今噂のDockerをVagrantから触ってみました。
VagrantはproviderとしてデフォはVirtualBoxを使いますが、1.6くらいから(正確には不明)dockerがサポートされました。
これの何が嬉しいかというと、Vagrant up した時の起動がとにかく早いです。VirtualBoxだと条件によりますが2.3分かかるのですが、dockerを使うと一瞬で立ち上がります。(初回だけはdocker のイメージをbuildするのに多少時間がかかりますが)
あ、タイトル通りホストがUbuntuの場合の記事です。
MacOSからの場合はnativeでdockerを使えない(docker実行用のLinuxの仮想マシンをかますみたいです)のでちょっと変わるかもしれません。
Dockerのインストール
Dockerのインストールとかについてはこちらの記事を参照してください。
http://krakenbeal.blogspot.jp/2014/04/docker-0100-ubuntu-1404.html
apt-getでも入れられるようですが、パッケージ名は「docker」ではなく「docker.io」なので注意が必要です。
私はリンク先のcurlで取得したものをsudo shに流し込む方法でやりました。
dockerグループにユーザーを入れてやる
必須ではないです。が、dockerを実行するたびにsudoをつけるのが面倒な人はやっておくといいかも。
$ gpasswd -a newgyu docker
usermod -G でやってハマった人です。ハイ。
Dockerのイメージ取得
centosのイメージでやりたかったので、「centos」という名前のイメージをpullしました。
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 162
tianon/centos CentOS 5 and 6, created using rinse instea... 22
blalor/centos Bare-bones base CentOS 6.5 image 4 [OK]
$ docker pull centos
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos6 0c752394b855 7 days ago 124.1 MB
centos latest 0c752394b855 7 days ago 124.1 MB
centos 6.4 539c0211cd76 14 months ago 300.6 MB
vagrant ssh できるようにする
pullしてきたdockerのイメージはホントに素の状態のcentosでsshが使えない状態だったのでここにつまづきました。
多分、sshが使える状態のimageをpullしてくれば素直にやれると思います。が、Dockerfileの学習も兼ねてやってみたかったので、
http://www.nerdstacks.net/2014/03/ssh-ready-centos-dockerfile/
この辺を参考にして頑張りました。
Dockerfileの作成
FROM centos:latest
RUN yum update -y
RUN yum install -y passwd openssh openssh-server openssh-clients sudo
## Create user
RUN useradd vagrant
RUN passwd -f -u vagrant
## Set up SSH
RUN mkdir -p /home/vagrant/.ssh; chown vagrant /home/vagrant/.ssh; chmod 700 /home/vagrant/.ssh
ADD authorized_keys /home/vagrant/.ssh/authorized_keys
RUN chown vagrant /home/vagrant/.ssh/authorized_keys
RUN chmod 600 /home/vagrant/.ssh/authorized_keys
## setup sudoers
RUN echo "vagrant ALL=(ALL) ALL" >> /etc/sudoers.d/docker
## Set up SSHD config
RUN sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop
CMD /usr/sbin/sshd -D
EXPOSE 22
ポイントは
- yumでopenssh-serverを入れる
- vagrantユーザーで鍵認証でssh接続できるようにする
- 22番ポートを開ける
です。
sshdを一回起動して停止するのは自分にとってはおまじないですが、ログを見るとsshd_configを読み込んでどうたらしているっぽいのでまぁそういうことだと納得しておきます。
Vagrantfileの作成
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provider "docker" do |d|
d.has_ssh = true
d.build_dir = "."
d.remains_running = false
end
config.ssh.username = "vagrant"
config.ssh.private_key_path = "vagrant.pkey"
end
ポイントは、
- Vagrantfileと同ディレクトリにあるDockerfileを使ってイメージビルドするように指定
- sshを使いたい
- 起動しっぱなしにしとけ指定
- 接続ユーザーはvagrantユーザー
- 鍵は所定の場所にあるやつを使う
というところですかね。remains_runningとか無くても動くのかもしれませんが・・・。
いよいよ実行
$ vagrant up --provider=docker
Bringing machine 'default' up with 'docker' provider...
==> default: Building the container from a Dockerfile...
default: Image: 19b599c4d574
==> default: Creating the container...
default: Name: centos_default_1402991682
default: Image: 19b599c4d574
default: Volume: /home/newgyu/workspace/centos:/vagrant
default: Port: 2222:22
default:
default: Container created: 347f7ea987ae242a
==> default: Starting container...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 172.17.0.40:22
default: SSH username: vagrant
default: SSH auth method: private key
==> default: Machine booted and ready!
$ vagrant ssh
[vagrant@347f7ea987ae ~]$ pwd
/home/vagrant
ようやく出来た。
動きとしては、
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> 19b599c4d574 About an hour ago 192.6 MB
centos centos6 0c752394b855 7 days ago 124.1 MB
centos latest 0c752394b855 7 days ago 124.1 MB
centos 6.4 539c0211cd76 14 months ago 300.6 MB
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
347f7ea987ae 19b599c4d574 /bin/sh -c '/usr/sbi 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp centos_default_1402991682
Dockerfileを使って19b599c4d574というイメージをbuildして、347f7ea987ae242aというコンテナを起動するということか。
一応ファイル一式を下記の場所においておきました。
https://github.com/NewGyu/myfirst_vagrant_docker