욱'S 노트

Docker Engine - Quickstart Containers 본문

Programming/Docker

Docker Engine - Quickstart Containers

devsun 2016. 2. 17. 10:42

Quickstart Docker Engine


이 퀵스타트는 도커 엔진이 동작하도록 설치가 되어있다고 가정한다. 엔진이 설치되었는지를 확인하기 위해 다음과 같은 명령을 수행해보자.


$ docker info

Containers: 12

Images: 14

Storage Driver: aufs

 Root Dir: /mnt/sda1/var/lib/docker/aufs

 Backing Filesystem: extfs

 Dirs: 38

 Dirperm1 Supported: true

Execution Driver: native-0.2

Logging Driver: json-file

Kernel Version: 4.0.9-boot2docker

Operating System: Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015

CPUs: 1

Total Memory: 1.956 GiB

Name: default

ID: HKZF:4Z5M:L7XJ:ISX7:HEVF:BDZS:EBWI:LOR3:KVS4:JNRI:UDSA:V4SH

Debug mode (server): true

File Descriptors: 12

Goroutines: 16

System Time: 2016-02-17T01:28:02.039605398Z

EventsListeners: 0

Init SHA1:

Init Path: /usr/local/bin/docker

Docker Root Dir: /mnt/sda1/var/lib/docker

Username: devsun98

Registry: https://index.docker.io/v1/

Labels:

 provider=virtualbox


만약 도커를 설치했는데, 명령을 찾을 수 없다거나 /var/lib/docker/repositories에 대한 권한이 없다고 나온다면 불완전하게 도커 엔진이 설치되었거나 엔진에 접근할 수 있는 권한이 불충분하다는 것이다. 도커 엔진에 대한 명령은 도커 그룹이나 루트 유저로 실행해야 한다.


엔진 시스템 설정에 따라 각 도커 명렬은 sudo로 수핼시켜야 할 수 있다. sudo를 회피하는 하나의 방법은 docker라는 유닉스 그룹을 생성하고 전체 도커 커맨드에 접근할 수 있는 유저를 docker 그룹에 추가하는 것이다.


도커 엔진의 설치나 sudo 설정에 대한 더 많은 정보를 얻으려면 당신의 os에 설치 지시에 언급된 내용을 잘 살펴보자.


Download a pre-built image


$ docker pull ubuntu

Using default tag: latest

latest: Pulling from library/ubuntu

f15ce52fc004: Pull complete

c4fae638e7ce: Pull complete

a4c5be5b6e59: Pull complete

8693db7e8a00: Pull complete

library/ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Digest: sha256:457b05828bdb5dcc044d93d042863fba3f2158ae249a6db5ae3934307c757c54

Status: Downloaded newer image for ubuntu:latest


이 명령은 도커허브에서 ubuntu라는 이미지를 찾은 후 로컬 이미지 캐쉬로 해당 이미지를 다운로드 받는 것이다.


Running an interactive shell


우분투 이미지에 있는 대화형 쉘을 실행해보자.


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

root@5615e8b6c789:/#


-i 플래그는 대화형 컨테이너를 실행하는 것이다. -t 플래그는 표준입출력을 위한 pseudo-TTY를 생성한다.


exit 명령을 사용하지 않고 tty를 분리한다면 Ctrl-p + Ctrl-q 이스케이브를 사용하면 된다. 컨테이너를 exit로 나오면 stopped 상태로 컨테이너는 계속 존재할 것이다. stopped 나 running 상태의 모든 컨테이너를 리스트할려면 docker ps -a 커맨드를 사용하면 된다.


To detach the tty without exiting the shell, use the escape sequence Ctrl-p + Ctrl-q. The container will continue to exist in a stopped state once exited. To list all containers, stopped and running, use the docker ps -a command.


Bind Docker to another host/port or a Unix socket


주의 : 기본 도커 데몬에 바인딩된 TCP 포트 또는 유닉스 docker 유저 그룹을 변경시키면 non-root 유저가 호스트에 대한 root 권한을 획득할 수 있는 보안 리스크가 증대된다. docker에 접근 권한을 확실히 해야한다. 만약 TCP port를 바인딩하면 누구든지 해당 포트로 모든 도커에 접근할 수 있다. 


-H 플래그로 도커 데몬이 특정한 IP나 포트를 listen할 수 있도록 만들 수 있다. 기본적으로 도커 데몬은 unix:///var/run/docker.sock에 있는 내용들을 루트 유저에 의한 로컬 커넥션만을 허용한다. 0.0.0.0:2375 또는 특정한 호스트 IP로 세팅하면 모두에게 접근권한을 주는 것이다. 하지만 이것은 권장하지 않는데 이유는 데몬이 실행되고 있는 호스트에 루트 권한을 획득할 수 있는 위험이 있기 때문이다.


비슷하게 도커 클라이언트는 -H를 사용하여 커스텀 포트로 접속할 수 있다. 도커 클라이언트는 기본적으로 unix:///var/run/docker.sock를 리눅스에서는 사용하고 윈도우에서는 tcp://127.0.0.1:2376을 사용한다.


-H는 접근 호스트와 포트를 할당한다. 


tcp://[host]:[port][path] or unix://path


For example:


tcp:// -> TCP 접속 로컬호스트에서 2376 포트로 TLS 암호화가 설정된 상태로 가능 또는 2375 포트로 plain text 커뮤니케이션 가능

tcp://host:2375 -> host:2375 상에 TCP 접속

tcp://host:2375/path -> host:2375으로 TCP 접속하고 모든 리퀘스트에 path를 첨가

unix://path/to/socket -> path/to/socket에 위치한 Unix 소켓


-H 하고 비워두면 -H를 전달하지 않았을때와 같음


-H 플래그는 TCP 바인딩을 위한 단순한 폼을 허용함 


`host:` 또는 `host:port` 또는 `:port`


도커를 데몬모드로 실행 


$ sudo <path to>/docker daemon -H 0.0.0.0:5555 &


우분투 이미지를 다운로드


$ docker -H :5555 pull ubuntu


또한 우리는 다수의 -H를 사용할 수 있다. 예를들어 tcp와 유닉스 소켓을 모두 리슨하고 싶다면 다음과 같이 한다.


도커를 데몬 모드로 실행


$ sudo <path to>/docker daemon -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &


디폴트 유닉스 소켓을 이용하여 우분투 이미지를 다운로드


$ docker pull ubuntu


또는 TCP 포트를 사용해서 다운로드


$ docker -H tcp://127.0.0.1:2375 pull ubuntu


Starting a long-running worker process


long-running 프로세스는 매우 유용하다.

$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")


작업의 아웃풋을 수집하자.

$ docker logs $JOB


작업을 종료하자.

$ docker kill $JOB


Listing containers


$ docker ps # running 중인 컨테이너 리스트

$ docker ps -a # 모든 컨테이너 리스트


Controlling containers


# 새로운 컨테이너 시작

$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")


# 컨테이너 종료

$ docker stop $JOB


# 컨테이너 시작

$ docker start $JOB


# 컨테이너 재시작

$ docker restart $JOB


# 컨테이너 킬

$ docker kill $JOB


# 컨테이너 제거

$ docker stop $JOB # 제거할 컨테이너는 반드시 종료되어야 한다.

$ docker rm $JOB


Bind a service on a TCP port


# 컨테이너의 4444 포트를 바인드 시켜 netcat이 해당 포트를 리슨하게 한다.

$ JOB=$(docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444)


# 컨테이너의 Nated 퍼블릭 포트는 무엇인가?

$ PORT=$(docker port $JOB 4444 | awk -F: '{ print $2 }')


# 퍼블릭 포트로 연결한다.

$ echo hello world | nc 127.0.0.1 $PORT


# 네트워크 연결이 잘 동작하는것을 확인한다.

$ echo "Daemon received: $(docker logs $JOB)"


Committing (saving) a container state


컨테이너 상태를 이미지에 저장한다. 상태는 재사용될 수 있다.


컨테이너를 커밋하면 도커는 소스 이미지와 현재 상태의 이미지와 차이점만을 저장한다. 가지고 있는 이미지를 출력하기 위해서는 docker images 명령을 사용한다.


# 새로운 이름을 가진 이미지로 컨테이너를 커밋한다.

$ docker commit <container> <some_name>


# 이미지를 리스트한다.

$ docker images



Comments