1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker compose で MySQL と adminer を動かした

Last updated at Posted at 2021-10-17

why

  • docker-compose up で 複数コンテナを動かせることとができたが、コマンドで省略されている
    ネットワークなどが分からないので、run + 引数 で compose と同じものを動かして理解を深めたい

  • docker-compose で DB のうごくアプリをって言われたがなんもわからん

まずは、データは置いといて、
docker-compose で MySQL のコンテナを立ち上げること
MySQL のコンテナの MySQL を操作できること
ここまでを実現するのがよいかなと

  • こう言われたので docker-compose で MySQL のコンテナを立ち上げることにした

MySQL とは?

Docker Hub の説明を読む

MySQL is the world's most popular open source database.
With its proven performance, reliability and ease-of-use,

  • MySQL は世界で最も有名な オープンソースの DB
  • (よく使われて)証明されているパフォーマンスと信頼性、使い勝手で有名。

MySQL has become the leading database choice for web-based applications,
covering the entire range from personal projects and websites,
via e-commerce and information services,

  • EC や 情報サービスでよく使われる

all the way to high profile web properties including
Facebook, Twitter, YouTube, Yahoo! and many more

  • FB, Twitter, Youtube, Yahoo!, などで使われている

compose up で MySQL 単体を動かす

  • これはコピペで簡単だった
docker-compose.yml
version: "3.7"
services:
  db:
    image: mysql:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  • 最小限の DB だけの compose がこれ
    • 最新の MySQL
    • 環境ではパスワードを空にするをの許す
docker-compose up

db_1  | 2020-09-25T09:39:26.918399Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1  | 2020-09-25T09:39:26.944264Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - 
  • adminer などを入れてないので サーバーやブラウザでも触れないが、MySQL が立ち上がっている
  • localhost 3306 を開いても phpMyAdmin のような 管理画面に行けるわけではない。
  • (多分 DB サーバーのみ。Blitz などの App サーバーで使える)

compose で MySQL と adminer を動かす

  • ここの公式のコードを使用
# Use root/example as user/password credentials
version: '3.8'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
  • version を 3.1 から 3.8 に変更
 docker-compose up                                                    
Creating network "docker-mysql_default" with the default driver                                   
Creating docker-mysql_db_1      ... done                                                          
Creating docker-mysql_adminer_1 ... done                                                          
Attaching to docker-mysql_db_1, docker-mysql_adminer_1                                            
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0
.22-1debian10 started.                                                                            
adminer_1  | [Thu Oct 29 09:57:59 2020] PHP 7.4.11 Development Server (http://[::]:8080) started  
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'   
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0
.22-1debian10 started.                                                                            
db_1       | 2020-10-29 09:57:59+00:00 [Note] [Entrypoint]: Initializing database files           
db_1       | 2020-10-29T09:57:59.482611Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 
8.0.22) initializing of server in progress as process 46                                          
db_1       | 2020-10-29T09:57:59.489105Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has
 started.                                                                                         
db_1       | 2020-10-29T09:57:59.904580Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has
 ended.                                                                                  
  • 動いた。

Screen Shot 2020-10-29 at 18.59.14.png

  • Chrome で開くと立ち上がっているのを確認
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 Accepted
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 Accepted
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 [403]: GET /?pgsql=db&username=example&db=test&ns=public&table=test-test
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49608 Closing
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 [200]: GET /?file=favicon.ico&version=4.7.7
adminer_1  | [Thu Oct 29 09:58:23 2020] [::ffff:172.20.0.1]:49610 Closing
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49618 Accepted
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 Accepted
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 [200]: GET /
adminer_1  | [Thu Oct 29 09:58:30 2020] [::ffff:172.20.0.1]:49616 Closing
  • 8080 にアクセスすると反応している

docker-compose とは?

  • docker run のオプションをかく物と仮定する

さくらの記事を参考に

Docker Composeは、複数のコンテナで構成されるアプリケーションについて、
Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。

  • run だけではなく build と stop もまとめて行えるコマンドらしい

これまでの連載の中でも、複数のコンテナを起動させる場面がありました。
その際、各コンテナを起動するために、それぞれ起動コマンドを実行する必要がありました。
また、コンテナを起動する際に、いろいろなオプションを利用していました。

コマンドや手順が複雑になると、他の環境で使う/使ってもらう場合に、ミスが発生しやすくなります。
他の環境でも同じ構成(同じDockerイメージ)で動かせるというDockerのメリットを生かすには、
起動手順なども簡単であってほしいですよね。

そこで活躍するのが、Docker Composeです。

  • ミスが発生しないように起動手順などを簡単にするのが docker-compose らしい

run と compose の引数の対照

この記事によると

設定内容: docker run コマンド, docker-compose.yml
コンテナ名: --name , container_name
環境変数: -e , environment
ポートフォワード: -p , ports
使用するDockerイメージ: コマンドの最後 , image

  • この対応になっている。compose のこの欄を引数で手打ちすれば run でも使えるはず。

Docker run で MySQL DB サーバーのみをうごかす

参考
dockerhub mysql 公式

https://hub.docker.com/_/mysql

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

.. where some-mysql is the name you want to assign to your container,
my-secret-pw is the password to be set for the MySQL root user and
tag is the tag specifying the MySQL version you want. See the list above for relevant tags.

  • some-mysql はコンテナにアサインしたい名前
  • my-secret-pw は mysql の root パスワード
  • tag は 特別な mysql の version
docker run \
--name run-mysql \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:latest

Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql

af7528e958b6: Pull complete 
Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
Status: Downloaded newer image for mysql:latest
04191d9ecd9d6a97c661158ea20d837a07b35bd361397ae918ab3ee1a76548b2
  • 作成されたみたいだ
  • コンテナの名前の16進数が帰ってきた
  • プロセスを確認してみる
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
04191d9ecd9d        mysql:latest        "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        3306/tcp, 33060/tcp   run-mysql
  • run-mysql という名前の mysql:latest のコンテナが動いてる
  • 多分この コマンドで DB サーバーが立ち上がった
  • この後は App サーバーを立ち上げる

別のコンテナを接続

  • これに並列して adminer のコンテナを動かして network で接続する
  • 結論として不可能だった。compose でやることにする

やることの説明

The following command
starts another mysql container instance
and runs the mysql command line client
against your original mysql container,
allowing you to execute SQL statements
against your database instance:

これらのコマンドでは

  • オリジナルの MySQL コンテナに対して
  • また別の MySQL コンテナ インスタンスをスタートし
  • MySQL コマンドライン クライアントを走らせる
  • (今回で言うとオリジナルのMySQLコンテナのような)データベース インスタンス に対して
  • SQL 文を実行できるようにする

「これ(コンテナに対して新しく MySQL コマンドライン クライアントのインスタンスを走らせる)
を使えば一般的なデータベースに接続できる(今 you が作ったオリジナルにも)」
という意味。

インスタンスは この2つ

  • オリジナルの MySQL コンテナ (DBインスタンス)
  • MySQL コマンドライン クライアント インスタンス

インスタンス が compose で言う services: の中身の解釈です

docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p

... where some-mysql is the name of your original mysql container
(connected to the some-network Docker network).

  • some-mysql はオリジナルコンテナの名前
  • some-network という Docker ネットワーク

実行すると network がない

docker run -it \
--network run-mysql-network \
--rm mysql mysql \
-hrun-mysql \
-uexample-user -p \
  • -network をrun-mysql-network にして
  • 終わったら削除することにして
  • 動かすコンテナを run-mysql にして
  • ユーザーの例を プレイヤーにして
  • 起動。
docker: Error response from daemon: 
Could not attach to network run-mysql-network: 
rpc error: code = NotFound desc = network run-mysql-network not found.
  • run-my-network に attach できない
  • その名前のネットワークが見つからない
  • 新しくこれで run-mysql-network というネットワークができたりはしないらしい

ネットワークとは?

ネットワークの状況を見てみる

docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
9c5a8f439579        bridge                bridge              local
c782587be9fa        docker_gwbridge       bridge              local
ca04d2ac4141        host                  host                local
zp84rl1ybyb2        ingress               overlay             swarm
ccb78c451e9e        nextjs-blog_default   bridge              local
87eb957ef9f8        none                  null                local
  • bridge, host, overlay, null, が動いてる。これらはなんだろう?

  • Docker Network を調べる必要があることに気づいた、その公式に当たる

  • bridge が難しかった。 bridge を作るのはかなり時間がかかりそう
  • 指示も最初から compose で動かせるようにだし、run での mysql と adminer の実行は諦めた
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?