如何在Docker容器中运行MySQL数据库

使用本地容器化数据库提供了灵活性和简化了设置过程。它允许在不具备传统数据库安装复杂性的情况下,紧密复制生产环境。Docker简化了这一过程,只需几个命令就可以轻松部署、管理和扩展隔离容器中的数据库。

在本指南中,您将了解如何:

  • 运行本地容器化数据库
  • 访问容器化数据库的shell
  • 从主机连接到容器化数据库
  • 在卷中持久化数据库数据
  • 清理实验室

先决条件

要遵循本指南,您必须安装Docker。安装说明请参考Docker官方网站。

设置容器化数据库的逐步指南

1. 运行本地容器化数据库

大多数流行的数据库系统,如MySQLPostgreSQLMongoDB,在Docker Hub上都有官方的Docker镜像。这些精选的镜像遵循最佳实践,确保您可以访问最新的功能和安全更新。

要开始使用,请访问Docker Hub并搜索您感兴趣的数据库。每个镜像页面都提供了如何运行容器、自定义设置以及配置数据库以满足您需求的详细说明。关于本指南中提供的MySQL镜像的更多信息,请参考Docker Hub上的MySQL镜像页面。

要运行数据库容器,您可以使用Docker Desktop的GUI或CLI。要使用CLI运行容器,请在终端中运行以下命令:

Shell

 

$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest

 

在这个命令中:

  • --name my-mysql 将名称my-mysql分配给您的容器,以便更容易引用。
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw 将 MySQL 的 root 密码设置为 my-secret-pw。将 my-secret-pw 替换为您选择的 secure 密码。
  • -e MYSQL_DATABASE=mydb 可选地创建一个名为 mydb 的数据库。您可以将 mydb 更改为您希望的数据库名称。
  • -d 以分离模式运行容器,这意味着它将在后台运行。
  • mysql:latest 指定您希望使用 MySQL 镜像的最新版本。

要验证您的容器是否正在运行,请在终端中运行 docker ps

Shell

 

run docker ps

您也可以在 Docker Desktop 控制台中查看相同信息:

2. 访问容器化数据库的 Shell

当数据库在 Docker 容器中运行时,您可能需要访问其 Shell 来管理数据库、执行命令或执行管理任务。Docker 提供了一种使用 docker exec 命令直接执行此操作的方式。另外,如果您更喜欢图形界面,还可以使用 Docker Desktop 的 GUI。

如果您还没有运行数据库容器,请参阅 运行本地容器化数据库。要使用 CLI 访问 MySQL 容器的终端,您可以使用以下 docker exec 命令。

Shell

docker exec -it my-mysql bash 

在此命令中:

  • docker exec 告诉 Docker 您想在运行中的容器中执行命令。
  • -it 确保您访问的终端是交互式的,以便您可以在其中输入命令。
  • my-mysql 是您的 MySQL 容器的名称。如果您在运行时给容器起了不同的名字,请使用那个名称代替。
  • 您想在容器内运行的命令是 bash。它会打开一个 Bash shell,允许您与容器的文件系统以及安装的应用程序交互。
  • 执行这个命令后,您将获得访问您 MySQL 容器内 bash shell 的权限,从那里您可以直接管理您的 MySQL 服务器。您可以运行 Exit 返回到您的终端。

检查 Docker 容器是否正在运行。

Shell

 

run docker ps

一旦您访问了容器的终端,您就可以运行该容器中可用的任何工具。以下(图像)示例显示了在容器内使用 MySQL来列出数据库。

Shell

Mysql -u root -p

MySQL

 

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

5 rows in set (0.00 sec)

 

mysql> create database testdb;

Query OK, 1 row affected (0.11 sec)

 

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| sys                |

| testdb             |

+--------------------+

6 rows in set (0.00 sec)

 

mysql> connect testdb;

Connection id:    12

Current database: testdb

 

mysql> SHOW TABLES;

Empty set (0.02 sec)

 

mysql> create table test (id numeric,fname varchar(20));

Query OK, 0 rows affected (0.10 sec)

 

mysql> SHOW TABLES;

+------------------+

| Tables_in_testdb |

+------------------+

| test             |

+------------------+

1 row in set (0.00 sec)

 

mysql> insert into test values (1,'arvind');

Query OK, 1 row affected (0.08 sec)

 

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from test;

+------+--------+

| id   | fname  |

+------+--------+

|    1 | arvind |

+------+--------+

1 row in set (0.00 sec)

我们在测试表中创建的表和保存的数据只在使用同一个容器时持久;一旦我们重新创建或构建一个新的容器,所有数据都会丢失。

您可以通过退出容器然后重新登录到容器数据库来验证数据是否存在。您将看到,只要容器正在运行,数据库中的数据仍然存在。

3. 从宿主机连接到容器化的数据库

从宿主机连接到容器化的数据库需要将容器内的端口映射到宿主机上的端口。这个过程确保了容器内的数据库可以通过宿主机的网络进行访问。对于MySQL,默认端口是3306。通过暴露这个端口,您可以在宿主机上使用各种数据库管理工具或应用程序与您的MySQL数据库交互。

在开始之前,您必须移除本指南中之前运行的任何容器。要停止并移除容器,可以:

  • 在终端中运行docker remove --force my-mysql以移除名为my-mysql的容器;
  • 或者在Docker Dashboard中,选择容器视图旁边您的容器旁边的删除图标。

接下来,您可以使用Docker桌面GUI或CLI来运行映射了端口的容器。

Shell

 

docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest

在这个命令中,-p 3307:3306将宿主机的端口3307映射到容器内的端口3306

4. 在卷中持久化数据库数据

在Docker卷中持久化数据库数据是确保您的数据在容器重启和移除后仍然存在的必要步骤。Docker卷允许您将数据库文件存储在容器可写层之外,这样可以升级容器、切换基础镜像和共享数据而不会丢失。您可以使用Docker CLI或Docker桌面GUI将卷附加到您的数据库容器。

注意:如同之前在“连接到容器化数据库”部分所做的那样,在开始之前,您必须删除为此指南之前运行过的任何容器。

接下来,您可以使用 Docker Desktop GUI 或 CLI 来运行带有卷的容器。

要运行带有附加卷的数据库容器,请在您的 docker run 命令中包括 —v 选项。这指定了一个卷名称和容器内数据库存储数据的路径。如果卷不存在,Docker 将为您自动创建它。

要运行带有附加卷的数据库容器,请验证数据是否持久。运行容器并附加卷。

Shell

docker run –name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latest

这个命令将名为 my-db-volume 的卷挂载到容器内的 /var/lib/mysql 目录。

在数据库中创建一些数据。使用 docker exec 命令在容器内运行 MySQL 并创建一个表。

Shell

docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"

 

这个命令使用容器中的 MySQL 工具创建一个名为 mytable 的表,其中包含一个名为 column_name 的列,最后,它插入一个值为 value 的记录。

停止并删除容器。如果没有卷,当您删除容器时,您创建的表将会丢失。

Shell

docker remove --force my-mysql

启动一个新的带有卷附加的容器。这次,您不需要指定任何环境变量,因为配置已保存在卷中。

Shell

docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest

验证您创建的表是否仍然存在。然后,再次使用 docker exec 命令在容器内运行 MySQL。

Shell

docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"

 

这个命令使用容器中的MySQL工具从table表中选择所有记录。你应该看到如下所示的输出。

SQL

 

column_name

value

5. 清理MySQL容器镜像

要移除一个容器,使用docker remove命令,并使用空格分隔容器名称或ID。例如:

Shell

 

docker remove --force 90b8831a4b8
docker remove --force 36252896d6ff
docker remove --force d86dff3809e8

结论

最终,使用Docker运行MySQL提供了一个便携、可扩展且高效的数据管理解决方案。Docker的隔离容器有助于简化部署、减少兼容性问题并优化资源使用。通过允许轻松进行版本控制和环境重置,Docker支持快速开发和测试。它非常适合在微服务中管理MySQL数据库,使得部署和扩展更加容易,同时保持强大的性能。

Source:
https://dzone.com/articles/guide-for-running-mysql-database-in-docker-container