Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Dockerイメージ構築
実践テクニック
Haruka Iwao
Storage Solution Architect, Red Hat K.K.
February 12, 2015
自己紹介
•  岩尾 はるか (@Yuryu)
•  所属: レッドハット株式会社
– ストレージソリューションアーキテクト
– 大手家電メーカー、ソーシャルゲーム会社、
Web広告ベンチャーを経て現職
•  大学・大学院で高性能計算(HPC)...
Dockerイメージの構造
RHEL
nginx
Webサーバー
OSの基本
ファイル
OSの基本
ファイル
OSの基本
ファイル
nginx
nginx
HTML
ファイル
追加
追加
nginxイメージを元に作成
RHELイメージを元に作成...
Dockerイメージの作成手順
•  2ステップで作成できます
•  Dockerfile の作成
•  $ docker build -t <tag> Dockerfileの場所
– 例) $ docker build -t yuryu/te...
Dockerfileとは
•  イメージ作成の手順を書いたもの
•  例)
FROM	
  registry.access.redhat.com/rhel	
  
	
  
RUN	
  yum	
  -­‐y	
  install	
  htt...
Dockerfile 文法
•  FROM - ベースとなるイメージ
•  RUN - イメージ構築で実行するコマンド
•  ADD - イメージ内にファイルを追加
•  EXPOSE - ポートを外に見せる
•  CMD - デフォルトで実行さ...
Dockerfile 文法(2)
•  MAINTAINER - メンテナを書く
•  USER - コンテナ内で実行するユーザー
•  WORKDIR - 基準ディレクトリの変更
•  COPY - ホストからファイルのコピー
– ADD が大...
作って動かす
•  $ docker run で実行
– -d バックグラウンドで実行
– -P EXPOSE したポートを割り当て
$	
  mkdir	
  demo-­‐apache	
  
$	
  cd	
  demo-­‐apach...
docker build 実行例
[yuryu@rhel7	
  docker-­‐apache]$	
  docker	
  build	
  -­‐t	
  demo-­‐apache	
  .	
  
Sending	
  build	
...
docker run 実行例
•  ランダムなポートと、コンテナID、コン
テナ名が割り当てられる
[yuryu@rhel7	
  docker-­‐apache]$	
  docker	
  run	
  -­‐dP	
  demo-­‐ap...
いくつかの応用パターン
•  固定ポートの割り当て
•  コンテナのリンク
•  コンテナ内のボリュームを共有
•  コンテナ外とボリュームを共有
固定ポートの割り当て
•  $ docker run -p <host port>:<guest port>
•  $ docker port コマンドでもポートの割り
当てを確認できる
[yuryu@rhel7	
  docker-­‐apa...
コンテナのリンク
•  --link <コンテナ名>:alias
•  EXPOSEしたポートを環境変数に入れる
#	
  docker	
  run	
  -­‐d	
  -­‐e	
  MYSQL_ROOT_PASSWORD=root	
 ...
ALIAS_PORT_XXX
ALIAS_PORT_XXX_TCP
ALIAS_PORT_XXX_TCP_PROTO
ALIAS_PORT_XXX_TCP_ADDR
ALIAS_PORT_XXX_TCP_PORT
コンテナのリンク(図)
提供コ...
コンテナ内のボリューム共有
•  例: VOLUME /var/lib/mysql
•  --volumes-from <コンテナ名> で利用
•  Data-only コンテナをベースに使うと良い
#	
  docker	
  run	
  ...
コンテナ外とのボリューム共有
•  -v <host path>:<container path>
•  SELinuxの設定が必要
– # chcon -Rt svirt_sandbox_file_t
$	
  mkdir	
  mysql-...
Data-onlyコンテナのバックアップ
•  ホストでボリュームを共有して、tarで固
める
$	
  mkdir	
  mysql-­‐volume;	
  cd	
  mysql-­‐volume	
  
$	
  sudo	
  chc...
ボリューム共有
Data only
コンテナ
使うコンテナ
volumes-from
VOLUME
ホスト
-v <host>:<container>
Dockerで作るCI
開発者A
開発者B
コンテナの定義を共有
変更を通知
自動テストを実施
コンテナを取得して開発
開発者C
クラウドへデプロイを指示
GitHub
テスト済みコンテナイメージを
クラウドサービスへデプロイ
コンテナイメージ...
今回のデモの定義
•  GitHubで公開中
•  https://github.com/yuryu/docker-­‐
jenkins-­‐demo	
  
Red Hat Enterprise Linux
テストソースコードを取得
生成
起動
JenkinsのDockerfile
FROM	
  registry.access.redhat.com/rhel	
  
MAINTAINER	
  Haruka	
  Iwao	
  
	
  
RUN	
  yum	
  -­‐y	
  ...
run-jenkins.sh
#!/bin/sh	
  
	
  
JENKINS_HOME="/var/lib/jenkins"	
  
JENKINS_USER="jenkins"	
  
JENKINS_JAVA_OPTIONS="-­‐...
SlaveのDockerfile
FROM	
  registry.access.redhat.com/rhel	
  
MAINTAINER	
  Haruka	
  Iwao	
  
	
  
RUN	
  yum	
  -­‐y	
  up...
Slaveを作るときの注意点
•  RHEL標準のコンテナイメージには
systemdが入っていません
•  fakesystemdが入っている
•  systemdに依存するパッケージを入れる場
合は、本物のsystemdに置き換える
– y...
Jenkins Docker Plugin
•  JenkinsスレーブをDockerで実行
•  テストごとにコンテナを生成、削除
DockerにTCPをlistenさせる
•  Jenkinsから制御するために必要
•  /etc/sysconfig/dockerを書き換える
•  このままだと認証なしに誰でもアクセス
可能になるので注意!
OPTIONS=-­‐-­‐s...
Jenkins実行手順
•  Data-onlyコンテナを起動してから、
Jenkins本体を起動する
$	
  docker	
  run	
  -­‐d	
  -­‐v	
  /var/lib/jenkins	
  -­‐-­‐name	
...
Jenkins本体の設定
•  Manage Jenkins > Configure System
Dockerの状態を確認
•  Manage Jenkins > Docker
プロジェクトの設定
今回デモで使うプロジェクト
•  簡単なautoconf	
  /	
  gtest	
  を使うCのプロジェ
クトを用意しました	
  
•  https://github.com/yuryu/gtest-­‐demo
テスト実行中の様子
•  コンテナ内で configure が走っている
テスト終了後
•  設定すれば、コンテナをイメージに
commitできる
実際にやってみます
cAdvisor
•  Dockerのための監視ツール
– https://github.com/google/cadvisor
cAdvisorの画面
cAdvisor起動方法
#	
  setenforce	
  Permissive	
  
$	
  docker	
  run	
  	
  
	
  	
  -­‐-­‐volume=/:/rootfs:ro	
  	
  
	
  	
...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

Dockerイメージ構築 実践テクニック

21,304 views

Published on

Dockerイメージを作る手順、JenkinsからDockerを使う方法について説明しています。

Published in: Engineering
  • Be the first to comment

Dockerイメージ構築 実践テクニック

  1. 1. Dockerイメージ構築 実践テクニック Haruka Iwao Storage Solution Architect, Red Hat K.K. February 12, 2015
  2. 2. 自己紹介 •  岩尾 はるか (@Yuryu) •  所属: レッドハット株式会社 – ストレージソリューションアーキテクト – 大手家電メーカー、ソーシャルゲーム会社、 Web広告ベンチャーを経て現職 •  大学・大学院で高性能計算(HPC)、分散 ファイルシステムを研究 •  ゲーマーです(主に某国産MMORPG)
  3. 3. Dockerイメージの構造 RHEL nginx Webサーバー OSの基本 ファイル OSの基本 ファイル OSの基本 ファイル nginx nginx HTML ファイル 追加 追加 nginxイメージを元に作成 RHELイメージを元に作成 実体は共有 新規
  4. 4. Dockerイメージの作成手順 •  2ステップで作成できます •  Dockerfile の作成 •  $ docker build -t <tag> Dockerfileの場所 – 例) $ docker build -t yuryu/test .
  5. 5. Dockerfileとは •  イメージ作成の手順を書いたもの •  例) FROM  registry.access.redhat.com/rhel     RUN  yum  -­‐y  install  httpd   ADD  index.html  /var/www/html/index.html     EXPOSE  80     CMD  ["/usr/sbin/httpd",  "-­‐DFOREGROUND"]  
  6. 6. Dockerfile 文法 •  FROM - ベースとなるイメージ •  RUN - イメージ構築で実行するコマンド •  ADD - イメージ内にファイルを追加 •  EXPOSE - ポートを外に見せる •  CMD - デフォルトで実行されるコマンド FROM  registry.access.redhat.com/rhel     RUN  yum  -­‐y  install  httpd   ADD  index.html  /var/www/html/index.html     EXPOSE  80     CMD  ["/usr/sbin/httpd",  "-­‐DFOREGROUND"]  
  7. 7. Dockerfile 文法(2) •  MAINTAINER - メンテナを書く •  USER - コンテナ内で実行するユーザー •  WORKDIR - 基準ディレクトリの変更 •  COPY - ホストからファイルのコピー – ADD が大きすぎるので分割 •  その他リファレンスは下記 – https://docs.docker.com/reference/ builder/  
  8. 8. 作って動かす •  $ docker run で実行 – -d バックグラウンドで実行 – -P EXPOSE したポートを割り当て $  mkdir  demo-­‐apache   $  cd  demo-­‐apache   $  curl  -­‐L  -­‐o  Dockerfile  bit.ly/1FA902p   $  echo  “Hello,  Docker!”  >  index.html   $  build  -­‐t  demo-­‐apache  .     $  docker  run  -­‐dP  demo-­‐apache  
  9. 9. docker build 実行例 [yuryu@rhel7  docker-­‐apache]$  docker  build  -­‐t  demo-­‐apache  .   Sending  build  context  to  Docker  daemon  3.584  kB   Sending  build  context  to  Docker  daemon     Step  0  :  FROM  registry.access.redhat.com/rhel    -­‐-­‐-­‐>  e1f5733f050b   Step  1  :  RUN  yum  -­‐y  install  httpd    -­‐-­‐-­‐>  Using  cache    -­‐-­‐-­‐>  3679b20fa9ba   Step  2  :  ADD  index.html  /var/www/html/index.html    -­‐-­‐-­‐>  Using  cache    -­‐-­‐-­‐>  db91c285d5ad   Step  3  :  EXPOSE  80    -­‐-­‐-­‐>  Using  cache    -­‐-­‐-­‐>  c9ceb17b169f   Step  4  :  CMD  /usr/sbin/httpd  -­‐DFOREGROUND    -­‐-­‐-­‐>  Using  cache    -­‐-­‐-­‐>  4e99155706f6   Successfully  built  4e99155706f6  
  10. 10. docker run 実行例 •  ランダムなポートと、コンテナID、コン テナ名が割り当てられる [yuryu@rhel7  docker-­‐apache]$  docker  run  -­‐dP  demo-­‐apache   8d6b20a1e23427ad575bed1aee9cbea5406e5ed648a645e955cd6c6c6a 34ea0a   [yuryu@rhel7  docker-­‐apache]$  docker  ps   CONTAINER  ID                IMAGE                                COMMAND                             CREATED                          STATUS                            PORTS                                   NAMES   8d6b20a1e234                demo-­‐apache:latest      "/usr/sbin/httpd   -­‐DF      4  seconds  ago              Up  4  seconds                 0.0.0.0:49247-­‐>80/tcp        jovial_jones                  
  11. 11. いくつかの応用パターン •  固定ポートの割り当て •  コンテナのリンク •  コンテナ内のボリュームを共有 •  コンテナ外とボリュームを共有
  12. 12. 固定ポートの割り当て •  $ docker run -p <host port>:<guest port> •  $ docker port コマンドでもポートの割り 当てを確認できる [yuryu@rhel7  docker-­‐apache]$  docker  run  -­‐dp  80:80  demo-­‐ apache   b027be3d09ace7c8cac594c14d07d3ddda5c32f15e14f8a28297714a69 723c54   [yuryu@rhel7  docker-­‐apache]$  docker  port  b027be3d09ac   80/tcp  -­‐>  0.0.0.0:80  
  13. 13. コンテナのリンク •  --link <コンテナ名>:alias •  EXPOSEしたポートを環境変数に入れる #  docker  run  -­‐d  -­‐e  MYSQL_ROOT_PASSWORD=root  -­‐-­‐name  mysql   mysql   #  docker  run  -­‐it  -­‐-­‐link  mysql:mysql  mysql  /bin/bash   #  env  |grep  MYSQL_PORT   MYSQL_PORT_3306_TCP_PORT=3306   MYSQL_PORT_3306_TCP=tcp://172.17.0.155:3306   MYSQL_PORT_3306_TCP_PROTO=tcp   MYSQL_PORT_3306_TCP_ADDR=172.17.0.155   MYSQL_PORT=tcp://172.17.0.155:3306   #  mysql  -­‐-­‐host=$MYSQL_PORT_3306_TCP_ADDR  -­‐-­‐port= $MYSQL_PORT_3306_TCP_PORT  -­‐-­‐password=root  
  14. 14. ALIAS_PORT_XXX ALIAS_PORT_XXX_TCP ALIAS_PORT_XXX_TCP_PROTO ALIAS_PORT_XXX_TCP_ADDR ALIAS_PORT_XXX_TCP_PORT コンテナのリンク(図) 提供コンテナ 使うコンテナ link aliasEXPOSE 環境変数
  15. 15. コンテナ内のボリューム共有 •  例: VOLUME /var/lib/mysql •  --volumes-from <コンテナ名> で利用 •  Data-only コンテナをベースに使うと良い #  docker  run  -­‐d  -­‐-­‐name  mysql_volume  mysql  echo  MySQL   Volume  Container   #  docker  run  -­‐-­‐volumes-­‐from  mysql_volume  -­‐d  -­‐e   MYSQL_ROOT_PASSWORD=root  -­‐-­‐name  mysql  mysql   Docker 1.4以降は docker run の代わりに docker create を利用する (ボリューム生成のタイミングが変更されている)
  16. 16. コンテナ外とのボリューム共有 •  -v <host path>:<container path> •  SELinuxの設定が必要 – # chcon -Rt svirt_sandbox_file_t $  mkdir  mysql-­‐volume;  cd  mysql-­‐volume   $  sudo  chcon  -­‐Rt  svirt_sandbox_file_t  .   $  docker  run  -­‐v  $(pwd):/var/lib/mysql  -­‐-­‐name  mysql  -­‐e   MYSQL_ROOT_PASSWORD=root  -­‐d  mysql  
  17. 17. Data-onlyコンテナのバックアップ •  ホストでボリュームを共有して、tarで固 める $  mkdir  mysql-­‐volume;  cd  mysql-­‐volume   $  sudo  chcon  -­‐Rt  svirt_sandbox_file_t  .   $  sudo  docker  run  -­‐-­‐volumes-­‐from  mysql_volume  -­‐v  $(pwd):/ backup  -­‐-­‐name  mysql-­‐backup  fedora  tar  cfz  /backup/mysql-­‐ backup.tar.gz  /var/lib/mysql   $  sudo  docker  run  -­‐-­‐volumes-­‐from  mysql_volume  -­‐v  $(pwd):/ backup  -­‐-­‐name  mysql-­‐restore  fedora  tar  xf  /backup/mysql-­‐ backup.tar.gz  -­‐C  /    
  18. 18. ボリューム共有 Data only コンテナ 使うコンテナ volumes-from VOLUME ホスト -v <host>:<container>
  19. 19. Dockerで作るCI 開発者A 開発者B コンテナの定義を共有 変更を通知 自動テストを実施 コンテナを取得して開発 開発者C クラウドへデプロイを指示 GitHub テスト済みコンテナイメージを クラウドサービスへデプロイ コンテナイメージを作成
  20. 20. 今回のデモの定義 •  GitHubで公開中 •  https://github.com/yuryu/docker-­‐ jenkins-­‐demo   Red Hat Enterprise Linux テストソースコードを取得 生成 起動
  21. 21. JenkinsのDockerfile FROM  registry.access.redhat.com/rhel   MAINTAINER  Haruka  Iwao     RUN  yum  -­‐y  upgrade     RUN  curl  -­‐o  /etc/yum.repos.d/jenkins.repo  http://pkg.jenkins-­‐ ci.org/redhat/jenkins.repo   RUN  rpm  -­‐-­‐import  https://jenkins-­‐ci.org/redhat/jenkins-­‐ ci.org.key   RUN  yum  -­‐y  install  jenkins  java  git  docker     ADD  run-­‐jenkins.sh  /root/run-­‐jenkins.sh     EXPOSE  8080     CMD  /root/run-­‐jenkins.sh  
  22. 22. run-jenkins.sh #!/bin/sh     JENKINS_HOME="/var/lib/jenkins"   JENKINS_USER="jenkins"   JENKINS_JAVA_OPTIONS="-­‐Djava.awt.headless=true"   JENKINS_PORT="8080"   JENKINS_HANDLER_MAX="100"   JENKINS_HANDLER_IDLE="20"     JAVA_CMD="/usr/bin/java  $JENKINS_JAVA_OPTIONS  -­‐DJENKINS_HOME=$JENKINS_HOME  -­‐ jar  /usr/lib/jenkins/jenkins.war"   OPTIONS="-­‐-­‐httpPort=$JENKINS_PORT  -­‐-­‐handlerCountMax=$JENKINS_HANDLER_MAX  -­‐-­‐ handlerCountMaxIdle=$JENKINS_HANDLER_IDLE  "     cd  "$JENKINS_HOME"   exec  runuser  -­‐u  $JENKINS_USER  -­‐-­‐  $JAVA_CMD  $OPTIONS
  23. 23. SlaveのDockerfile FROM  registry.access.redhat.com/rhel   MAINTAINER  Haruka  Iwao     RUN  yum  -­‐y  upgrade     RUN  yum  -­‐y  swap  -­‐-­‐  remove  fakesystemd  -­‐-­‐  install  systemd  systemd-­‐libs   RUN  yum  -­‐y  install  openssh-­‐server  java-­‐1.7.0-­‐openjdk     RUN  adduser  jenkins   RUN  echo  "jenkins:jenkins"  |  chpasswd   RUN  ssh-­‐keygen  -­‐f  /etc/ssh/ssh_host_rsa_key  -­‐N  ''  -­‐t  rsa   RUN  ssh-­‐keygen  -­‐f  /etc/ssh/ssh_host_dsa_key  -­‐N  ''  -­‐t  dsa   RUN  ssh-­‐keygen  -­‐f  /etc/ssh/ssh_host_ecdsa_key  -­‐N  ''  -­‐t  ecdsa     RUN  yum  -­‐y  install  gcc  gcc-­‐c++  automake  autoconf  make  git  libtool     EXPOSE  22     CMD  ["/usr/sbin/sshd",  "-­‐D"]  
  24. 24. Slaveを作るときの注意点 •  RHEL標準のコンテナイメージには systemdが入っていません •  fakesystemdが入っている •  systemdに依存するパッケージを入れる場 合は、本物のsystemdに置き換える – yum -y swap -- remove fakesystemd -- install systemd systemd-libs •  systemdをinitとして実行する必要は無い
  25. 25. Jenkins Docker Plugin •  JenkinsスレーブをDockerで実行 •  テストごとにコンテナを生成、削除
  26. 26. DockerにTCPをlistenさせる •  Jenkinsから制御するために必要 •  /etc/sysconfig/dockerを書き換える •  このままだと認証なしに誰でもアクセス 可能になるので注意! OPTIONS=-­‐-­‐selinux-­‐enabled  -­‐H  tcp://172.17.42.1:5555  -­‐H  fd://  
  27. 27. Jenkins実行手順 •  Data-onlyコンテナを起動してから、 Jenkins本体を起動する $  docker  run  -­‐d  -­‐v  /var/lib/jenkins  -­‐-­‐name   jenkins-­‐home  yuryu/demo-­‐jenkins  echo  Data-­‐only   container  for  jenkins   $  docker  run  -­‐-­‐volumes-­‐from  jenkins-­‐home  -­‐d  -­‐p   8080:8080  yuryu/demo-­‐jenkins  
  28. 28. Jenkins本体の設定 •  Manage Jenkins > Configure System
  29. 29. Dockerの状態を確認 •  Manage Jenkins > Docker
  30. 30. プロジェクトの設定
  31. 31. 今回デモで使うプロジェクト •  簡単なautoconf  /  gtest  を使うCのプロジェ クトを用意しました   •  https://github.com/yuryu/gtest-­‐demo
  32. 32. テスト実行中の様子 •  コンテナ内で configure が走っている
  33. 33. テスト終了後 •  設定すれば、コンテナをイメージに commitできる
  34. 34. 実際にやってみます
  35. 35. cAdvisor •  Dockerのための監視ツール – https://github.com/google/cadvisor
  36. 36. cAdvisorの画面
  37. 37. cAdvisor起動方法 #  setenforce  Permissive   $  docker  run        -­‐-­‐volume=/:/rootfs:ro        -­‐-­‐volume=/var/run:/var/run:rw        -­‐-­‐volume=/sys:/sys:ro        -­‐-­‐volume=/var/lib/docker/:/var/lib/docker:ro        -­‐-­‐publish=8080:8080        -­‐-­‐detach=true        -­‐-­‐name=cadvisor        -­‐-­‐volume=/cgroup:/cgroup        google/cadvisor:latest
  38. 38. ご清聴ありがとうございました

×