Docker環境構築で困ったらログを見る!

どうも!バックエンドエンジニアとして活動しているがんちゃんです!!

バックエンドエンジニア

がんちゃん

寒い日布団の重力に負けがちです!

あ~~冬眠したい!!

バックエンドエンジニア

がんちゃん

さて今回は、Dockerのlogを見ることで環境構築の躓きを解決する記事になります。
ではよろしくお願いします!!

環境情報

Docker version 20.10.8

環境構築実施

下記Docker-compose.ymlで環境を構築します。

今回の作成コンテナは下記3つのコンテナになっています。

  1. appコンテナ(アプリケーション用)

  2. mysqlコンテナ(DB用)
  3. nodeコンテナ(Node用)
version: "3.8"
services:
  web:
    build: ./container/php
    container_name: app
    ports:
      - 8080:8080
    volumes:
      - ./src:/var/www/html/
    working_dir: /var/www/html/
  db:
    build: ./container/mysql
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: public
      MYSQL_USER: iwama
      MYSQL_PASSWORD: Test1111
  node:
    build: ./container/node
    container_name: node
    ports:
      - 81:81
    volumes:
      - ./src:/var/www/html/
    working_dir: /var/www/html/
    tty: true

3つのコンテナを下記コマンドでビルド&アップします。

docker-compose up -d --build
============================
【実行結果】 
Creating mysql ... done 
Creating app ... done
Creating node ... done

正常にビルドが完了してるな!

Dockerのステータスを確認します。

docker-compose ps
=================
【実行結果】
Name               Command               State                          Ports
---------------------------------------------------------------------------------------
app docker-php-entrypoint apac ... Up 80/tcp, 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
mysql docker-entrypoint.sh mysqld Exit 1
node docker-entrypoint.sh node Up 0.0.0.0:81->81/tcp,:::81->81/tcp

あれ?dbコンテナだけ立ち上がってない!

ymlファイルの書き方も間違ってないし、ビルドも正常に実行されていたしなぜ立ち上がらないんだろう?

エラー内容がわからないときはDocker Logを下記コマンドで出力することができます!

docker logs コンテナ名

今回の場合はmysqlコンテナのLogが見たいので、下記のような記述になります。

docker logs mysql
==================
【実行結果】 
2022-02-23 08:31:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. 
2022-02-23 08:31:49+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 
2022-02-23 08:31:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. 
2022-02-23 08:31:49+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified 
You need to specify one of the following: 
- MYSQL_ROOT_PASSWORD 
- MYSQL_ALLOW_EMPTY_PASSWORD 
- MYSQL_RANDOM_ROOT_PASSWORD

下記のようなエラーログが出ていることがわかりますね!

2022-02-23 08:31:49+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified

データベースのパスワードオプションが指定されていませんという内容のエラーが出力されています。

You need to specify one of the following:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD

次のいずれかのパスワードオプションを設定してくださいと教えてくれていますね!

Logの内容に従ってDocker-compose.ymlを修正する

Logで指摘されたデータベースのパスワードオプションをymlファイルに追記してみます。

version: "3.8"
services:
  web:
    build: ./container/php
    container_name: app
    ports:
      - 8080:8080
    volumes:
      - ./src:/var/www/html/
    working_dir: /var/www/html/
  db:
    build: ./container/mysql
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: public
      MYSQL_ROOT_PASSWORD: Test1111 <-ここにパスワードオプションを追加
      MYSQL_USER: iwama
      MYSQL_PASSWORD: Test1111
  node:
    build: ./container/node
    container_name: node
    ports:
      - 81:81
    volumes:
      - ./src:/var/www/html/
    working_dir: /var/www/html/
    tty: true

もう一度コンテナをビルド&アップしてみます

docker-compose up -d --build

そしてDockerのステータスを確認します。

docker-compose ps
=================
【実行結果】
app     docker-php-entrypoint apac ...   Up      80/tcp, 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
mysql   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
node    docker-entrypoint.sh node        Up      0.0.0.0:81->81/tcp,:::81->81/tcp

無事にmysqlコンテナも立ち上がりました!

おまけ

DockerLogは下記コマンドでも出すことができます。

docker-compose logs
===================
Name               Command               State                         Ports
--------------------------------------------------------------------------------------------------
app     | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.23.0.3. Set the 'ServerName' directive globally to suppress this message
app     | [Wed Feb 23 12:33:53.136371 2022] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.51 (Debian) PHP/7.4.25 configured -- resuming normal operations
app     | [Wed Feb 23 12:33:53.136395 2022] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
node    | Welcome to Node.js v17.5.0.
node    | Type ".help" for more information.
mysql   | 2022-02-23 12:33:52+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql   | 2022-02-23 12:33:52+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql   | 2022-02-23 12:33:52+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql   | 2022-02-23 12:33:52+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
mysql   |     You need to specify one of the following:
mysql   |     - MYSQL_ROOT_PASSWORD
mysql   |     - MYSQL_ALLOW_EMPTY_PASSWORD
mysql   |     - MYSQL_RANDOM_ROOT_PASSWORD

Docker Logs コマンドと違ってコンテナすべてのLogを一気に出力することができます!!

最後に

Logはシステム開発にとって欠かせない情報源です。
駆け出しエンジニアにはログを見る習慣をつけることが、大切だと感じる今日この頃です。

最後にこの言葉で締めたいと思います。「Logは友達怖くない!

 

ロジカルスタジオではバックエンドエンジニアを募集しています。
もうすでにLogと友達になっている方、これから友達になろうとしている方、
ご応募お待ちしています↓↓↓