Dockerで起動しているMysqlをローカルディレクトリにリンクすると開発(運用)効率が上がる件

2019年7月12日

テクノロジー

データベースの管理って大変です。 Docker管理でMysqlを別コンテナで運用している時に、データをコンテナ内に置いておくと、なかなかのブラックボックス運用に成りかねません。 そこで、データ部分をローカルOS(macやwin)のシンボリックリンクにしてしまうことで、チーム内でのデータの受け渡しなどが簡単にできる方法でかなりの効率化ができたので、その手順を共有します。

1. dockerにmysqlをpullする(image)

$ docker pull mysql Mysql8.0がインストールされます。(2019/7/4現在)

2. dockerを起動してみる(確認用)

# 起動 $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql # コンテナ確認 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0bbe7708f33 mysql "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql 無事にUPされてます。

3. mysqlデータフォルダを作成

僕のルールで、自分アカウントのrootディレクトリに作っておくことで、アクセスも簡単にでき、データ管理も可視化できるので、"~/mysql"というディレクトリを作成しておくことにします。 ※windowはpowershellで操作してください。 $ mkdir ~/mysql

4. docker機能コマンドをmysqlフォルダにリンクさせる

$ docker run -v ~/mysql:/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql # 確認 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1aa108596ad mysql "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql $ docker inspect mysql [ { "Id": "e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708", "Created": "2019-07-05T23:50:54.3088692Z", "Path": "docker-entrypoint.sh", "Args": [ "mysqld" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 43370, "ExitCode": 0, "Error": "", "StartedAt": "2019-07-05T23:50:55.0579854Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:c7109f74d339896c8e1a7526224f10a3197e7baf674ff03acbab387aa027882a", "ResolvConfPath": "/var/lib/docker/containers/e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708/resolv.conf", "HostnamePath": "/var/lib/docker/containers/e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708/hostname", "HostsPath": "/var/lib/docker/containers/e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708/hosts", "LogPath": "/var/lib/docker/containers/e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708/e1aa108596ad9b19ef7e274874e37bc62c4956621880070f3290109cc2468708-json.log", "Name": "/mysql", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": [ "/Users/~~~/mysql:/var/lib/mysql" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": { "3306/tcp": [ { "HostIp": "", "HostPort": "3306" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/99325993d7bfd351ebf5cccb7536b4e00d11c7d7fbd5ea0fdda32a81b1b997e3-init/diff:/var/lib/docker/overlay2/d7d76c71349aec3a8c7a09fd0ae34be7ae7aaeaa18f4fd2557e8ad7fa15ef496/diff:/var/lib/docker/overlay2/a50e27e38edb2762deb72a2eb4ae9b7bccbb6e934d780e2532992f2ede1d0978/diff:/var/lib/docker/overlay2/68691c5f3091d59b2dc01d803e58759ee7f36bfe8f2e5cfb334352707a8f8cf1/diff:/var/lib/docker/overlay2/21d8b773ed5fafb213b6e2a8128308796d152f188e1c4ccd405a8918d0c39dbe/diff:/var/lib/docker/overlay2/502628cc620d905a15884a39ce67b6e778cc077d4218ab848f1fecfdd76af4ab/diff:/var/lib/docker/overlay2/28dfb58dfe29f2146c8030eb38b784d1b493eb6b9c8883a172bc1880dbfea3d7/diff:/var/lib/docker/overlay2/753cd629f7865806129c103773b9666c696bd47565e150f98652d346502bcfd1/diff:/var/lib/docker/overlay2/a763e3a56d8ae8ab25ab140687df632a80bde1226624635c4e8859a7703ce0e3/diff:/var/lib/docker/overlay2/439db04a8d1cfa7c3e6b946babd1950ae6537ce25232b15f5af5478cde040694/diff:/var/lib/docker/overlay2/e472a5e2b82ac5c8828c9eb3d03c4eccaa899497b99579a9d3db8ed17f030278/diff:/var/lib/docker/overlay2/e6623a66425d35da6ed9f7d2abcd6bb34973befd0774a1b6a67cb2a81b0d96d6/diff:/var/lib/docker/overlay2/621d066e1ae3f1dae09e37c5307e75e4b447aa509c23d412474e345aa3ed592e/diff", "MergedDir": "/var/lib/docker/overlay2/99325993d7bfd351ebf5cccb7536b4e00d11c7d7fbd5ea0fdda32a81b1b997e3/merged", "UpperDir": "/var/lib/docker/overlay2/99325993d7bfd351ebf5cccb7536b4e00d11c7d7fbd5ea0fdda32a81b1b997e3/diff", "WorkDir": "/var/lib/docker/overlay2/99325993d7bfd351ebf5cccb7536b4e00d11c7d7fbd5ea0fdda32a81b1b997e3/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/Users/~~~/mysql", "Destination": "/var/lib/mysql", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "e1aa108596ad", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "3306/tcp": {}, "33060/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "MYSQL_ROOT_PASSWORD=mysql", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "GOSU_VERSION=1.7", "MYSQL_MAJOR=8.0", "MYSQL_VERSION=8.0.16-2debian9" ], "Cmd": [ "mysqld" ], "ArgsEscaped": true, "Image": "mysql", "Volumes": { "/var/lib/mysql": {} }, "WorkingDir": "", "Entrypoint": [ "docker-entrypoint.sh" ], "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "38a73badac9085952313b6c91148f1f83b5e44893aa946775a63a50c5cb6fa76", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "3306/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "3306" } ], "33060/tcp": null }, "SandboxKey": "/var/run/docker/netns/38a73badac90", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "a6a79bd11c2bd40694ac2930333cdaa06a1f8cc353dfa8e8e8b3b5fa441405b8", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "203a8a9984f5140ff9648a79c6f6774682f6582d3113f8bb8ba10c5a13f4c741", "EndpointID": "a6a79bd11c2bd40694ac2930333cdaa06a1f8cc353dfa8e8e8b3b5fa441405b8", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03", "DriverOpts": null } } } } ] 問題なく起動できたら、先程作ったmysqlフォルダを見てみましょう。 次のような感じでデータが作成されていれば成功です。

運用について

create database ***; という風に、データベースを作成してみると、このデータの中に、そのデータベース名のフォルダが作成されることが見ていてよく分かります。 データベースの簡易にバックアップを取りたければ、このフォルダやデータベースフォルダを圧縮やコピーしておくことで簡単に管理することもできるし、他の人に受け渡すのもかなり簡易にできます。 また、dockerを終了しても、このデータは消えないので、docker-commitをしなくても、データや構成が消えることはありません。 これだけでも、運用効率があがりますよね。 他にもプログラム部分もシンボリック化して、自分のPCをカスタマイズしておくと、非常に早い開発を行うことが可能になりますよ。 あくまで開発環境での話なので、本番環境には何にも役にたたないお話でした・・・

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。