도커 엔진은 설치와 함께 실행되며, 계속 동작 상태로 남아 있지만 컨테이너를 실행 중이 아니라면 컴퓨터의 리소스를 거의 차지하지 않으므로 문제가 없다.
도커 데스크톱이나 리눅스 버전 모두 도커 엔진이 한번 종료되면 모든 컨테이너는 정지 상태가 되고, 컨테이너에는 자동 실행 설정이 없으므로, 도커 엔진과 함께 컨테이너를 복구하려면 컨테이너를 따로 실행하는 스크립트로 실행해야 한다.
컨테이너 사용의 기본은 도커 명령어다. 명령 프롬프트 및 터미널 화면에서 프롬프트뒤에 다음 명령어를 입력한다.
컨테이너를 다루는 모든 명령은 ‘docker’ 명령어로 시작한다.
docker ~
docker 명령어 뒤에 오는 ‘무엇을’ ‘어떻게’에 해당하는 부분을 ‘커맨드’라고 한다. 커맨드는 다시 상위 커맨드와 하위 커맨드로 구성되며, 상위 커맨드가 ‘무엇을’, 하위 커맨드가 ‘어떻게’에 해당하는 내용을 지정한다. 또 ‘대상’에는 컨테이너명 또는 이미지명 등 구체적인 이름이 들어간다. docker 명령 뒤로 ‘무엇을’, ‘어떻게’, ‘대상’의 순으로 지정하면 된다.
docker 커맨드 대상
예를 들어 이름이 penguin인 이미지를 컨테이너(container)로 실행(run)하려면 다음과 같은 명령을 입력하면 된다.
docker container run penguin
대상과 상위 커맨드(무엇을)의 차이가 잘 와닿지 않을 수 도 있는데, 상위 커맨드는 container(컨테이너) 또는 image(이미지)와 같이 대상의 종류가 들어간다. 딱 12종류만있다. 대상에 해당하는 부분에는 구체적인 이름을 지정한다.
따라서 penguin 이라는 이름의 이미지를 pull(내려받기)하기 위해서는
docker image pull penguin
penguin이라는 이름의 이미지로 컨테이너를 start(시작)하려면
docker container start penguin
명령어를 입력하면 된다.
도커를 써본 사람은 알고 있을 수도 있지만 위에서 말한 명령어들 보다 훨씬 긴 명령어 들을 본적이 있을 것이다.
명령어의 기본적인 형태는 docker [커맨드][대상]이지만 커맨드에는 앞서 설명한 대상 외에도 옵션과 인자라는 추가 정보가 붙는다.
예를 들면 container run 커맨드에 -d라는 옵션을, penguin을 대상으로 —mode=1이라는 인자를 붙이면 다음과 같은 명령어가 된다.
docker container run -d penguin --mode=1
-d는 ‘백그라운드로 실행해라’ —mode=1는 모드1로 실행해라 라는 의미지만 모든 명령어에 옵션이나 인자가 붙는 것은 아니며, 커맨드와 대상만으로 구성된 명령어도 많다.
반대로 옵션이나 인자를 여러 개 복잡하게 붙일 수 있는 명령어도 있지만 가짓수도 적고 자주 쓰이는 옵션이나 인자도 한정돼 있으므로 기억해두는 편이 좋다.
docker 커맨드 (옵션) 대상 (인자)
숙달하기 전까지는 ‘docker 커맨드 대상’ 형태가 기본이고, 여기에 커맨드에 옵션이 붙거나 대상에 인자가 지정되는 경우도 있다고 기억해두면 좋다.
도커 명령어의 커맨드는 ‘무엇을’, ‘어떻게’할 것인지 지정하는 부분이라고 설명했다. ‘컨테이너’를 ‘실행’하고 싶다면 container run 커맨드를 사용한다. 다만 start나 run처럼 container를 붙이지 않아도 실행 가능한 명령어가 있으며, 관례상 이쪽을 사용하는 경우가 많다.
docker container run
# docker container run을 생략한 커맨드 예
docker run
옵션은 커맨드에 세세한 설정을 지정하는 용도로 쓰인다.
백그라운드로 실행할 때는 -d, 키보드를 통해 조작하고 싶다면 -i 또는 -t를 붙이는 등, 커맨드의 실행 방법 또는 커맨드에 전달할 값을 지정한다. 옵션은 커맨드에 따라 달라진다.
옵션은 - 또는 —으로 시작하는 것이 일반적이지만 - 기호를 붙이지 않는 경우도 있다. 그리고 -나 —중 무엇을 사용할지는 커맨드 작성자의 취향이므로 명확한 기준은 없다.
# 옵션 예
-d
-all
커맨드에 어떤 값을 전달하고 싶을때
# --name 옵션 값의 예
--name penguin
-d와 같이 -를 하나만 사용하는 옵션은 한꺼번에 모아 쓸 수 있다. 예를 들어 -d와 -i, -t를 합쳐 -dit처럼 쓸 수 있다.
-d, -i, -t를 합친 예
-dit
커맨드와 달리 구체적인 이름을 지정한다. 이름이 penguin인 이미지의 컨테이너를 실행하려면
‘container start [옵션] penguin’ 명령을 사용한다.
대상에 전달할 값을 전달한다. 문자 코드 또는 포트 번호 등을 전달할 수 있다. 단, 인자를 지정하는 경우는 그리 많지 않다. 예를 들어, MySQL과 워드프레스를 함께 쓸 때 MySQL쪽에서 워드프레스가 지원하는 구식 인증 방식을 지정할 때 세 가지 인자를 사용하는 정도로, 필요한 상황이 제한적이다. 작성 방법은 옵션과 마찬가지로 - 또는 —로 시작하는 경우가 많다.
# 인자의 예
--mode=1
--style nankyoku
# 커맨드의 이전 표기법(docker run)
docker run penguin
# 재편된 커맨드의 표기법(docker run)
docker container run penguin
컨테이너를 실행/종료, 컨테이너 목록 확인 등 컨테이너를 다루기 위해 사용하는 커맨드다. 컨테이너를 대상으로 어떤 일을 할지는 하위 커맨드를 통해 지정한다.
docker container 하위_커맨드 옵션
하위 커맨드 | 내용 | 생략 가능 여부 | 주요 옵션 |
---|---|---|---|
start | 컨테이너를 실행 | O | -i |
stop | 컨테이너를 정지 | O | 거의 사용하지 않음 |
create | 도커 이미지로부터 컨테이너를 생성 | O | —name -e -p -v |
run | 도커 이미지를 내려받고 컨테이너를 생성해 실행함(다운로드는 필요한 경우에만). docker image pull, docker container create, docker container start라는 세개의 명령을 하나로 합친 것과 같다. | O | —name -e -p -v -d -i -t |
rm | 정지 상태의 컨테이너를 삭제 | O | -f -v |
exec | 실행 중인 컨테이너 속에서 프로그램을 실행 | O | -i -t |
ls | 컨테이너 목록을 출력 | *1 | -a |
cp | 도커 컨테이너와 도커 호스트 간에 파일을 복사 | O | 거의 사용하지 않음 |
commit | 도커 컨테이너를 이미지로 변환 | O | 거의 사용하지 않음 |
생략 가능 커맨드는 ‘docker container 하위커맨드’가 아니라 ‘docker 하위커맨드’와 같이 실행한다. 이 방법은 예전 표기법과의 호환성을 위한 것이다.
*1: 생략형은 docker ps
이미지를 내려받거나 검색하는 등 이미지와 관련된 기능을 실행하는 커맨드다. 이미지를 대상으로 어떤 일을 할지는 하위 커맨드를 통해 지정한다.
docker image 하위_커맨드 옵션
하위 커맨드 | 내용 | 생략 가능 여부 | 주요 옵션 |
---|---|---|---|
pull | 도커 허브 등의 리포지토리에서 이미지를 내려받음 | O | 거의 사용하지 않음 |
rm | 도커 이미지를 삭제 | *2 | 거의 사용하지 않음 |
ls | 내려 받은 이미지의 목록을 출력 | X | 거의 사용하지 않음 |
build | 도커 이미지를 생성 | O | -t |
*2: 생략형은 docker rmi
볼륨 생성, 목록 확인, 삭제 등 볼륨과 관련된 기능을 실행하는 커맨드다. 볼륨을 대상으로 어떤 일을 할지는 하위 커맨드를 통해 지정한다.
docker volume 하위_커맨드 옵션
하위 커맨드 | 내용 | 생략 가능 여부 | 주요 옵션 |
---|---|---|---|
create | 볼륨을 생성 | X | —name |
inspect | 볼륨의 상세 정보를 출력 | X | 거의 사용하지 않음 |
ls | 볼륨읨 목록을 출력 | X | -a |
prunem | 현재 마운트되지 않음 볼륨을 모두 삭제 | X | 거의 사용하지 않음 |
rm | 지정한 볼륨을 삭제 | X | 거의 사용하지 않음 |
도커 네트워크의 생성, 삭제, 컨테이너의 네트워크 접속 및 접속 해제 등 도커 네트워크와 관련된 기능을 실행하는 커맨드다. 도커 네트워크란 도커 요소 간의 통신에 사용하는 가상 네트워크를 가리킨다.
docker network 하위_커맨드 옵션
하위 커맨드 | 내용 | 생략 가능 여부 | 주요 옵션 |
---|---|---|---|
connect | 컨테이너를 도커 네트워크에 연결 | X | 거의 사용하지 않음 |
disconnect | 컨테이너의 도커 네트워크 연결을 해제 | X | 거의 사용하지 않음 |
create | 도커 네트워크를 생성 | X | 거의 사용하지 않음 |
inspect | 도커 네트워크의 상세 정보를 출력 | X | 거의 사용하지 않음 |
ls | 도커 네트워크의 목록을 출력 | X | 거의 사용하지 않음 |
prune | 현재 컨테이너가 접속하지 않은 네트워크를 모두 삭제 | X | 거의 사용하지 않음 |
rm | 지정한 네트워크를 삭제 | X | 거의 사용하지 않음 |
대부분은 도커 스웜과 관련된 커맨드로서 초보자 수준에서는 사용할 일이 없다
상위 커맨드 | 내용 |
---|---|
checkpoint | 현재 상태를 일시적으로 저장한 후, 나중에 해당 시점의 상태로 되돌릴 수 있다. (아직 실험적 기능) |
node | 도커 스웜의 노드를 관리하는 기능 |
plugin | 플러그인을 관리하는 기능 |
secret | 도커 스웜의 비밀값 정보를 관리하는 기능 |
service | 도커 스웜의 서비스를 관리하는 기능 |
stack | 도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리하는 기능 |
swarm | 도커 스웜을 관리하는 기능 |
system | 도커 엔진의 정보를 확인하는 기능 |
상위 커맨드 없이 단독으로 쓰이는 특수한 커맨드도 있다. 주로 도커 허브의 검색이나 로그인에 사용되는 커맨드다.
단독 커맨드 | 내용 | 주요 옵션 |
---|---|---|
login | 도커 레지스트리에 로그인 | -u -p |
logout | 도커 레지스트리에 로그아웃 | 거의 사용하지 않음 |
search | 도커 레지스트리를 검색 | 거의 사용하지 않음 |
version | 도커 엔진 및 명령행 도구의 버전을 출력 | 거의 사용하지 않음 |
컨테이너를 실행하는 커맨드다. docker image pull, docker container create, docker container start의 기능을 하나로 합친 것과 같다. 이 커맨드는 현재 해당 이미지를 내려받은 상태가 아니라면 이미지를 먼저 내려받고 ‘대상’으로 사용할 이미지의 이름을 지정한다.
컨테이너의 이름은 —name 옵션, 포트 번호는 -p, 볼륨을 마운트할 때는 -v, 컨테이너를 연결할 네트워크는 —net 옵션 등을 사용할 수 있다.
docker run (옵션) 이미지 (인자)
옵션 형식 | 내용 |
---|---|
—name 컨테이너_이름 | 컨테이너 이름을 지정함 |
-p 호스트포트번호:컨테이너포트번호 | 포트 번호를 지정함 |
-v 호스트디스크:컨테이너디렉터리 | 볼륨을 마운트함 |
—net=네트워크_이름 | 컨테이너를 네트워크에 연결함 |
-e 환경변수_이름=값 | 환경변수를 설정함 |
-d | 백그라운드로 실행함 |
-i | 컨테이너에 터미널(키보드)를 연결함 |
-t | 특수 키를 사용 가능하도록 함 |
-help | 사용 방법 안내 메시지를 출력함 |
-p는 —publish, -v는 —volumne, -e는 —env, -d는 —detach, -i는 —interactive, -t는 —tty의 생략형이다
컨테이너를 삭제하려면 먼저 반드시 컨테이너를 정지시켜야 한다.
docker stop 컨테이너_이름
컨테이너를 삭제하는 커맨드다. 정지 상태가 아닌 컨테이너를 대상으로 삭제하려고 하면 오류가 발생하며 컨테이너가 삭제되지 않는다.
docker rm 커맨드_이름
-d는 컨테이너를 백그라운드로 실행
-i와 -t는 컨테이너 내부에 터미널로 접속하기 위한 옵션
-d를 붙이지 않고 컨테이너를 실행하면 실행된 컨테이너가 프로그램의 실행을 마칠 때까지 터미널의 제어를 차지하므로 그다음 명령을 입력할 수 없는 상태가 된다.
또한, -i, -t 옵션으 ㄹ붙이지 않으면 컨테이너 안의 파일 시스템에 접근할 수 없다.
이 옵션들은 당연히 사용하는 옵션 같지만 ‘한 번만 실행되는 컨테이너’와 ‘데몬 형태로 동작하는 컨테이너’를 실행할 때는 사용하지않는다.
왜냐하면 한 번만 실행되는 컨테이너는 실행하자마자 종료되므로 컨테이너가 터미널의 제어를 차지하더라도 일시적인 것이기에 문제가 되지 안흔다.
그러나 데몬처럼 계속적으로 실행되는 프로그램은 저절로 종료되지 않으므로 한번 터미널의 제어를 넘기면 이를 되찾아 오기가 번거롭다.
또한 컨테이너 속 파일 시스템을 다르려면 -i, -t 옵션을 사용 해야 하지만 실행하자마자 곧장 종료되는 컨테이너라면 컨테이너 속 파일 시스템에 손을 댈 일도 없으므로 불필요한 옵션이 된다.
컨테이너의 생애주기를 관장하는 커맨드 외에 자주 쓰이는 커맨드이다.
이 커맨드는 컨테이너의 목록을 출력하는 기능을 하는데, docker ps는 현재 실행 중인 컨테이너의 목록을 출력하며, 옵션으로 -a를 사용하면 현재 존재하는 컨테이너(정지 상태 컨테이너도 포함)하여 목록을 출력해준다.
docker ps (옵션)
컨테이너를 실행하거나 컨테이너의 상태가 기대했던 대로인지 확인할 수 있으며, 컨테이너의 상세 정보를 확인할 때도 사용한다.
docker ps 커맨드를 실행하면 다음과 같은 결과가 출력된다.
첫 번째 행은 이름이 출력 되고, 두 번쨰 행 부터 실제 컨테이너의 정보가 출력된다.
항목 | 내용 |
---|---|
CONTAINER ID | 컨테이너 식별자. 무작위 문자열이 할당됨. 원래는 64글자지만 앞의 12글자만 출력한다 이 12글자로도 식별자 역할을 수행할 수 있다. |
IMAGE | 컨테이너를 만들 때 사용한 이미지의 이름 |
COMMAND | 컨테이너 실행 시에 실행하도록 설정된 프로그램의 이름. 크게 신경 쓰지 않아도 된다. |
CREATED | 컨테이너 생성 후 경과된 시간 |
STATUS | 컨테이너의 현재 상태. 실행 중이라면 ‘Up’, 종료된 상태라면 ‘Exited’가 출력된다. |
PORTS | 컨테이너에 할당된 포트 번호. ‘호스트 번호 → 컨테이너 포트 번호’ 형식으로 출력된다. |
NAMES | 컨테이너 이름 |
웹 브라우저를 통해 컨테이너를 접근하려면 외부와 접속하기 위한 설정이 필요하다. 이를 위해 포트를 설정한다.
포트란 통신 내용이 드나드는 통로를 의미한다. ‘웹은 포트 80번’ ‘메일은 포트 25번’이다.
아파치는 서버에서 정해둔 포트(80번 포트)에서 웹 사이트에 대한 접근을 기다리다가 사용자가 이 포트를 통해 접근해 오면 요청에 따라 웹 사이트의 페이지를 제공한다. 하지만 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
따라서 컨테이너를 실행 중인 물리적 컴퓨터가 외부의 접근을 대신 받아 전달해주도록 해야한다.
컨테이너를 실행 중인 물리적인 컴퓨터(호스트)의 8080번 포트(이 포트는 다른 소프트웨어가 사용하는 포트와 겹치지 않는 한 임의의 숫자를 사용해도 된다)와 컨테이너의 80번 포트를 연결한다. 이 옵션이 -p 옵션이며, 그 뒤로 ‘호스트의 포트 번호’와 ‘컨테이너의 포트 번호’를 콜론으로 연결해 함께 기재한다.
# 포트 설정 방법
-p 호스트_포트:컨테이너_포트_번호
# 포트 옵션 예
-p 8080:80
컨테이너에서 실행되는 프로그램(소프트웨어)는 독립적으로 실행되기 때문에 위 같이 웹 서버를 실행하는 경우엔 여러개의 웹 서버를 실행할 수 있다. 이러한 상황엔 호스트 포트 번호를 모두 같은것으로 사용하면 어떤 컨테이너로 가야 할 요청인지 구분할 수 없기 때문에 컨테이너 A,B에 각각 8080,8081과 같이 겹치지 않은 포트 번호로 실행해야 한다.
꼭 여러 컨테이너로 연결되는 포트를 같게 설정하고 싶다면 리버스 프락시로 서버 이름을 통해 구별하도록 구성한다.
컨테이너는 이미지로 부터 만들어지는데, 컨테이너를 삭제해도 이미지는 삭제되지 않는다.
이미지가 늘어나면 스토리지 용량을 의미없게 차지하게 되므로 이미지는 되도록 그때그때 삭제하는게 좋다. 이미지 삭제도 컨테이너 삭제때와 같이 이미지ID 또는 이미지 이름으로 지정한다.
또한, 컨테이너가 실행중인 컨테이너를 삭제하지 못하는 것처럼, 이미지도 이미로 만든 컨테이너가 있으면 삭제할 수 없다. docker ps -a 명령어로 컨테이너 목록을 출력해 확인하고 컨테이너를 먼저 종료 및 삭제 하고 이미지를 삭제해야 한다.
이 커맨드는 컨테이너를 삭제할 떄 처럼 docker rm처럼 생략할 수 없다. docker rm은 컨테이너 삭제 커맨드의 생략형인 docker container rm이기 때문이다.
# 자주 쓰이는 커맨드
docker image rm 이미지_이름
# 여러 개의 이미지를 삭제하고 싶을 때
docker image rm 이미지_이름 이미지_이름 이미지_이름
이미지를 삭제하려면 이미지 이름 또는 이미지 ID를 알아야 한다.
컨테이너 목록을 출력하는 docker ps 커맨드가 있듯 이미지 목록을 확인하는 커맨드도 있다. 이 커맨드가 바로 docker image ls 커맨드다.
이 명령어를 사용하면 REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 등을 확인할 수 있다.
# 자주 사용하는 커맨드 예
docker network create 네트워크_이름
# 자주 사용하는 커맨드 예
docker network rm 네트워크_이름
커맨드 | 내용 | 생략 가능 여부 | 주요 옵션 |
---|---|---|---|
connect | 네트워크에 컨테이너를 새로이 접속 | X | 거의 사용하지 않음 |
disconnect | 네트워크에서 컨테이너의 접속을 끊음 | X | 거의 사용하지 않음 |
create | 네트워크를 생성 | X | 거의 사용하지 않음 |
inspect | 네트워크의 상세 정보를 확인 | X | 거의 사용하지 않음 |
ls | 네트워크의 목록을 확인 | X | 거의 사용하지 않음 |
prune | 현재 아무 컨테이너도 접속하지 않은 네트워크를 모두 삭제 | X | 거의 사용하지 않음 |
rm | 지정한 네트워크를 삭제 | X | 거의 사용하지 않음 |