0
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 1 year has passed since last update.

docker コンテナ作成後にmysql接続できなかくて苦戦しました

Posted at

内容

``` docker-compose exec db mysql -u root -p ``` コマンドでmysqlに接続ができない

実行環境

・windows10 ・docker ・mysql Ver 15.1 Distrib 10.5.12-MariaDB ・debian11 ・Python 3.8.2

エラー内容

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

各種ディレクトリ構成、内容

``` . ├── Dockerfile ├── docker-compose.yml ├── mysql │ ├── Dockerfile │ ├── my.cnf │ └── sqls │ │ └── initialize.sql │ └──mysql-data ├── src │ ├── __init__.py │ ├── sample.py │ └── Dockerfile ├── docker-compose.yml ├── README.md └── requirements.txt ```
docker-compose.yml
version: '3'
services:
#database container
  db:
    image: mysql:5.7
    ports:
      - 3306:3306
    expose:
      - '3306'
    restart: always
    container_name: python-db
    build: ./mysql/
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql
      - ./mysql/sqls:/docker-entrypoint-initdb.d
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      #userパスワード
      - MYSQL_DATABASE=test_database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=docker
      - TZ=Asia/Tokyo
      #rootパスワード
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_RANDOM_ROOT_PASSWORD=no
    stdin_open: true
      
  #application container
  python3:
    ports:
      - "8000:80"
    container_name: python3
    build:
      context: ./src/
    links:
      - db
    stdin_open: true
##データベース
FROM mysql:5.7
# EXPOSE 3306
RUN touch /var/log/mysql/mysqld.log
RUN touch /run/mysqld/mysql.sock

ADD  ./mysql/my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/my.cnf
CMD ["mysqld"]

##アプリケーション本体
FROM python:3.6

ARG project_dir= /src

WORKDIR $project_dir

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install jupyterlab
my.conf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8mb4
user = docker
password = docker

試したこと

・```docker exec -it python-db sh```でコンテナに入り``` mysql_config --socket ```で```mysqld.sock```があることは確認済み

ps ax | grep mysqlでプロセスを確認してみた所 19608 pts/1 S+ 0:00 grep mysqlとありおそらくmysqlがうまく起動?できてないみたいです。

root@コンテナid:/# ls -l /run/
合計 8
drwxrwxrwt 2 root root 4096 12月 20 09:00 lock
drwxrwxrwx 2 root root 4096  2月 16 18:32 mysqld
-rw-rw-r-- 1 root utmp    0 12月 20 09:00 utmp
root@コンテナid:/# ls -l /run/mysqld/
合計 0
-rwxrwxrwx 1 root root 0  2月 16 18:32 mysqld.sock
root@コンテナid:/# ls -l /run/mysqld/mysqld.sock
-rwxrwxrwx 1 root root 0  2月 16 18:32 /run/mysqld/mysqld.sock

試行錯誤

参考サイト 参考サイト 参考サイト 参考サイト このようなサイトを参考にファイル内の記述を変更してみたりしてみましたが、効果なしでした。

解決策

docker-compose.ymlファイル内の記述内容を下記のように書き換えました。
docker-compose.yml
version: '3.3'
services:
  python3:
    ports:
      - 8000:80
    build: ./src/
    links:
      - db
    stdin_open: true
  db:
    image: mysql:8.0
    ports:
      - 3306:3306
    restart: always
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql
      - ./mysql/sqls:/docker-entrypoint-initdb.d
      - ./log/mysql:/var/log/mysql
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_PASSWORD: password
      eTZ: Asia/Tokyo
    stdin_open: true

・変更内容はbuildディレクトリをmysqlとアプリケーションで分けていましたが、それをアプリケーション側にまとめました。

・mysql dockerイメージをmysql8.0に変更しdocker-compose up -d --buildしてdocker exec -it <コンテナ名> bashでコンテナに入り、mysql -u root -pとすると

root@<container id>:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, 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>

無事にログインできました、何とか期待通りの動作をしてくれたのはうれしいですが、ファイル編集前の段階でかなり時間を使ってしまいました。

しかしなぜ前の環境ではうまくmysqlに接続できなかったのか今一分かっておりません・・・

0
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
0
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?