Linux Docker.

참고문서:
https://docs.docker.com/engine/installation/ubuntulinux/
https://docs.docker.com/engine/userguide/
https://docs.docker.com/engine/userguide/basics/

 

I. 설치

1. 설치(ubuntu 14.04 에서).

아래 커맨드로, docker repository를 위한 pgp key를 등록한다.

# apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.fq7Qgn6cd8 --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
gpg: requesting key 2C52609D from hkp server pgp.mit.edu
gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) <docker@docker.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

docker repository를 등록한다. /etc/apt/sources.list.d/docker.list 화일을(없으면 만들고) 아래와 같이 편집한다. os version이 ubuntu14.04이므로 trusty repository를 등록.

#vi /etc/apt/sources.list.d/docker.list
# Ubuntu Trusty
deb https://apt.dockerproject.org/repo ubuntu-trusty main

ubuntu 14.04 이전 버전에서는 설치 시 커널을 업그레이드 해 주어야 하지만, 여기서는 14.04 이기 때문에, 커널 업그레이드는 필요 하지 않다.

# apt-get install docker-engine
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  aufs-tools cgroup-lite git git-man liberror-perl
Suggested packages:
  git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk
  gitweb git-arch git-bzr git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  aufs-tools cgroup-lite docker-engine git git-man liberror-perl
0 upgraded, 6 newly installed, 0 to remove and 3 not upgraded.
Need to get 9,067 kB of archives.
After this operation, 50.4 MB of additional disk space will be used.
Do you want to continue? [Y/n]

docker가 잘 설치되었는지 확인해 본다. 아래와 같이 보이면 잘 설치된 것이다.

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:517f03be3f8169d84711c9ffb2b3235a4d27c1eb4ad147f6248c8040adb93113
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com


For more examples and ideas, visit:
 https://docs.docker.com/userguide/

2. 선택 사항(추가설정)

‘docker’ 그룹 만들기.

docker 데몬은 tcp 포트 대신 unix socket을 사용한다. unix socket은 보통 root 소유이고, 다른 사용자들은 sudo 를 통해 접근 가능하다. 이런 연유로 docker는 항상 ‘root’ 권한으로 실행된다.
‘docker’ 커맨드를 사용할 때, sudo 사용을 피하려면, ‘docker’ 그룹을 만들고, sudo 사용가능한 사용자를 ‘docker’그룹에 속하게 해주면 된다. docker 데몬이 시작 될 때, ‘docker’그룹이 unix socket을 읽고 쓸 수 있도록 한다.

ubuntu 14.04에서 docker를 설치하면, ‘docker’ 그룹이 만들어져 있을 것이다. 따라서, sudo 커맨드를 사용할 수 있는 사용자에게는 아래처럼 ‘docker’ 그룹을 추가해 주면 된다. 아래는 id가 snowfox인 사용자에게 ‘docker’ 그룹을 추가해주는 명령어이다.

# usermod -aG docker snowfox

이제, ID snowfox 로 로그인한 후 docker 커맨드를 사용했을 때, 아래와 같은 결과를 얻을 수 있다.

snowfox@ubuntu:~$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

UFW 설정.
docker 호스트가 실행되는 서버에서 ufw가 실행되고 있다면, 추가 설정이 필요하다. docker는 bridge를 사용해서 container 네트워킹을 관리한다. UFW는 기본적으로 forward 패킷을 drop한다. 따라서 UFW가 enable되어 있는 상태에서 docker를 실행중이라면, forwarding 룰을 추가해주어야 한다.
또한 UFW는 기본적으로 모든 incoming 트래픽을 deny한다. 만약 다른 호스트에서 container에 연결하기를 원한다면 docker 포트에 incomming connect를 허용해 주어야 한다. docker의 기본 포트는 TLS 사용하는 경우 2376, 사용하지 않는 경우 2375 이다. TLS를 사용하지 않는다면, 통신은 암호화되지 않을 것이다. 기본적으로 docker는 TLS 사용하지 않고 실행된다.

UFW 사용 중인지 확인한다.

# ufw status
Status: active

/etc/default/ufw에서 forward 정책을 수정한다.

# vi /etc/default/ufw 

#DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_FORWARD_POLICY="ACCEPT"

수정하고 UFW룰을 reload한다.

# ufw reload
Firewall reloaded

docker 포트로 들어오는 연결을 허용해준다.

# ufw allow 2375/tcp
Rule added
Rule added (v6)

Docker에 의해 사용하는 dns 서버 설정.

/etc/default/docker에서 아래 부분처럼 주석을 제거해준다. 구글 public DNS를 사용하지 않는다면, 8.8.8.8 대신 사용할 dns서버의 ip주소를 넣어주면 된다.

# vi /etc/default/docker

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

II. 사용하기.

1. docker 명령어와 Dcker Hub
Dcker Hub는 Docker Inc.에 의해 관리되는 공개된 repository 이며, 이미 build된 15000 개 이상의 이미지를 제공한다. docker는 search, pull, login, push 명령어로 Docker Hub 서비스에 접근할 수 있다.

docker login : 계정이 없다면, 간단하게 만들 수 있다.

$ docker login
Username: snowfox
Password:
Email: xxxx@xxxmail.com
WARNING: login credentials saved in /home/snowfox/.docker/config.json
Account created. Please use the confirmation link we sent to your e-mail to activate it.

로그인을 하려고하면, 아래처럼 계정이 활성되지 않았다는 메시지가 나온다.

$ docker login
Username (snowfox): snowfox
Error response from daemon: Login: Account is not Active. Please check your e-mail for a confirmation link.

email을 확인하고, 계정을 활성화 하면, 아래처럼 로그인 할 수 있다.

$ docker login
Username (snowfox): snowfox
WARNING: login credentials saved in /home/snowfox/.docker/config.json
Login Succeeded

docker search : Docker Hub 에서 이미 만들어진 image를 검색하여 보여준다.
ubunu를 검색하면 아래와 같은 결과를 볼 수 있다. 첫번째, 두번째줄의 official 항목에 OK 표시가 나오는 이미지가 공식 이미지이고, 아래쪽 toursware/speedus-ubuntu는 speedus-ubuntu라는 이미지 이름으로 toursware 사용자가 만든 것 이다.

snowfox@ubuntu:~$ docker search ubuntu
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                         Ubuntu is a Debian-based Linux operating s...   2593      [OK]
ubuntu-upstart                 Upstart is an event-based replacement for ...   42        [OK]
torusware/speedus-ubuntu       Always updated official Ubuntu docker imag...   25                   [OK]
sequenceiq/hadoop-ubuntu       An easy way to try Hadoop on Ubuntu             23                   [OK]
ubuntu-debootstrap             debootstrap --variant=minbase --components...   19        [OK]
tleyden5iwx/ubuntu-cuda        Ubuntu 14.04 with CUDA drivers pre-installed    18                   [OK]
rastasheep/ubuntu-sshd         Dockerized SSH service, built on top of of...   14                   [OK]
guilhem/vagrant-ubuntu                                                         11                   [OK]
n3ziniuka5/ubuntu-oracle-jdk   Ubuntu with Oracle JDK. Check tags for ver...   5                    [OK]
sameersbn/ubuntu                                                               5                    [OK]
nimmis/ubuntu                  This is a docker images different LTS vers...   3                    [OK]
ioft/armhf-ubuntu              [ABR] Ubuntu Docker images for the ARMv7(a...   3                    [OK]
nuagebec/ubuntu                Simple always updated Ubuntu docker images...   3                    [OK]
maxexcloo/ubuntu               Docker base image built on Ubuntu with Sup...   2                    [OK]
armbuild/ubuntu-debootstrap    ARMHF port of ubuntu-debootstrap                2                    [OK]
seetheprogress/ubuntu          Ubuntu image provided by seetheprogress us...   1                    [OK]
densuke/ubuntu-jp-remix        Ubuntu Linuxの日本語remix風味です                       1                    [OK]
baselibrary/ubuntu             ThoughtWorks Ubuntu Docker Image                1                    [OK]
isuper/base-ubuntu             This is just a small and clean base Ubuntu...   1                    [OK]
densuke/ubuntu-supervisor      densuke/ubuntu-jp-remix:trusty 上で supe...       0                    [OK]
rallias/ubuntu                 Ubuntu with the needful                         0                    [OK]
zoni/ubuntu                                                                    0                    [OK]
esycat/ubuntu                  Ubuntu LTS                                      0                    [OK]
vicamo/ubuntu-phablet-jiexi    Dockerfile for developing Ubuntu JieXi PDK.     0                    [OK]
tvaughan/ubuntu                https://github.com/tvaughan/docker-ubuntu       0                    [OK]

docker pull : 원하는 이미지를 설치한다.
search로 원하는 이미지를 찾았으면, pull 명령어로 설치한다. 위에서 찾은 ubuntu 공식 이미지를 설치 하려면 아래와 같이 하면 된다.

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu

c63fb41c2213: Pull complete
99fcaefe76ef: Pull complete
5a4526e952f0: Pull complete
1d073211c498: Pull complete
Digest: sha256:8b1bffa54d8a58395bae61ec32f1a70fc82a939e4a7179e6227eb79e4c3c56f6
Status: Downloaded newer image for ubuntu:latest

docker images : 다운로드 받은 이미지를 확인 할 수 있다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              1d073211c498        2 weeks ago         187.9 MB
hello-world         latest              0a6ba66e537a        3 weeks ago         960 B

docker push : 내가 만든 docker 이미지를 업로드한다.
내가 만든 docker 이미지를 업로드하려면, docker push id/image_name 형식의 명령어를 사용한다.

docker run : container를 만든다.
-i 옵션은 interactive, -t 옵션은 Pseudo TTY 옵션으로 stdin/stdout으로 입출력이 가능하게 해준다.

$ docker run -i -t ubuntu /bin/bash
root@eae76e8f16a3:/#
root@eae76e8f16a3:/#

container 에서 shell(bash)을 종료하지 않고 tty를 떼어내려면, Ctrl+p, Ctrl+q 를 순서대로 누른다. 그리고, docker ps -a 명령어로 확인해보면, 쉘을 종료하지 않았기 때문에, 상태가 Up 으로 나오는 것을 확인 할 수 있다.

$ docker run -it ubuntu /bin/bash
root@ed77cc644c46:/#  ---이 부분에서 escape 신호를 준다(Ctrl+p, Crtl+q)
root@ed77cc644c46:/#
root@ed77cc644c46:/# 

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                    PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         About a minute ago   Up About a minute                             drunk_jang
06e7caf1e9db        ubuntu              "/bin/bash"         19 hours ago         Exited (0) 16 hours ago                       insane_mestorf
be8981a00294        ubuntu              "/bin/bash"         19 hours ago         Exited (0) 19 hours ago                       hungry_rosalind

docker ps : container 리스트를 확인한다.

옵션 없이 사용하면, 현재 running중인 container만 보여주며, -a 옵션을 사용하면 모든 container를 볼 수 있다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         11 minutes ago      Up 11 minutes                           drunk_jang


$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         13 minutes ago      Up 13 minutes                                 drunk_jang
06e7caf1e9db        ubuntu              "/bin/bash"         19 hours ago        Exited (0) 16 hours ago                       insane_mestorf
be8981a00294        ubuntu              "/bin/bash"         19 hours ago        Exited (0) 19 hours ago                       hungry_rosalind
e6ea695cbd89        ubuntu              "/bin/bash"         19 hours ago        Exited (0) 19 hours ago                       sharp_archimedes
eae76e8f16a3        ubuntu              "/bin/bash"         23 hours ago        Exited (0) 19 hours ago                       lonely_payne
a951626ca6ec        hello-world         "/hello"            44 hours ago        Exited (0) 44 hours ago                       berserk_nobel
383b49028029        hello-world         "/hello"            4 days ago  

docker start : 정지된 container를 실행한다.
exited 상태인 container를 아래처럼 시작할 수 있다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         2 days ago          Exited (0) 15 minutes ago                       drunk_jang
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Exited (0) 13 seconds ago                       insane_mestorf
$ docker start 06e7caf1e9db
06e7caf1e9db
snowfox@ubuntu:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Up 6 seconds                            insane_mestorf

docker stop : 실행중인 container를 정지시킨다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Up 4 seconds                            insane_mestorf
$ docker stop 06e7caf1e9db
06e7caf1e9db
snowfox@ubuntu:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker restart : 정지된 또는 실행중인 container를 재 실행한다.
바로 위 예에서, 상태가 exited 인 container(ID 06e7caf1e9db)를 재 실행하려면, restart 뒤에 container ID를 붙여주면 된다. 재 실행하고 ps 로 확인해보면, 상태가 UP 된 것을 확인 할 수 있다.

$ docker restart 06e7caf1e9db
06e7caf1e9db
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Up 5 seconds                            insane_mestorf

이때, container를 처음 만들었을 때(docker run -it ubuntu /bin/bash) 처럼 shell 프롬프트가 떨어지지는 않는다. 이때는 attach 명령어를 사용한다.

docker attach :

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Up 3 minutes                            insane_mestorf
$ docker attach 06e7caf1e9db
root@06e7caf1e9db:/#

docker rm : container를 삭제한다.
container를 삭제하려면, rm 명령을 사용한다. rm 뒤에 삭제하고자 하는 container id를 나열하면 된다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         2 days ago          Exited (0) 20 minutes ago                       drunk_jang
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Exited (0) 2 minutes ago                        insane_mestorf
be8981a00294        ubuntu              "/bin/bash"         2 days ago          Exited (0) 2 days ago                           hungry_rosalind
e6ea695cbd89        ubuntu              "/bin/bash"         2 days ago          Exited (0) 31 minutes ago                       sharp_archimedes
eae76e8f16a3        ubuntu              "/bin/bash"         3 days ago          Exited (0) 2 days ago                           lonely_payne
a951626ca6ec        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                           berserk_nobel
383b49028029        hello-world         "/hello"            6 days ago          Exited (0) 6 days ago                           stupefied_cray
89f66e4d1cb7        hello-world         "/hello"            6 days ago          Exited (0) 6 days ago                           cocky_mclean
4e720732bfb5        hello-world         "/hello"            9 days ago          Exited (0) 9 days ago                           elated_mccarthy
25ab51e0eafb        hello-world         "/hello"            9 days ago          Exited (0) 9 days ago                           evil_banach
$ docker rm 25ab51e0eafb 4e720732bfb5
25ab51e0eafb
4e720732bfb5
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ed77cc644c46        ubuntu              "/bin/bash"         2 days ago          Exited (0) 20 minutes ago                       drunk_jang
06e7caf1e9db        ubuntu              "/bin/bash"         2 days ago          Exited (0) 3 minutes ago                        insane_mestorf
be8981a00294        ubuntu              "/bin/bash"         2 days ago          Exited (0) 2 days ago                           hungry_rosalind
e6ea695cbd89        ubuntu              "/bin/bash"         2 days ago          Exited (0) 31 minutes ago                       sharp_archimedes
eae76e8f16a3        ubuntu              "/bin/bash"         3 days ago          Exited (0) 2 days ago                           lonely_payne
a951626ca6ec        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                           berserk_nobel
383b49028029        hello-world         "/hello"            6 days ago          Exited (0) 6 days ago                           stupefied_cray
89f66e4d1cb7        hello-world         "/hello"            6 days ago          Exited (0) 6 days ago                           cocky_mclean

docker top : container에서 실행중인 프로세스를 확인
docker top CONTAINER_ID 형식으로, 아래는 ID가 ed77cc644c46인 container에서 mysql 서버가 실행 중임을 알 수 있다.

$ docker top ed77cc644c46
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                29373               14461               0                   09:31               pts/1               00:00:00            /bin/bash
root                29430               29373               0                   09:32               pts/1               00:00:00            /bin/sh /usr/bin/mysqld_safe
message+            29783               29430               0                   09:32               pts/1               00:00:00            /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306

docker info : docker가 설치되어 있는지 확인 설치되어 있다면, 아래와 비슷한 화면을 볼 수 있다.

$ docker info
Containers: 9
Images: 6
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 24
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-25-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 2
Total Memory: 1.954 GiB
Name: ubuntu
ID: 2LP7:Z5IC:F2QL:ATII:7EMI:36O7:AG7U:6VEY:GQSP:V4PW:PM5M:UCS2
Username: snowfox
Registry: https://index.docker.io/v1/
WARNING: No swap limit support

답글 남기기

Your email address will not be published.