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 のインストールが完了したので、イメージのダウンロードがてら 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.04 の 1d31ef4b443c が存在していることを確認します。
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 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL / was not found on this server.</p> <hr> <address>Apache Server at 172.17.0.8 Port 80</address> </body></html> ubuntu@ubuntu:~/chef-repo$
動作が確認できました。
まとめ
Chef Container はまだまだ beta 版でこなれていない部分は多いですが、最低限のコンセプトはわかるようになっています。今後の改善に期待したいと思います。
