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)は DHCP でIPアドレス(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 コンテナの起動まで完了した。