Docker? #2 / TIL

Docker 실습 #1

Featured image

docker/whalesay

먼저, 내가 사용하는 Ubuntu 환경은 Docker 명령어를 실행하려면 항상 sudo 권한을 붙여서 실행해야 하는 번거로움이 있다. 그 번거로움을 없애기 위해 다음 명령을 실행한 후 실습을 진행하자.

$ sudo usermod -aG docker $USER
$ sudo su - $USER

위 명령을 실행한 후 docker 명령을 사용하면 sudo를 앞에 붙이지 않아도 된다.

이제 docker에서 제공된 whalesay라는 이미지를 가져와서 출력해보자!

$ docker image pull docker/whalesay:latest 

docker/whalesay의 최신 이미지를 받아온다.

$ docker image ls
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
hello-world                latest    feb5d9fea6a5   18 months ago   13.3kB
danielkraic/asciiquarium   latest    7bab964067d2   4 years ago     309MB
docker/whalesay            latest    6b362a9f73eb   7 years ago     247MB

docker image 리스트 출력

$ docker container run --name whalesay docker/whalesay:latest cowsay hi
 ____ 
< hi >
 ---- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/

whalesay라는 이름을 가진 컨테이너를 실행한다.

$ docker container ps -a
CONTAINER ID   IMAGE                    COMMAND          CREATED             STATUS                       PORTS        NAMES
63b03ff29855   docker/whalesay:latest   "cowsay hi"      3 minutes ago       Exited (0) 3 minutes ago                  peaceful_heyrovs

ps -a 는 컨테이너의 모든 리스트를(종료된 컨테이너 포함) 출력한다.

–name을 생략해서 실행 후 NAMES 부분을 보면 peaceful_heyrovs라고 이름이 부여된 걸 볼 수 있다.

$ docker container rm peaceful_heyrovs
peaceful_heyrovs
# 컨테이너 지우기 / 컨테이너의 이름이 출력되면서 지워진다.

$ docker image rm docker/whalesay
# 이미지 지우기

위와 같이 이미지와 컨테이너를 지울 수도 있다.


$ docker container run --rm docker/whalesay cowsay boo

이 작업은 세 가지 작업을 한 번에 실행한 명령이다.



danielkraic/asciiquarium

$ docker container run --it --rm danielkraic/asciiquarium:latest



Pacman !

앞선 내용에서는 사용할 모든 파일이 하나의 이미지에 구성되어 있고, 그 이미지를 사용하는 방법을 학습했다. 그러나 게임 서버, 웹 서버와 같이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우도 있다.

  1. 웹 서버는 도커 컨테이너로 실행
  2. 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성

위와 같은 경우는 서버에 문제가 생기는 것을 호스트와 별개로 파악하여 문제가 생긴 서버를 끄고, 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있다.

로컬에 있는 파일과 도커 이미지를 연결하는 방법

팩맨 게임을 로컬에서 실행하기 위해
먼저, Github에 pacman-canvas 레포를 fork해서 clone 한다. 이 레포에 구성되어 있는 파일들을 웹 서버에 업로드해서 사용해보자.

사용할 도커 이미지는 *httpd(http daemon)이다.
httpd는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 한다.

$ docker container run -p 818:80 httpd

httpd를 실행한다.

실행이 되고 있는지 localhost:818 를 주소창에 입력해보면, 다음과 같은 화면과 함께 httpd가 작동되고 있는 것을 볼 수 있다.

서버가 정상적으로 열리면, 로컬 호스트에 있는 파일을 컨테이너에 전달한다. 다음 명령은 pacman-canvas 디렉토리에서 실행해야한다.

$ docker container cp ./ cranky_swartz:/usr/local/apache2/htdocs

httpd를 실행할 때 컨테이너 이름을 지정하지 않아서 ‘cranky_swartz’라는 랜덤 이름이 부여 되었다. (docker container ps -a를 통해 확인함)

혹시 컨테이너를 다룰 때, 뭔가 제대로 되지 않는다면, 다음 명령을 사용해 컨테이너 내부 터미널로 접속할 수 있다. 팩맨 실습에서는 컨테이너 속 ‘usr/local/apache2/htdocs’ 경로를 잘 살펴보자.

$ docker exec -it 컨테이너_이름 bash

이제 Docker Container를 이미지 파일로 변환해보자.

$ docker container commit cranky_swartz my_pacman:1.0

$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
my_pacman      1.0       77f27e6405ce   10 seconds ago   162MB

구동한 컨테이너를 commit 하면, images에서 my_pacman 1.0을 확인할 수 있다.

$ docker run --name pacman -p 900:80 my_pacman:1.0

900번 포트에서 pacman이라는 웹 서버의 이미지를 구동하고, localhost:900을 통해 작동 여부를 확인해 보자.

정상적으로 작동한다 !


Dockerfile


Dockerfile은 컨테이너 이미지를 생성하기 위한 스크립트로, Docker 이미지를 구성하는 데 사용되는 파일이다. 이미지를 빌드 하기 위해서는 Dockerfile이 필요하다.

FROM httpd:2.4
COPY ./ /usr/local/apache2/htdocs/

베이스 이미지를 httpd:2.4로 사용한다.

로컬에 있는 파일을(웹 서비스) /usr/local/apache2/htdocs/ 경로(httpd 이미지 파일 경로)에 복사한다.

$ docker build --tag my_pacman:2.0
$ docker run --name my_web -p 901:80 my_pacman:2.0

localhost:901을 통해 웹 서버가 작동하고 있는지 확인해보면, 위에서 보여주었던 pacman 게임 화면이 호스팅한 포트에서 구동되고 있는 것을 확인할 수 있다.



단어 정리
*마운트(mount) : 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용해서, 마치 하나의 저장 공간을 이용하는 것 처럼 보이게 하는 작업
*httpd(http daemon) : Apache HTTP Serer를 실행할 수 있는 오픈소스 웹 서버 소프트웨어