Docker 시작하기

토이(Toy) 프로젝트 테스트 환경을 구성하기위해 Docker를 사용하고 그 과정을 정리한 것으로 Docker를 깊이있게 다루는 글이 아님을 미리 알려드립니다.

Docker는 아주 간단하게 표현하면 컨테이너(container) 기반의 오픈소스 가상화 플랫폼입니다. 일반적으로 컨테이너는 화물 수송용 상자로 무언가를 담을 수 있는 크기와 모양이 규격화되어 있어 트레일러나 철도 그리고 대형 선박을 통해 물건을 운송할 수 있습니다.

이처럼, 컨테이너 기반이라는 것은 컨테이너와 같이 규격화된 인터페이스를 제공하여 그 안에서 프로그램의 실행 또는 관리를 할 수 있도록 하는 가상화 기술입니다.

Docker image

Docker imageDocker 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/

댓글남기기