概要
Ubuntuの18.04を入れてからDockerを使ってなかったので、docker-composeも含めたインストールと申し訳程度にMySQLとPostgreSQLを動かすあたりをメモしておく。
バージョン情報
- Ubuntu 18.04.1 LTS
- Docker 18.09.0
- docker-compose 1.23.2
- mysql 8.0.13
- PostgreSQL 11.1
dockerのインストール
下記URLを参照。
https://docs.docker.com/install/linux/docker-ce/ubuntu/
$ 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 install docker-ce
動作するか確認
$ sudo docker run hello-world
実行結果(の一部)
Hello from Docker! This message shows that your installation appears to be working correctly.
ユーザーにdockerのgroupを付ける。
$ sudo gpasswd -a $USER docker $ sudo newgrp docker
idコマンドでgroupにdockerが追加されているか確認。
$ id
実行結果にxxx(docker)が付加されていること。
ログインし直してsudoなしでdocker runの確認。
$ docker run hello-world
docker-composeも入れておく。
$ sudo apt install docker-compose
実行確認
$ docker-compose --version docker-compose version 1.23.2, build 1110ad01
mysql
まずはImageを頂いてくる。タグはlatestでいいや。
$ docker pull mysql:latest $ docker images
実行結果。先程のhello-worldに加えてmysql-serverが追加された。
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest f991c20cb508 4 weeks ago 486MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
適当な名前を付けてmysqlを実行。portは33060に飛ばす。
$ docker run --name mysql-example -e MYSQL_ROOT_PASSWORD=hoge -p 33306:3306 -d mysql:latest # 立ち上がっているか確認 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fd1d8571ccb7 mysql/mysql-server:latest "/entrypoint.sh mysq…" 2 minutes ago Up 2 minutes (healthy) 3306/tcp, 33060/tcp mysql-example # container lsでも確認 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c54fc56aa2d5 mysql:latest "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 33060/tcp, 0.0.0.0:33306->3306/tcp mysql-example
docker execでmysqlに繋いでみる。パスワードはMYSQL_ROOT_PASSWORDで設定した値。
$ docker exec -it mysql-example mysql -p
localhostから繋ぐ。まずIPAddressを確認しておく。
$ docker inspect mysql-example | grep IPAddress
ローカルにはmysql clientは入れない想定なのでPythonのMySQL connectorで接続確認。
import mysqlx # Connect to server on localhost session = mysqlx.get_session({ "host": "grepして出てきたip address", "port": 33060, "user": "root", "password": "hoge" }) session.sql('show databases').execute() result = session.sql('show databases').execute() for row in result.fetch_all(): print(row.get_string('Database'))
無事接続できた。
containerの停止。
$ docker ps $ docker stop {container_id}
postgresql
まずはpullから。
$ docker pull postgres:latest # 確認 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres latest f9b577fb1ed6 2 weeks ago 311MB mysql latest f991c20cb508 4 weeks ago 486MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
run。bindするportは54320にしておく。
$ docker run --name postgres-example -e POSTGRES_PASSWORD=hoge -p 54320:5432 -d postgres:latest
接続して軽くデータを入れておく。
$ docker exec -it postgres-example psql -Upostgres # なんとなくデータ投入 postgres=# create database fuga; postgres=# \c fuga fuga=# create table fugafuga(text varchar(16)); fuga=# insert into fugafuga values ('hogehoge'); fuga=# \q
Pythonのpsycopg2からデータ接続。
import psycopg2 conn = psycopg2.connect("host=127.0.0.1 port=54320 dbname=fuga user=postgres password=hoge") cur = conn.cursor() cur.execute("select * from fugafuga") for row in cur: print(row)
データの永続化
上記のままだとコンテナ終了時にデータも消えるので、docker-compose内でvolumeの指定をしてデータを永続化する。
データ生成用のクエリとしてinitdb/create.shというパスに下記を作成。
#!/bin/bash set -e psql --username postgres --dbname postgres <<-EOSQL CREATE DATABASE hoge; EOSQL psql --username postgres --dbname hoge <<-EOSQL create table fugafuga(text varchar(16)); insert into fugafuga values ('hogehoge'); EOSQL
docker-compose.ymlの記述。postgres-dataとinitdb配下をvolumesに指定している。
version: '2' services: postgres: image: postgres:latest environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=hoge - POSTGRES_DB=fuga volumes: - ./postgres-data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d ports: - "54321:5432"
これで自動でinitdb/create.shが実行され ./postgres-data ディレクトリにDBの情報が残るようになった。
改定履歴
Author: Masato Watanabe, Date: 2019-02-15, 記事投稿