참고문서:
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