Edited at

Dockerに入門してみた

More than 5 years have passed since last update.

「Docker入門」を購入したので、dockerに入門したいと思います。

参考資料:

「Docker入門」

Docker 0.9.0 for CentOS6.5


環境

項目

ホストOS
Windows 7 Professional 64bit

プロバイダ
VirtualBox 4.3.8

ゲストOS
CentOS 6

Docker
docker-io-0.9.0-3.el6.x86_64

Image
centos


インストール手順

http://docs.docker.io/installation/fedora/

今回はepelからパッケージインストールにて構築。


Vagrantfile

(中略)

docker.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = ["cookbooks/", "site-cookbooks/"]
chef.add_recipe "base::yumupdate"
chef.add_recipe "docker::default"
chef.add_recipe "docker::centos"
end

(中略)



Berksfile

site :opscode

cookbook 'yum-epel'



site-cookbooks/base/recipes/yumupdate.rb

execute "yum update" do

command "yum update -y"
end


site-cookbooks/docker/recipes/default.rb

include_recipe 'yum-epel::default'

package "docker-io"

service "docker" do
action [:enable, :start]
end



site-cookbooks/docker/recipes/centos.rb

execute "pull centos" do

command "docker pull centos"
end

<2014/05/21追記>

32bitのepelにはdocker-ioパッケージがないので、上記のレシピではインストールできません。

別環境の32bit機で実行して見事にこけました。。。


コマンドリファレンス


Dockerの情報を取得:docker info

[vagrant@localhost ~]$ sudo docker info

Containers: 0
Images: 26
Driver: devicemapper
Pool Name: docker-253:0-263291-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 2333.3 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 2.5 Mb
Metadata Space Total: 2048.0 Mb


Dockerイメージの取得:docker pull

イメージはデフォルトだとDockerの公開しているdocker indexから検索する。

# centosのイメージを取得

[vagrant@localhost ~]$ sudo docker pull centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete


対話的にコンテナを実行:docker run -i -t <イメージ名> /bin/bash

# -hはホスト名を指定

# docker run -i -t -h <ホスト名> <イメージ名> /bin/bash
[vagrant@localhost ~]$ sudo docker run -i -t -h test centos /bin/bash
bash-4.1# hostname
test


バックグラウンドでコンテナを実行:docker run -d

[vagrant@localhost ~]$ sudo docker run -d centos /bin/sh -c "while true; do echo Hello; sleep 10; done"

d95c283fb002c9ceae9f85f9d56df77b006af6a6b290c243ce19a731a9af1626


稼働中のコンテナの実行状態を確認:docker ps

[vagrant@localhost ~]$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d95c283fb002 centos:centos6 /bin/sh -c while tru 9 hours ago Up 9 hours insane_ritchie

# 稼働中のコンテナのIDのみを取得:-q
[vagrant@localhost ~]$ sudo docker ps -q
d95c283fb002

# 停止中のコンテナも含めて取得:-a
[vagrant@localhost ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a3a913b0f8f centos:centos6 /bin/sh -c 'while tr 5 minutes ago Up 3 minutes pensive_wozniak
68bd42d503c1 centos:centos6 /bin/bash 6 minutes ago Exited (0) 6 minutes ago insane_carson
00daefab7cc5 centos:centos6 /bin/bash 12 minutes ago Exited (0) 12 minutes ago ecstatic_fermi
9d3e11b7bedc centos:centos6 /bin/bash 12 minutes ago Exited (0) 12 minutes ago angry_goldstine


コンテナの標準出力を確認:docker logs -f <CONTAINER ID>

[vagrant@localhost ~]$ sudo docker logs -f d95c283fb002

Hello
Hello
Hello
Hello
Hello
Hello


コンテナの停止:docker stop <CONTAINER ID>

# コンテナの停止

[vagrant@localhost ~]$ sudo docker stop d95c283fb002
d95c283fb002

# 稼働中の全てのコンテナを停止
[vagrant@localhost ~]$ sudo docker ps -q | sudo xargs docker stop
d95c283fb002


コンテナの再実行:docker start <CONTAINER ID>docker restart <CONTAINER ID>

# 停止中のコンテナを確認

[vagrant@localhost ~]$ sudo docker ps -a | grep Exit | awk '{ print $1 }'
d95c283fb002
5d9e80c64382
582a23bf9161
0c5a68e78a70

# d95c283fb002を実行
[vagrant@localhost ~]$ sudo docker start d95c283fb002
d95c283fb002

# 最初の1件を実行
[vagrant@localhost ~]$ sudo docker ps -a | grep Exit | head -1 | awk '{ print $1 }' | sudo xargs docker start
d95c283fb002

# restartで実行
[vagrant@localhost ~]$ sudo docker restart d95c283fb002
d95c283fb002


バックグラウンド実行中のコンテナにアタッチ:docker attach <CONTAINER ID>

# バックグラウンド実行しているプロセスがある状態でアタッチ

[vagrant@localhost ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d95c283fb002 centos:centos6 /bin/sh -c while tru 3 days ago Up 13 hours insane_ritchie

[vagrant@localhost ~]$ sudo docker attach d95c283fb002
Hello
Hello
Hello


コンテナの強制終了:docker kill <CONTAINER ID>

[vagrant@localhost ~]$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d95c283fb002 centos:centos6 /bin/sh -c while tru 3 days ago Up 13 hours insane_ritchie

# 起動中のコンテナを強制終了
[vagrant@localhost ~]$ sudo docker kill d95c283fb002
d95c283fb002

[vagrant@localhost ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES


コンテナ内のプロセスの監視:docker top <CONTAINER ID>

[vagrant@localhost ~]$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d95c283fb002 centos:centos6 /bin/sh -c while tru 3 days ago Up 4 seconds insane_ritchie

[vagrant@localhost ~]$ sudo docker top d95c283fb002
UID PID PPID C
STIME TTY TIME CMD
root 3822 3817 0
12:15 ? 00:00:00 /bin/sh -c while true; do echo Hello; sleep 10; done
root 3884 3822 0
12:15 ? 00:00:00 sleep 10


コンテナの詳細な情報を取得:docker inspect [<CONTAINER ID>|<IMAGE>]

[vagrant@localhost ~]$ sudo docker inspect d95c283fb002

[{
"ID": "d95c283fb002c9ceae9f85f9d56df77b006af6a6b290c243ce19a731a9af1626",
"Created": "2014-05-13T14:31:54.284329622Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo Hello; sleep 10; done"
],
"Config": {
"Hostname": "d95c283fb002",
"Domainname": "",
(省略)


コンテナのコミット:docker commit -a "作者" -m "コミットメッセージ" <CONTAINER ID>

[vagrant@localhost ~]$ sudo docker commit -a "author" -m "test" d95c283fb002

ccfe0e061be58bc1ff8b3694e06ed9179899be12d76c7b0a68c57a322e0aeb08

[vagrant@localhost ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> ccfe0e061be5 32 seconds ago 297.6 MB


コンテナの削除:docker rm <CONTAINER ID> [<CONTAINER ID>]

# 稼働中のコンテナは削除できない(`-f`オプションをつければ削除できる)

[vagrant@localhost ~]$ sudo docker ps -q | xargs sudo docker rm
Error: Impossible to remove a running container, please stop it first or use -f
2014/05/17 20:08:37 Error: failed to remove one or more containers

# 稼動していないコンテナの一覧を表示
[vagrant@localhost ~]$ sudo docker ps -a | grep Exit
582a23bf9161 centos:centos6 /bin/bash 3 days ago Exit 130 furious_hawking
0c5a68e78a70 centos:centos6 /bin/bash 3 days ago Exit 0 hopeful_brattain

# 0c5a68e78a70を削除
[vagrant@localhost ~]$ sudo docker rm 0c5a68e78a70
0c5a68e78a70


イメージの削除:docker rmi <IMAGE ID> [<IMAGE ID>]

# イメージの一覧を表示

[vagrant@localhost ~]$ sudo docker images | awk '{ print $1,$2,$3 }'
REPOSITORY TAG IMAGE
<none> <none> ccfe0e061be5
ubuntu 13.10 5e019ab7bf6d
ubuntu saucy 5e019ab7bf6d
ubuntu 12.04 74fe38d11401
(省略)
centos centos6 0b443ba03958
centos latest 0b443ba03958
centos 6.4 539c0211cd76

# ubuntu 13.10のイメージを削除
[vagrant@localhost ~]$ sudo docker rmi 5e019ab7bf6d
Untagged: ubuntu:13.10
Untagged: ubuntu:saucy
Deleted: 5e019ab7bf6deb75b211411ef7257d1e76bf7edee31d9da62a392df98d0529d6
Deleted: 2209cbf9dcd35615211a2fdc6762bb5e651b5c847537359f05b9ab1bc9a74614
Deleted: f0ee64c4df74c766a16faebfb5123e2b67192eff4a82aa70d0d2081681200a79
Deleted: e2aa6665d37109cd6d196eec32c98d8f4412325cb2dc1588e5eb27cae4beb836

Vagrant 1.6からはVagrantでもDockerを扱えるようですし、AWS BeanstalkがDockerをサポートするなど、Dockerが盛り上がってきてますね。

Dockerfileを触った後にVagrantでのDocker操作に着手したいなと思います。


プロキシ環境におけるDocker利用の注意点


イメージをダウンロードできない

外部接続にプロキシの必要な環境の場合、yum等を実行する際には環境変数http_proxyhttps_proxyにプロキシ情報を設定しますが、

上記環境変数を設定してもdocker pullの実行に失敗します。

[vagrant@localhost ~]$ sudo docker pull centos

Pulling repository centos
2014/05/23 16:58:36 Get https://index.docker.io/v1/repositories/centos/images: dial tcp: lookup index.docker.io on ***.***.***.***:53: no answer from server

 プロキシ環境でイメージをダウンロードする場合、/etc/sysconfig/dockerにプロキシ情報を設定する必要があります。

 また、dockerを起動済みの場合はservice docker restartを実行するなどして、dockerを再起動する必要があります。


/etc/sysconfig/docker

export http_proxy=http://<ユーザ名>:<パスワード>@<プロキシサーバ>:<ポート>

export https_proxy=http://<ユーザ名>:<パスワード>@<プロキシサーバ>:<ポート>