IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Docker MySQLのアクセスエラーについて

どうも、nippa です。

Docker で MySQL の環境構築のテストをしていたんですが、アクセスできない問題が起き たので備忘録として記事に残しておきます。

今回は MySQL の以下のエラーについてです。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/tmp/mysql.sock' (2)

環境

発生事象の状況

Docker で MySQL のコンテナを作成し、起動後にホストから mysql クライアントでアク セスした際にアクセスできない問題です。

# アクセスコマンド
mysql -u [user名] -h localhost -p

エラーの詳細は以下の通りです。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/tmp/mysql.sock' (2)

結論

結論を先に述べると MySQLlocalhost という名前のホスト名で外部からのアクセスを デフォルトでは禁止していることが原因でした。

そのため、localhost の代わりに127.0.0.1でアクセスすることでアクセス可能にな ります。

# アクセスコマンド
mysql -u [user名] -h 127.0.0.1 -p

サーバに直接 MySQL をインストールする場合には、起こり得ない問題で、

Docker MySQL 特有の問題になります。

Docker MySQL ではlocalhostでのアクセスは禁止されているということを覚えておきま す。

結論に至るまでの確認事項

  1. コンテナが起動していない可能性

コンテナが起動していない場合はレスポンスがないので、そもそもデータベースからエラ ーが返って来ないため、今回の事象の原因ではありません。

コンテナが起動していない場合は、timeout 表示がされます。

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.0:3306' (60)
  1. パスワード間違い

パスワード間違いの場合は、以下のエラーになります。

ERROR 1045 (28000): Access denied for user '[ユーザー名]'@'172.0.0.1' (using
password: YES)
  1. コンテナにアクセスして、データベースへのログイン確認

以下の場合だと、localhost でアクセスできることを確認しました。

docker run -it [コンテナ名] /bin/bash

mysql -u [user名] -h localhost -p

ホスト名が怪しいと考えられます。

  1. ログの確認

docker MySQL のデフォルトでは log が出力されない設定でした。

設定ファイルに log の出力設定を追加すれば確認できますが、今回は行いませんでした 。

参考までにmy.cnfの場所です。

/etc/mysql/my.cnf

感想

Docker MySQL の環境を準備していて、はまった落とし穴でした。

あまり MySQL を触ってこなかったこともあり、少し時間がかかってしまいましたが、問 題の原因まで確認できたので、よかったとしましょう。

落とし穴にはまらないようにご注意ください。

ではでは、また次回。

Docker PostgreSQLの環境構築(その3)

どうも、nippa です。

前回の内容:

timesaving.hatenablog.com

docker で postgresql の環境を構築してきましたが、コマンドの長さやコンテナの停止 、削除が非常に煩わしいです。

そこで今回は前回の内容を利用して docker-compose 化を行いと思います。

環境

ディレクトリ構造

今回は以下のようなディレクトリ構造です。

.
├── docker-compose.yaml
└── postgresql/
    ├── data/
    ├── dockerfile
    └── init/
        └── init.sql

datapostgresql のデータが保存されるディレクトリ、initはコンテナの初回起動 時に実行されるスクリプトを格納するディレクトリになります。

dockerfile の作成

dockerfile の内容は前回同様です。

FROM postgres:14-alpine

# Time Zone
ENV TZ Asia/Tokyo

init.sql の作成

初回起動時に実行される SQL スクリプトです。内容は前回同様です。

/* Variables */
\set user_name test
\set user_password test
\set database_name test
\set schema_name public
\set table_name users
\set table_name_seq users_id_seq

/** CREATE ROLE **/
CREATE ROLE :user_name WITH LOGIN PASSWORD :'user_password';

/** CREATE DATABASE **/
CREATE DATABASE :database_name OWNER = :user_name TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';

/** TIMEZONE Asia/Tokyo **/
ALTER DATABASE :database_name SET timezone to 'Asia/Tokyo';

/** GRANT FOR DATABASE **/
GRANT ALL ON DATABASE :database_name TO :user_name;
ALTER ROLE :user_name SET search_path TO :schema_name;

/** CONNECTION DATABASE **/
\c :database_name

/** CREATE TABLE **/
CREATE TABLE IF NOT EXISTS :schema_name.:table_name (
    id          serial PRIMARY KEY,
    username    VARCHAR ( 50 ) UNIQUE NOT NULL,
    password    VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL
);

/** GRANT FOR TABLE **/
GRANT ALL ON :schema_name.:table_name TO :user_name;
GRANT ALL ON :schema_name.:table_name_seq TO :user_name

docker-compose.yaml の作成

docker-compose.yaml には docker の起動情報を記載します。

前回は、以下のコマンドを利用して起動していました。

docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=admin -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgresql

これを docker-compose.yaml に落とし込むと以下のようになります。

version: "3"
services:
  postgres:
    build: ./postgresql
    container_name: postgre
    hostname: postgre
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
      - ./postgresql/init:/docker-entrypoint-initdb.d

docker-compose の起動

以下のコマンドで docker-compose を起動します

docker-compose up -d

起動後の確認には以下のコマンドで確認できます。

docker-compose ps

# 出力
NAME                COMMAND                  SERVICE             STATUS              PORTS
postgre             "docker-entrypoint.s…"   db                  running             0.0.0.0:5432->5432/tcp

また、コンテナの log を確認する場合には、logs オプションで確認可能です。

docker-compose logs [service名]

# 今回は
docker-compose logs postgres

docker-compose の停止

docker-compose の停止は以下のコマンドで行います。

docker-compose down

データベースへのアクセス

PostgreSQL クライアントで接続可能です。

psql -U test -h localhost -d test

データの確認を行います。

# データの確認
test=> select * from users;
 id | username | password | email | created_on
----+----------+----------+-------+------------
(0 rows)


# データの挿入
test=> INSERT INTO users (username, password, email, created_on) VALUES ('Yamada Taro', 'yamadatraro', 'yamada-taro@example.com', now());

# データの確認
test=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-20 15:15:25.074613
(1 row)

docker-compose を停止して、データが引き継がれているかを確認します。

docker-compose down

# 停止の確認
docker-compose ps

# 起動
docker-compose up -d

# 起動の確認
docker-compose ps

データベースの内容を確認します。

psql -U test -h localhost -d test

データを select してみます。

# データの確認
test=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-20 15:15:25.074613
(1 row)

データが引き継がれていることが確認できます。

感想

前回 docker をコマンドで起動していましたが、今回はその起動設定を docker-compose.yaml に記載して、docker-compose を利用してコンテナの起動を行いま した。

これにより、起動設定がファイル化されるので、他の方と共有することもできるようにな ります。

コマンドの手間も省けるので、非常に便利ですね。

是非、使ってみてください。

ではでは、また次回。

Docker MySQLの環境構築(その1)

どうも、nippa です。

テスト用の MySQL 環境が必要になり、Docker で準備したいと思います。

Docker mysql を参考にしています。

dockerhub mysql

環境

Docker のインストール

Docker のインストールは、公式サイトからインストーラーをダウンロードしてインスト ールします。

Docker 公式: Docker Desktop

詳しくはこちらの記事を確認ください。

Docker + MySQL の構築

構築の流れは以下の通りです。

  1. MySQL の Docker のイメージをダウンロード
  2. Dockerfile の作成

1. Docker のイメージをダウンロード

Docker のコアとなる image をダウンロードします。

docker image pull [image name]

# 今回は mysql 5.7
docker image pull mysql:5.7

ダウンロードしたイメージの確認

docker image ls

# 結果
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.7       8b43c6af2ad0   2 days ago    448MB

2. Dockerfile の作成

Dockerfile を作成します。

設定としては以下の通りです。

ここではファイル名はdockerfileとしています。

FROM mysql:5.7

# Time Zone
ENV TZ Asia/Tokyo

RUN apt update

3. Dockerfile からイメージ作成

Docker image を Dockerfile からビルドします。

# イメージ名を指定して Docker imageのビルド
docker build -t [image name] .

# image名を mysqlとして作成
docker build -t mysql .

イメージが作成されていることを確認します。

docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        latest    d5986516c257   8 seconds ago   466MB

mysqlという名でイメージが作成されています。

4. 作成したイメージから container を起動

container nameimage nameを指定してコンテナを起動します。

起動時のオプションでパスワード、Listen ポートを指定します。

docker run --name mysql -e MYSQL_ROOT_PASSWORD=[password] -d mysql

MYSQL_ROOT_PASSWORDで root のパスワードを指定します。

コンテナの起動を確認します。

docker ps

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
7fd13e8b80f4   mysql     "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   3306/tcp, 33060/tcp   mysql

上記の出力がされればコンテナ名:mysql で起動しています。

5. MySQL にアクセス

以下のコマンドで コンテナ内にアクセスして、mysql のデータベースにログインします 。

docker exec -it mysql mysql -u root -p
Enter password: [MYSQL_ROOT_PASSWORDで指定したパスワードを入力]

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

6. MySQL コンテナの停止と削除

コンテナ名を指定してコンテナを停止・削除を行います。

# コンテナの停止
docker stop mysql

# コンテナの削除
docker rm mysql

感想

今回、mysql を docker で起動しました。

docker-compose を利用したり、外部からのアクセス設定を次回はしていきたいと思いま す。

ではでは、また次回。

Docker PostgreSQLの環境構築(その2)

どうも、nippa です。

前回の内容:

timesaving.hatenablog.com

docker で postgreSQL の構築を行いましたが、より便利に使うためにホストのストレー ジとコンテナのストレージの共有設定を行いたいと思います。

コンテナの初回起動時に、データベース構築 SQL を読み込み、2 回目以降のコンテナ起 動では、前回データが読み込まれるように設定します。

今回はついでに PostgreSQL 14 がリリースされたので、14 を使ってみたいと思います。

PostgreSQL 14 Released!

環境

ディレクトリ構造

今回は下記のようなディレクトリ構造になります。

.
├── dockerfile
├── data/
└── init/
    └── init.sql

init には初回起動に実行するスクリプトを配置します。

data はコンテナの PostgreSQL データをホストと共有して保存するためのディレクトリ になります。

PostgreSQL イメージのビルド

dockerfile でイメージをpostgres:14-alpineを指定してください。

FROM postgres:14-alpine

# Time Zone
ENV TZ Asia/Tokyo

dockerfile の内容をpostgresqlというイメージ名でビルドします。

docker build -t postgresql .

コンテナの初回起動時の SQL の作成

初回実行時の SQL init/init.sqlは以下のような内容を書き込みます。

/* Variables */
\set user_name [ユーザー]
\set user_password [ユーザーのパスワード]
\set database_name [データベース名]
\set schema_name public
\set table_name users

/** CREATE ROLE **/
CREATE ROLE :user_name WITH LOGIN PASSWORD :'user_password';

/** CREATE DATABASE **/
CREATE DATABASE :database_name OWNER = :user_name TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';

/** TIMEZONE Asia/Tokyo **/
ALTER DATABASE :database_name SET timezone to 'Asia/Tokyo';

/** GRANT FOR DATABASE **/
GRANT ALL ON DATABASE :database_name TO :user_name;
ALTER ROLE :user_name SET search_path TO :schema_name;

/** CONNECTION DATABASE **/
\c :database_name

/** CREATE TABLE **/
CREATE TABLE IF NOT EXISTS :schema_name.:table_name (
    id          serial PRIMARY KEY,
    username    VARCHAR ( 50 ) UNIQUE NOT NULL,
    password    VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL
);

/** GRANT FOR TABLE **/
GRANT ALL ON :schema_name.:table_name TO :user_name;

今回は簡単な user テーブルを作成しています。

PostgreSQL コンテナの起動

コンテナの起動時にボリュームとポートを指定します。また、postgres ユーザーのパス ワード指定は必須なので指定します。

docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=[パスワード] -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgresql

起動の確認を行います。

docker ps

CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                    NAMES
a22e709fd827   postgresql   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:5432->5432/tcp   postgres

データベースの確認

以下のコマンドでコンテナの PosgreSQL にログインします。

psql -U [ユーザー名] -h localhost -p 5432 -d [データベース名]

# 出力
Password for user [ユーザー名]: <--- パスワードを入力
psql (14.0, server 14.1)
Type "help" for help.

[データベース名]=>

データベースにログインしたら、テーブルの確認を行います。

[データベース名]=>\d

# 出力
             List of relations
 Schema |    Name     |   Type   |  Owner
--------+-------------+----------+----------
 public | user        | table    | postgres
 public | user_id_seq | sequence | postgres
(2 rows)

初回起動時の SQL が読み込まれ、user テーブルと user_id_seq テーブルが作成されて います。今回 admin ユーザーを指定していないので、初回起動時の SQL は posgres ユ ーザーで作成されています。権限の確認をします。

[データベース名]=> \z

# 出力
                                      Access privileges
 Schema |     Name     |   Type   |     Access privileges          | Column privileges | Policies
--------+--------------+----------+--------------------------------+-------------------+----------
 public | users        | table    | postgres=arwdDxt/postgres+     |                   |
        |              |          | [ユーザー名]=arwdDxt/postgres    |                   |
 public | users_id_seq | sequence |                                |                   |
(2 rows)

権限が正しくついています。select 文を実行してみます。

[データベース名]=>  select * from users;
 id | username | password | email | created_on
----+----------+----------+-------+------------
(0 rows)

テーブルが空になっています。ここデータを挿入します。

[データベース名]=> INSERT INTO users (username, password, email, created_on) VALUES ('Yamada Taro', 'yamadatraro', 'yamada-taro@example.com', now());

# 出力
INSERT 0 1

[データベース名]=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-13 14:28:24.695819
(1 row)

データ挿入が確認できたので、コンテナを停止・削除を行ったのちに再度起動します。

# コンテナの停止
docker stop postgres

# コンテナの削除
docker rm postgres

# 削除されていることを確認
docker ps

コンテナを再度起動させます。

docker run --name postgres -it -p 5432:5432 -e POSTGRES_PASSWORD=[パスワード] -v $(pwd)/init:/docker-entrypoint-initdb.d -v $(pwd)/data:/var/lib/postgresql/data -d postgresql

データベースにアクセスしてデータが残っているかを確認します。

psql -U [ユーザー名]] -h localhost -d [データベース名]
Password for user [ユーザー名]]:
psql (14.0, server 14.1)
Type "help" for help.

[データベース名]=> select * from users;
 id |  username   |  password   |          email          |         created_on
----+-------------+-------------+-------------------------+----------------------------
  1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-20 21:28:24.695819
(1 row)

データが残っていることが確認できました。

感想

今回、docker Postgresql を開発でより使いやすくするために、ホスト側とストレージを 共有して、データ部分を残す方法をご紹介しました。

これで、必要なときに必要なデータベースを切り替えて開発することができるので、非常 に便利です。

docker-compose を使うと更に便利になりますので、こちらも紹介したいと思います。

ではでは、また次回。

Docker grafanaの環境構築

どうも、nippa です。

今回は Grafana の環境を手軽に準備、開発環境によって簡単に切り替えれるように Grafana の環境を Docker で構築したいと思います。

docker-compose を使えばコマンド 1 つで grafana 環境が構築できます。

お手軽に環境を作ってしまいましょう。

環境

  • macOS 10.15
  • docker-compose 1.29.2
  • grafana 8.2.3

docker のインストール

今回は docker 環境は用意済みの前提で初めます。

docker のインストールはこちらを参考にインストールしてください。

timesaving.hatenablog.com

docker-compose.yaml の作成

作業ディレクトリ(ここでは work)を作成して、docker-compose.yamlを作成して以下 の内容を書き込みます。

version: "3"
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    hostname: grafana
    ports:
      - 3000:3000
    volumes:
      - ./data/grafana:/var/lib/grafana

grafana container の/var/lib/grafanaに grafana に必要な設定がすべて配置されて いるので、この部分は保存ホストとボリュームを共有して保存します。

これにより、コンテナをダウンさせても次回も同じ設定を利用することができます。

grafana コンテナの起動

作業ディレクトリにdocker-compose.yamlがあることを確認して以下のコマンドを実行 します。

docker-compose up -d

コンテナの起動を確認します。

docker-compose ps

# 出力
 Name     Command   State           Ports
--------------------------------------------------
grafana   /run.sh   Up      0.0.0.0:3000->3000/tcp

ステータスがUpになっているので起動完了です。

Grafana にアクセス

今回はlocalhost:3000で起動しているので、ブラウザで

http://localhost:3000/

にアクセスして grafana が起動していることを確認します。

構築時の以下のアカウントでアクセスして、admin のパスワードを変更します。

username: admin
password: admin

パスワードを変更し、ログインで環境構築完了です。

コンテナの再起動確認

コンテナをダウンさせてもパスワード変更が残っているかを確認します。

# コンテナの終了
docker-compose down

# 起動コンテナの確認
docker-compose ps

コンテナが終了していることを確認したら、http://localhost:3000/に再度アクセスし 、接続できなことを確認します。

コンテナを再度起動します。

# コンテナの起動
docker-compose up -d

# 起動コンテナの確認
docker-compose ps

コンテナを起動させたら、http://localhost:3000/に再度アクセスし、admin で変更し たパスワードでログインして、ログインできれば成功です。

grafana のプラグインのインストール

サーバーで grafana のプラグインをインストールには、grafana-cli を実行してインス トールする必要があますが、docker 起動の grafana は docker の環境変数を指定するだ けでインストールされます。

docker コマンドからの起動の場合、--envGF_INSTALL_PLUGINSを指定することでイ ンストールされて起動します。

docker continer run --env "GF_INSTALL_PLUGINS=[Pulagins]"  --publish [Image ID]
# 複数指定する場合は,で繋げる

docker-compose の場合は、environmentGF_INSTALL_PLUGINS=[Pulagins]を指定す るだけでインストールされた状態で起動します。

version: "3"
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    hostname: grafana
    environment:
      - GF_INSTALL_PLUGINS=marcusolsson-gantt-panel,grafana-googlesheets-datasource
    ports:
      - 3000:3000
    volumes:
      - ./data/grafana:/var/lib/grafana
# コンテナの起動
docker-compose up -d

感想

今回は docker で grafana 環境の構築をまとめてみました。

この記事を書くために、pulgin を調べていたら、データソースに

など、いろいろ増えていることに気づきました。

面白そうなので、このあたりもまとめて見ようかと思っています。

ではでは、また次回。