身近で独立する人が多くて若干影響を受けてる。俺の場合は社長になるとかそういうのガラじゃないんで、フリーランスとかやってみようかなーって気分になっている(これも社長みたいなモンかあ〜?w)。ほぼ興味のみの動機。でもまあ刹那的なのはアレなので、まずは情報集めとかをしよう…。調べた挙げ句「やっぱ(今の)会社は辞めへんで〜!」ってなるかもしれないけど、リサーチはしとく。それと、独立とかそういうのとは関係無しに、今まで得られた信頼とかポジションとか、プラスの面もマイナスの面も含めて全部リセットしてイチから始めたいと思う時がある。ウマく説明できないけど。
でだ、今日はかねてから興味のあったDockerをちょっと実験したのでそのメモを書く。まだ触り始めたばかりで理解が怪しい…。今回は、Pythonの実行環境が入っているDockerイメージを作って、それが起動できることをゴールにした。このイメージがあれば当該の環境は一発で立ち上がる。
それにしても最近、この手のインフラツールが発達してきて、使い分けに迷うときがある。例えば、一昔前だと、どこまでをPXEでやるのか?どこからをchefでやるか?みたいな。OSの基本設定、言語はDocker/AMI/PXE、ミドルウェアのパッケージインストール、各種コンフィグはchef/puppet/ansible、アプリケーションのデプロイはCIツール、みたいな感じがいいのかな?それともむしろ、アプリケーションまで全部入ったテスト済みのDockerイメージを作っておいて、それを本番にリリースする。んで、再リリース時は新しいイメージを配布して古いイメージを破棄みたいな感じのがイケてるかな…?このあたりの境界線とか使い分けについてもベストプラクティスを考えねば…。



0. 環境

さくらVPSにDockerをいれてそこにゲストを作ってみた。

  • ホスト
    • OS: CentOS6.5
    • Kernel: 2.6.32-431.1.2.0.1.el6.x86_64
    • memory: 1GB
    • CPU: 2core
  • ゲスト
    • OS: CentOS
    • ※ 公式イメージをそのまま使ったんだが、バージョンは6.4だった。
1. インストール&起動

CentOSの場合、epelから入れることができる。参考にさせていただいた記事やブログにはMacにVagrantとVirtualBoxを入れて…って形が多かったが、CentOSホストの場合はDockerを入れるだけでよい。下記のようにするだけでOK。

1
2
yum install --enablerepo=epel docker-io
/etc/init.d/docker start

初めて触る人はまず下記のようにするとハローワールド的に試せるのでやっておくといい。初回はcentosのイメージを公式から落としてくるので時間がかかる。

1
sudo docker run centos /bin/echo "Hello World"

2. Dockerイメージの作成

Dockerfileを作ることでイメージの自作ができる。ここでは冒頭で述べた通り、Python3.3.3の実行環境が入っていて、かつホストOSからsshログイン可能なイメージを作ることにする。

Dockerイメージは次のコマンドでできる。後述するDockerfileのあるディレクトリに移動して実行する。

1
docker build -t test/centos_64_python .

Dockerfileは次のとおり。「ore」というユーザにpyenvを通して、こいつがPythonを実行することを想定する。また、同じくoreユーザでsshログインを行うことにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
FROM centos

RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
RUN yum install -y passwd
RUN yum install -y sudo
RUN yum install -y gcc
RUN yum install -y gcc-c++
RUN yum install -y make
RUN yum install -y vim
RUN yum install -y git
RUN yum install --enablerepo=epel -y mosh
RUN yum install -y openssl-devel
RUN yum install -y zlib-devel
RUN yum install -y readline-devel
RUN yum install -y sqlite-devel
RUN yum install -y bzip2-devel
RUN yum install -y libevent-devel
RUN yum install -y openssh
RUN yum install -y openssh-server
RUN yum install -y openssh-clients

RUN useradd ore
RUN passwd -f -u ore
RUN mkdir -p /home/ore/.ssh
ADD ./authorized_keys /home/ore/.ssh/
RUN chown -R ore. /home/ore/.ssh
RUN chmod 700 /home/ore/.ssh
RUN chmod 600 /home/ore/.ssh/authorized_keys
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 echo "ore ALL=(ALL) ALL" >> /etc/sudoers.d/ore

RUN git clone git://github.com/yyuu/pyenv.git /home/ore/.pyenv
RUN echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> /home/ore/.bashrc
RUN echo 'if [ -d "${PYENV_ROOT}" ]; then' >> /home/ore/.bashrc
RUN echo ' export PATH=${PYENV_ROOT}/bin:$PATH' >> /home/ore/.bashrc
RUN echo ' eval "$(pyenv init -)"' >> /home/ore/.bashrc
RUN echo 'fi' >> /home/ore/.bashrc
RUN cd /home/ore/.pyenv/plugins; git clone git://github.com/yyuu/pyenv-virtualenv.git
RUN chown -R ore. /home/ore/.pyenv
RUN su ore -c "/home/ore/.pyenv/bin/pyenv install 3.3.3"

RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

3. コンテナの起動と確認

イメージの作成が完了したら、docker imagesと叩くと作ったイメージが存在していることが確認できる。そして次のコマンドで起動する。

1
docker run -d -p 22 test/centos_64_python

docker psと叩くと、上記イメージでコンテナが起動していることが確認できる。また、22番ポートへの接続が、49XXXみたいなポートでフォワードされていることも確認できる。

4. 接続

ホストからコンテナに接続を行うには次のようにする。IPはホストでifconfigを打つと、「docker0」というインターフェイスにバインドされているIPを確認できるので、そいつを指定する。-pはdocker psコマンドで確認したフォワード用のポート。Dockerfileで設定した通り、鍵を指定して接続する。

1
ssh -i ./id_rsa ore@172.17.42.1 -p 49155

5. ハマりどころ

ハマったところについてメモ。

docker build中にlxc-start cannot allocate memoryでコケる

vm.overcommit_memory = 1
vm.overcommit_ratio = 75

として解決…。

docker build中になぜか名前解決できなくなる

Dockerfileを見ていただくと、yumコマンドでパッケージのインストールをしているわけだが、なんかよくわからんがたまにリポジトリのURLにアクセスできなくなる。

/etc/sysconfig/dockerというファイルがあるので、それを下記のようにして解決。

other_args=”-dns 8.8.8.8″

ホストからのsshアクセスができなかった

「Connection to xxx.xxx.xxx closed.」と怒られてしまった…

Dockerfileに次の二行を追記して解決。

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

dockerを起動するとホストでiptablesが動く

最初、sshできなかったとき、こいつが原因かと思ったがそうでもなかった。これは止めちゃダメ。

6. 参考
おわり

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Set your Twitter account name in your settings to use the TwitterBar Section.