読者です 読者をやめる 読者になる 読者になる

dockerとdocker-composeの使い方メモ

プライベートで使ってるVPSの環境をdocker-composeで動かしたのだけど、忘れてもいいようにメモを残す。
ホストOSは、Ubuntu16.04。

インストール

dockerは手順通りaptでインストールすればよい。
Installation on Ubuntu
docker-composeは、dockerとは別途インストールが必要(1ファイルのコマンドをダウンロードして配置するだけ)
Install Compose
dockerコマンドを実行するユーザーはdockerグループに属している必要があるので、インストール後にusermodで設定しておく(usermodで設定したグループは再ログインで反映される)

Dockerイメージの準備

DockerHubからpullしてくるか、Dockerfileを作成してビルド(docker build)する。
ビルドの際に、名前の指定をしとかないと、無名になりハッシュ値で指定することになる。
なるべくオフィシャルのイメージを使って、自前ビルドや野良ビルドのイメージは避けたほうがよさそう。メンテが面倒。
野良のイメージを使う場合は、セキュリティに注意する。バックドアが仕込まれたイメージなどもあるらしい。

コンテナの作成と起動

docker runコマンドで起動されるが、これはコンテナ作成+プロセス実行であって、実行が終わってもコンテナが消えないで残るので注意。
コンテナ一覧はdocker psで見れる。-aオプションを指定すると、実行中以外のコンテナも表示される。

docker ps -a

終了したプロセスの再実行はdocker startでできる。
runの際にポートマッピングやvolumeのマウントなど、全部指定する。コンテナ名をちゃんと指定したほうがよい。
「-d」 (detouch) オプションを指定しないとforegroundで実行される(systemdやsupervisorなどから監視させるならdetouchしなくていい)
docker-composeで管理するなら、docker-compose.ymlにrunのオプションを書いてしまう。

コンテナの停止

docker stopで停止できる。停止してもコンテナは消えないので、startで再度実行できる。

再起動

docker restartでプロセスを再起動できる。runで指定したオプションを変更するならコンテナの再生成が必要かも?
設定ファイルが入ったディレクトリをVOLUMEでマウントさせとけば、restartでプロセスに読み込ませるのも可能か。

プロセスの自動再起動

docker runで実行するときに --restart オプションでalwaysを指定しておくと、プロセスが死んでもdocker-engineが自動で再起動してくれる。
また、alwaysの場合は、OSを再起動したときも自動で起動される。
Docker run reference -- Restart policies (--restart)
例:

$ docker run -d -v /tmp/ftp/:/srv/soloftpd/ \
  -p 21:21 -p 50000-50009:50000-50009 \
  --env OPTIONS="--masquerade-address=192.168.0.2" \
  --name=soloftpd --restart=always tokibito/soloftpd

復数の依存するサービスを起動する

docker-composeを使って依存を記述すればいい。

docker-compose

docker-compose.ymlにdocker runのオプションなどを書いといて、複数のイメージをまとめてビルド、コンテナを作って実行するところまでやってくれるラッパーツール。

docker-compose up

でイメージをビルドしてコンテナを生成して起動までやってくれる。 -dオプションを指定すればバックグラウンドで実行できる。

docker-compose down

でコンテナを停止して破棄してくれる。

docker-composeの管理

docker-compose.ymlと各Dockerイメージの管理とかディレクトリ構成どうするか。
単一リポジトリで管理するのもありだけど、gitを使ってるなら、Dockerfileはそれぞれ別リポジトリに置いて、submoduleでdocker-compose用のリポジトリから参照すれば、個別に再利用しやすく、バージョン管理も楽そう。