욱'S 노트

Docker - Run a simple application 본문

Programming/Docker

Docker - Run a simple application

devsun 2016. 3. 11. 14:33

Run a simple application


“Hello world in a container“에서 우리는 docker run 커맨트를 이용해 첫번째 컨테이너를 띄웠다. 우리는 foreground에서 대화형 컨테이너를 실행하였고, 또한 백그라운드에서 분리된 컨테이너를 실행하였다. 이러한 과정중에 몇가지 Docker 커맨드를 배울 수 있었다.


docker ps - 컨테이너들의 리스트를 출력

docker logs - 컨테이너의 표준 출력을 보여준다.

docker stop - 실행중인 컨테이너를 중지한다.


Learn about the Docker client


인지하지 못했지만 우리는 이미 도커 클라이언트를 이용하였다. 클라이언트는 단순한 커맨드라인이다. 클라리언트는 각 명령 과 각 명령의 일련의 플래그 및 인자를 처리한다.

# Usage:  [sudo] docker [subcommand] [flags] [arguments] ..

# Example:

$ docker run -i -t ubuntu /bin/bash


docker version 명령을 통해 우리는 버젼정보와 현재 설치된 도커 클라이언트와 데몬의 정보를 얻을 수 있다..

$ docker version


이 커맨드는 우리가 사용하고 있는 도커 클라이언트와 데몬의 버젼뿐만 아니라 Go의 버젼도 확인할 수 있다.

Client:

 Version:      1.8.2

 API version:  1.20

 Go version:   go1.4.2

 Git commit:   0a8c2e3

 Built:        Thu Sep 10 19:10:10 UTC 2015

 OS/Arch:      darwin/amd64


Server:

 Version:      1.8.2

 API version:  1.20

 Go version:   go1.4.2

 Git commit:   0a8c2e3

 Built:        Thu Sep 10 19:10:10 UTC 2015

 OS/Arch:      linux/amd64


Get Docker command help


도커 커맨드의 상세한 설명을 출력한다. 도움말은 옵션과 사용법을 상세히 설명한다. 사용가능한 커맨드의 리스트를 확인하려면 다음과 같은 커맨드를 사용한면된다.

$ docker --help


특정한 커맨드의 상세한 사용법이 궁금하다면 커맨드 다음에 --help 프래그를 명시하면 된다.


$ docker attach --help


Usage: docker attach [OPTIONS] CONTAINER


Attach to a running container


  --help=false        Print usage

  --no-stdin=false    Do not attach STDIN

  --sig-proxy=true    Proxy all received signals to the process


Running a web application in Docker


이제 도커 클라이언트에 관한 더 많은 내용에 대해서 배워보겠다. 더 많은 컨테이너를 실행할 것이다. 우리는 도커에 예제 웹어플리케이션을 실행해볼것이다.


우리는 Python Flask 어플리케이션을 실행할 것이다. 도커 커맨드는 다음과 같다.

$ docker run -d -P training/webapp python app.py


수행한 커맨드를 복습해보자. 우리는 두가지 플래그를 명시했다 : -d, -P. -d 플래그는 이미 본적이 있다. 이것은 컨테이너를 데몬으로 실행하겠다는 것이다. -P 플래그는 새로운 것인다. 호스트에게 컨테이너 내부의 필요한 네트워크 포트를 매핑하라고 도커에게 명령하는 것이다. 이것은 우리에게 웹 어플리케이션을 보여준다.


우리는 특정한 이미지를 명시했다. : traning/webapp. 이미지는 미리 빌드된 이미지로 간단한 Python Flask 웹 어플리케이션을 포함하고 있다.


마지막으로 우리는 컨테이너가 실행할 명령을 명시하였다. : python app.py. 이것은 우리의 웹 어플리케이션을 실행한다.


Viewing our web application container


이제 docker ps 명령을 통해 실행중인 컨테이너를 살펴보자.

$ docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES

b51ac2411ae0        training/webapp     "python app.py"     5 minutes ago       Up 5 minutes        0.0.0.0:32768->5000/tcp   desperate_franklin


우리는 새로운 플래그를 명시했는데 -l이다. 이것은 가장 마지막에 시작된 컨테이너의 상세를 리턴한다.


Note: 기본적으로 docker ps 커맨드는 실행중인 컨테이너에 대한 정보만을 보여준다. 만약 중지된 컨테이너에 대한 것을 확인할려면 -a 프래그를 명시해야한다.


우리는 처음으로 PORTS라는 중요한 칼럼이 상세에 추가된 것을 알 수 있다. 

PORTS

0.0.0.0:32768->5000/tcp


docker run 커맨드에 -P 플래그를 전달했을 때 이미지의 어떠한 포트가 호스트에 매핑되어 노출된 것을 알 수 있다.


Note: 도커 이미지의 포트가 어떻게 노출되는지는 이미지 빌드에 대해서 배울때 배우게 될 것이다.


이번 경우 도커 이미지의 5000 포트가 호스트의 32768 포트 노출된 것을 알 수 있다.


도커에서 네트워크 포트 바인딩은 설정할 수 있다. 지난 예제의 -P 플래그는 -p 5000의 숏컷이다. 우리는 또한 -p 플래그를 통해 특정 포트를 바인딩할 수도 있다.

$ docker run -d -p 80:5000 training/webapp python app.py


이것은 컨테이너 내부의 5000포트를 우리 로컬 호스트의 80 포트로 매핑하는것이다. 하나 궁금중이 생길수 있다. 왜 1:1 포트 매핑을 해야 하는가?


두가지 파이썬 어플리케이션을 테스트한다고 가정해보자 컨테이너 내부에서는 둘다 5000 포트로 바인딩되어 있을 것이다. 도커 매핑이 없다면 우리의 호스트에 하나의 컨테이너 밖에 띄울 수 없는 상황이 된다.


이제 브라우저에서 32768포트로 접근해보자.


Viewing the web application.


파이썬 어플리케이션이 수행중이다.


Note: 만약 OS X, Windows, Linux에서 버츄얼 머신을 사용하고 있다면 localhost 대신에 버츄얼 호스트의 IP를 사용해야 한다. 이럴 경우 docker-machine ip your_vm_nam 커맨드로 IP를 얻을 수 있다. 


$ docker-machine ip default

192.168.99.100


이 경우 브라우저에서 http://192.168.99.100:32768로 접속해야 한다. 


A network port shortcut


docker ps 명령으로 매핑된 포트를 보는 것은 약간 별로이다. 이럴때 사용할 수 있는 숏컷이 docker port이다. docker port에 컨테이너의 id나 이름을 명시하면 퍼블릭으로 노출된 port을 얻을 수 있다.

$ docker port desperate_franklin 5000

0.0.0.0:32768



Viewing the web application’s logs


또한 우리는 웹 어플리케이션의 로그를 볼 수 있는데 이것은 이전의 예와 동일하다.


$ docker logs -f desperate_franklin

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

192.168.99.1 - - [11/Mar/2016 06:16:03] "GET / HTTP/1.1" 200 -

192.168.99.1 - - [11/Mar/2016 06:16:03] "GET /favicon.ico HTTP/1.1" 404 -


이번에는 새로운 플래그 -f를 볼 수 있다. 이것은 마치 tail -f 커맨드와 비슷하게 동작한다.


Looking at our web application container’s processes


우리는 또한 docker top 커맨드로 컨테이너 내부에 실행되는 프로세스를 확인할 수 있다.

$ docker top desperate_franklin

PID                 USER                COMMAND

1435                root                python app.py



Inspecting our web application container


마지막으로 docker inspect 명령으로 도커의 로우-레벨정보를 획득할 수 있다. 이것은 특정 컨테이너의 유용한 설정정보와 상태정보를 JSON 도큐먼트로 리턴한다.

$ docker inspect desperate_franklin

[

{

    "Id": "b51ac2411ae0923b4b968ab034209a7e3be63a3214d2a9ef94b21002300902df",

    "Created": "2016-03-11T05:48:30.151535507Z",

    "Path": "python",

    "Args": [

        "app.py"

    ],

. . .


우리는 또한 특정한 엘리먼트에 대한 요청으로 정보를 축약해서 얻을 수도 있다. 다음 예제는 컨테이너의 IP 주소에 대한 정보를 얻는 예제이다. we would:

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' desperate_franklin

172.17.0.5


Stopping our web application container


이제 웹어플리케이션이 동작하는 것을 확인하였다. 이제 중지 시켜보자. docker stop 커맨드에 컨테이너의 이름을 인자로 전달하면 된다.

$ docker stop desperate_franklin

desperate_franklin


docker ps 명령으로 컨테이너가 종료된 것을 확인하자.

$ docker ps -l


Restarting our web application container


컨테이너를 다시 기동하는데는 두가지 초이스가 있다. : 새로운 컨테이너를 만들거나 예전것을 리스타트하거나. 먼저 이전 컨테이너를 다시 시작해보자.

$ docker start desperate_franklin

desperate_franklin


docker ps 명령으로 확인하고 브라우저를 통해 접속해보자.


Note: docker restart 커맨드로도 가능하다. restart 커맨드는 컨테이너를 stop하고 다시 start한다.


Removing our web application container


마지막으로 컨테이너를 삭제해보자.


$ docker rm desperate_franklin

Error response from daemon: Cannot destroy container desperate_franklin: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f

Error: failed to remove containers: [desperate_franklin]


위에서 보다시피 삭제하기 전에는 먼저 중지를 수행해야 한다.


$ docker stop desperate_franklin

desperate_franklin

$ docker rm desperate_franklin

desperate_franklin


이제 컨테이너는 중지되고 삭제되었다.


'Programming > Docker' 카테고리의 다른 글

Docker - Build your own images  (0) 2016.03.11
Docker Engine - Hello world in a container  (0) 2016.02.18
Docker Engine - Architecture  (0) 2016.02.17
Docker Engine - Quickstart Containers  (0) 2016.02.17
Docker - Tag, push, and pull your image  (0) 2016.02.02
Comments