run 명령어 : pull, create, start 명령어를 일괄적으로 실행한 attach가 가능한 컨테이너라면 컨테이너 내부로 들어간다.
create 명령어 : pull 한 뒤 컨테이너만 생성할 start, attach를 실행하지 않는다.
보통은 run 명령어를 더 많이 사용한다.
도커 이미지 내려받기
1
sudo docker pull centos:7
도커 엔진에 존재하는 이미지 조회
1
2
3
4
5
6
7
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 2eb2d388e1a2 10 days ago 64.2MB
wordpress latest 04b52c96c4b6 11 days ago 543MB
mysql 5.7 8679ced16d20 11 days ago 448MB
mysql 8 e3fcc9e1cc04 11 days ago 544MB
2.2 컨테이너 목록 확인
생성한 컨테이너 목록 확인
1
2
3
4
5
# 정지되지 않은 컨테이너만 출력sudo docker ps
# 정지된 컨테이너를 포함한 모든 컨테이너 출력sudo docker ps -a
CONTAINER ID : 컨테이너에게 할당되는 고유한 ID. 위 결과에서는 ID의 일부분 밖에 확인할 수 없지만 컨테이너를 확인하기 위해 docker inspect 명령어를 사용하면 전체 ID를 확인할 수 있다.
IMAGE : 컨테이너를 생성할 때 사용된 이미지 이름.
COMMAND : 커맨드는 컨테이너가 시작될 때 실행 명령어. 커맨드는 대부분의 이미지에 미리 내장되어 있기 때문에 별도로 설정할 필요가 없다.
CREATE : 컨테이너가 생성되고 난 뒤 흐른 시간을 나타냄
STATUS : 컨테이너의 상태를 나타낸다. Exited... 는 정지된 상태 나타내며 Up ... seconds 는 실행중인 상태를 나타낸다.
PORTS : 컨테이너가 개방한 포트와 호스트에 연결한 포트를 나열.
NAMES : 컨테이너의 고유 이름. docker rename 명령어를 통해 컨테이너 이름을 변경할 수도 있다.
1
2
# 컨테이너 이름 변경docker rename angry_morse my_container
2.3 컨테이너 삭제
docker rm 명령어를 통해 컨테이너를 삭제할 수 있다. 한 번 삭제한 컨테이너는 복구할 수 없으므로 신중을 기해야 한다.
도커 컨테이너 삭제
실행 중인 컨테이너는 삭제할 수 없다. 실행 중인 컨테이너를 종료하거나 강제삭제 옵션을 추가해야한다.
1
2
3
4
5
6
# 실행 중인 컨테이너 종료 후 삭제docker stop mycentos
docker rm mycentos
# 강제 옵션을 통한 삭제docker rm -f mycentos
모든 도커 컨테이너 삭제 - prune
prune 명령어를 사용하면 모든 컨테이너를 한번에 삭제할 수 있다.
1
2
3
4
riley@DESKTOP-XXXXX:~$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
2.4 컨테이너를 외부에 노출
컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당 받는다.
기본적으로는 172.17.0.x의 IP를 순차적으로 받게 된다. (나는 WSL2 우분투 사용중이라 네트워크 정보가 조금 다른것 같다.)
ifconfig 명령어를 통해 도커의 NAT IP를 할당받은 eht0 인터페이스와 로컬 lo 인터페이스를 확인 할 수 있다.
외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩 해야 한다.
exec : 명령어를 사용하면 컨테이너 내부에서 명령어를 실행한 뒤 그 결과값을 반환 받을 수 있다.
-i, -t 옵션을 추가해 /bin/bash로 상호 입출력이 가능한 형태로 exec를 사용할 수 있다.
--link : deprecated 된 옵션이며 도커 브리지(bridge) 네트워크를 사용하면 link와 동일한 기능을 손쉽게 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ba1266d50e0 wordpress "docker-entrypoint.s…"3 seconds ago Up 2 seconds 0.0.0.0:57594->80/tcp wordpress
7a8d5ded323e mysql:5.7 "docker-entrypoint.s…"29 seconds ago Up 27 seconds 3306/tcp, 33060/tcp wordpressdb
# wordpress가 사용중인 포트 확인하기$ docker port wordpress
80/tcp -> 0.0.0.0:57594
포트 54746과 호스트의 80 포트와 매핑되었다.
2.6 도커 볼륨
도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되고 컨테이너의 변경 사항만 별도 저장하여 컨테이너의 정보를 보존한다.
이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장한다.
생성된 mysql 이미지에는 mysql을 실행하는 데 필요한 애플리케이션 파일이, 컨테이너 계층에는 워드프레스에서 쓴 로그인 정보나 게시글 등과 같은 데이터베이스를 운용하면서 쌓인 데이터가 저장된다.
위의 mysql 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 데이터베이스의 정보도 모두 사라진다. 도커는 컨테이너의 생성과 삭제가 매우 쉬으므로 데이터를 영속적(Persistent)로 활용할 수 있는 방법은 아래와 같다.
볼륨 생성 방법
호스트 볼륨 공유
볼륨 컨테이너 활용
도커가 관리하는 볼륨 이용
2.6.1 호스트 볼륨 공유
-v 옵션을 통해 ~/wordpress_db:/var/lib/mysql로 설정하여 [호스트 공유 디렉터리]:[컨테이너 공유 디렉터리] 형태로 디렉토리를 공유한다.
~/wordpress_db 에 mysql 구동에 필요한 파일이 공유된 것을 확인 할 수 있다. 컨테이너의 /var/lib/mysql 디렉터리는 호스트의 ~/wordpress_db 디렉터리와 동기화되는 것이 아니라 완전히 같은 디렉터리이다.