Google Cloud Platform(GCP)で、MySQLのdockerコンテナを動かす(デプロイ)手順の覚書です。
mysqlコンテナを実行するまでの手順を記録しておきます。
GCPでVMインスタンス起動
cos(Container Optimized OSの略)は、コンテナ起動用にサイズを抑えて最適化したLinuxイメージです。
stableは安定版、という意味です。
無料で使える最小のマシンタイプ(f-micro 1cpu 614MBメモリ)だとメモリ不足でMySQLが動きませんでした。GCPで無料でMySQLを動かすのは無理っぽいです。
今回は、g1-small(下から二番目に小さい仮想マシン)を選択しました。
コンテナイメージ名を入力
擬似TTYの割り当てにチェック
環境変数の名前にMYSQL_ROOT_PASSWORD、値にmy-secrete-pwを入力
コンテナイメージには、dockerhubのタグ名を入力しました。※内部的に、googleのレジストリから近いイメージを持ってくるようです。
擬似TTYの割り当ては、ここにチェックをいれておかないと何故か再起動を繰り返すため。本来バックグラウンド実行すべきところですが、いったんこれで動いているのでよしとします。
環境変数MYSQL_ROOT_PASSWORDは、MySQL5.7.28で初回実行時に勝手に決められるrootパスワードを指定するためのものです。
インスタンス名の前に緑色のチェックマークが表示されるまで待ちます。(10秒くらい)
ブラウザベースのSSHターミナルが開き、cosイメージにログインした状態になりました。
実行中のMySQLコンテナに名前をつける
実行コンテナ名に名前をつける方法がわからなかったので、とりあえず後から名前をつけます。
docker rename 【CONTAINER ID】 【名前】 で名前を付けられます。
もともと名前がついていない状態でも、コンテナID指定で名前付けできるんですね。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca6cccdd53d0 mysql:5.7.28 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes klt-instance-17-vufa 335272d34baa gcr.io/stackdriver-agents/stackdriver-logging-agent:0.2-1.5.33-1-1 "/entrypoint.sh /usr…" 12 minutes ago Up 12 minutes stackdriver-logging-agent $ docker rename ca6cccdd53d0 test_mysql $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca6cccdd53d0 mysql:5.7.28 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes test_mysql 335272d34baa gcr.io/stackdriver-agents/stackdriver-logging-agent:0.2-1.5.33-1-1 "/entrypoint.sh /usr…" 13 minutes ago Up 13 minutes stackdriver-logging-agent
docker execでMySQLコンテナにログイン(シェル起動)
$ docker exec -it test_mysql bash root@9db249795e88:/#
root権限でログイン完了。
mysqlコマンドを発行し、結果を確認する
パスワードは、上記の例の通りVMインスタンス設定をした場合、「my-secret-pw」になってます。
root@9db249795e88:/# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 4 Server version: 5.7.28 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql>
サンプルDB(employees)をインストールする手順
サンプルデータベースをインストールしてみましょう。
mysqlコンテナにrootログインした状態で作業を進めます。
まず、ファイルをダウンロードするwgetコマンドとzip解凍するコマンドunzipが入っていないのでインストールします。
apt-get updateでインストールパッケージの情報を更新。
# apt-get update Get:1 http://repo.mysql.com/apt/debian stretch InRelease [21.6 kB] Ign:2 http://deb.debian.org/debian stretch InRelease Get:3 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB] Get:4 http://deb.debian.org/debian stretch Release [118 kB] Get:5 http://deb.debian.org/debian stretch Release.gpg [2365 B] Get:6 http://repo.mysql.com/apt/debian stretch/mysql-5.7 amd64 Packages [5707 B] Get:7 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB] Get:8 http://deb.debian.org/debian stretch-updates/main amd64 Packages [27.9 kB] Get:9 http://deb.debian.org/debian stretch/main amd64 Packages [7086 kB] Get:10 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages [513 kB] Fetched 7960 kB in 2s (3809 kB/s) Reading package lists... Done
apt-get installで、wgetとunzipをインストールします。途中、continue ?[Y/n]と聞かれるので、yを入力。
# apt-get install wget unzip Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: ca-certificates libidn2-0 libpsl5 libunistring0 publicsuffix Suggested packages: zip The following NEW packages will be installed: ca-certificates libidn2-0 libpsl5 libunistring0 publicsuffix unzip wget 0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded. Need to get 1644 kB of archives. After this operation, 5542 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://deb.debian.org/debian stretch/main amd64 libunistring0 amd64 0.9.6+really0.9.3-0.1 [279 kB] Get:2 http://deb.debian.org/debian stretch/main amd64 libidn2-0 amd64 0.16-1+deb9u1 [60.7 kB] Get:3 http://deb.debian.org/debian stretch/main amd64 libpsl5 amd64 0.17.0-3 [41.8 kB] Get:4 http://deb.debian.org/debian stretch/main amd64 wget amd64 1.18-5+deb9u3 [800 kB] : :
employeesのインストール用SQLをダウンロードします。ダウンロードするディレクトリは適当に決めました。(/root)
# cd /root # pwd /root # wget https://github.com/datacharmer/test_db/archive/master.zip --2020-01-12 22:15:32-- https://github.com/datacharmer/test_db/archive/master.zip Resolving github.com (github.com)... 140.82.113.3 Connecting to github.com (github.com)|140.82.113.3|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://codeload.github.com/datacharmer/test_db/zip/master [following] --2020-01-12 22:15:33-- https://codeload.github.com/datacharmer/test_db/zip/master Resolving codeload.github.com (codeload.github.com)... 140.82.114.10 Connecting to codeload.github.com (codeload.github.com)|140.82.114.10|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [application/zip] Saving to: 'master.zip' master.zip [ <=> ] 34.99M 3.32MB/s in 11s 2020-01-12 22:15:43 (3.32 MB/s) - 'master.zip' saved [36687757] #
master.zipがダウンロードされるので、unzipコマンドで解凍します。
# unzip master.zip Archive: master.zip 0b66c2338736779e3b150c7d125b1012d95a961fhttps://seten.na8mi.com/blog/wp-admin/post.php?post=98&action=edit# creating: test_db-master/ inflating: test_db-master/Changelog inflating: test_db-master/README.md inflating: test_db-master/employees.sql inflating: test_db-master/employees_partitioned.sql inflating: test_db-master/employees_partitioned_5.1.sql : :
解凍後に出来るディレクトリ、test_db-masterに移動。
# ls master.zip test_db-master # cd test_db-master # pwd /root/test_db-master
mysqlコマンドで、employees.sqlを実行すると、データベースが完成。
# mysql -u root -pmy-secret-pw < ./employees.sql mysql: [Warning] Using a password on the command line interface can be insecure. INFO CREATING DATABASE STRUCTURE INFO storage engine: InnoDB INFO LOADING departments INFO LOADING employees INFO LOADING dept_emp INFO LOADING dept_manager INFO LOADING titles INFO LOADING salaries data_load_time_diff 00:00:35
途中に出てくるwarningは、コマンドラインで生パスワード入力するには、セキュリティ的に良くないですよ、という意味です。
データベース名、テーブルなどを確認。
affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.02 sec) mysql> use employees Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------------+ | Tables_in_employees | +----------------------+ | current_dept_emp | | departments | | dept_emp | | dept_emp_latest_date | | dept_manager | | employees | | salaries | | titles | +----------------------+ 8 rows in set (0.00 sec) mysql>
テーブルemployees(雇用者テーブル)の中身を軽く確認してみます。
mysql> select bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec) mysql>
サンプルデータもインストールされているようです。
MySQLコンテナのデプロイをコマンドラインから実行する手順
VMインスタンス設定で「このVMインスタンスにコンテナイメージをデプロイします」にチェックを入れなかった場合は、以下の手順でコンテナをデプロイします。
docker pullでMySQLコンテナイメージのダウンロード
$ docker pull mysql:5.7.28 5.7.28: Pulling from library/mysql d599a449871e: Pull complete f287049d3170: Pull complete 08947732a1b0: Pull complete 96f3056887f2: Pull complete 871f7f65f017: Pull complete 1dd50c4b99cb: Pull complete 5bcbdf508448: Pull complete 02a97db830bd: Pull complete c09912a99bce: Pull complete 08a981fc6a89: Pull complete 818a84239152: Pull complete Digest: sha256:5779c71a4730da36f013a23a437b5831198e68e634575f487d37a0639470e3a8 Status: Downloaded newer image for mysql:5.7.28 docker.io/library/mysql:5.7.28
docker pullでダウンロード。
docker imagesで ダウンロードしたイメージの確認
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7.28 1e4405fe1ea9 2 weeks ago 437MB
mysql5.7.28のコンテナイメージがダウンロードできたことが確認できました。2週間前にビルドされたイメージのようです。
docker runで コンテナ起動
$ docker run --name test_mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7.28 9db249795e88d5e28b627aeb62d09215c5240bd7e25c80d8b94bf4c58ae807b5
起動用のコマンドは、MySQLのDockerhubページのDescriptionに記載されているものを使用。
表示される文字列は、コンテナID。
docker psでMySQLコンテナの状態をチェック
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9db249795e88 mysql:5.7.28 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp test_mysql
docker ps -a で、全コンテナの状態を表示します。
CONTAINER IDのところに表示されている「9db249795e88」は、docker run時に表示された「9db249795e88d5e28b627aeb62d09215c5240bd7e25c80d8b94bf4c58ae807b5」と同一です。短縮表示は先頭12ケタを表示するようになってます。この部分だけ指定すれば、コンテナは一意に決定できるからなんですね。
dockerコマンドでコンテナIDを指定する際は、この短縮12ケタのIDを使用すればOKです。
-aをつけないと、起動失敗したコンテナは表示されないようです。
上の例では、STATUSが、Up About a minute(一分以内に起動した)になっているのでOK。
MySQLコンテナの永続化
再起動しても、コンテナで作ったデータが消えないようにしたい場合は永続化(再起動で消えないストレージ領域を設定する)が必要ですね。
コンテナの詳細オプションで、「ボリュームのマウント」で、Add volumeをクリックするとコンテナにボリューム追加ができます。
永続化領域には、ホストOSのディレクトリや、新規に設定したディスクが選べます。
今回は、ホストのディレクトリをそのままゲストOS(MySQLコンテナ)にマウントして、ホストOSとゲストOSの共有フォルダを設定するような感じにします。
詳細検証中
dockerでMySQLコンテナ起動時のエラー関連情報
無料のf1-microでMySQLが起動しないのはメモリ不足
無料でMySQLを起動してやろうと、一定リソース利用が無料のf1-microというマシンタイプを指定してMySQLを起動しようとしたところ、全然立ち上がってきませんでした。
原因はわからなかったのですが、メモリの多いg1-small(メモリ1.7G)に変更したらあっさり起動。
どうやらメモリ不足でMySQLが起動しなかったようです。
dockerのMySQLに接続できないのはなぜ?
VMインスタンス設定でMySQLコンテナをデプロイしたつもりが、うまく起動できていなかったという記録です。
結論は「擬似TTYの割り当て」にチェックすれば、動きました。
以下、悲しい失敗の記録。
インスタンスから、直接コンテナをデプロイできそうな設定項目がありました。
GCPのCOMPUTE ENGINE→イメージ→「インスタンスの作成」起動時に、「このVMインスタンスにコンテナイメージをデプロイします」とあります。
チェックを入れて、コンテナイメージの欄に「https://hub.docker.com/layers/mysql/library/mysql/5.7.28/images/sha256-9e02c7c9a87d363588e85c87b8c6f637254c5c67b915b1666482f54121bb0926」と入れたところ、SSHターミナルに以下のメッセージが出ていました。
Connected, host fingerprint: ssh-rsa 0 95:AB:4E:F7:7A:12:9B:63:3A:AB:06:AE:63:6F:F9:87:0F:E8:5B:0C:4C:BD:BA:8B:11:23:EF:74:05:42:74:5B #########################[ Error ]######################### # The startup agent encountered errors. Your container # # was not started. To inspect the agent's logs use # # 'sudo journalctl -u konlet-startup' command. # ###########################################################
sudo journalctl -u konlet-startupで起動時のログを見てみたところ、イメージファイルが見つからない旨が表示されてました。
コンテナイメージの欄は「mysql」とか、「mysql:latest」とか「mysql:5.7.28」とかを指定するのが正解でした。
コンテナイメージに「mysql:5.7.28」と入力したところdocker ps -a で調べると、インスタンス起動後に、なぜかコンテナを何度も再起動(ステータスが一定時間ごとにRestartになる)になっていました。
→「擬似TTYの割り当て」にチェックで、再起動病が収まりました。
まとめ
- GCPで、cosイメージのインスタンスを起動する
- コンテナデプロイの設定をすると、インスタンス起動時にコンテナも自動起動
- コマンドラインから、docker pullでmysqlコンテナをダウンロードして起動することも可能。
- docker exec -itでmysqlコンテナにログインして、コマンドラインベースで操作できる