Docker入門
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
実行中のタスクをストップするにはkillかstop
再開させるには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があることを確認
