Docker/K8S実践コンテナ開発入門@8日目

今回もDocker/K8Sの実践本の続きを対応します。

今回は3章の続きである永続データをどう扱うかというところからやっていきます。

 

■書籍

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

 

 

Data Volume

Data VolumeというDockerコンテナ内のディレクトリをディスクに永続化するための仕組みであり、ホスト・コンテナ間でのディレクトリ共有・再利用が可能になります。

DataVolumeを利用することでコンテナを破棄してもディスクに保存されるのでステートフルなアプリケーションに向いていると言えます。

 

■コマンド書式

docker container run [options] -v ホスト側ディレクトリ:コンテナ側ディレクトリ リポジトリ名[:タグ] [コマンド] [コマンド引数]

 

まずはお試しとして、画像処理ツールであるImageMagickwo利用してコンテナの中で画像ファイルを作成します。

 

 

■コマンド

docker container run -v {$PWD}:/workspace gihyodocker/imagemagick:latest convert -size 100x100 xc:#000000 /workspace/gihyo.jpg

f:id:lawrence-twin:20200423224333p:plain

 

 convert から後がコンテナに渡すアプリケーションの引数で、jpg ファイルを生成しています。

 -vオプションでData Volumeを設定しており、コンテナ内のカレントディレクトリ仁摩ううとされます。カレントディレクトリを参照するとコンテナで生成されたgihyo.jpgが共有されているはずです。

 

しかし、ダメ

エラー内容を参照すると以下の通りでした。

https://qiita.com/bananaumai/items/131c337a32b7a690a405

 

絶対パスで実行しろとのことなので以下の通りコマンドを実行

■コマンド

docker container run -v /Users/lawrence/go/src/dv01:/workspace gihyodocker/imagemagick:latest convert -size 100x100 xc:#000000 /workspace/gihyo.jpg

 

■確認コマンド

ls -l

f:id:lawrence-twin:20200423225710p:plain

 

Data Volumeコンテナ

コンテナのデータ永続か手法として推奨されているのがData Volumeコンテナという手法

Data VolumeコンテナのVolumeはDockerの管理領域であるホスト側の「/var/lib/docker/volumes/」以下に配置されていることは覚えておいた方が良さそう

 

MySQLのデータをData Volumeコンテナに保持する

以下の通りDockerfileを準備する。

busyboxは色んな機能を詰め込んだ特殊プログラムらしい。とりあえず利用

ja.wikipedia.org

f:id:lawrence-twin:20200424220522p:plain

 

続いて以下のコマンドを実行

■コマンド

docker image build -t example/mysql-data:latest .

f:id:lawrence-twin:20200424221330p:plain

続いて、「mysql-data」という名称を付与してコンテナを起動

■コマンド

docker container run -d --name mysql-data example/mysql-data:latest

f:id:lawrence-twin:20200424221629p:plain

次はMySQLコンテナを実行します。

今回は参考書通りの設定としました。

■コマンド

lawrence@Chocolate mysql_dv % docker container run -d --rm --name mysql \
 -e "MYSQL_ALLLOW_EMPTY_PASSWORD=yes" \
 -e "MYSQL_DATABASE=volume_test" \
 -e "MYSQL_USER=example" \
 -e "MYSQL_PASSWORD=example" \
 --volumes-from mysql-data \

 mysql:5.7

 

問題なく完了したら、次に CREATE文とINSERT文をMySQLコンテナに流します。

 

 が、起動しない

以下のエラーが発生

■エラー

lawrence@Chocolate mysql_dv % docker run -it mysql

2020-04-24 14:14:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started.

2020-04-24 14:14:26+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'

2020-04-24 14:14:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian9 started.

2020-04-24 14:14:26+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified

You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

 

■原因

初期化を行なっていなかったことが原因でした。

mysqlの初期化時に以下のコマンドを実行することでうまくいきました。

 -e "MYSQL_ROOT_PASSWORD=root" \

 

以降はテーブル作成とstop・再execでデータが消えていないことを確認しました。

明日以降はDIND(Docker in Docker)を試していきます。