Docker/K8S実践コンテナ開発入門@7日目
今回もDocker/K8Sの実践本の続きを対応します。
今回は3章の「実用的なコンテナの構築とデプロイ」に着手します。
■書籍
アプリケーションとコンテナの粒度
コンテナとプロセスの関係性についての読み物になっている部分がありますが、
1コンテナ=1プロセス という考え方が基本にはなりそうですが、この考え方を必ずしも厳守する必要はありません。これについては以下のアプリで実践してみます。
定期的なジョブを実行するアプリケーション
まずは、以下の通りファイル構成を作成します。
- task.sh
- cron-example
- Dockerfile
■task.shの定義
#!/bin/sh
echo "[`date`] Hello!" >> /var/log/cron.log
■cron-exampleの定義
* * * * * root sh /usr/local/bin/task.sh
■Dockerfileの定義
FROM ubuntu:16.04
RUN apt update
RUN apt install -y cron
COPY task.sh /usr/local/bin/
COPY cron-example /etc/cron.d/
RUN chmod 0644 /etc/cron.d/cron-example
CMD ["cron", "-f"]
上記のとおり、ファイル作成が完了したら以下のコマンドでDockerイメージを作成します。
■コマンド
docker image build -t example/cronjob:latest .
上記の通り正常終了したら今度は出来上がったイメージを以下のコマンドで実行します。
■コマンド
docker container run -d --rm --name cronjob example/cronjob:latest
実行中コンテナ内の/var/log/cron.logを確認してみると、
1分毎にHelloという文字列が出力されていることが確認できます。
1コンテナ内でcronとジョブのスクリプトの2つのプロセスを実行することで、定期的なジョブの実行が実現できました。コンテナの中で複数プロセスを起動する方がシンプルなユースケースが作れるそうです。
以降は読み物系です。
コンテナのポータビリティ
Docker はポータビリティ性が高いため基本的にどんな環境でも稼働できる再現性がありますが、いくつかの例外も存在します。
- Kernel・アーキテクチャの違い
ホストOSカーネルリソースを共有しているのでDockerコンテナが実行出来るホストは、ある特定のCPU,アーキテクチャに依存します。そのため、違うCPUで環境構築しても稼働しない可能性があります。
- ライブラリ・ダイナミックリンクの課題
Dockerではダイナミックリンクを利用して環境を作成すると一度のコンパイルでアプリケーションの配置が終わり高速かつ手軽である。
しかし、CI側とコンテナ側で採用しているライブラリが異なる場合CI側からコピーしたバイナリがコンテナ側では動作しない問題が起こり得る。
これを避ける方法としてはスタティックリンクにするか、ライブラリをCI/Docker間で統一することのどちらかとなる。
ただ、スタティックリンクを利用すると実行ファイルのサイズが大きくなってしまうという問題がありどれを採用すべきかはつど考える必要があります。
- Dockerフレンドリなアプリケーション
アプリケーションはDocker化しやすい特徴というものがあるので、既存アプリケーションをDockerに移行するということがあるのであれば環境変数を活用しよう!という章です。こちら詳細は改めて書籍を見直すのが良さそうです。
明日以降は永続かデータをどう扱うか。の実践を行なっていきます。