fbpx

Chef Container 0.2.0 (beta) で Docker コンテナを作成する #opschef_ja #getchef_ja #dockerjp

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

注意: Chef Provisioning と Docker の組み合わせとして knife-container がありましたがプロジェクト終了しており、現在は chef-provisioning-docker の利用が推奨されています。Chef Provisioning Docker については Chef ProvisioningとDockerでSerfクラスタ環境を作成する を参照してください(2015/07/08 追記)。

既報の通り、Chef Container 0.2.0 (beta) がリリースされました。本記事では、実際に Chef Container を用いて Docker コンテナを作成してみます。なお、途中でつまずいた部分もすべて記載しています。

検証はまったくプレーンな Ubuntu 12.04 LTS の仮想環境を用意し、その上で行いました。

Ubuntu 12.04 LTS に Docker をインストール

Docker installation に従い、Ubuntu 12.04 LTS に Docker をインストールします。


ubuntu@ubuntu:~$ sudo apt-get update
:
ubuntu@ubuntu:~$

Ubuntu 12.04 LTS の Linux Kernel は 3.2 系であるため、3.8 系にアップグレードします。


ubuntu@ubuntu:~$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
:
linux-headers-3.8.0-44 (3.8.0-44.66~precise1) を設定しています ...
linux-headers-3.8.0-44-generic (3.8.0-44.66~precise1) を設定しています ...
linux-headers-generic-lts-raring (3.8.0.44.44) を設定しています ...
linux-image-generic-lts-raring (3.8.0.44.44) を設定しています ...
ubuntu@ubuntu:~$

再起動して新しい Linux Kernel で起動します。


ubuntu@ubuntu:~$ sudo reboot

Docker のインストールを簡単化するスクリプトを実行します。


ubuntu@ubuntu:~$ curl -s https://get.docker.io/ubuntu/ | sudo sh
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.xxLcCx6yp1 --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
gpg: 鍵A88D21E9をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵A88D21E9:“Docker Release Tool (releasedocker) <docker@dotcloud.com>”変更なし
gpg: 処理数の合計: 1
gpg: 変更なし: 1
:
:
:
aufs-tools (1:3.0+20111101-1ubuntu1) を設定しています ...
liberror-perl (0.17-1) を設定しています ...
git-man (1:1.7.9.5-1) を設定しています ...
git (1:1.7.9.5-1) を設定しています ...
cgroup-lite (1.1.5) を設定しています ...
cgroup-lite start/running
lxc-docker-1.1.1 (1.1.1) を設定しています ...
docker start/running, process 2664
lxc-docker (1.1.1) を設定しています ...
libc-bin のトリガを処理しています ...
ldconfig deferred processing now taking place
ubuntu@ubuntu:~$
</docker@dotcloud.com>

Docker のインストールが完了したので、イメージのダウンロードがてら Docker の動作テストを行います。
コマンドプロンプトが表示されたら、Docker コンテナ内で bash が動作する状態となっています。


ubuntu@ubuntu:~$ sudo docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
root@7d82acb173ea:/#

exit で Docker コンテナから抜けて、次の手順に移ります。

Ubuntu 12.04 LTS に Chef DK をインストール

Chef Development Kit から Ubuntu 12.04 用の Chef DK パッケージをダウンロードします。


ubuntu@ubuntu:~$ wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.2.0-2_amd64.deb
:
ubuntu@ubuntu:~$

ダウンロードした Chef DK パッケージをインストールします。


ubuntu@ubuntu:~$ sudo dpkg -i chefdk_0.2.0-2_amd64.deb
以前に未選択のパッケージ chefdk を選択しています。
(データベースを読み込んでいます ... 現在 82220 個のファイルとディレクトリがインストールされています。)
(chefdk_0.2.0-2_amd64.deb から) chefdk を展開しています...
chefdk (0.2.0-2) を設定しています ...
Thank you for installing Chef Development Kit!
ubuntu@ubuntu:~$

knife-container をインストール

chef gem コマンドを用いて、knife-container をインストールします。


ubuntu@ubuntu:~$ chef gem install knife-container --no-rdoc --no-ri
Fetching: knife-container-0.2.0.gem (100%)
WARNING: You don't have /home/ubuntu/.chefdk/gem/ruby/2.1.0/bin in your PATH,
gem executables will not run.
Successfully installed knife-container-0.2.0
1 gem installed
ubuntu@ubuntu:~$

chef-repo の準備

必須ではありませんが chef-repo を準備しておきます。以降、chef-repo ディレクトリ内で作業を行います。


ubuntu@ubuntu:~$ git clone https://github.com/opscode/chef-repo
Cloning into 'chef-repo'...
remote: Reusing existing pack: 225, done.
remote: Total 225 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (225/225), 46.44 KiB, done.
Resolving deltas: 100% (57/57), done.
ubuntu@ubuntu:~$

knife-container の実行

Docker コンテキストの初期化

knife container docker init で Docker コンテキストを初期化します。設定項目は、

  • イメージ名: demo/apache2
  • run-list: recipe[apache2]
  • -z: ローカルモードで実行
  • -b: Berkshelf を利用

となっています。


ubuntu@ubuntu:~$ cd chef-repo/
ubuntu@ubuntu:~/chef-repo$ knife container docker init demo/apache2 -r 'recipe[apache2]' -z -b
WARNING: No knife configuration file found
Compiling Cookbooks...
Recipe: knife_container::docker_init
* directory[/home/ubuntu/chef-repo/dockerfiles/demo/apache2] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/demo/apache2
* template[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/Dockerfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/Dockerfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/Dockerfile from none to 4c70a7
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/.dockerignore] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/.dockerignore
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/.dockerignore from none to e3b0c4
(diff output suppressed by config)
* directory[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef
* template[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/zero.rb] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/zero.rb
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/zero.rb from none to cde131
(diff output suppressed by config)
* file[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/first-boot.json] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/first-boot.json
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/first-boot.json from none to 1b9651
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/.node_name] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/.node_name
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/.node_name from none to fa2107
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/demo/apache2/Berksfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/Berksfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/demo/apache2/Berksfile from none to 6a02b1
(diff output suppressed by config)
* execute[cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/roles/] action run
- execute cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/roles/
* execute[cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/environments/] action run
- execute cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/environments/
* execute[cp -r /home/ubuntu/chef-repo/nodes/ /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/nodes/] action run (skipped due to not_if)
Downloading base image: chef/ubuntu-12.04:latest. This process may take awhile...
Tagging base image chef/ubuntu-12.04 as demo/apache2


Context Created: /home/ubuntu/chef-repo/dockerfiles/demo/apache2
ubuntu@ubuntu:~/chef-repo$

カレントディレクトリに dockerfiles ディレクトリと、Docker コンテキストが作成されました。tree コマンドで確認してみます。


ubuntu@ubuntu:~/chef-repo$ tree -aF dockerfiles/
dockerfiles/
└── demo/
└── apache2/
├── .dockerignore
├── Berksfile
├── Dockerfile
└── chef/
├── .node_name
├── environments/
│ └── README.md
├── first-boot.json
├── roles/
│ └── README.md
└── zero.rb


5 directories, 8 files
ubuntu@ubuntu:~/chef-repo$

dockerfiles/demo/apache2/.dockerignore

空です。


ubuntu@ubuntu:~/chef-repo$ cat dockerfiles/demo/apache2/.dockerignore
ubuntu@ubuntu:~/chef-repo$

dockerfiles/demo/apache2/Berksfile

Berkshelf を用いて apache2 Cookbook を取得するようになっています。


source "https://api.berkshelf.com"


cookbook "apache2"

dockerfiles/demo/apache2/Dockerfile

Docker イメージを作成する際に用いる Dockerfile です。
この Dockerfile のテンプレートは dockerfile.erb で確認できます。


# BASE chef/ubuntu-12.04:latest
FROM demo/apache2
ADD chef/ /etc/chef/
RUN chef-init --bootstrap
RUN rm -rf /etc/chef/secure/*
ENTRYPOINT ["chef-init"]
CMD ["--onboot"]

dockerfiles/demo/apache2/chef/.node_name

Node 名のようです。


demo-apache2-build

dockerfiles/demo/apache2/chef/first-boot.json

Docker コンテナ内の初期化プロセスで利用するファイルです。


{
"run_list": [
"recipe[apache2]"
]
}

dockerfiles/demo/apache2/chef/zero.rb

Docker コンテナ内の初期化プロセスで利用するファイルです。


require 'chef-init'


node_name ChefInit.node_name
cookbook_path ["/etc/chef/cookbooks"]
ssl_verify_mode :verify_peer

dockerfiles/demo/apache2/chef/first-boot.json の修正

手順の通り、container_service を追加します。
なお、1行前の , を忘れないようにしてください。


{
"run_list": [
"recipe[apache2]"
],
"container_service": {
"apache2": {
"command": "/usr/sbin/apache2 -k start"
}
}
}

Docker イメージのビルド

knife container docker build で Docker イメージのビルドを行います。


ubuntu@ubuntu:~/chef-repo$ knife container docker build demo/apache2
WARNING: No knife configuration file found
USAGE: knife container docker build REPO/NAME [options]
:
:
:
FATAL: Can not find a Chef configuration file in /home/ubuntu/.chef/dockerfiles/demo/apache2/chef
ubuntu@ubuntu:~/chef-repo$

手順通りに行いましたが、失敗してしまいました。
これは先の Docker コンテキストの初期化の際にローカルモードで実施しているため、こちらもローカルモードにしなければいけません(参考: wenboseさんのツイート)。


ubuntu@ubuntu:~/chef-repo$ knife container docker build demo/apache2 -z
WARNING: No knife configuration file found
Resolving cookbook dependencies...
Fetching cookbook index from https://api.berkshelf.com...
Installing apache2 (1.10.4) from https://api.berkshelf.com ([opscode] https://supermarket.getchef.com/api/v1)
Installing iptables (0.13.2) from https://api.berkshelf.com ([opscode] https://supermarket.getchef.com/api/v1)
Installing logrotate (1.6.0) from https://api.berkshelf.com ([opscode] https://supermarket.getchef.com/api/v1)
Installing pacman (1.1.1) from https://api.berkshelf.com ([opscode] https://supermarket.getchef.com/api/v1)
Resolving cookbook dependencies...
Using apache2 (1.10.4)
Using iptables (0.13.2)
Using pacman (1.1.1)
Using logrotate (1.6.0)
Vendoring apache2 (1.10.4) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/apache2
Vendoring iptables (0.13.2) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/iptables
Vendoring logrotate (1.6.0) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/logrotate
Vendoring pacman (1.1.1) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/pacman
2014/07/17 11:42:14 Post http:///var/run/docker.sock/build?rm=1&t=demo%2Fapache2: dial unix /var/run/docker.sock: permission denied
ubuntu@ubuntu:~/chef-repo$

パーミッションエラーが出てしまいました。


ubuntu@ubuntu:~/chef-repo$ ls -l /var/run/docker.*
-rw-r--r-- 1 root root 4 7月 17 11:27 /var/run/docker.pid
srw-rw---- 1 root docker 0 7月 17 11:27 /var/run/docker.sock
ubuntu@ubuntu:~/chef-repo$

ユーザを docker グループに所属させておくのを忘れていました。


ubuntu@ubuntu:~/chef-repo$ groups
ubuntu adm cdrom sudo dip plugdev lpadmin sambashare
ubuntu@ubuntu:~/chef-repo$

ユーザを docker グループに所属させます。


ubuntu@ubuntu:~/chef-repo$ groups
ubuntu adm cdrom sudo dip plugdev lpadmin sambashare docker
ubuntu@ubuntu:~/chef-repo$

再度実行します。


ubuntu@ubuntu:~/chef-repo$ knife container docker build demo/apache2 -z
WARNING: No knife configuration file found
USAGE: knife container docker build REPO/NAME [options]
:
:
:
FATAL: A `cookbooks` directory already exists. You must either remove this directory from your dockerfile directory or use the `force` flag
ubuntu@ubuntu:~/chef-repo$

cookbooks ディレクトリが既に存在しているというエラーです。
どこに作成されているのか確認します。


ubuntu@ubuntu:~/chef-repo$ tree dockerfiles/
dockerfiles/
└── demo
└── apache2
├── Berksfile
├── Berksfile.lock
├── Dockerfile
└── chef
├── cookbooks
│ ├── Berksfile.lock
│ ├── apache2
(中略)
│ ├── iptables
(中略)
│ ├── logrotate
(中略)
│ └── pacman
(中略)
├── environments
│ └── README.md
├── first-boot.json
├── roles
│ └── README.md
└── zero.rb


35 directories, 165 files
ubuntu@ubuntu:~/chef-repo$

一旦削除してしまいます。


ubuntu@ubuntu:~/chef-repo$ /bin/rm -rf dockerfiles/demo/apache2/chef/cookbooks/
ubuntu@ubuntu:~/chef-repo$

再度実行します。


ubuntu@ubuntu:~/chef-repo$ knife container docker build demo/apache2 -z
WARNING: No knife configuration file found
Resolving cookbook dependencies...
Using apache2 (1.10.4)
Using iptables (0.13.2)
Using pacman (1.1.1)
Using logrotate (1.6.0)
Resolving cookbook dependencies...
Using apache2 (1.10.4)
Using iptables (0.13.2)
Using pacman (1.1.1)
Using logrotate (1.6.0)
Vendoring apache2 (1.10.4) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/apache2
Vendoring iptables (0.13.2) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/iptables
Vendoring logrotate (1.6.0) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/logrotate
Vendoring pacman (1.1.1) to /home/ubuntu/chef-repo/dockerfiles/demo/apache2/chef/cookbooks/pacman
Sending build context to Docker daemon 449.5 kB
Sending build context to Docker daemon
Step 0 : FROM demo/apache2
Pulling repository demo/apache2
2014/07/17 11:45:01 HTTP code: 404
ubuntu@ubuntu:~/chef-repo$

demo/apache2 イメージが存在しない、とのことです。そういえば先の Dockerfile 内で次のような記載がありました。


# BASE chef/ubuntu-12.04:latest
FROM demo/apache2

chef/ubuntu-12.04 イメージとは、DockerHub の chef/ubuntu-12.04 のようです。
現状ではどんなイメージに対しても実行できるのではなく、既定のこのイメージを使わなければいけないようです(参考: wenboseさんのツイート, Chef-Container Beta を使ってみる)。

一旦この Docker コンテキストは破棄し、chef/ubuntu-12.04 を用いるようにやり直します。

knife-container の再実行

Docker コンテキストの初期化

先程失敗した Docker コンテキストを削除します。名前を変えるので必要ないかもしれませんが、念のためです。


ubuntu@ubuntu:~/chef-repo$ /bin/rm -rf dockerfiles/demo
ubuntu@ubuntu:~/chef-repo$

Docker コンテキストの初期化項目は、

  • イメージ名: chef/ubuntu-12.04
  • run-list: recipe[apache2]
  • -z: ローカルモードで実行
  • -b: Berkshelf を利用

となっています。イメージ名を変更しました。


ubuntu@ubuntu:~/chef-repo$ knife container docker init chef/ubuntu-12.04 -r 'recipe[apache2]' -z -b
WARNING: No knife configuration file found
Compiling Cookbooks...
Recipe: knife_container::docker_init
* directory[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile from none to 57c377
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore from none to e3b0c4
(diff output suppressed by config)
* directory[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb from none to cde131
(diff output suppressed by config)
* file[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json from none to 1b9651
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name from none to 26ac58
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile from none to 6a02b1
(diff output suppressed by config)
* execute[cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/roles/] action run
- execute cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/roles/
* execute[cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/environments/] action run
- execute cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/environments/
* execute[cp -r /home/ubuntu/chef-repo/nodes/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/nodes/] action run (skipped due to not_if)
Downloading base image: chef/ubuntu-12.04:latest. This process may take awhile...
Tagging base image chef/ubuntu-12.04 as chef/ubuntu-12.04


Context Created: /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04
ubuntu@ubuntu:~/chef-repo$

dockerfiles/chef/ubuntu-12.04/Dockerfile

FROM が chef/ubuntu-12.04 となっています。


# BASE chef/ubuntu-12.04:latest
FROM chef/ubuntu-12.04
ADD chef/ /etc/chef/
RUN chef-init --bootstrap
RUN rm -rf /etc/chef/secure/*
ENTRYPOINT ["chef-init"]
CMD ["--onboot"]

dockerfiles/chef/ubuntu-12.04/chef/first-boot.json

同様に編集します。


{
"run_list": [
"recipe[apache2]"
],
"container_service": {
"apache2": {
"command": "/usr/sbin/apache2 -k start"
}
}
}

Docker イメージのビルド

Docker イメージのビルドを行います。


ubuntu@ubuntu:~/chef-repo$ knife container docker build chef/ubuntu-12.04 -z
WARNING: No knife configuration file found
Resolving cookbook dependencies...
Fetching cookbook index from https://api.berkshelf.com...
Using apache2 (1.10.4)
Using iptables (0.13.2)
Using pacman (1.1.1)
Using logrotate (1.6.0)
Resolving cookbook dependencies...
Using apache2 (1.10.4)
Using iptables (0.13.2)
Using pacman (1.1.1)
Using logrotate (1.6.0)
Vendoring apache2 (1.10.4) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/apache2
Vendoring iptables (0.13.2) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/iptables
Vendoring logrotate (1.6.0) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/logrotate
Vendoring pacman (1.1.1) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/pacman
Sending build context to Docker daemon 449.5 kB
Sending build context to Docker daemon
Step 0 : FROM chef/ubuntu-12.04
---> 03fd2357596f
Step 1 : ADD chef/ /etc/chef/
---> a5143667c17c
Removing intermediate container 92b86799983b
Step 2 : RUN chef-init --bootstrap
---> Running in d6be9bcc5364

#################################
# Welcome to Chef Container
#################################

[2014-07-17T03:12:05+00:00] INFO: Starting Supervisor...
[2014-07-17T03:12:05+00:00] INFO: Supervisor pid: 13
[2014-07-17T03:12:05+00:00] INFO: Waiting for Supervisor to start...
[2014-07-17T03:12:06+00:00] INFO: Starting chef-client run...
[2014-07-17T03:12:08+00:00] INFO: Starting chef-zero on port 8889 with repository at repository at /etc/chef
One version per cookbook


[2014-07-17T03:12:08+00:00] INFO: Forking chef instance to converge...
[2014-07-17T03:12:08+00:00] INFO: *** Chef 11.12.8 ***
:
:
:
================================================================================
Error executing action `install` on resource 'package[apache2]'
================================================================================
:
:
:
---- End output of apt-get -q -y install apache2=2.2.22-1ubuntu1.6 ----
Ran apt-get -q -y install apache2=2.2.22-1ubuntu1.6 returned 100
[2014-07-17T03:12:25+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
[2014-07-17T03:12:25+00:00] INFO: Deleting client key...
---> e748dce73519
Removing intermediate container d6be9bcc5364
Step 3 : RUN rm -rf /etc/chef/secure/*
---> Running in 864662da516b
---> 2390dc2e7d05
Removing intermediate container 864662da516b
Step 4 : ENTRYPOINT ["chef-init"]
---> Running in 839b86e3225e
---> 42c8badde9fe
Removing intermediate container 839b86e3225e
Step 5 : CMD ["--onboot"]
---> Running in 0df948bd156d
---> 6ddbd9003b5d
Removing intermediate container 0df948bd156d
Successfully built 6ddbd9003b5d
ubuntu@ubuntu:~/chef-repo$

失敗してしまいました。これはおそらく apt-get update しないといけないというおなじみのパターンのように見えます。apt Cookbook を追加してやり直しましょう。

knife-container の再々実行

Docker コンテキストの初期化

先程失敗した Docker コンテキストを削除します。


ubuntu@ubuntu:~/chef-repo$ /bin/rm -rf dockerfiles/chef
ubuntu@ubuntu:~/chef-repo$

Docker コンテキストの初期化項目は、

  • イメージ名: chef/ubuntu-12.04
  • run-list: recipe[apt],recipe[apache2]
  • -z: ローカルモードで実行
  • -b: Berkshelf を利用

とします。run-list に recipe[apt] を加えました。


ubuntu@ubuntu:~/chef-repo$ knife container docker init chef/ubuntu-12.04 -r 'recipe[apt],recipe[apache2]' -z -b
WARNING: No knife configuration file found
Compiling Cookbooks...
Recipe: knife_container::docker_init
* directory[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Dockerfile from none to 57c377
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/.dockerignore from none to e3b0c4
(diff output suppressed by config)
* directory[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef] action create
- create new directory /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/zero.rb from none to cde131
(diff output suppressed by config)
* file[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/first-boot.json from none to 1729a3
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/.node_name from none to 26ac58
(diff output suppressed by config)
* template[/home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile] action create
- create new file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile
- update content in file /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/Berksfile from none to a21c1e
(diff output suppressed by config)
* execute[cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/roles/] action run
- execute cp -r /home/ubuntu/chef-repo/roles/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/roles/
* execute[cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/environments/] action run
- execute cp -r /home/ubuntu/chef-repo/environments/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/environments/
* execute[cp -r /home/ubuntu/chef-repo/nodes/ /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/nodes/] action run (skipped due to not_if)
Downloading base image: chef/ubuntu-12.04:latest. This process may take awhile...
Tagging base image chef/ubuntu-12.04 as chef/ubuntu-12.04


Context Created: /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04
ubuntu@ubuntu:~/chef-repo$

dockerfiles/chef/ubuntu-12.04/chef/first-boot.json

同様に編集します。


{
"run_list": [
"recipe[apt]",
"recipe[apache2]"
],
"container_service": {
"apache2": {
"command": "/usr/sbin/apache2 -k start"
}
}
}

Docker イメージのビルド

Docker イメージのビルドを行います。


ubuntu@ubuntu:~/chef-repo$ knife container docker build chef/ubuntu-12.04 -z
WARNING: No knife configuration file found
Resolving cookbook dependencies...
Fetching cookbook index from https://api.berkshelf.com...
Using apache2 (1.10.4)
Installing apt (2.4.0) from https://api.berkshelf.com ([opscode] https://supermarket.getchef.com/api/v1)
Using iptables (0.13.2)
Using logrotate (1.6.0)
Using pacman (1.1.1)
Resolving cookbook dependencies...
Using apache2 (1.10.4)
Using apt (2.4.0)
Using iptables (0.13.2)
Using logrotate (1.6.0)
Using pacman (1.1.1)
Vendoring apache2 (1.10.4) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/apache2
Vendoring apt (2.4.0) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/apt
Vendoring iptables (0.13.2) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/iptables
Vendoring logrotate (1.6.0) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/logrotate
Vendoring pacman (1.1.1) to /home/ubuntu/chef-repo/dockerfiles/chef/ubuntu-12.04/chef/cookbooks/pacman
Sending build context to Docker daemon 553 kB
Sending build context to Docker daemon
Step 0 : FROM chef/ubuntu-12.04
---> 03fd2357596f
Step 1 : ADD chef/ /etc/chef/
---> 41c9853b7993
Removing intermediate container 7db0f558d525
Step 2 : RUN chef-init --bootstrap
---> Running in f83cde623020

#################################
# Welcome to Chef Container
#################################

[2014-07-17T03:16:57+00:00] INFO: Starting Supervisor...
[2014-07-17T03:16:57+00:00] INFO: Supervisor pid: 13
[2014-07-17T03:16:57+00:00] INFO: Waiting for Supervisor to start...
[2014-07-17T03:16:58+00:00] INFO: Starting chef-client run...
[2014-07-17T03:17:00+00:00] INFO: Starting chef-zero on port 8889 with repository at repository at /etc/chef
One version per cookbook


[2014-07-17T03:17:00+00:00] INFO: Forking chef instance to converge...
[2014-07-17T03:17:00+00:00] INFO: *** Chef 11.12.8 ***
:
:
:
[2014-07-17T03:18:25+00:00] INFO: service[apache2] reloaded
[2014-07-17T03:18:25+00:00] INFO: Chef Run complete in 83.665531937 seconds
[2014-07-17T03:18:25+00:00] INFO: Running report handlers
[2014-07-17T03:18:25+00:00] INFO: Report handlers complete
[2014-07-17T03:18:27+00:00] INFO: Deleting client key...
---> 74b008b52971
Removing intermediate container f83cde623020
Step 3 : RUN rm -rf /etc/chef/secure/*
---> Running in 98cfdb6c473e
---> 8e9fa8896021
Removing intermediate container 98cfdb6c473e
Step 4 : ENTRYPOINT ["chef-init"]
---> Running in 50b09990baf3
---> 09a86e1b033e
Removing intermediate container 50b09990baf3
Step 5 : CMD ["--onboot"]
---> Running in c248f5dc9acf
---> 1d31ef4b443c
Removing intermediate container c248f5dc9acf
Successfully built 1d31ef4b443c
ubuntu@ubuntu:~/chef-repo$

ようやく Docker イメージのビルドに成功しました。

Docker イメージの確認

今作成した chef/ubuntu-12.041d31ef4b443c が存在していることを確認します。


ubuntu@ubuntu:~/chef-repo$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chef/ubuntu-12.04 latest 1d31ef4b443c 24 seconds ago 505.8 MB
6ddbd9003b5d 6 minutes ago 411.6 MB
ubuntu latest e54ca5efa2e9 4 weeks ago 276.5 MB
ubuntu@ubuntu:~/chef-repo$

Docker コンテナのローンチ

Docker コンテナを起動します。


ubuntu@ubuntu:~/chef-repo$ docker run -d chef/ubuntu-12.04
8a2fec9583be3ffd3159549647033a986ea9a1fa00b7958a21e9f50f91e7dc9b
ubuntu@ubuntu:~/chef-repo$

コンテナが動作していることを確認します。


ubuntu@ubuntu:~/chef-repo$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a2fec9583be chef/ubuntu-12.04:latest chef-init --onboot 8 seconds ago Up 8 seconds trusting_sammet
ubuntu@ubuntu:~/chef-repo$

コンテナ内のプロセスを確認します。


ubuntu@ubuntu:~/chef-repo$ docker top 8a2fec9583be
UID PID PPID C STIME TTY TIME CMD
root 6742 2664 0 12:19 ? 00:00:00 /opt/chef/embedded/bin/ruby /usr/bin/chef-init --onboot
root 6763 6742 0 12:19 ? 00:00:00 sh -c /opt/chef/embedded/bin/runsvdir -P /opt/chef/service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'
root 6765 6763 0 12:19 ? 00:00:00 /opt/chef/embedded/bin/runsvdir -P /opt/chef/service log: ...........................................................................................................................................................................................................................................................................................................................................................................................................
root 6966 6742 0 12:19 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 6970 6966 0 12:19 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 6972 6966 0 12:19 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 6973 6966 0 12:19 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 6974 6966 0 12:19 ? 00:00:00 /usr/sbin/apache2 -k start
ubuntu@ubuntu:~/chef-repo$

コンテナの IP アドレスを確認します。


ubuntu@ubuntu:~/chef-repo$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 8a2fec9583be
Warning: '-format' is deprecated, it will be replaced by '--format' soon. See usage.
172.17.0.8
ubuntu@ubuntu:~/chef-repo$

コンテナの apache2 にアクセスします。


ubuntu@ubuntu:~/chef-repo$ curl 172.17.0.8

Not Found

The requested URL / was not found on this server.


Apache Server at 172.17.0.8 Port 80



ubuntu@ubuntu:~/chef-repo$

動作が確認できました。

まとめ

Chef Container はまだまだ beta 版でこなれていない部分は多いですが、最低限のコンセプトはわかるようになっています。今後の改善に期待したいと思います。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA