Docker使ってみました
突然寒くなりましたね。
開発担当のノリフミです。
最近サーバーサイドを少し触らせてもらってるのですが
Dockerという素晴らしいのに得体の知れないものを手懐けようと奮闘してる日々です。
自分なりにこうしたらいいのでは?
っと思ったこと残しておこうかと。
そもそも、Dockerって?
「Docker」とは、Docker社(旧dotCloud)が開発するオープンソースのコンテナー管理ソフトウェアの1つです。
なんて記述をみつけましたが、分かる人には分かりますが、分からない人はさっぱりですよね。
簡単にいうと、「皆んなが使えて、目に見えないパソコンを簡単に管理(作成・編集・削除等)できるソフトウェア」という感じでしょか(逆にわからない)
前置きはこれくらいにして、ここから本題…
マウントでコンテナ生成してみた
wordpressの公式イメージをpull
docker pull wordpress:latest
コンテナ生成
docker run –name container-name -it
–link container-mysql:mysql
-p 8080:80
-v /home/user/html:/var/www/html
-v /home/user/conf/apache2/sites-available/000-default.conf:/etc/apache2/sites-available/000-default.conf
-v /home/user/conf/php/php.ini:/usr/local/etc/php/php.ini
-e ‘WORDPRESS_DB_HOST=mysql’
-e ‘WORDPRESS_DB_USER=user’
-e ‘WORDPRESS_DB_PASSWORD=password’
-e ‘WORDPRESS_DB_NAME=db_name’
wordpress:latest bash
※ここで問題発生!
カスタマイズすればするほど-vが
増える!
増える!!
そこで考えるノリフミ…
「そうかDockerfileにしてしまえば!」
※ここでまたまた問題発生!!
DockerfileでCOPYしてコンテナ生成しても、起動後のホスト側での編集がコンテナに反映されない…
そこでノリフミは思いました。
「-vとDockerfileってどっちがいいんだ?」
-vとDockerfileどっちが良いのか
要点整理
-vでマウントいっぱい
- ホストから設定書き換えれる!
- imageも公式wordpressだけで済むし簡単!
- 生成コマンド(run)が度々変わる
- 生成後にもコンテナ内作業がいる場合がある
Dockerfileでまとめる
- COPYなりで設定ファイル追加すると、設定変えたらimage作り直し
- 環境ごとにimage増える
- 生成はimageからだから生成コマンドが簡単!
- 生成後に作業がいらない!
色々と記事を探していると、こんなのみつけました。
Dockerが提供するのは、アプリケーションの実行環境を「Dockerイメージ」としてイメージ化する機能、そして、Dockerイメージから実際にアプリケーションを起動する実行環境を提供するという機能です。この「実行環境のイメージ化」こそが、Dockerの中心となる機能です。
なるほど。
imageどんどん作ってけよってことですよね。
それではDockerの考え方に基づいて、構築しよう。
Docker build時の仕様
その前に、Dockerのbuildする時に注意点が何点かあります。
- COPYとADDの違い
COPYは純粋にコピーするだけADDはzipなどの解凍もします。
なのでコピーするだけであればCOPYを使いましょう。
- コンテキスト(読み込めるファイルとか)
読み込むDockerfileのある階層のファイルorディレクトリか
設定しているコンテキスト内しかアクセスできません。
なので、COPYしたいファイル等はDockerfileと同じ階層に設置しましょう。
逆にコンテキスト内に不要ファイル(重いファイルとか)を設置していると
勝手に読み込まれるので整理しましょう。
Dockerfileでコンテナ生成してみた
上記を踏まえてファイル構成はこんな形に
├── Dockerfile
└── conf
├── apache2
| └── sites-available
| └── 000-default.conf
├── docker-entrypoint-initdb.d
└── php
└── php.ini
Dockerfile生成
vi Dockerfile
FROM wordpress
MAINTAINER user
COPY conf/docker-entrypoint-initdb.d /docker-entrypoint-initdb.d/
COPY conf/apache2/sites-available/000-default.conf /etc/apache2/sites-available/
COPY conf/php/php.ini /usr/local/etc/php/
RUN a2ensite 000-default
RUN a2enmod headers
RUN a2enconf security
image生成
docker build image_name ./
コンテナ生成
docker run –name container_name -it
–link container-mysql:mysql
-p 8080:80
-e ‘WORDPRESS_DB_HOST=mysql’
-e ‘WORDPRESS_DB_USER=user’
-e ‘WORDPRESS_DB_PASSWORD=password’
-e ‘WORDPRESS_DB_NAME=db_name’
-v /home/user/html:/var/www/html
image_name:latest bash
無事コンテナ生成終了しましたm(_ _)m
まとめ
Dockerでコンテナ生成するときは最低限のマウントで
後はDockerfileに書いて、どんどんimage作っていこう。
というお話でした。
よくよく考えると当たり前な気もしますが、今でもimageいっぱい作るの抵抗あります…