Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

컨테이너로 작업하기

컨테이너는 docker run 명령으로 실행할 수 있다. 이 때 두 종류의 컨테이너를 실행 할 수 있다.
  • 포그라운드(forground)로 실행되며, 키보드와 모니터를 이용해서 유저와 상호작용 할 수 있다.
  • 백그라운드로 실행 할 수 있다.
그 밖에 아래와 같은 도커 명령들을 살펴볼 것이다.
  • docker ps : 컨테이너의 목록 확인
  • docker logs : 컨테이너의 표준출력을 확인할 수 있다.
  • docker stop : 실행중인 컨테이너 종료
도커 컨테이너를 실행해 보자.
# sudo docker run -i -t ubuntu /bin/bash

docker version명령으로 도커 클라이언트와 도커 데몬의 버전을 확인 할 수 있다.
# docker version
Client version: 1.2.0
Client API version: 1.14
Go version (client): go1.2.1
Git commit (client): fa7b24f
OS/Arch (client): linux/amd64
Server version: 1.2.0
Server API version: 1.14
Go version (server): go1.2.1
Git commit (server): fa7b24f
도커의 버전과 함께, 도커의 기동을 위해서 필요한 git, go에 대한 버전정보도 함께 출력한다.

도커 클라이언트 명령어 확인

아무런 명령없이 실행하면, 도커에서 사용 할 수 있는 명령들을 출력한다.
# docker

Commands:
  attach    Attach to a running container
  build     Build an image from a Dockerfile
  commit    Create a new image from a container's changes
  cp        Copy files/folders from a container's filesystem to the host path
  diff      Inspect changes on a container's filesystem
  events    Get real time events from the server
...

명령어별 도움말 보기

도커 명령어를 입력하고 엔터를 입력하면 자세한 사용법을 출력한다.
# docker attach
Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

  --no-stdin=false    Do not attach STDIN
...
명령 다음에 --help를 이용해도 동일한 도움말 화면을 볼 수 있다.
# docker attach --help
Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

도커로 웹 애플리케이션 실행하기

도커 클라이언트를 이용하면 하나 이상의 도커 컨테이너를 만들 수 있다. 특히 유용한 기능은 컨테이너에게 실행할 명령을 전달할 수 있다는 점이다. 컨테이너에서 hello world를 실행하는 예제다.
# docker run ubuntu echo /bin/echo "hello world"
hello world
ubuntu 이미지로 부터 컨테이너가 실행되고, /bin/echo "hello world"를 실행한다. 실행결과를 표준출력 하고, 컨테이너는 종료된다. Djangonode.js와 같은 애플리케이션 이미지로 부터, 웹 서비스 컨테이너를 실행 하는 식으로 확장할 수 있다. Python Flask 애플리케이션을 포함한 training/webapp이미지로 테스트를 했다.
# docker run -d -P training/webapp python app.py
로컬에 training/webapp이 없다면, 자동으로 다운로드 한다.
  • -d : 데몬모드로 실행한다.
  • -P : 도커 데몬이 로컬의 적당한 포트를 선택해서, 애플리케이션 포트로 포트포워딩 한다.
컨테이너가 실행되면서, python app.py를 실행하고, 플라스크 애플리케이션이 실행된다.

컨테이너 정보 확인

앞서 실행한 컨테이너의 정보를 docker ps로 확인해 보자.(중요한 정보만 출력하게 편집했다.)
# docker ps
CONTAINER ID  IMAGE           COMMAND           PORTS                     NAMES
fdd0e7eb3dc0  training/webapp "python app.py"   0.0.0.0:49154->5000/tcp   sick_davinci 
여기에서 가장 중요한 정보는 웹 애플리케이션의 포트포워딩 정보다.
0.0.0.0:49154->5000/tcp
49154 포트를 컨테이너의 5000번 포트로 포워딩하고 있다. 로컬의 포트는 도커가 적당한 걸 선택하는데, 애플리케이션의 포트를 어떻게 선택했는지 궁금할 수 있겠다. 이미지를 만들 때, 포워딩에 사용할 포트를 설정 할 수 있다. 이 정보는 Working with Docker Images를 참고하자.

curl로 테스트해보자.
# curl -v localhost:49154
* Rebuilt URL to: localhost:49154/
* Hostname was NOT found in DNS cache
*   Trying ::1...
* Connected to localhost (::1) port 49154 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:49154
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 12
< Server: Werkzeug/0.10.4 Python/2.7.6
< Date: Sat, 16 May 2015 07:22:26 GMT
< 
* Closing connection 0

-P옵션을 사용하면 32768 ~ 61000 사이의 포트를 선택한다. -p(소문자다)옵션을 이용해서 아래와 같이 포트를 특정 할 수 있다.
# docker run -d -p 5000:5000 training/webapp python app.py
이제 호스트의 5000번 포트로 애플리케이션 서버에 연결할 수 있다.

네트워크 포트정보 확인

docker ps명령으로 포트정보를 확인 할 수 있기는 하지만, 다른 정보들이 많아서 화면이 좀 지저분하다. docker port를 이용하면, 애플리케이션 포트가 로컬의 어떤 포트에서 포워딩되는지를 쉽게 확인 할 수 있다.
# docker port my_docker_app 5000
0.0.0.0:49155

웹 애플리케이션 로그 확인

docker logs 명령으로 애플리케이션에서 (굳이 로그인 하지 않고도)어떤일이 일어나는지 확인할 수 있다.
# docker logs -f my_docker_app
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.200.1 - - [16/May/2015 12:36:06] "GET / HTTP/1.1" 200 -
192.168.200.1 - - [16/May/2015 12:36:11] "GET / HTTP/1.1" 200 -
192.168.200.1 - - [16/May/2015 12:36:26] "GET /login HTTP/1.1" 404 -
-f 옵션을 이용하면 컨테이너의 정보를 tail -f처럼 표준출력한다.

컨테이너의 프로세스 정보 확인

top명령으로 프로세스의 정보를 확인할 수 있다.
# docker top my_docker_app
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1746                605                 0                   May16               ?                   00:00:00            python app.py

컨테이너의 상세 정보

docker inspect명령으로 컨테이너의 상세정보를 확인 할 수 있다. 정보는 json으로 출력된다.
# docker inspect !$
docker inspect my_docker_app
[{
    "Args": [
        "app.py"
    ],
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "python",
            "app.py"
        ],

    }
}]
......
원하는 데이터만 따로 뽑아낼 수도있다. 예를 들어 컨테이너의 IP주소를 확인하고 싶다면 아래와 같이 하면된다.
# docker inspect -f '{{ .NetworkSettings.IPAddress }}' my_docker_app
172.17.0.2

컨테이너 종료

docker stop으로 컨테이너를 종료 할 수 있다.
# docker stop my_docker_app
my_docker_app
dokcer ps로 컨테이너가 stop 된걸 확인 할 수 있다.

컨테이너 재 시작

컨테이너를 재 시작하는 방법은 두 가지가 있다.
  • 이미지로 부터 새로운 컨테이너를 시작한다.
  • 이전의 컨테이너를 다시 시작한다. 이전 컨테이너 아이디 혹은 컨테이너 이름으로 docker start하면 된다.
docker restart를 이용할 수도 있다. 해당 컨테이너에 대해 docker stopdocker start를 수행한다.

컨테이너 삭제

docker start로 stop된 컨테이너를 다시 실행 할 수 있는 이유는, stop이 도커를 삭제하지 않고 중지만 하기 때문이다. docker rm명령을 이용해서 컨테이너를 삭제할 수 있다. 삭제하기 전에 먼저 stop 해야 한다.
# docker stop my_docker_app
# docker rm my_docker_app