GCPでmysqlを使う手順 デプロイしてサンプルDBインストール

Google Cloud Platform(GCP)で、MySQLのdockerコンテナを動かす(デプロイ)手順の覚書です。

mysqlコンテナを実行するまでの手順を記録しておきます。

GCPでVMインスタンス起動

GCPでVMインスタンス起動

Google Cloud Platformにログインし、Compute Engine→イメージ→検索窓に cos と入力しenterキーを押します。

cos(Container Optimized OSの略)は、コンテナ起動用にサイズを抑えて最適化したLinuxイメージです。

「cos-stable」とついているイメージ名をクリック。(以下の例では、cos-stable-78-12499-59-0)

stableは安定版、という意味です。

イメージの詳細が表示されるので「インスタンスを作成」をクリックします。

インスタンスの詳細が表示されます。「マシンタイプ」を「g1-small」に変更します。

無料で使える最小のマシンタイプ(f-micro 1cpu 614MBメモリ)だとメモリ不足でMySQLが動きませんでした。GCPで無料でMySQLを動かすのは無理っぽいです。

今回は、g1-small(下から二番目に小さい仮想マシン)を選択しました。

「このVMインスタンスにコンテナイメージをデプロイします」にチェック
コンテナイメージ名を入力
擬似TTYの割り当てにチェック
環境変数の名前にMYSQL_ROOT_PASSWORD、値にmy-secrete-pwを入力

コンテナイメージには、dockerhubのタグ名を入力しました。※内部的に、googleのレジストリから近いイメージを持ってくるようです。

擬似TTYの割り当ては、ここにチェックをいれておかないと何故か再起動を繰り返すため。本来バックグラウンド実行すべきところですが、いったんこれで動いているのでよしとします。

環境変数MYSQL_ROOT_PASSWORDは、MySQL5.7.28で初回実行時に勝手に決められるrootパスワードを指定するためのものです。

画面を下にスクロールし、「作成」ボタンをクリック。

インスタンス名の前に緑色のチェックマークが表示されるまで待ちます。(10秒くらい)

「接続」のSSHと表示されている箇所をクリックします。

ブラウザベースのSSHターミナルが開き、cosイメージにログインした状態になりました。

実行中のMySQLコンテナに名前をつける

実行中の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でMySQLコンテナにログイン(シェル起動)

$ docker exec -it test_mysql bash
root@9db249795e88:/#

root権限でログイン完了。

mysqlコマンドを発行し、結果を確認する

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)をインストールする手順

サンプル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コンテナのデプロイをコマンドラインから実行する手順

MySQLコンテナのデプロイをコマンドラインから実行する手順
VMインスタンス設定で「このVMインスタンスにコンテナイメージをデプロイします」にチェックを入れなかった場合は、以下の手順でコンテナをデプロイします。

docker pullでMySQLコンテナイメージのダウンロード

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で ダウンロードしたイメージの確認

$ 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で コンテナ起動

$ 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で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コンテナの永続化

MySQLコンテナの永続化
再起動しても、コンテナで作ったデータが消えないようにしたい場合は永続化(再起動で消えないストレージ領域を設定する)が必要ですね。

コンテナの詳細オプションで、「ボリュームのマウント」で、Add volumeをクリックするとコンテナにボリューム追加ができます。

永続化領域には、ホストOSのディレクトリや、新規に設定したディスクが選べます。

今回は、ホストのディレクトリをそのままゲストOS(MySQLコンテナ)にマウントして、ホストOSとゲストOSの共有フォルダを設定するような感じにします。

詳細検証中

dockerでMySQLコンテナ起動時のエラー関連情報

無料のf1-microでMySQLが起動しないのはメモリ不足

無料のf1-microでMySQLが起動しないのはメモリ不足
無料でMySQLを起動してやろうと、一定リソース利用が無料のf1-microというマシンタイプを指定してMySQLを起動しようとしたところ、全然立ち上がってきませんでした。

原因はわからなかったのですが、メモリの多いg1-small(メモリ1.7G)に変更したらあっさり起動。

どうやらメモリ不足でMySQLが起動しなかったようです。

dockerの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コンテナにログインして、コマンドラインベースで操作できる