Docker 해부 (3) - Installation and Container Lifecycle
macOS의 Docker Desktop과 Linux 서버 설치, hello-world 한 줄이 하는 일, 그리고 run이 매번 새 container를 만든다는 사실과 created, running, exited로 이어지는 lifecycle을 정리합니다.
Docker 해부 시리즈의 3편입니다. 전체 목차는 0편에 있습니다.
설치
macOS는 Docker Desktop을 설치합니다.
1
2
3
brew install --cask docker # 또는 공식 사이트의 dmg
open -a Docker # 앱을 실행해야 daemon이 뜬다
docker version # Client와 Server 정보가 둘 다 나오면 정상
docker version에서 Server 쪽이 Cannot connect to the Docker daemon 에러로 비어 있으면 Docker Desktop 앱이 꺼져 있는 것입니다. CLI는 daemon에 요청을 보내는 창구일 뿐이라는 2편의 구조가 여기서 바로 확인됩니다.
Linux 서버는 공식 설치 스크립트를 씁니다.
1
2
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # 재로그인 후 sudo 없이 사용
docker 그룹에 든 계정은 사실상 root 권한을 갖게 되므로, 공용 서버에서는 이 편의 설정을 신중하게 결정합니다.
첫 실행: hello-world 한 줄이 하는 일
1
2
3
docker run hello-world
이 한 줄에서 네 단계가 일어납니다. 로컬에 hello-world image가 없음을 확인하고, Docker Hub에서 pull 하고, container를 만들어 실행하고, 메시지를 출력한 뒤 종료합니다. run 명령이 pull까지 겸한다는 것, 그리고 container는 맡은 프로세스가 끝나면 함께 종료된다는 것이 이 출력에 담겨 있습니다.
container lifecycle
1
2
3
4
5
6
7
8
9
docker pull python:3.12-slim # image 받기 (run이 겸하므로 생략 가능)
docker images # 로컬 image 목록
docker run -it python:3.12-slim # container 실행, -it로 터미널 연결 (Python REPL이 뜬다)
docker ps # 실행 중인 container
docker ps -a # exited 포함 전체
docker start <이름|ID> # exited container 다시 시작
docker stop <이름|ID> # 정지
docker rm <이름|ID> # container 삭제
docker rmi python:3.12-slim # image 삭제
REPL에서 exit로 나오면 container는 exited 상태가 됩니다. 이때 개념 세 개를 정확히 잡아야 합니다.
- run은 매번 새 container를 만듭니다. run은 create와 start의 축약이라서, 같은 run 명령을 두 번 실행하면 container가 두 개 생깁니다. 어제 쓰던 container를 다시 쓰려면 run이 아니라 start입니다
- exited는 삭제가 아닙니다. 종료된 container는
docker ps -a에 남아 있고, start로 다시 시작할 수 있으며, rm 해야 사라집니다. 그래서 일회성 실행에는--rm옵션을 붙여 종료와 동시에 삭제되게 합니다 - 이름을 붙이면 다루기 쉽습니다.
--name pg처럼 이름을 주면 이후 stop, rm, logs를 이름으로 부를 수 있습니다. 이름이 없으면 무작위 이름이 붙습니다
image 삭제는 rmi인데, 그 image로 만든 container가 남아 있으면 거부됩니다. container를 먼저 rm 해야 image를 지울 수 있습니다.
다음 편에서 run의 핵심 옵션들로 실제 서비스(PostgreSQL)를 띄우고 다룹니다.
다음 글: Docker 해부 (4) - Working with Containers: run, logs, and exec