在本地启动一个 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 容器。请确保在授权连接时使用了正确的主机地址和密码。

posted @ 2023-07-19 12:07  爱家家的卡卡  阅读(773)  评论(0编辑  收藏  举报