6 min to read
Docker? #2 / TIL
Docker 실습 #1
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라는 이름을 가진 컨테이너를 실행한다.
[options] --name
: 컨테이너의 이름을 할당하며, 생략이 가능하다. (생략할 시 컨테이너의 이름은 랜덤 부여 된다.)[command arg] cowsay hi
: 컨테이너 실행 시 command인 cowsay 명령어를 호출하여(node를 호출하듯 이용) argument의 파라미터로 hi를 출력한다.
$ 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
이 작업은 세 가지 작업을 한 번에 실행한 명령이다.
run
: 컨테이너를 실행하는데, 이미지가 없다면 이미지를 받아온 뒤(pull) 실행한다.--rm
: 컨테이너를 일회성으로 실행한다. 컨테이너가 중지 or 종료될 때, 컨테이너와 관련된 리소르를 모두 제거한다.
danielkraic/asciiquarium
$ docker container run --it --rm danielkraic/asciiquarium:latest
-it
:-i
,-t
를 동시에 사용한 옵션이다. 이 명령을 통해 컨테이너를 대화형으로 실행하고, 컨테이너의 표준 입력과 가상 터미널을 연결하여 사용자가 컨테이너 내부에서 쉘을 실행하여 컨테이너 내부와 상호작용하거나, 로그 출력 등을 확인할 수 있다.
(주로 디버깅, 로그 확인, 명령어 실행 등의 목적으로 사용하는 옵션이다.)-i
: 컨테이너와 터미널 간의 표준 입력을 유지하는 옵션으로, 컨테이너 내부에서 키보드 입력을 받을 수 있다.-t
: 가상 터미널을 할당하는 옵션으로 컨테이너 내부에서 터미널과 상호작용할 수 있다.
- 위 명령을 실행하면 아래와 같은 화면이 영상처럼 움직이는데,
ctri + c
로 종료할 수 있다.
Pacman !
앞선 내용에서는 사용할 모든 파일이 하나의 이미지에 구성되어 있고, 그 이미지를 사용하는 방법을 학습했다. 그러나 게임 서버, 웹 서버와 같이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우도 있다.
- 웹 서버는 도커 컨테이너로 실행
- 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성
위와 같은 경우는 서버에 문제가 생기는 것을 호스트와 별개로 파악하여 문제가 생긴 서버를 끄고, 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있다.
로컬에 있는 파일과 도커 이미지를 연결하는 방법
- CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사
- Volume : 호스트와 컨테이너 사이에 공간을 *마운트
팩맨 게임을 로컬에서 실행하기 위해
먼저, Github에 pacman-canvas 레포를 fork해서 clone 한다.
이 레포에 구성되어 있는 파일들을 웹 서버에 업로드해서 사용해보자.
사용할 도커 이미지는 *httpd(http daemon)이다.
httpd는 /usr/local/apache2/htdocs/
경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 한다.
$ docker container run -p 818:80 httpd
httpd를 실행한다.
-p
: localhost의 포트와 컨테이너의 포트를 연결한다.- 818 = localhost의 포트
- 80 = 컨테이너의 포트
- httpd는 일정 시간 연결 기록이 없으면, 서버 가동이 중지된다.
-d
: 이 명령을 사용하면 컨테이너를 백그라운드에서 실행하게 해준다.
실행이 되고 있는지 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
- –tag는 name:tag 형식으로 이미지를 생성할 수 있다.
- 지정한 경로에 있는 Dockerfile을 찾아서 빌드한다.
$ docker run --name my_web -p 901:80 my_pacman:2.0
localhost:901을 통해 웹 서버가 작동하고 있는지 확인해보면, 위에서 보여주었던 pacman 게임 화면이 호스팅한 포트에서 구동되고 있는 것을 확인할 수 있다.