목차
도커 명령어의 구조
도커는 상위 4개 명령어가 있고, 그 아래 하위 커맨드들이 존재한다.
상위 4개 명령어는 다음과 같다.
- Image
- Container
- Network
- Volume
Image
Image란?
이미지란 가상화 환경을 추상화 해서 만들어 놓은 것이다.
객체지향 언어에서 class를 instance화 해서 객체를 만드는 것처럼 도커는 image를 instance화 해서 container를 만든다.
docker search (이미지명) | 이미지 검색
CLI 환경
이렇게 나오긴 하지만 보기도 별로고 결과물도 많이 나오지 않는다.
무엇보다 문서들이 나오지 않는다.
Docker Desktop 환경
이렇게 이미지도 찾을 수 있고 클릭하면 해당 이미지에 대한 문서도 나온다.
httpd는 아파치에서 도커 허브에 넣어놓은 공식 아파치 http web server의 이미지명이다.
docker image pull (이미지명) | 이미지 다운로드
docker image list/ls | 내가 다운받은 이미지 리스트 확인
docker image list
docker image ls 둘 모두 사용 가능하다
docker image rm (이미지명) | 이미지 삭제
이미지를 삭제하기 전에는 이미지를 구현한 컨테이너를 먼저 삭제 후 이미지를 삭제해야 한다.
docker image rm -f (이미지명) | 이미지 강제 삭제
위 명령으로 컨테이너가 남아있어도 이미지를 강제 삭제 할 수 있으나 깔끔하게 삭제되지 않는 것을 볼 수 있다.
반드시 컨테이너를 삭제하고 이미지를 삭제하도록 하자
Container
docker container ps | 작동중인 컨테이너 리스트 보기
docker container ps -a | 내 도커의 모든 컨테이너 리스트 보기
현재 실행되고 있는 도커는 없지만 만들어진 컨테이너는 2개 있는 것을 확인할 수 있다.
docker container create --name (1) -dit -p (2):(3) (4) -e (5)
- 생성할 컨테이너의 이름
- 내가 접속할 포트번호
- 오리지널 이미지에서 열어 놓은 포트번호
- 이미지명
- 환경변수
- -d : --detache = 컨테인가 실행될 때 백그라운드에서 작동하도록 하는 명령어
- -i : --interactive = 컨테이너를 STDIN을 사용해서 접근할 수 있도록 하는 명령어
- -t : --tty = 컨테이너에 터미널을 통해 접근할 수 있도록 하는 명령어
- -dit : 컨테이너를 실행하면 Background에서 동작하도록 하고, 터미널과 STDIN을 사용해 컨테이너에 접근할 수 있도록 하라.
docker container create --name apache_docker -dit -p 8080:80 httpd
아파치 컨테이너를 생성한 직후에는 아직 실행이 되지 않아 docker container ps 명령어의 결과가 나오지 않는다.
docker container ps -a 명령어로 생성한 컨테이너를 보면 방금 만든 아파치 컨테이너가 존재함을 확인할 수 있다.
후술하겠지만 생성된 컨테이너는 docker container start apache_docker 명령으로 실행할 수 있다.
컨테이너가 실행되었으니 docker container ps에서 목록이 나타나는 것을 확인할 수 있다.
접속할 포트를 사용해서 접속해보면 위와 같이 아파치 서버가 돌아가는 것을 확인할 수 있다.
docker container run --name (1) -dit -p (2):(3) (4) -e (5)
(1) ~(5), 옵션은 Container Create와 동일하다.
docker container run 명령은 아래 세 개의 명령을 합친 명령이다.
- image pull - 이미지가 없으면 자동으로 이미지를 받아온다.
- container create - 해당 이름의 컨테이너가 존재하지 않으면 자동으로 해당 컨테이너를 생성한다.
- container start - 해당 이름의 컨테이너가 실행되지 않았으면 자동으로 해당 컨테이너를 실행한다.
docker container run --name nginx_docker -d -p 80:80 nginx
이미지를 다운, 컨테이너 생성, 컨테이너 실행까지 한번에 되서 localhost:80으로 바로 접속이 가능한 것을 확인할 수 있다.
docker container start (컨테이너명) | 컨테이너 실행
처음에 실행되고 있는 컨테이너가 존재하지 않았지만 start명령어로 nginx도커를 실행시킨 것을 확인할 수 있다.
docker container stop (컨테이너명) | 컨테이너 종료
stop명령어로 실행중인 도커 컨테이너를 종료하는 것을 확인할 수 있다.
종료되도 여전히 컨테이너가 존재하기때문에 ps -a명령으로 확인할 수 있다.
docker container rm (컨테이너명) | 컨테이너 삭제
rm명령어로 도커를 삭제한 것을 볼 수 있다.
도커를 삭제하기 전에 반드시 컨테이너 실행을 종료하도록 하자!
docker exec -it (1) (2) | 터미널을 통해 컨테이너에 접근
- 컨테이너명
- 실행 명령문
docker container run --name mysql_docker -dit -p 3307:3306 -e MYSQL_ROOT_PASSWORD=12345 mysql
위 명령은 mysql 컨테이너에 환경변수로 mysql root의 비밀번호를 12345로 설정한 컨테이너를 만드는 명령어이다.
-it 옵션을 줬기 때문에 터미널을 통해 mysql 내부로 접속이 가능하도록 만들었다.
이때 mysql 내부도 접속하기 위한 명령어가 바로 docker -it (1) (2)이다.
현재 3306포트가 사용중이기 때문에 3307포트로 바꿔서 사용하도록 하겠다.
docker exec -it mysql_docker /bin/bash 명령으로 mysql container 내부로 접근한 후,
mysql -u root -p로 mysql을 실행한 것을 확인할 수 있다.
우리가 컨테이너를 생성할 때 환경변수로 루트 비밀번호를 12345로 설정했기 때문에 위 비밀번호로 들어가면 루트 계정에 접속이 가능하다.
루트 계정에 접속해 데이터베이스를 생성하고 해당 데이터베이스로 이동하는 등의 작업을 하는 것을 볼 수 있다.
외부에서 이 데이터베이스에 접근해볼까?
먼저 유저를 만들고 권한을 설정한다.
유저명 @ '%' 으로 유저를 만들어 외부 ip에서도 DB에 접속 가능하도록 설정해주자.
그리고 dbeaver에 들어가서 접속을 테스트하면 아래와 같이 접속되는 것을 확인할 수 있다.
webdev 데이터베이스도 만들어진 것을 확인할 수 있다.
docker container cp [1] [2] | 도커와 컴퓨터 사이의 파일 전송
- 복사할 파일의 경로
- 붙혀넣을 경로
컴퓨터 -> 도커로의 파일 전송 테스트
docker container run --name apache_docker -p 80:80 -dit httpd
위와 같이 아파치 컨테이너를 하나 만든 후, 아파치에 접속하면 아파치의 기본 화면이 뜨는 것을 볼 수 있다.
위와 같은 index.html파일을 만든 후,
docker container cp index.html apache_docker:/usr/local/apache2/htdocs
위 커맨드로 index.html파일로 이동시키면 아래와 같이 컨테이너에 파일이 들어간 것을 확인할 수 있다.
이제 다시 아파치 서버에 접속해보면 우리가 넣어준 페이지로 접속하는 것을 볼 수 있다.
도커 -> 컴퓨터로의 파일 전송 테스트
방금 도커로 전송한 index.html파일을 바탕화면으로 전송해보자.
위와 같이 전송이 잘 되는 것을 확인할 수 있다!
docker container logs -f (컨테이너명) | 도커 로그 확인하기
위 커맨드로 한번 로그를 켜놓으면 로그가 뜰 때마다 갱신된다.
리눅스의 tail명령어와 유사하게 동작한다.
docker container rename (기존이름) (새이름) | 도커 이름 변경하기
private repository를 만들 때 도커명을 ip주소로 바꿔줘야 하기 때문에 컨테이너 이름을 바꿀 일이 있을 것이다.
컨테이너 생성의 환경변수에 대하여
환경 변수는 이미지 제조사가 만들어서 넣어둔 것이다.
위에서 mysql컨테이너를 만들 때 환경변수를 사용해 루트 비밀번호를 미리 설정한 것을 볼 수 있었다.
제조사가 배포한 이미지 document에 환경변수들과 그 사용법이 다 적혀있으니 잘 참고하도록 하자!!
이 환경변수들을 이용할 경우 mysql 컨테이너를 만들 때, root 비밀번호 설정, 데이터베이스 생성, 유저 생성, 유저 비밀번호 설정 등 많은 작업을 수행해둔 컨테이너를 생성할 수 있다.
docker container create --name mysql_docker -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -e MYSQL_DATABASE=webdev -e MYSQL_USER=webmaster -e MYSQL_PASSWORD=12345 mysql
Network
docker network create (네트워크명) | 네트워크 생성
docker network create myweb 명령어로 네트워크를 생성할 수 있다.
docker network inspect (네트워크명) | 네트워크 정보 출력
위와 같이 docker network ls로 생성된 네트워크들을 볼 수 있다.
docker network inspect (네트워크명) | 네트워크 정보 출력
docker network insepct myweb명령어로 해당 네트워크의 정보를 확인할 수 있다.
ip, Gateway, submnet mask등의 정보가 출력되는 것을 볼 수 있다.
--gateway (ip주소) : 네트워크 게이트웨이 설정 옵션
생성할 네트워크의 ip주소를 설정할 수 있다.
--subnet (subnet mask) : 네트워크 서브넷마스크 설정 옵션
생성할 네트워크의 subnet mask를 설정할 수 있다.
옵션을 이용해 네트워크를 만들어보자
docker network create --gateway 172.19.0.1 --subnet 172.19.0.0/24 myweb
위 옵션을 적용해서 생성한 network의 subnet과 gateway는 우리가 설정한 대로 만들어질 것이다.
docker network rm (네트워크명) | 네트워크 삭제
docker network rm myweb으로 네트워크를 삭제하면 더이상 해당 네트워크가 보이지 않는 것을 볼 수 있다.
docker network connect (네트워크명) (도커 명) | 네트워크에 컨테이너 삽입
docker network connect myweb apache_docker
docker network connect myweb mysql_docker
위 명령어로 컨테이너들을 네트워크에 추가한 후, inspect으로 네트워크를 보면 아래와 같이 네트워크 안에 컨테이너들이 들어간 것을 확인할 수 있다.
도커라이징을 통해 서비스를 배포할 때 이렇게 하나의 가상 네트워크를 만들고 그 안에 컨테이너들을 넣어서 배포한다.
유동ip를 고정ip로 바꾸고 하는 작업들이 필요하지만 기본적인 원리는 위와 같다.
docker network disconnect (네트워크명) (도커명) | 네트워크에서 컨테이너 제거
docker network disconnect myweb apache_docker
docker network disconnect myweb mysql_docker
위 명령어로 컨테이너를 네트워크에서 제거한 후, inspect으로 네트워크를 보면 컨테이너에서 네트워크가 제거된 것을 볼 수 있다.