在本地启动一个 Docker 的 MySQL 服务
要在本地启动一个 Docker 的 MySQL 服务,并允许其他 Docker 容器连接到该数据库,您可以按照以下步骤操作:
1. 确保已在本地安装了 Docker。您可以在终端中运行 `docker --version` 命令来检查 Docker 是否已正确安装。
2. 使用以下命令来拉取 MySQL 8.0 镜像:
```
docker pull mysql/mysql-server:8.0
```
3. 接下来,您可以使用以下命令来启动一个 MySQL 容器,并将其命名为 `mysql_container`:
```
docker run -d --name mysql_container -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 mysql/mysql-server:8.0
```
请将 `your_password` 替换为您所需的 MySQL root 密码。
4. 等待一段时间,直到容器启动并运行。您可以使用以下命令来检查容器的状态:
```
docker ps
```
如果 `mysql_container` 显示为已运行,则说明 MySQL 容器已成功启动。
5. 现在,您可以在另一个 Docker 容器中连接到 MySQL 容器。为此,您需要在另一个容器中使用 MySQL 客户端工具,例如 `mysql` 命令行工具。
首先,启动另一个容器,并将其连接到 MySQL 容器的网络中。您可以使用以下命令来创建一个新容器:
```
docker run -it --name client_container --network container:mysql_container mysql/mysql-server:8.0 mysql -h mysql_container -u root -p
```
此命令将创建一个新的容器,并将其连接到 `mysql_container` 的网络中。它还将启动 MySQL 客户端工具并连接到 MySQL 容器。
6. 在新容器中,您将被提示输入密码。输入之前在第 3 步中设置的 MySQL root 密码。
现在,您已成功连接到 MySQL 容器。您可以在新容器中执行任何 MySQL 命令,例如创建数据库、表格等。
请注意,上述步骤仅适用于本地 Docker 环境。如果您在生产环境中使用 Docker,建议采取适当的安全措施来保护数据库访问和密码。MySQL 8.0 镜像的默认账户名是 root。在运行 Docker 容器时,通过 `-e MYSQL_ROOT_PASSWORD=your_password` 参数设置的密码将用于 root 用户。您可以使用 root 用户连接到 MySQL 容器,并进行数据库管理操作。
(base) kaka@KakadeMacBook-Pro docker % docker run -d --name kaka_mysql_container -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql/mysql-server:8.0 590db2777460c09a6a77b788f233f3590f62d09370dd12008ea3ccc24c7539c6 docker: Error response from daemon: driver failed programming external connectivity on endpoint kaka_mysql_container (660c44bd96d080e7ac5e2fe9c2f335a314c6d0b0f4b64f2dd42db39ad5f766e1): Bind for 0.0.0.0:3306 failed: port is already allocated. (base) kaka@KakadeMacBook-Pro docker % 报错
这个错误通常是因为端口 3306 已经被其他进程占用导致的。您可以尝试以下解决方法:
1. 检查是否已经有其他容器或进程在使用端口 3306。您可以使用以下命令来查看正在运行的容器和它们使用的端口:
```
docker ps
```
如果在列表中找到正在运行的容器,并且该容器使用了端口 3306,则需要停止或删除该容器,或者修改您的 MySQL 容器使用的端口。
2. 如果没有其他容器使用端口 3306,但您仍然收到端口已被占用的错误消息,请检查是否有其他进程在您的主机上监听了该端口。您可以使用以下命令来查找占用端口 3306 的进程:
```
lsof -i :3306
```
如果找到了正在使用该端口的进程,请停止该进程或修改您的 MySQL 容器使用的端口。
3. 如果以上方法仍然无法解决问题,可以尝试修改您的 MySQL 容器使用的端口,例如将 `-p 3306:3306` 修改为 `-p 3307:3306`,将本地的 3307 端口映射到 MySQL 容器的 3306 端口。
请注意,确保不要使用已经被其他服务占用的端口,以避免冲突。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 04d99d2c4a55 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 4 seconds ago Up 2 seconds (health: starting) 33060-33061/tcp, 0.0.0.0:33060->3306/tcp kaka_mysql_container
根据提供的信息,MySQL 容器已经成功启动,并将容器的 3306 端口映射到主机的 33060 端口。
要使用数据库连接软件连接到 MySQL 容器,您可以按照以下步骤进行操作:
1. 打开您的数据库连接软件(例如 MySQL Workbench、Navicat、DBeaver 等)。
2. 在连接配置中,填写以下信息:
- 主机名/地址:localhost 或者是您的主机 IP 地址。
- 端口:33060(即容器映射的主机端口)。
- 用户名:root(默认的 MySQL root 用户)。
- 密码:您在运行容器时设置的 MySQL root 密码,如 `123456`。
3. 确保您的数据库连接软件支持通过 TCP/IP 连接 MySQL,并且防火墙或安全组已允许主机的 33060 端口的入站连接。
4. 点击连接,尝试连接到 MySQL 容器。
请注意,如果您使用的是本地连接,主机名/地址可以是 `localhost` 或者是您的主机 IP 地址。如果您将容器部署在远程服务器上,则需要使用相应的主机 IP 地址。
如果您遇到连接问题,请确保 MySQL 容器已正确运行,并且主机的 33060 端口没有被其他进程占用。
出现错误 `1130 - Host '172.17.0.1' is not allowed to connect to this MySQL server` 是因为 MySQL 服务器拒绝了来自主机 `172.17.0.1` 的连接请求。
要解决这个问题,您可以按照以下步骤进行操作:
1. 首先,确认您的数据库连接软件正在使用正确的 IP 地址和端口连接到 MySQL 容器。确保主机地址为 `172.17.0.1`,端口为 `33060`(容器映射的主机端口)。
2. 进入运行 MySQL 容器的命令行界面。可以使用以下命令进入容器:
```
docker exec -it kaka_mysql_container bash
```
将 `kaka_mysql_container` 替换为您的 MySQL 容器名称。
3. 在容器的命令行界面中,使用以下命令登录到 MySQL 服务器:
```
mysql -u root -p
```
然后输入您在运行容器时设置的 MySQL root 密码。
4. 登录成功后,执行以下命令以授权允许来自主机 `172.17.0.1` 的连接:
```
1 mysql> show databases; 2 +--------------------+ 3 | Database | 4 +--------------------+ 5 | information_schema | 6 | mysql | 7 | performance_schema | 8 | sys | 9 +--------------------+ 10 4 rows in set (0.53 sec) 11 12 mysql> use mysql; 13 Reading table information for completion of table and column names 14 You can turn off this feature to get a quicker startup with -A 15 16 Database changed 17 mysql> show tables ; 18 +------------------------------------------------------+ 19 | Tables_in_mysql | 20 +------------------------------------------------------+ 21 | columns_priv | 22 | component | 23 | db | 24 | default_roles | 25 | engine_cost | 26 | func | 27 | general_log | 28 | global_grants | 29 | gtid_executed | 30 | help_category | 31 | help_keyword | 32 | help_relation | 33 | help_topic | 34 | innodb_index_stats | 35 | innodb_table_stats | 36 | ndb_binlog_index | 37 | password_history | 38 | plugin | 39 | procs_priv | 40 | proxies_priv | 41 | replication_asynchronous_connection_failover | 42 | replication_asynchronous_connection_failover_managed | 43 | replication_group_configuration_version | 44 | replication_group_member_actions | 45 | role_edges | 46 | server_cost | 47 | servers | 48 | slave_master_info | 49 | slave_relay_log_info | 50 | slave_worker_info | 51 | slow_log | 52 | tables_priv | 53 | time_zone | 54 | time_zone_leap_second | 55 | time_zone_name | 56 | time_zone_transition | 57 | time_zone_transition_type | 58 | user | 59 +------------------------------------------------------+ 60 38 rows in set (0.03 sec) 61 62 mysql> select Host, User from user ; 63 +-----------+------------------+ 64 | Host | User | 65 +-----------+------------------+ 66 | localhost | healthchecker | 67 | localhost | mysql.infoschema | 68 | localhost | mysql.session | 69 | localhost | mysql.sys | 70 | localhost | root | 71 +-----------+------------------+ 72 5 rows in set (0.01 sec) 73 74 mysql> update user set Host='%' where User='root' ; 75 Query OK, 1 row affected (0.12 sec) 76 Rows matched: 1 Changed: 1 Warnings: 0 77 78 mysql> select Host, User from user ; 79 +-----------+------------------+ 80 | Host | User | 81 +-----------+------------------+ 82 | % | root | 83 | localhost | healthchecker | 84 | localhost | mysql.infoschema | 85 | localhost | mysql.session | 86 | localhost | mysql.sys | 87 +-----------+------------------+ 88 5 rows in set (0.00 sec) 89 90 mysql> flush privileges ; 91 Query OK, 0 rows affected (0.09 sec) 92 93 mysql>
```
5. 退出 MySQL 命令行界面,然后退出容器的命令行界面:
```
exit
exit
```
6. 现在,尝试使用数据库连接软件连接到 MySQL 容器,看看是否仍然出现连接问题。
通过执行上述步骤,您应该能够解决连接问题并成功连接到 MySQL 容器。请确保在授权连接时使用了正确的主机地址和密码。