Dockerをドカッと触ってみた(Macで)

Dockerが0.8でMac OSXのサポートをしたみたいな事をどっかでみたので、思考を停止してやってみた。触ってみただけなので全然ドカッと触れてない事に留意してください。言ってみたかっただけです。

あ。あけましておめでとうございます。

http://blog.docker.io/2014/02/docker-0-8-quality-new-builder-features-btrfs-storage-osx-support/

Dockerはそれまでは、Dockerを動かすためのVagrantfileを配布していて、VagrantVM起動、そのVM上でdockerを使ってくれよな!よろしくー!的な感じだった。

それがMac上から直接dockerコマンドを使えるようになったぜ!ヒャッハー!ていう話らしい。

0. 前提

1. boot2dockerとdocker client をセットアップ

マニュアルとほぼ同じような事をやる

$ cd /usr/local/bin

$ curl -o boot2docker https://raw.github.com/steeve/boot2docker/master/boot2docker
$ chmod +x boot2docker

$ curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest
$ chmod +x docker

$ export DOCKER_HOST=tcp://

$ boot2docker init
$ boot2docker up
# コマンド一覧の確認
$ boot2docker 
  • boot2dockerなんなの? - TinyCoreLinuxをベースにDockerを動かす設定をしたVMVirtualBoxに作ってくれる。それをコマンドラインで操作できるようにしてくれる。
  • Mac用のdockerて何さ? - 上記のVM経由でdockerコマンドを実行してくれるクライアント。Mac側で叩いたdockerコマンドをVMで実行してくるショートカットみたいなもん
  • 結局VM上でdockerを動かしてるのは、今までのVagrantFileを配布していた時と大して変わらない感じだった。

2. dockerコマンドを叩く

既にこの時点でdockerが利用可能になってる

 # versionの確認
 $ docker version
 Client version: 0.8.0
 Go version (client): go1.2
 Git commit (client): cc3a8c8
 Server version: 0.8.0
 Git commit (server): cc3a8c8
 Go version (server): go1.2

3. ssh出来るコンテナを作る

完全に目的なくセットアップしてたので何していいか分からなくなった

http://blog.ryotarai.info/blog/2013/07/25/docker-sshd-container/

とりあえずココを参考にsshできるコンテナを作成する。

下記のようなopenssh-serverをインスコしてsshdを立てて、rootてパスでログインできるようなイメージを作成する「Dockerfile」を置く

 FROM ubuntu:12.04
 MAINTAINER tell-k "ffk2005@gmail.com"

 RUN apt-get update
 RUN apt-get install -y openssh-server
 RUN mkdir /var/run/sshd
 RUN bash -c 'echo "root:root" | chpasswd'

 CMD /usr/sbin/sshd -D
 EXPOSE 22

ビルドする

 $ docker build ./
 Uploading context 1.842 GB
 Uploading context
 Step 0 : FROM ubuntu:12.04
  ---> 9cd978db300e
 Step 1 : MAINTAINER tell-k "ffk2005@gmail.com"
  ---> Using cache
  ---> f39bc83bc3a1
 Step 2 : RUN apt-get update
  ---> Using cache
  ---> 43349868d941
 Step 3 : RUN apt-get install -y openssh-server
  ---> Using cache
  ---> 71e6832c0d64
 Step 4 : RUN mkdir /var/run/sshd
  ---> Using cache
  ---> 14d8d5b361c1
 Step 5 : RUN bash -c 'echo "root:root" | chpasswd'
  ---> Using cache
  ---> d1ccd560aa9e
 Step 6 : CMD /usr/sbin/sshd -D
  ---> Using cache
  ---> fdf4c6068540
 Step 7 : EXPOSE 22
  ---> Running in 2b0a51afe8e3
  ---> 4aa9bed82ea4
 Successfully built 4aa9bed82ea4

ビルドしたイメージをtagとして保存する

 $ docker tag 4aa9bed82ea4 tellk/sshd

よーしパパ。コンテナつくっちゃうぞーハハハー。なんつってコンテナ作る

 $ docker run -d -p 22 tellk/sshd
 a1023b856c14286886e44485435cfda51d6f35a31c48a5fe76ccbac7aac9d3c3

コンテナIDから、SSHすべきportを調べる

 $ docker ps 
 CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
 a1023b856c14        tellk/sshd:latest   /bin/sh -c /usr/sbin   50 seconds ago      Up 48 seconds       0.0.0.0:49154->22/tcp   evil_franklin       

 $ docker port a1023b856c14 22
 0.0.0.0:49154
 # 49154にSSHすればいいらしい

4. sshで繋いでみる

まずはMac -> boot2docker_vmsshする

 # とりあえず鍵作成
 $ ssh-keygen -t rsa
 
 # なんやかんや聞かれるのでnopassで鍵を作成して、
 # 下記のような感じで、鍵を置く。
 ~/.ssh/id_rsa_boot2docker_vm
 ~/.ssh/id_rsa_boot2docker_vm.pub

 # 公開鍵をboot2docker_vmにコピー
 $ ssh-copy-id -i ~/.ssh/id_rsa_boot2docker_vm.pub localhost -p 2022
 # パスが求められる「tcuser」がデフォのパス

 # ~/.ssh/configに以下を追加
 Host localhost
   User docker
   StrictHostKeyChecking no  
   UserKnownHostsFile /dev/null 
   IdentityFile /Users/tell_k/.ssh/id_rsa_boot2docker_vm
   HostName 127.0.0.1

 # sshをしてみる。パス無しでログインできる。
 $ ssh localhost -p 2022
 # boot2docker ssh でも パス無しでログイン可
 $ boot2docker ssh 

boot2docker_vmにログインしたらコンテナが起動してるIPを調べる

 docker@boot2docker:~$ ifconfig | grep -A4 docker0
 docker0   Link encap:Ethernet  HWaddr FE:17:B0:FF:B4:70  
             inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
             inet6 addr: fe80::a055:fff:fe78:9134/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 # 172.17.42.1 として起動してるらしい

IPとポートが分かったんで、boot2docker_vm -> Dockerコンテナ(192.17.42.1:49154) にsshする

  docker@boot2docker:~ $ ssh root@172.17.42.1 -p 49154
  # passは「root」になってる
  root@172.17.42.1's password:

  Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64)

   * Documentation:  https://help.ubuntu.com/
     Last login: Sun Feb  9 13:44:12 2014 from 172.17.42.1

  root@a1023b856c14:~#
  # 無事にログインできたぽい

こんどはSSHポートフォーディングで Mac -> (boot2docker_vm)-> Dockerコンテナ(192.17.42.1:49154) 的な感じでMacからDokcerコンテナに直ログインする。

 # Macに戻って ~/.ssh/configを以下の内容を追加
 Host container01
   ProxyCommand ssh localhost -p 2022 nc %h %p
   StrictHostKeyChecking no  
   User root
   Port 49154
   HostName 172.17.42.1

 # これで直接 Dockerコンテナにログインできる
 $ ssh container01 

 # ここでもパス入力省きたいから、boot2docker_vmと同じ公開鍵をコンテナに設置する。
 $ ssh-copy-id -i ~/.ssh/id_rsa_boot2docker_vm.pub container01

 # 上のssh-configに下記一行追加
   IdentityFile /Users/tell_k/.ssh/id_rsa_boot2docker_vm

 # これでnopassで鍵つかってsshできる
 $ ssh container01

 root@a1023b856c14:~#

とりあえず終わり

まとめ

  • boot2dockerとそれに対応したdockerによって,Macから透過的にVM上のdockerを操作出来る事が分かった。
  • コンテナの作成(docker run)は一瞬で終わるので、Vagrantよりはストレスフリーだった。
  • もうちょっとうまい事こなれてみたいと思った。
  • 複数コンテナを立ち上げて、chef-soloやら、ansibleやらでゴニョゴニョしてみたいと思った。