Docker

2015/9/6更新

対応バージョン: 1.5.0 via Ubuntu15.04

Dockerのコンテナを作成してコンソール接続するまでの一連の手順を示す。後半ではDockerfileによるイメージ自動生成の手順についても記す。

インストール、サービス有効化 & 起動

インストール
% sudo apt install docker.io

% sudo docker info
Containers: 0
Images: 0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
Execution Driver: native-0.2
Kernel Version: 3.19.0-22-generic
Operating System: Ubuntu 15.04
CPUs: 4
Total Memory: 7.489 GiB
Name: k1
ID: F6AV:UOKQ:R2QW:WXSA:ZGU5:3USC:ZGYW:GJPX:BQZ7:NVR5:F7OX:AYTL
WARNING: No swap limit support

% sudo docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.3.3
Git commit (client): a8a31ef
OS/Arch (client): linux/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.3.3
Git commit (server): a8a31ef
サービス有効化
% sudo systemctl enable docker.service
Synchronizing state for docker.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d docker defaults
Executing /usr/sbin/update-rc.d docker enable
サービス起動
% sudo systemctl start docker.service

% sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2015-09-06 19:36:59 JST; 2h 39min ago
     Docs: http://docs.docker.com
 Main PID: 955 (docker)
   Memory: 186.4M
   CGroup: /system.slice/docker.service
           └─955 /usr/bin/docker -d -H fd://
:

Dockerイメージインポート、コンテナ作成

DockerイメージはDocker Hub Registryにて配布されており、docker pullコマンドでダウンロードする。

ここではCentOSの最新バージョン7(64bit)をダウンロードする。

% sudo docker pull centos:latest
Pulling repository centos
7322fbe74aa5: Download complete 
f1b10cd84249: Download complete 
c852f6d61e65: Download complete 
Status: Downloaded newer image for centos:latest

特定のバージョンをダウンロードしたい場合は以下のようにバージョンを明記する。

% sudo docker pull centos:centos6

ダウンロードしたイメージはdocker imagesコマンドで確認できる。

% sudo docker images
REPOSITORY  TAG      IMAGE ID      CREATED        VIRTUAL SIZE
centos      7        7322fbe74aa5  9 minutes ago  172.2 MB
centos      latest   7322fbe74aa5  9 minutes ago  172.2 MB
centos      centos7  7322fbe74aa5  9 minutes ago  172.2 MB

イメージが用意できたらコンテナを作成する。

docker run [オプション] [--name {コンテナ名}] {イメージ名}[:{タグ名}] [コンテナで実行するコマンド] [引数]

オプションには以下のものが使用できる。

-d

コンテナをバックグラウンドで実行(デフォルトはフォアグラウンド)

-i

コンテナの標準入力を開く。コマンドラインからコンテナを操作する際に指定

-t

ttyを確保する。上記-iと組み合わせて使用

-p {ホストのポート番号}:{コンテナのポート番号}

Dockerサーバのホストとコンテナとのポートマッピング

ここではコンテナを作成してフォアグラウンドで操作してみる。

% sudo docker run -it --name c7 centos:7 /bin/bash
[root@efffd4e08c2d /]# uname -a
Linux efffd4e08c2d 3.19.0-25-generic #26-Ubuntu SMP Fri Jul 24 21:17:31 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

[root@efffd4e08c2d /]# cat /etc/system-release
CentOS Linux release 7.1.1503 (Core) 

[root@e4b3620a8f99 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  11728  2904 ?        Ss   03:45   0:00 /bin/bash
root        26  0.0  0.0  19772  2264 ?        R+   03:51   0:00 ps aux

[root@efffd4e08c2d /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
10: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

[root@e4b3620a8f99 /]# ip r
default via 172.17.42.1 dev eth0 
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4 

[root@e4b3620a8f99 /]# df -h
Filesystem                Size  Used Avail Use% Mounted on
none                      451G   49G  380G  12% /
tmpfs                     3.8G     0  3.8G   0% /dev
shm                        64M     0   64M   0% /dev/shm
/dev/disk/by-uuid/72a...  451G   49G  380G  12% /etc/hosts
tmpfs                     3.8G     0  3.8G   0% /proc/kcore

[Ctrl] + [d]でbashを終了する。これによりコンテナは停止する。コンテナを動作させたままホストに戻る場合は[Ctrl] + [p]に続けて[Ctrl] + [q]を押下する。

コンテナの一覧はdocker psで確認できる。-aを付けると停止中のコンテナも表示される。

(コンテナが起動中の場合)

% sudo docker ps
CONTAINER ID  IMAGE     COMMAND      CREATED        STATUS                    PORTS  NAMES
e4b3620a8f99  centos:7  "/bin/bash"  9 minutes ago  Up About a minute                c7                  

(コンテナが停止している場合)

% sudo docker ps -a
CONTAINER ID  IMAGE     COMMAND      CREATED        STATUS                    PORTS  NAMES
efffd4e08c2d  centos:7  "/bin/bash"  9 minutes ago  Exited (0) 9 seconds ago         c7                  

動作中のコンテナに接続するにはdocker attachを実行する。

% sudo docker attach c7
[Enter]

ちなみにコンテナ上のファイルシステムはホスト上の/var/lib/docker/aufsにレイヤ毎の差分として格納される。

% sudo ls -l /var/lib/docker/aufs
合計 12
drwxr-xr-x 7 root root 4096  9月  6 19:25 diff
drwxr-xr-x 2 root root 4096  9月  6 19:25 layers
drwxr-xr-x 7 root root 4096  9月  6 19:25 mnt

コンテナ起動・停止

コンテナの起動と停止はそれぞれdocker start、docker stopでコンテナIDかコンテナ名を指定して行う。startに-iオプションを付けるとコンテナに接続してシェルが実行できる。

% sudo docker start c7
c7

% sudo docker ps
CONTAINER ID  IMAGE     COMMAND      CREATED        STATUS         PORTS  NAMES
10c0a89cc9b6  centos:7 "/bin/bash"   9 minutes ago  Up 14 seconds         c7

% sudo docker stop c7
c7

% sudo docker ps -a

CONTAINER ID  IMAGE     COMMAND      CREATED        STATUS                    PORTS  NAMES
e4b3620a8f99  centos:7  "/bin/bash"  9 minutes ago  Exited (0) 12 seconds ago        c7                  

コンテナ削除

docker rmを使用する。

% sudo docker rm c7
c7

% sudo docker ps -a
CONTAINER ID  IMAGE     COMMAND      CREATED        STATUS         PORTS  NAMES

イメージ削除

docker rmiを使用する。

% sudo docker images
REPOSITORY  TAG      IMAGE ID      CREATED        VIRTUAL SIZE
centos      7        7322fbe74aa5  9 minutes ago  172.2 MB
centos      latest   7322fbe74aa5  9 minutes ago  172.2 MB
centos      centos7  7322fbe74aa5  9 minutes ago  172.2 MB

% sudo docker rmi 7322fbe74aa5
Untagged: centos:7
Untagged: centos:centos7
Untagged: centos:latest
Deleted: 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
Deleted: c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
Deleted: f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639

% sudo docker images
REPOSITORY  TAG      IMAGE ID      CREATED      VIRTUAL SIZE

イメージ作成

コンテナの今の状態をイメージとして保存する場合はdocker commitを実行する。

docker commit [オプション] コンテナ名 [リポジトリ名:{タグ名}]
% sudo docker commit c7 centos:test
939ea32d41bbb5cc3f01354be331e8477c151fbceeff02c45ea556dc27b771d8

% sudo docker images
REPOSITORY  TAG      IMAGE ID      CREATED        VIRTUAL SIZE
centos      test     939ea32d41bb  4 seconds ago  172.2 MB
centos      latest   7322fbe74aa5  9 minutes ago  172.2 MB
centos      7        7322fbe74aa5  9 minutes ago  172.2 MB
centos      centos7  7322fbe74aa5  9 minutes ago  172.2 MB

基のイメージとの差分は前述の/var/lib/docker/aufs/diffに格納される。

% sudo ls -l /var/lib/docker/aufs/diff/939ea32d41bbb5cc3f01354be331e8477c151fbceeff02c45ea556dc27b771d8
合計 8
dr-xr-x--- 2 root root 4096  9月  6 19:37 root
drwxrwxrwt 2 root root 4096  9月  6 19:46 tmp

Dockerfile

Dockerfileを用意しておくことでイメージの作成が自動化できる。

docker build -t リポジトリ名:{タグ名} Dockerfileのパス

Dockerfileには以下のような命令が記述できる。

共通

FROM

ベースイメージの指定

MAINTAINER

作者名

docker buidの際に実行される

RUN

コマンド実行

ADD

特定ファイルへのファイルの追加

docker runの際に実行される

ENV

環境変数の設定

CMD

コマンド実行(上書き可)

ENTRYPOINT

コマンド実行(上書き不可)

例としてnginxをインストールして起動するためのDockerfileを示す。nginxのようにデーモンとして動作するサービスは起動時にはデーモン化せず(nginx.confに「daemon off;」を記述)、コンテナ作成時に-dオプションを付けてコンテナ自体をデーモン化する。

FROM centos:7
RUN yum update -y 
RUN yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
CMD ["nginx"]

このDockerfileを使ってイメージを作成する。

% sudo docker build -t nginx .

% sudo docker images
REPOSITORY  TAG      IMAGE ID      CREATED         VIRTUAL SIZE
nginx       latest   a6537c9b5eb4  2 minutes ago   369.4 MB
centos      7        7322fbe74aa5  24 minutes ago  172.2 MB
centos      latest   7322fbe74aa5  24 minutes ago  172.2 MB
centos      centos7  7322fbe74aa5  24 minutes ago  172.2 MB

イメージが作成できたらコンテナを作成する。前述のように-dオプションを付けてコンテナをデーモンモードで動作させる。

% sudo docker run -d -p 8080:80 --name nginx nginx

% sudo docker ps
CONTAINER ID  IMAGE         COMMAND  CREATED        STATUS        PORTS                 NAMES
f3abcd7b5747  nginx:latest  "nginx"  9 seconds ago  Up 9 seconds  0.0.0.0:8080->80/tcp  nginx               

動作確認を行う。ホスト側の8080番ポートにアクセスしてコンテナ内のnginxが応答すればOKである。

% curl http://localhost:8080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
: