도커 엔진
도커 이미지와 컨테이너
도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너임.
도커 이미지
이미지는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다. 이미지는 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용된다. 도커 명령어로 내려받을 수 있다.
도커 컨테이너
이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 바로 도커 컨테이너가 된다.
생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화가 없다.
도커 컨테이너 다루기
컨테이너 생성
$ docker -v
Docker version ...
$ docker run -i -t ubuntu:14.04
-i -t 옵션은 컨테이너와 상호 입출력을 가능하게함.
이미지가 로컬 도커 엔진에 존재하지 않으면 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받음.
root@bff498040cde:/#
컨테이너에서 기본 사용자는 root이고 호스트 이름은 무작위의 16진수 해시값. 이건 컨테이너의 고유한 ID의 앞 일부분임.
docker run 명령어로 컨테이너를 생성할 때 -i 옵션으로 상호 입출력을, -t 옵션으로 tty를 활성화해서 bash shell을 사용하도록 컨테이너를 설정했다. 이 2개의 옵션을 사용하지 않으면 셸을 정상적으로 사용할 수 없다.
컨테이너 내부에서 빠져나오는 방법은 exit, Ctrl + D. exit나 Ctrl + D는 배시 셸을 종료함으로써 컨테이너를 정지시킴과 동시에 컨테이너에서 빠져나오지만 Ctrl + P 누른상태에서 Q는 단순히 컨테이너의 셸에서만 빠져나오기 때문에 애플리케이션 개발하는 목적으로 컨테이너를 사용할 때는 이 방법을 많이씀.
$ docker pull centos:7
7: Pulling from ...
...
...
docker pull 명령어는 이미지를 내려받을 때 사용.
$ docker images
docker images 명령어는 도커 엔진에 존재하는 이미지의 목록을 출력.
컨테이너를 생성할 때는 run 명령어가 아닌 create 명령어도 가능.
$ docker create -i -t --name mycentos centos:7
dd06c5cbdfe.......
--name 옵션에는 컨테이너의 이름을 설정한다.
docker inspect 명령어로 컨테이너의 ID를 다시 확인할 수도 있다.
$ docker inspect mycentos | grep id
"Id":"~~~",
create 명령어는 컨터에너를 생성만 할 뿐 컨테이너로 들어가지 않음. 그래서 docker start와 docker attach 명령어를 써서 컨테이너를 시작하고 내부로 들어간다.
$ docker start mycentos
mycentos
$ docker attach mycentos
[root@dd06... /]
여기서 이젠 Ctrl + P + Q로 나오게 되면 exit와는 다르게 컨테이너를 정지시키지 않고 컨테이너에서 빠져나옴.
정리하면 run 명령어는 pull, create, start 명령어를 일괄적으로 실행한 후 attach가 가능한 컨테이너라면 컨테이너 내부로 들어간다. 그러나 create 명령어는 도커 이미지를 pull한 뒤에 컨테이너를 생성만 할 뿐 start, attach를 실행하지 않는다. run을 더 많이 쓴다.
컨테이너 목록 확인
$ docker ps
정지되지 않은 컨테이너만 출력한다. exit를 사용해 빠져나온 컨테이너는 정지 상태이기 때문에 컨테이너 목록에 출력되지 않지만 Ctrl + P + Q를 입력해 빠져나온 컨테이너는 실행 중이기 때문에 컨테이너 목록에 출력된다.
-a 옵션을 추가하면 정지된거 까지 다 보임.
docker ps -a 했을 때 COMMAND는 컨테이너가 시작될 때 실행될 명령어. 커맨드는 대부분의 이미지에 미리 내장돼있기 때문에 별도로 설정할 필요는 없음. centos나 ubuntu는 /bin/bash라는 커맨드가 내장돼 있기 때문에 컨테이너를 생성할 때 별도의 커맨드를 설정하지 않았다. 컨테이너가 시작될 때 /bin/bash 명령어가 실행됐으므로 상호 입출력이 가능한 셸 환경을 사용할 수 있었음.
이미지에 내장된 커맨드는 docker run이나 create 명령어의 맨 끝에 입력해서 컨테이너를 생성할 때 덮어쓸 수 있다. 예를 들어, 아래의 docker run 명령어로 생성되는 컨테이너는 실행될 때마다 "echo hello world!"를 실행하고 /bin/bash 커맨드가 없어서 상호 입출력이 가능한 셸이 실행되지 않아 바로 종료된다.
$ docker run -i -t ubuntu:14.04 echo hello world!
NAMES는 컨테이너의 고유한 이름임. 컨테이너를 생성할 때 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 부작위로 조합해 이름을 설정하기 때문에 엉뚱한 이름이 설정돼있음. 그때는 docker rename '엉뚱한이름' '짓고픈이름'
로 컨테이너의 이름을 변경할수 있음.
셸의 화면이 작아서 ps 명령어의 출력 결과가 줄바꿈되어 알아보기 힘들 때는 --format 옵션에 Go 템플릿을 입력해서 원하는 정보만 출력 가능
$ docker ps --format "table {{.ID}}\t{{.Status}}"
CONTAINERID STATUS
xxxxx xxxxx
컨테이너 삭제
$ docker rm 컨테이너 이름
실행 중인 컨테이너 강제 삭제
$ docker rm -f mycentos
모든 컨테이너 삭제
$ docker container prune
# -q는 아이디를 출력하는 옵션
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)