読者です 読者をやめる 読者になる 読者になる

Foreverly

メモ帳

Docker入門

Docker infracture as code

Dockerとは何か。

軽量な仮想環境を実現するためのツール。 OSやアプリの設定したものをイメージ化して保存できる。 Docker環境の別のマシンにも移すことができる。

なにをする。

DockerがインストールされたOSを用意する。 OSやアプリが入った実行imageを実行するdocker run 今回は実行imageはDocker Indexから取ってくるdocker pull 実行したらContainerというものができる。 Containerで設定やアプリ、インストールしたりして設定する。 そこから新しくimageを作る場合はdocker commit 作成したimageを他のマシンで動かしたい場合は docker pushでimageをDocker Indexに持って行き、 移したい先のマシンでdocker pull , docker runをすればよい。 imageを持ってきたらContainerができる。

OSインストール

Vagrantbox.esから Official Ubuntu 14.04 daily Cloud Image amd64 (Development release, No Guest Additions)のイメージを使用します。

使い方

To use the available boxes just replace {title} and {url} with the information in the table below.

$ vagrant box add {title} {url}
$ vagrant init {title}
$ vagrant up

なので

$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ mkdir Docker
$ cd Docker/
$ vagrant init trusty64
$ vi Vagrantfile

config.vm.network “private_network”, ip: “192.168.33.10”

config.vm.network “private_network”, ip: “192.168.55.44”

$ vagrant up
$ vagrant ssh

公式サイトを参照してインストールします。

Docker1.12.1がインストールされました。

$ sudo docker --version
Docker version 1.12.1, build 23cf638

また、CentOS7にインストールするならyumで良いと思います。

yum -y install docker
systemctl start docker
systemctl enable docker

Dockerの操作

DockerでcentosのimageをsearchでDocker Indexから探してみます。 imageが見つかったらdocker pullで引っ張ってきます。 docker imagesでimageをもってこれたことを確認しました。 imageを消すにはdocker rmiで削除できます。

$ sudo docker search centos |more
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                          The official build of CentOS.                   2613      [OK]
jdeathe/centos-ssh              CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8...   29                   [OK]
jdeathe/centos-ssh-apache-php   CentOS-6 6.8 x86_64 / Apache / PHP / PHP M...   19                   [OK]
nimmis/java-centos              This is docker images of CentOS 7 with dif...   15                   [OK]
million12/centos-supervisor     Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos        Always updated official CentOS docker imag...   8                    [OK]
[以下略]
$ sudo docker pull centos
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              980e0e4c79ec        7 hours ago         196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
$ sudo docker inspect [IMAGE-ID]
$ sudo docker images
$ sudo docker rmi [IMAGE ID]
$ sudo docker images

centosというimageを実行してContainerを作りコマンドを実行します。

$ sudo docker run centos echo "Hello World"
Hello World

Containerが作られたかを確認するためにdocker psを実行しても確認できません。 動作が完了してしまっているので表示されませんでした。 既に完了しているContainerを確認するためにはps -aとします。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
7b88f37bfa42        centos              "echo 'Hello World'"   About a minute ago   Exited (0) About a minute ago                       compassionate_bassi
5fb7e2f68a58        hello-world         "/hello"               About an hour ago    Exited (0) About an hour ago                        amazing_kowalevski

最新5つのContainerを表示させるにはps -a -n=5です。 削除するにはrm CONTAINER IDで削除できます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a -n=5
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
7b88f37bfa42        centos              "echo 'Hello World'"   5 minutes ago       Exited (0) 5 minutes ago                           compassionate_bassi
5fb7e2f68a58        hello-world         "/hello"               About an hour ago   Exited (0) About an hour ago                       amazing_kowalevski
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker rm 7b
7b
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
5fb7e2f68a58        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       amazing_kowalevski

今度は実行中のContainerを確認してみます。 バックグラウンドで動かすにはrun -d CONTAINER IDが出力されるので、 logs CONTAINER IDで実行中のタスクログを確認できる。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run -d centos free -s 3
9396f8bf834796370f781293f9effd11f4af71e45a58025dbad6f8ba133cac20
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker logs 939
              total        used        free      shared  buff/cache   available
Mem:         501712      120312      137480         736      243920      359839
Swap:             0           0           0

              total        used        free      shared  buff/cache   available
Mem:         501712      119892      137796         736      244024      360327
(以下略)

フォアグラウンドに持って行く時はattachを使います。 止めるにはCtrl + C

$ sudo docker attach --sig-proxy=false 939

実行中のタスクをストップするにはkillstop 再開させるにはstart

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         2 minutes ago       Up 2 minutes                            modest_brattain
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker stop 939
939
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         2 minutes ago       Exited (137) 12 seconds ago                       modest_brattain
5fb7e2f68a58        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                            amazing_kowalevski
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker start 939
939
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         3 minutes ago       Up 2 seconds                                 modest_brattain
5fb7e2f68a58        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                       amazing_kowalevski

Containerに変更して、imageを作成する まずは-iインタラクティブモードにし、 -tでターミナルを立ち上げ、 imageを指定、 bashを指定してシェルを立ち上げContainerに入ります。

Containerに入れたので/home配下に移動してtest.txtを作成してみます。

$ sudo docker run -i -t centos /bin/bash
# ll
total 68
-rw-r--r--   1 root root 18307 Sep  6 14:02 anaconda-post.log
lrwxrwxrwx   1 root root     7 Sep  6 13:59 bin -> usr/bin
drwxr-xr-x   5 root root   380 Sep  7 20:23 dev
drwxr-xr-x  48 root root  4096 Sep  7 20:23 etc
drwxr-xr-x   2 root root  4096 Aug 12  2015 home
lrwxrwxrwx   1 root root     7 Sep  6 13:59 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Sep  6 13:59 lib64 -> usr/lib64
drwx------   2 root root  4096 Sep  6 13:59 lost+found
drwxr-xr-x   2 root root  4096 Aug 12  2015 media
drwxr-xr-x   2 root root  4096 Aug 12  2015 mnt
drwxr-xr-x   2 root root  4096 Aug 12  2015 opt
dr-xr-xr-x 111 root root     0 Sep  7 20:23 proc
dr-xr-x---   2 root root  4096 Sep  6 14:02 root
drwxr-xr-x  10 root root  4096 Sep  6 14:02 run
lrwxrwxrwx   1 root root     8 Sep  6 13:59 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096 Aug 12  2015 srv
dr-xr-xr-x  13 root root     0 Sep  7 20:23 sys
drwxrwxrwt   7 root root  4096 Sep  6 14:02 tmp
drwxr-xr-x  13 root root  4096 Sep  6 13:59 usr
drwxr-xr-x  18 root root  4096 Sep  6 14:02 var
# cd home/
# ll
total 0
# touch test.txt
# ll
total 0
-rw-r--r-- 1 root root 0 Sep  7 20:23 test.txt

Containerから抜けたらps -aでContainerを確認します。 先ほどできたContainerがあるので、IDを指定してimageを作ります。 docker commitで作成できます。「username/任意の名前」でimageの名前をつけます。 今回では「hoge/test」としました。 sudo docker imagesでimageが作成されたことを確認します。 hoge/testが作成されています。これを元にContainerを作成します。 sudo docker run -i -t hoge/test /bin/bashでContainerに入り、 test.txtがあることを確認。 これでContainerからimageを作成することができました。

# exit
~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
35695d6c9cef        centos              "/bin/bash"         About a minute ago   Exited (0) 26 seconds ago                       kickass_euclid
9396f8bf8347        centos              "free -s 3"         15 hours ago         Up 15 hours                                     modest_brattain
5fb7e2f68a58        hello-world         "/hello"            17 hours ago         Exited (0) 17 hours ago                         amazing_kowalevski
~$ sudo docker commit 356 hoge/test
sha256:c44f82ed12cc43c6b9a24256b0a99f62e69e9ac75ead52e9035f58214904511e
~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hoge/test           latest              c44f82ed12cc        8 seconds ago       196.7 MB
centos              latest              980e0e4c79ec        23 hours ago        196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
~$ sudo docker run -i -t hoge/test /bin/bash
# cd home/
# ll
total 0
-rw-r--r-- 1 root root 0 Sep  7 20:23 test.txt
  • Dockerコマンドのライフサイクルに関わる動作
サブコマンド 意味 実行後の状態
run デプロイ・起動 起動が成功したら稼働中/失敗したら停止中
stop 稼働中のDockerコンテナを停止 停止が成功したら停止中
start 停止中のDockerコンテナを起動 起動が成功したら稼働中
rm デプロイしたDockerコンテナを削除 存在しなくなる(startできなくなる)
  • Dockerコンテナの操作
サブコマンド 意味
exec 稼働中のコンテナでコマンドを実行
logs コンテナのログ(標準出力、標準エラー出力)をする
inspect コンテナ/イメージの詳細情報を表示
  • Dockerイメージ操作のコマンド
サブコマンド 意味
images DockeデーモンにあるDockerイメージ一覧を表示する
rmi DockerデーモンにあるDockerイメージを削除する

Dockerfile

docker build imageから新しいimage作成の自動化 自動化のスクリプトがDockerfile

Dockerfileを作成

vagrant@vagrant-ubuntu-trusty-64:~$ vi Dockerfile

FROMで何のイメージを元にするか指定します。 MAINTAINERで誰が書いたか記述します。 名前とメールアドレスを書いておきます。 コメントは#です。 今回コマンド2つ指定します。 RUNはbuildされるときに実行されるもの。 色んな物をインストールしたりすることができます。 今回はインストールではなく、now building...とだけ表示させます。 CMDはbuildされたimageを元に、runするときに実行されるもの。 (imageからContainerを作るときのこと) 書き方は実行したいものを,で区切り、[]で囲みます。

FROM centos
MAINTAINER FirstName LastName <email address>
# RUN: build時に実行
RUN echo "new building..."
# CMD: run時に実行
# CMD: echo "now runnning..."
CMD ["echo", "new running..."]

buildをしてみます。 sudo docker buildに新しいimageの名前をつけます。 -t hoge/test2とします。 カレントディレクトリにあるDockerfileを使うので.をつけます。 実行するとnow building...と出力されているのが確認できました。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker build -t hoge/test2 .
Sending build context to Docker daemon 13.31 kB
Step 1 : FROM centos
 ---> 980e0e4c79ec
Step 2 : MAINTAINER Gen dockerid <mailaddress>
 ---> Running in f506910e9ee7
 ---> b1af5b08522a
Removing intermediate container f506910e9ee7
Step 3 : RUN echo "new building..."
 ---> Running in b9c7c9ec39a1
new building...
 ---> feb31b681b6d
Removing intermediate container b9c7c9ec39a1
Step 4 : CMD echo new running...
 ---> Running in 858b8d74a51f
 ---> a646d9c9c705
Removing intermediate container 858b8d74a51f
Successfully built a646d9c9c705

sudo docker imagesを実行して、hoge/test2があることを確認できました。 実行するとnew running...と出力されることが確認できます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hoge/test2          latest              a646d9c9c705        12 seconds ago      196.7 MB
hoge/test           latest              c44f82ed12cc        About an hour ago   196.7 MB
centos              latest              980e0e4c79ec        24 hours ago        196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run hoge/test2
new running...

次はインストールを試してみます。

ApacheインストールするVagrantfileを書きます

build時にRUNでインストールさせます。 imagesの中にファイルを取り込むにはADDを使います。 index.htmlを/var/www/html/にコピーします。 EXPOSEで80番ポートを開けます。 runの時に実行するコマンドを CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]とします。 ※ index.htmlはHello World!という内容で作りました。

FROM centos
MAINTAINER Gen docker id <mailaddress>
RUN yum -y install httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
# CMD ["/usr/sbin/httpd", "-DFOREGROUND"] でもOK

buildでインストールします。

$ sudo docker build -t hoge/httpd .

ホスト側の8080番ポートをContainer側の80番ポートにリダイレクトさせ、 バックグラウンドで走らせます。 runを実行するとContainerのhttpdが立ち上がります。

$ sudo docker run -p 8080:80 -d hoge/httpd
e23a0bb40467f42650d9dc33dbd77f1927efe7b828d1bb2ba2f18d957a04cf44

Containerのhttpdが立ち上がっているのを確認。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e23a0bb40467        hoge/httpd          "/usr/sbin/httpd -D F"   14 seconds ago      Up 13 seconds       0.0.0.0:8080->80/tcp   nauseous_einstein

http://192.168.55.44:8080/にWEBブラウザでアクセスすると Hello World!が表示されました!

docker hubにコンソールからログインします。 Docker Hubにimageをpushします。

~$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: hoge
Password:

▽
Login Succeeded
~$ sudo docker push hoge/httpd

ブラウザで、Docker HUBにログインして Repositoryのところに、hoge/httpdがあることを確認