iMind Developers Blog

iMind開発者ブログ

Ubuntu18.04にDockerを入れてMySQLとPostgreSQLを動かす

概要

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, 記事投稿