gendosu流、dockerの使い方

2015年2月9日

以前よりローカルでの仮想環境の生成・破棄は容易になったような気がしますが

Vagrantでは、インスタンスの生成、破棄のコストが高い気がするので

そこのところをDockerを使ってやってみるようにしてみました。

gendosu流dockerの使い方

まずは、ベースになるマシンとしてUbuntu Server 14.10 64bitの仮想マシンを立ち上げます。

これは、VagrantでもVMwareでも問題ないです。

今後、頻繁にアクセスすることになるので、vmのIPをhostsに登録してしまいます。

hostsには

192.168.?.?    local-vm

として登録しちゃいます。

これで、vmに

ssh root@local-vm

という感じでログインできるようになりました。

ここから、dockerのセットアップをします。

ubuntu14では、

http://docs.docker.com/installation/ubuntulinux/

にあるとおりに

sudo apt-get update
sudo apt-get install docker.io
source /etc/bash_completion.d/docker.io

とやってインストールします。

これで、入ったので、dockerにコンテナを作ってみます。

ただ、普通にやるとコンテナ内へのアクセスが面倒なので

各コンテナ内にsshを起動してしまいます。

これで、ポート指定で外部からssh接続できるコンテナになります。

やり方ですが

Dockerfileを作ってイメージを作成するようにします。

# => Dockerfile

# sshd
#
# VERSION 0.0.1

FROM ubuntu:14.04.1
MAINTAINER gendosu "gendosu@hoge.hoge"

RUN apt-get update

RUN apt-get install -y openssh-server supervisor vim build-essential git
RUN mkdir -p /var/run/sshd
RUN sed -ibak -e "s/^PermitRootLogin.*$/PermitRootLogin yes/" /etc/ssh/sshd_config
ADD supervisord/sshd.conf /etc/supervisor/conf.d/sshd.conf
RUN echo 'root:root' |chpasswd

EXPOSE 22

CMD ["/usr/bin/supervisord"]

というファイルを作成します。

同じ階層にsupervisord/ssh.conf

を作成します。

こちらは

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

とします。

このDockerfileをdocker buildでイメージにします。

docker build --rm -q -t my/ubuntu-ssh:latest .

これで、sshdが起動するdockerコンテナのイメージが作成されました。

このイメージを元に、「run-ubuntu-ssh」という名前でコンテナを起動します。

docker run -d -p 2200:22 -p 3000:3000 -v ~/products:/products --name=run-ubuntu-ssh -h run-ubuntu-ssh my/ubuntu-ssh:latest

これで、2200番のポートを指定してssh接続が出来るようになりました。

各コンテナでsshが起動するのは無駄な気がしますが

アクセスが容易になる分、開発環境では便利になるのではないでしょうか。

さて、sshdは起動しましたが、たいていの場合MySQLとかも同時に入れたりしたくなったりします。

MySQLの場合は、別のコンテナでMySQLだけが入ったものを用意します。

これは、Docker.ioのdockerhubから持ってきます。

https://registry.hub.docker.com/

この中に、MySQLというリンクがあるので、ここを開いて、手順通りにやると

MySQLの入ったコンテナが起動できます。

先ほど、「run-ubuntu-ssh」コンテナを起動したときに使ったコマンド

docker runに、別のコンテナへのリンクを追加するというオプションがあります。

今回はそのオプションを追加します。
※先ほどのdocker runを実行している場合、一度docker stop、docker rmでコンテナを破棄します。

docker run -d -p 2200:22 -p 3000:3000 -v /products:/products --link mysql:mysql --name=run-ubuntu-ssh -h run-ubuntu-ssh my/ubuntu-ssh:latest

mysqlという名のコンテナに対してリンクを張っています。

run-ubuntu-sshコンテナの内部からは、mysqlという名前でmysqlコンテナへ接続できるようになっています。

mysql -uroot -p -hmysql

というコマンドでMySQLへ接続できていればOKです。

別のコンテナを起動する場合、先ほどのdocker runのコマンドで、-p 2200:22のところを2201:22という感じにインクリメントしていくことで、比較的容易にコンテナを管理できると思います。

アンケート