Докерский контейнер Mysql - практически ничего не получается - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь использовать образ докера mysql для разработки базы данных. Я не могу подключиться к нему или использовать его клиент для подключения к существующей базе данных.

Сервер

Вот я пытаюсь создать базу данных и подключиться к ней:

% cat Dockerfile
FROM mysql:5.7
COPY drupal.sql.gz /docker-entrypoint-initdb.d
COPY civicrm.sql.gz /docker-entrypoint-initdb.d
RUN perl -pi -e 's/^#(bind-address\s*=\s*127\.0\.0\.1)/$1/' /etc/mysql/mysql.conf.d/mysqld.cnf

% docker build -t my-mysql .
Sending build context to Docker daemon  7.166MB
Step 1/4 : FROM mysql:5.7
 ---> e1e1680ac726
Step 2/4 : COPY drupal.sql.gz /docker-entrypoint-initdb.d
 ---> Using cache
 ---> 93d57dcd45e9
Step 3/4 : COPY civicrm.sql.gz /docker-entrypoint-initdb.d
 ---> Using cache
 ---> cb0342af9523
Step 4/4 : RUN perl -pi -e 's/^#(bind-address\s*=\s*127\.0\.0\.1)/$1/' /etc/mysql/mysql.conf.d/mysqld.cnf
 ---> Using cache
 ---> bf68cb50c994
Successfully built bf68cb50c994
Successfully tagged my-mysql:latest

% docker run -p 4306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d my-mysql
ff19571bebf58ac1d58e44d40677c693953cd981fd70d18fd93d3d2fe8738349

% mysql --port 4306 -h 127.0.0.1 -u root -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

На самом деле он находит что-то в этом порту, потому что, если я подключаюсь к какому-нибудь случайному порту без сервера, возникает другая ошибка:

% mysql --port 4307 -h 127.0.0.1 -u root -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)

Журналыпохоже, что сервер успешно запускается:

% docker logs ff19571bebf5 2>&1 |tail -n3
2019-10-22T01:04:51.953141Z 0 [Note] mysqld: ready for connections.
Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
2019-10-22T01:04:52.933930Z 0 [Note] InnoDB: Buffer pool(s) load completed at 191022  1:04:52

Клиент

Аналогичным образом, когда я пытаюсь использовать контейнер в качестве клиента для подключения к локальному серверу MySQL, клиент может 'т подключиться. Вот подключение с использованием локального клиента:

% mysql -u ken -p -h 127.0.0.1 --port 3306
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 253
Server version: 5.7.27 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> 

и вот то же самое с использованием клиента Docker:

% docker run -it --network=host --rm mysql mysql -h 127.0.0.1 --port 3306 -u ken
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

Что я здесь не так делаю? Это проблема непонимания работы с сетями Docker или что-то не так с этими изображениями?

В конечном итоге

В конце концов я хочу, чтобы все работало с использованием docker-compose, чтобы мой веб-контейнер могпоговорите с моим контейнером базы данных, но я решил упростить это до чего-то более простого для отладки.

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Я отвечаю на вопрос Как в конечном итоге заставить это работать, используя docker-compose.

вы хотите сделать это первым, чтобы заставить работать docker-compose, даже если вам не нужен рой.

docker swarm init

настройка файла docker-compose.yml выглядит следующим образом

version: "2"
networks:
    mynet:
        driver: overlay
services:
    web:
        image:  put image tag here
        hostname:  web
        ports:
            - "8000:80/tcp"
        networks:
           mynet:
                aliases:
                     - web
    db:
        image:  put mysql image tag here
        hostname:  db
        ports:
              - "4306:3306/tcp"
        environment:
            - MYSQL_ROOT_PASSWORD=1234
        networks:
           mynet:
                aliases:
                     - db

проверка отступа перед запуском docker-compose. Я набрал текст выше на телефонной трубке, и любая помощь в редактировании приветствуется.

в каталоге, куда вы положили docker-compose.yml, скажем, это «mydir», например.

docker-compose up 

docker-compose попытается создать новую вспомогательную работу с именем "mydir_mynet" и два контейнера с именами "web" и "db" соответственно. после завершения запуска docker-compose вы должны иметь возможность

mysql --port 4306 -h 127.0.0.1 -u root -p1234

или клиента mysql внутри docker

docker exec db mysql --port 3306 -h 127.0.0.1 -u root -p1234

обратить внимание на разницу в номере порта

downконтейнеры и сеть по

docker-compose down
1 голос
/ 22 октября 2019

Если вы установите серверный процесс в контейнере Docker для привязки к 127.0.0.1, то есть интерфейс этого хоста localhost, и он будет недоступен извне контейнера. mysql изображение по умолчанию здесь правильно;удалите строку RUN, которая изменяет настройку MySQL bind-address.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...