Docker 시작하기
토이(Toy) 프로젝트 테스트 환경을 구성하기위해 Docker
를 사용하고 그 과정을 정리한 것으로 Docker
를 깊이있게 다루는 글이 아님을 미리 알려드립니다.
Docker
는 아주 간단하게 표현하면 컨테이너(container)
기반의 오픈소스 가상화 플랫폼입니다.
일반적으로 컨테이너는 화물 수송용 상자로 무언가를 담을 수 있는 크기와 모양이 규격화되어 있어 트레일러나 철도 그리고 대형 선박을 통해 물건을 운송할 수 있습니다.
이처럼, 컨테이너 기반이라는 것은 컨테이너와 같이 규격화된 인터페이스를 제공하여 그 안에서 프로그램의 실행 또는 관리를 할 수 있도록 하는 가상화 기술입니다.
Docker image
Docker image
는 Docker container
에서 코드를 실행하는 데 사용되는 여러 레이어로 구성된 파일입니다. 이것은 ISO 파일과 유사한 개념이라고 생각하면 좀 이해하기 쉬운 것 같습니다.
(참고: 디스크 이미지)
Docker 설치
테스트 환경
- macOS Mojave 10.14.2
- Homebrew 1.9.2
Docker 설치를 위해 아래 명령을 사용합니다.
$ brew cask install docker
==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/30215/Docker.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'docker'.
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺 docker was successfully installed!
설치가 완료되면, /Application/Docker.app
앱이 생성됩니다.
Docker.app
을 두번 클릭해서 Docker를 실행시킵니다.
그러면, Docker 프로그램이 실행되면서 메뉴바에서 고래(?) 모양의 Docker 아이콘이 활성화됩니다.
설치된 Docker의 버전을 확인합니다.
$ docker --version
Docker version 18.09.1, build 4c52b90
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
$ docker-machine --version
docker-machine version 0.16.1, build cce350d7
어플리케이션 실행
터미널에서 아래 명령을 실행하여 간단한 웹 서버를 실행시켜 보도록 하겠습니다. 웹 서버가 로컬에서 발견되지 않으면 Docker Hub
에서 가져옵니다.
Docker Hub
는 Docker 컨테이너 이미지를 저장 및 배포하는 클라우드 기반 저장소입니다.
# docker run :새로운 컨테이너를 실행하라는 명령
# --detach : 실행되는 컨터이너를 백그라운드로 실행하고 컨테이너 ID를 출력
# --publish=80:80 : 호스트에서 사용하는 port:컨테이너에서 사용하는 port를 80:80 으로 발행
# host:80 -> container:80
# --name : docker image 'nginx'를 'webserver'라는 이름으로 할당
$ docker run --detach --publish=80:80 --name=webserver nginx
Unable to find image 'nginx:latest' locally # nginx:latest 버전 이미지가 로컬에 없으므로
latest: Pulling from library/nginx # Docker hub에서 가져옵니다.
5e6ec7f28fb7: Pull complete
ab804f9bbcbe: Pull complete
052b395f16bc: Pull complete
Digest: sha256:4c47bf32cd72eaa779f051e3a077d3ed160e18b8e0dbaf1f705027d8ea6be5c8
Status: Downloaded newer image for nginx:latest
b96ace6157484deab4d9001fb7de2858b1f70323f9e85bbc54efebf2380c1f12
컨테이너가 성공적으로 실행되고 있는지 docker ps
또는 docker container ls
명령으로 확인해보겠습니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 9 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp webserver
컨테이너가 실행되고 있는 것을 확인했으니 웹 서버가 정상 동작하는지도 확인해보겠습니다.
브라우저를 열고 http://localhost/
로 이동하면 아래와 같이 nginx 홈페이지를 확인할 수 있습니다.
컨테이너 목록 조회
docker container ls
또는 docker ps
명령으로 실행중인 컨테이너 목록을 조회할 수 있습니다.
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 3 days ago Up 3 days 0.0.0.0:80->80/tcp webserver
실행 여부와 상관없이 모든 컨테이너 목록은 -a
또는 --all
옵션을 추가하여 조회할 수 있습니다.
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 3 days ago Up 9 seconds webserver
5c8cbfa6b1a3 hello-world "/hello" 3 days ago Exited (0) 3 days ago awesome_mclaren
실행중인 컨테이너 중지
docker container stop {container.name}
명령으로 실행중인 컨터이너를 실행을 중지할 수 있습니다.
$ docker container stop webserver
webserver
# 실행 중인 컨테이너가 조회되지 않음
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker container ls -a
명령으로 webserver
컨테이너가 성공적으로 실행 중지된 것을 확인할 수 있습니다.
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 3 days ago Exited (0) 2 minutes ago webserver
5c8cbfa6b1a3 hello-world "/hello" 3 days ago Exited (0) 3 days ago awesome_mclaren
중지된 컨테이너 실행
실행 중지된 컨테이너를 docker container start {container.name}
명령으로 다시 실행할 수 있습니다.
$ docker container start webserver
webserver
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 3 days ago Up 9 minutes 0.0.0.0:80->80/tcp webserver
5c8cbfa6b1a3 hello-world "/hello" 3 days ago Exited (0) 3 days ago awesome_mclaren
컨테이너 제거
docker container rm {container.name}
명령으로 더 이상 사용하지 않는 컨테이너를 제거할 수 있습니다.
단, 컨테이너 제거를 위해서는 컨테이너가 실행 중지 상태여야 합니다.
$ docker container rm awesome_mclaren
awesome_mclaren
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17b6cbcddd nginx "nginx -g 'daemon of…" 3 days ago Up 13 minutes 0.0.0.0:8080->80/tcp webserver
이미지 제거
더 이상 사용하지 않는 이미지를 docker image rm {image.name}
명령으로 제거할 수 있습니다.
# 설치된 모든 이미지 목록 조회
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 42b4762643dc 5 days ago 109MB
hello-world latest fce289e99eb9 3 weeks ago 1.84kB
조회된 이미지 목록에서 ‘nginx’ 이미지를 제거합니다.
$ docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:4c47bf32cd72eaa779f051e3a077d3ed160e18b8e0dbaf1f705027d8ea6be5c8
Deleted: sha256:42b4762643dcc9bf492b08064b55fef64942f055f0da91289a8abf93c6d6b43c
Deleted: sha256:e0e55dd2303b3e3ec852acae267d1f8a3eea27a22c64a5829304ecee4d3f559c
Deleted: sha256:4062cf272cdd99e83b1c21f712e5e1359c91ecf92925e56c62133c3324b84e45
Deleted: sha256:3c816b4ead84066ec2cadec2b943993aaacc3fe35fcd77ada3d09dc4f3937313
만약, 컨테이너가 해당 이미지를 참조하고 있다면, 아래와 같이 이미지 제거 시 에러가 발생합니다.
컨테이너를 먼저 제거하거나 -f
또는 --force
옵션을 추가해서 강제적으로 삭제할 수 있습니다.
$ docker image rm nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 5c17b6cbcddd is using its referenced image 42b4762643dc
정리
여기까지 아주 간단하게 docker
의 설치, 실행 명령어들을 알아보았습니다.
앞으로, 여러가지 어플리케이션을 docker
에서 실행하고, 관리하는 것들을 정리해보도록 하겠습니다.
참고
- https://docs.docker.com/
- http://avilos.codes/infra-management/virtualization-platform/docker/what-is-docker-image/
- http://www.opennaru.com/open-source/containers-metaphor-for-what-docker-is/
댓글남기기