@yukimasaki (正木 裕貴)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

DockerでLEMP環境を構築するもdbコンテナがすぐに終了してしまう

解決したいこと

【導入編】絶対に失敗しないDockerでLaravel + Vue.jsの開発環境(LEMP環境)を構築する方法〜MacOS Intel Chip対応〜 | yutaro blog

上記Webサイトを参考にしてDockerを用いたLEMP環境を構築したいのですが、
ビルドは正常に完了するにもかかわらず、dbコンテナがすぐに終了してしまいます。

解決策をご存じの方がいましたらご教示いただけますでしょうか?
よろしくお願いいたします。

環境

  • Ubuntu 22.04 LTS
  • Docker 20.10.17
  • Docker Compose 1.29.2

発生している問題・エラー

下記画像はコンテナ起動後に「docker ps -a」を実行したときの様子です。
image.png

「docker logs dbコンテナID」を実行すると下記画像のメッセージがずらっと表示されます。
image.png

試したこと

  • コンテナ削除
  • イメージ削除
  • ネットワーク削除
  • ボリューム削除

各種ファイルの配置

docker-original
├─ docker
│    ├─ php
│    │   └─ Dockerfile … (2)
│    │   └─ php.ini … (3)
│    ├─ nginx
│    │    └─ Dockerfile … (4)
│    │    └─ default.conf … (5)
│    └─ mysql
│         └─ Dockerfile … (6)
│         └─ my.cnf … (7)
├─ src
│─ .env … (8)
│─ .gitignore
└─ docker-compose.yml … (1)

設定値

各種ファイルの設定値は下記のとおりです。
※長いので折りたたんでいます。

設定値はコチラ

(1) docker-compose.yml

version: '3.8'

volumes:
  mysql-volume:

services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    volumes:
      - ./src/:/var/www/html
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}

  web:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - ${WEB_PORT}:80
    depends_on:
      - app
    volumes:
      - ./src/:/var/www/html

  db:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    ports:
      - ${DB_PORT}:3306
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      TZ: 'Asia/Tokyo'
    volumes:
      - mysql-volume:/var/lib/mysql

(2) Dockerfile (php)

FROM php:7.4.1-fpm

# COPY php.ini
COPY ./docker/php/php.ini /usr/local/etc/php/php.ini

# Composer install
COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer

# install Node.js
COPY --from=node:10.22 /usr/local/bin /usr/local/bin
COPY --from=node:10.22 /usr/local/lib /usr/local/lib

RUN apt-get update && \
    apt-get -y install \
    git \
    zip \
    unzip \
    vim \
    && docker-php-ext-install pdo_mysql bcmath

WORKDIR /var/www/html

(3) php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

(4) Dockerfile (nginx)

FROM nginx:1.18-alpine

ENV TZ=UTC

# nginx config file
COPY ./docker/nginx/*.conf /etc/nginx/conf.d/

WORKDIR /var/www/html

(5) default.conf

server {
    listen 80;
    
    root /var/www/html/public;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

(6) Dockerfile (mysql)

FROM mysql:8.0

ENV TZ=UTC

COPY ./docker/mysql/my.cnf /etc/my.cnf

(7) my.cnf

[mysqld]
user=mysql
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

(8) .env

WEB_PORT=8077
DB_PORT=3306

DB_NAME=laravel
DB_USER=user
DB_PASSWORD=****
DB_ROOT_PASSWORD=****
0 likes

4Answer

そちらのIPアドレスにpingは飛ぶでしょうか?飛ぶのであれば起動はされているはずです。
起動されていれば以下を参考に

my.cnfmysqld.cnfbind-addressをコメントアウト、または0.0.0.0に設定し、再起動して再度接続を試してみてください。

1Like

Comments

  1. @yukimasaki

    Questioner

    ありがとうございます。
    試してみます!

ご回答ありがとうございます。
tty: trueに加え下記コマンドを追記することでコンテナが終了することはなくなりました。

tty: true
command: >
/bin/bash -c "
pwd
/bin/bash
"

しかし、dbコンテナに入り「mysql -u user -p」でログインを試みても、
「ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)」
とのエラーが表示されます。

調べてみると「localhost」でのアクセスを禁止していることに由来しているようでした。
https://timesaving.hatenablog.com/entry/2021/11/23/150000

そこで下記サイトを参考に、コンテナのIPアドレスを取得しTCP接続を試みたのですが、
「ERROR 2003 (HY000): Can't connect to MySQL server on '172.20.0.2:3306' (111)」
と表示されMySQLサーバーに接続できませんでした。

これはコンテナ内部でMySQLサーバーが起動できていないことを意味しているのでしょうか?
「docker logs dbコンテナID」でログを表示させても、「/」とだけ返ってきます。

他にログを確認する方法はございますでしょうか?
よろしくお願いいたします。

0Like

Your answer might help someone💌