ykore::tech_memo

技術的な事を適当に書きます

Docker で MySQL を使えるようになるまで

DB運用のひとつも分からないのはイカンでしょということでMySQLを基礎から再勉強中。

Docker のインストールから MySQL コンテナの起動まで行ったメモ。

ソースからのインストールでも良かったが、簡単に作り直せる Docker でパパっと構築した。

ホスト環境

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

Docker のインストール

こちらを参考に Docker CE をインストールした。 https://docs.docker.com/install/linux/docker-ce/ubuntu/

# 関連パッケージのインストール
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

# GPG Key のインストール
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# リポジトリの追加・更新
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt update

# docker-ce のインストール
$ sudo apt install docker-ce
$ docker version
Client:
 Version:       17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:11:19 2017
 OS/Arch:       linux/amd64

Server:
 Engine:
  Version:      17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:        Wed Dec 27 20:09:53 2017
  OS/Arch:      linux/amd64
  Experimental: false

Docker で Proxy 認証をさせたいとき

docker(with systemd) の設定ディレクトリにプロキシのURLを記述した設定ファイルを作成すればよい。

# .confファイルであれば名前は任意
$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy-user>:<password>@<server>:<port>"
# docker 再起動
sudo service restart docker

Docker network

Docker コンテナのネットワークは何もしなければデフォルトのブリッジネットワークが使われる。

デフォルトのブリッジネットワーク(bridge)は DHCPIPアドレス(172.17.0.0/16)が割り当てられるが、DBのレプリケーションをするとき、複製元コンテナをIPアドレスを指定しているとDHCPでは具合が悪い。さらにユーザー定義のネットワークでなければ固定IPアドレスを振れないという仕様もあったので、ネットワークを作成した。

docker: Error response from daemon: user specified IP address is supported on
 user defined networks only.
sudo docker network --subnet=172.18.0.0/16 --gateway=172.18.0.1 --subnet mynet

MySQL設定ファイル my.cnf の仮置き

sudo mkdir -p /usr/local/etc/mysql-primary
sudo vim /usr/local/etc/mysql-primary/my.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
symbolic-links  = 0

MySQLコンテナ作成・起動

MySQL コンテナを起動するコマンドは以下のとおり。 port 3306 はMySQL標準なポート。port 11211 は後で memcached プラグインで遊ぶのに必要なポート。

sudo docker run -d -v /usr/local/etc/mysql-primary/:/etc/mysql/ --name mysql1 --net=mynet --ip=172.18.0.2 -p 3306:3306 -p 11211:11211 -e MYSQL_ROOT_PASSWORD=mysqlrootpassword mysql

オプション説明

オプション 説明
-d バックグラウンド起動
-v "ホスト側:コンテナ側" と指定するとコンテナからホスト側のディレクトリに透過的にアクセスさせることができる。
--name コンテナ名
--net 割り当てるネットワーク名
--ip IPアドレスを固定させる場合は指定
-p コンテナへのポートマッピング。"ホスト側:コンテナ側" と指定。必要な数を記述する。(-p=n1:m1 -p=n2:m2 -p=...)
-e コンテナで参照できる環境変数。ここではMySQLのルートパスワードだけ指定。必要な数だけ指定。( -e AAA=xxx -e BBB=yyy -e CCC=... )
mysql "イメージ名:バージョン"。バージョンを省略すると latest になる。厳密に指定することも可能。( mysql:latest, mysql:8.0 等 )

コンテナの起動でエラーが無いことの確認

$ sudo docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                                              NAMES
6e4a8fde381e        mysql               "docker-entrypoint.s…"   19 hours ago        Up 2 seconds              0.0.0.0:3306->3306/tcp, 0.0.0.0:11211->11211/tcp   mysql1

$ sudo docker logs mysql1
(...省略...)
MySQL init process done. Ready for start up.

MySQL の動作確認

$ sudo docker exec -it mysql1 mysql -u root -p -e "show databases"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

以上で Docker のインストール + MySQL コンテナの起動まで完了した。