도커 엔진에서 사용하는 기본 단위는 이미지 와 컨테이너 이다.
이미지는 컨테이너를 생성할때 필요한 요소이며, 가상머신 개념에서 게스트 OS에 해당하는 ".iso"파일과 비슷한 개념이다. 도커에서 사용하는 이미지 이름은 기본적으로 [저장소이름]/[이미지이름]:[태그]
혹은 [이미지이름]:[태그]
형식으로 구성되어 있다.
- 저장소 : 이미지의 저장소를 의미한다. 두번째 타입 형식과 같이 저장소 이름이 생략되는 경우도 있는데, 이런 경우에는 Docker Hub의 공식 이미지를 의미한다. Docker Hub가 아닌 Private Registry등에서 가져오게 되면 저장소 이름이 함께 붙는것을 볼 수 있다.
- 이미지 이름 : 이미지의 명칭을 의미한다
- 태그 : 이미지의 버전 관리에 사용한다
이미지를 이용해서 생성할 수 있으며, 각 이미지 목적에 맞게끔 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립 공간이다.하나의 이미지로 여러개의 컨테이너 를 만들 수 있으며, 각 컨테이너끼리 뿐만 아니라 호스트 OS에도 영향을 주지 않는다. 또한 컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장한다. 그렇기 때문에 원래 이미지는 영향을 받지 않는다.
Docker의 주요 명령어를 기준으로 살펴보자
Docker Engine의 버전 확인
docker -v
docker search <키워드> : 키워드가 들어간 Docker Image를 Docker Hub에서 검색해 반환한다. 아래 명령어와 같이 실행하면 ubuntu라는 단어가 들어간 이미지들을 검색해 반환한다.
docker search ubuntu
docker run <옵션> <이미지> <실행할파일> : 컨테이너를 생성하고 실행하는 역할을 한다. 아래 명령어에서는 '14.04'라는 태그를 가진 ubuntu이미지를 실행한다는 의미이다. 그리고 해당 이미지를 생성한 후 /bin/bash를 실행한다는 의미이다. 만약 로컬에 해당 이미지가 없는경우, 이미지를 받아온다.기본적으로 docker images는 Docker Hub 에서 이미지를 받아온다. 옵션은 아래와 같다.
docker run --name ubuntu_test2 -it ubuntu:14.04 /bin/bash
docker pull <이미지 이름>:<태그> : 이미지를 받아오는 명령어이다. 태그는 생략시 기본적으로 latest버전을 받아온다. 아래 예시에서는 CentOS7 의 최신 이미지를 불러오는 명령어이다.
docker pull centos
docker images : 로컬에 pull한 docker images목록을 출력한다.
docker images
docker ps : 현재 돌아가고있는 컨테이너 목록을 출력한다. 옵션은 아래와 같다.
docker start <컨테이너 이름 혹은 컨테이너 ID> : 지정한 컨테이너를 시작한다. 아래 명령어는 위에서 생성한 이미지를 실행하는 것이다.
docker start ubuntu_test2
docker restart <컨테이너 이름 혹은 컨테이너 ID> : 지정한 컨테이너를 재실행한다.
docker restart ubuntu_test2
docker attach <컨테이너 이름 혹은 컨테이너 ID> : 지정한 컨테이너에 접속한다. 기본적으로 attach로 접속한 경우, 해당 컨테이너에서 나오면 컨테이너는 종료되게 된다.
docker attach ubuntu_test2
docker exec <컨테이너 이름 혹은 컨테이너 ID> <명령> <매개변수> : 외부에서 컨테이너 안의 명령을 실행할 수 있도록 해준다. 아래 명령어 같은 경우, ubuntu_test2 컨테이너 안에서 "hello world"라는 문자열을 출력하도록 명령하는 것이다.
docker exec ubuntu_test2 echo "hello world"
docker attach를 사용해서 컨테이너를 접속 한 후 세션에서 나오면 컨테이너가 내려갔다. 하지만 docker exec을 사용하면, 접속 후 세션을 나와도 컨테이너가 내려가지 않는다. 아래와 같이 명령어를 실행하면, ubuntu_test2라는 컨테이너를 상호작용 가능한 tty를 활성시켜 /bin/bash를 실행한다는 의미이다.
docker exec -it ubuntu_test2 /bin/bash
docker stop <컨테이너 이름 혹은 컨테이너 ID> : 컨테이너를 정지시킬 수 있다. 반환값으로, 종료한 컨테이너의 이름 혹은 ID를 반환한다.
docker stop ubuntu_test2
docker rm <컨테이너 이름 혹은 컨테이너 ID> : 컨테이너를 삭제한다. 단, 컨테이너가 작동중에는 rm명령어를 실행할 수 없다. 컨테이너가 완전히 멈춘 이후에 삭제가 가능하다.이런 경우, docker stop과 연계해서 사용할 수 있다. 추후 다루겠지만, Shell Script문법중 $()는 안에있는 명령어를 실행하여 결과값으로 대체하는 문법이다(``과 동일한 역할)
docker rm $(docker stop ubuntu_test2)
만약 순수히 실행중인 컨테이너를 삭제하고 싶다면 -f
옵션을 추가해주면된다
docker rm -f ubuntu_test2
docker container prune : 정지상태의 모든 컨테이너들을 삭제한다.
docker rmi <이미지 이름>:<태그> : 이미지를 삭제하는 명령어이다. 태그를 입력하지 않을시 이미지 이름이 들어간 모든 이미지를 삭제하므로 주의해야한다. 이미지를 일일히 지우기 매우 귀찮다. docker image에 대해 -q
옵션을 넣으면, 아이디 값만 출력하게 되는데, 이를 이용해서 모든 이미지를 한번에 삭제할 수 도 있다.
docker rmi $(docker images -q)