目录
镜像的配置
镜像的拉取
推荐镜像源列表(截至2025年2月测试有效)
配置方法
修改容器名字
如何使用卷
创建不同的容器,每个容器中有不同的mysql和java版本(不推荐)
1. 安装 Docker Desktop(Windows)
2. 启用 WSL 2(Windows Subsystem for Linux 2)
3. 拉取 MySQL 和 Java 镜像
4. 创建并启动容器
5. 使用 Docker Compose(Windows)
总结
但是上面的做法是不推荐的
docker中MySQL数据库的导出和恢复
导出 MySQL 数据库并发送给别人
在别人容器中恢复数据库
演示
使用卷(volumes)来持久化数据
示例:如何持久化数据库数据
你可以查看这些卷:
如何避免自动卷?
镜像的配置
这是我的
"registry-mirrors": ["https://你的id.mirror.aliyuncs.com","https://mirror.ccs.tencentyun.com","http://hub-mirror.c.163.com","https://registry.docker-cn.com"]
镜像的拉取
根据2025年2月的最新测试结果,以下是国内可用的Docker镜像加速源推荐列表,这些镜像源在速度和稳定性方面表现较好,适合替代默认的Docker Hub以提升镜像拉取效率:
推荐镜像源列表(截至2025年2月测试有效)
-
docker.m.daocloud.io
-
DaoCloud 提供的官方镜像加速服务,覆盖主流镜像,拉取速度快且稳定性高。
-
-
docker-0.unsee.tech
-
社区维护的镜像站,实测拉取时间约8.77秒,适合基础镜像加速。
-
-
docker.1ms.run
-
毫秒级响应,适合对速度要求较高的场景,拉取时间约10.70秒。
-
-
func.ink
-
快速且稳定,拉取时间仅8.32秒,适合高频使用1。
-
-
docker.imgdb.de
-
德国镜像站的中国节点,支持多类镜像,同步速度较快。
-
-
docker.hlmirror.com
-
国内社区维护,实测拉取时间约14.16秒,支持主流镜像。
-
-
docker.zhai.cm
-
个人开发者维护,拉取时间约8.89秒,适合轻量级镜像。
-
-
fast360.xyz
-
企业级镜像加速服务,响应速度快,适合大型镜像。
-
-
lispy.org
-
社区推荐,拉取时间约14.09秒,支持多种公共镜像。
-
-
中国官方镜像:https://registry.docker-cn.com
网易163镜像:http://hub-mirror.c.163.com
中科大镜像:https://docker.mirrors.ustc.edu.cn
阿里云镜像:https://[xxx].mirror.aliyuncs.com
配置方法
-
永久配置(推荐)
修改 Docker 的配置文件daemon.json
,添加多个镜像源以提升容错性:"registry-mirrors": ["https://docker.m.daocloud.io","https://docker-0.unsee.tech","https://docker.1ms.run","https://func.ink","https://docker.imgdb.de"]
-
临时使用
在拉取命令中直接指定镜像源地址(无需https://
前缀):docker pull docker.m.daocloud.io/hello-world:latest
注意事项
-
镜像同步延迟
部分镜像源可能未同步最新镜像(如阿里云镜像站),若拉取失败可切换其他源。 -
地区限制
某些镜像源可能受地区网络影响(如企业内网限制),建议结合本地网络环境测试。 -
服务波动
社区维护的镜像源可能存在不稳定性,推荐配置多个备用地址。 -
验证配置是否生效
执行docker info
,若输出中显示Registry Mirrors
列表,则配置成功。
性能测试建议
-
使用
time
命令对比镜像拉取速度:time docker pull hello-world:latest
-
移除本地缓存后测试,结果更准确。
修改容器名字
Docker Desktop 界面本身没有直接修改容器名字的选项,但你可以通过以下步骤来完成:
步骤:
-
停止容器: 首先,确保容器处于停止状态。在 Docker Desktop 界面,找到
quizzical_brattai
容器,点击右侧的 "Stop" 按钮停止该容器。 -
重命名容器: 打开 Docker Desktop 中的 Terminal 或者使用命令行,输入以下命令来重命名容器,假设你想把
quizzical_brattai
容器改名为new-hello-world
,命令应该是:docker rename quizzical_brattai new-container-name
-
启动容器: 重命名容器后,你可以重新启动它。在 Docker Desktop 界面中,找到该容器,点击 "Start" 按钮。
注意:
- 容器重命名不会改变容器的功能或配置,它只是更改容器的名称。
- 容器的镜像 (
hello-world
) 不会改变,因为镜像和容器是不同的概念。你可以用相同的镜像启动多个容器,只需要不同的容器名称。
如何使用卷
卷(volumes)主要用于数据持久化和容器之间的数据共享。容器在运行时会创建文件系统,但这些文件系统是临时的,容器停止后数据会丢失。而卷提供了一种方式,让你能够在容器和主机之间持久化数据,并且容器之间也可以共享这些数据。
在Docker中,卷可以通过以下几种方式进行使用:
-
命令行创建和使用卷:可以通过
docker volume create
命令创建卷,使用时通过-v
参数将卷挂载到容器中。示例:
docker volume create myvolume docker run -d -v myvolume:/data mycontainer
-
将主机目录挂载为卷:除了使用 Docker 管理的卷,还可以将主机的某个目录直接挂载到容器中,这对于开发和调试非常方便。
示例:
docker run -d -v C:\path\to\host\folder:/data mycontainer
总之,Docker中的卷是一种非常重要的功能,能够保证数据的持久性,并提高容器的可移植性和灵活性。
创建不同的容器,每个容器中有不同的mysql和java版本(不推荐)
要在 Docker 中创建多个容器,每个容器中包含不同版本的 MySQL 和 Java,可以使用 Docker 的 多容器管理。你可以为每个容器选择不同的 MySQL 和 Java 版本,以下是详细的步骤。
1. 安装 Docker Desktop(Windows)
确保你已经在 Windows 上安装并启动了 Docker Desktop。如果没有安装,你可以从 Docker 官网下载并安装:Docker Desktop for Windows。
2. 启用 WSL 2(Windows Subsystem for Linux 2)
在 Windows 上运行 Docker Desktop 时,通常需要启用 WSL 2(Windows Subsystem for Linux 2)作为后端。Docker Desktop 会自动配置 WSL 2。
-
打开 PowerShell 以管理员身份运行,执行以下命令来启用 WSL:
wsl --install
-
如果已安装 WSL,可以通过以下命令升级为 WSL 2:
wsl --set-default-version 2
-
确保你已经安装了合适的 Linux 发行版(例如 Ubuntu)。可以在 Microsoft Store 中找到并安装。
3. 拉取 MySQL 和 Java 镜像
在 Windows 上,你可以使用 Docker Desktop 自带的 PowerShell 或 命令提示符 来运行 Docker 命令。
-
拉取 MySQL 镜像: 打开 PowerShell 或命令提示符,输入以下命令来拉取 MySQL 镜像(例如 MySQL 5.7):
docker pull mysql:5.7
-
拉取 Java 镜像: 同样,拉取 Java 镜像(例如 OpenJDK 8):
docker pull openjdk:8
4. 创建并启动容器
-
你可以使用下面的命令在 Windows 上创建和启动容器。
创建 MySQL 5.7 容器:
docker run --name mysql-java8-container -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:5.7
进入容器:
docker exec -it mysql-java8-container bash
安装 Java 8: 在容器内使用以下命令安装 Java 8:
apt-get update apt-get install openjdk-8-jdk -y
创建 MySQL 8.0 容器并安装 Java 11:
docker run --name mysql-java11-container -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:8.0 docker exec -it mysql-java11-container bash apt-get update apt-get install openjdk-11-jdk -y
5. 使用 Docker Compose(Windows)
详细教程:Windows下Docker Compose使用教程-CSDN博客
Docker Desktop 也支持 Docker Compose,在 Windows 上使用与其他操作系统相同。你可以创建一个 docker-compose.yml
文件来定义多个容器服务。
-
创建
docker-compose.yml
文件:使用文本编辑器创建一个名为
docker-compose.yml
的文件,并将以下内容复制到该文件中:version: '3' services:mysql-java8:image: mysql:5.7container_name: mysql-java8-containerenvironment:MYSQL_ROOT_PASSWORD: rootpasswordvolumes:- mysql-data:/var/lib/mysqlports:- "3306:3306"java8:image: openjdk:8container_name: java8-containercommand: ["java", "-version"]mysql-java11:image: mysql:8.0container_name: mysql-java11-containerenvironment:MYSQL_ROOT_PASSWORD: rootpasswordvolumes:- mysql-data:/var/lib/mysqlports:- "3307:3306"java11:image: openjdk:11container_name: java11-containercommand: ["java", "-version"]volumes:mysql-data:
-
启动 Docker Compose 服务:
打开 PowerShell 或命令提示符,导航到
docker-compose.yml
文件所在的目录,然后运行以下命令来启动服务:docker-compose up -d
-
检查容器状态: 运行
docker ps
命令检查容器是否成功启动。
总结
这些步骤是针对 Windows 环境的。如果你在 Windows 下遇到任何问题,确保 Docker Desktop 和 WSL 2 正常运行。如果你已经完成了 Docker Desktop 的安装并启用了 WSL 2,剩下的步骤和 Linux/macOS 环境类似,可以直接使用命令行操作。
通过上述步骤,你可以创建多个 Docker 容器,每个容器中有不同版本的 MySQL 和 Java。使用 Docker Compose 可以简化多个容器的管理,便于同时运行和管理不同版本的服务。这样,你可以根据需要在同一台机器上运行多个环境,每个环境包含不同的 MySQL 和 Java 版本。
但是上面的做法是不推荐的
在 Docker 中,容器是相互隔离的。你可以在同一个容器中运行多个服务或应用程序,但这样做并不推荐,因为这会违背容器化的基本理念:每个容器应该只负责一个服务。这种做法可能会导致管理上的复杂性以及环境冲突。
对于你的情况,如果你将 MySQL 和 JDK 8 放在同一个容器中运行,确实不会直接影响到 Windows 环境中的 Java 设置。然而,这样做并不符合最佳实践,因为它会让你失去容器本来的隔离性和灵活性,且在需要维护时可能更加困难。
更推荐的做法是分别为 MySQL 和 JDK 创建单独的容器,并通过 Docker 的网络功能将它们连接起来,这样可以避免相互干扰并保持每个服务的独立性。你还可以使用 Docker Compose 来管理多个容器。
如果你坚持将它们放入同一个容器,可以在 Dockerfile 中基于某个基础镜像(例如 Ubuntu)安装 JDK 和 MySQL 服务,并确保它们能够正常启动。但我建议你考虑分开部署,以便更容易管理和维护。
在你使用 docker exec
进入容器时,运行 apt-get install openjdk-8-jdk -y
不会从本地已经拉取的 openjdk-8 镜像安装,而是会从 Docker Hub 上下载对应的 OpenJDK 8 镜像。
这是因为你创建的容器基于 MySQL 镜像(mysql:8
),该镜像中并不包含 Java 环境。因此,运行 apt-get install openjdk-8-jdk
会尝试从 Docker Hub 下载并安装 OpenJDK 8。由于 MySQL 镜像并不包含 Java,所以它没有相关的 Java 环境。
要在容器内使用 Java,你有两种选择:
-
直接在容器中安装 OpenJDK: 你可以在容器内运行
apt-get update
和apt-get install openjdk-8-jdk -y
来安装 OpenJDK 8。这会从网络下载并安装 OpenJDK 8。在安装完成后,你就可以在容器中使用 Java 了。 -
基于 OpenJDK 镜像创建容器: 你可以创建一个基于 OpenJDK 镜像的容器。例如,你可以运行以下命令来拉取 OpenJDK 镜像并创建容器:
docker run --name java-container -it openjdk:8 bash
然后,你就可以在这个容器中直接使用 Java,而不需要安装 OpenJDK。
如果你希望在同一个容器中同时运行 MySQL 和 Java,建议使用 Docker Compose 来同时启动多个服务容器。
使用Navicat连接docker中的MySQL8
端口映射:你需要将 MySQL 容器的端口暴露到主机上,这样才能通过 Navicat 连接。默认情况下,MySQL 使用 3306 端口。你需要在运行容器时添加端口映射参数
打开docker的终端输入:
docker run --name mysql8-container -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8
会出现并运行该容器
打开Navicat新建连接,测试连接,密码就是刚刚设置的123456
(此时本地的MySQL是关闭的,说明连接的就是docker中的MySQL)
docker中MySQL数据库的导出和恢复
如果你想将当前容器中的 MySQL 数据库导出并发送给别人,这两个文件(SQL 文件和配置文件)可以作为导出的结果来复制你的数据库:
-
xx.sql
文件:这个文件包含了数据库的结构(例如表、索引、视图等)和数据(例如INSERT
语句)。它可以用来在其他 MySQL 容器或实例中重建相同的数据库,包括数据表、数据等。 -
xx.cnf
文件:这是 MySQL 的配置文件,包含了 MySQL 服务的运行参数(如端口、字符集等)。如果别人希望使用与你相同的配置,可以将这个文件放到他们的 MySQL 容器中,替换掉现有的配置文件(如果有不同配置需求)。
导出 MySQL 数据库并发送给别人
假设你希望导出 MySQL 数据库,可以使用 mysqldump
命令来进行备份:
-
导出数据库结构和数据: 在 Docker 容器中执行以下命令将数据库导出为 SQL 文件:
docker exec -it mysql-java8-container mysqldump -u root -p123456 --all-databases > /tmp/all_databases.sql
这将导出所有数据库的数据和结构。如果你只想导出特定的数据库,可以使用:
docker exec -it mysql-java8-container mysqldump -u root -p123456 database_name > /tmp/database_name.sql
-
复制导出的 SQL 文件到本地: 使用
docker cp
命令将导出的 SQL 文件从容器复制到本地:docker cp mysql-java8-container:/tmp/all_databases.sql /path/to/local/directory
-
复制配置文件(如果需要): 如果你需要包括配置文件,可以将
hm.cnf
文件从容器复制到本地:docker cp mysql-java8-container:/etc/mysql/my.cnf /path/to/local/directory/hm.cnf
-
发送给别人: 你可以将
all_databases.sql
或单个数据库的 SQL 文件以及hm.cnf
文件发送给别人。别人只需要按照前面的步骤,先将这些文件导入到他们的 MySQL 容器中,然后再根据需要配置hm.cnf
文件即可。
在别人容器中恢复数据库
-
导入数据库结构和数据: 别人可以将
all_databases.sql
或database_name.sql
文件复制到他们的 MySQL 容器中,然后使用以下命令恢复:docker cp /path/to/all_databases.sql mysql-java8-container:/tmp/all_databases.sql docker exec -it mysql-java8-container bash mysql -u root -p123456 < /tmp/all_databases.sql
-
应用配置文件(如果需要): 如果有配置文件需要替换,别人可以将
hm.cnf
文件复制到容器中,并重启 MySQL 服务:docker cp /path/to/hm.cnf mysql-java8-container:/etc/mysql/my.cnf docker restart mysql-java8-container
总结
- SQL 文件 用于导出和导入数据库的结构和数据。
- 配置文件 用于在不同环境中复制相同的 MySQL 配置。
通过这两个文件,别人可以在他们的容器中恢复你的数据库并应用相同的配置。
演示
现在我本地已经有hmall.sql和hm.cnf
有两种方式来恢复该数据库
方式一:在 Docker 中的 MySQL 容器中运行这些文件,hmall.sql和hm.cnf
-
运行 SQL 文件 (
hmall.sql
): 你可以将hmall.sql
文件加载到 MySQL 容器中,步骤如下:-
将 SQL 文件复制到容器中: 使用
docker cp
命令将hmall.sql
文件从本地复制到容器中:docker cp "F:\hmall.sql" mysql8-container:/tmp/hmall.sql
-
进入容器并执行 SQL 文件: 进入容器并使用 MySQL 命令行工具运行该 SQL 文件:
docker exec -it mysql8-container bash mysql -u root -p123456 < /tmp/hmall.sql
这样会执行
hmall.sql
中的所有 SQL 命令,将数据和结构导入到 MySQL 数据库中。
-
-
应用配置文件 (
hm.cnf
): 配置文件通常用于自定义 MySQL 的运行设置。要在 Docker 中使用hm.cnf
文件,你可以将它复制到容器中的 MySQL 配置目录,并重启 MySQL 服务。-
复制配置文件到容器中:
docker cp /path/to/hm.cnf mysql-java8-container:/etc/mysql/my.cnf
-
重启 MySQL 容器: 重启容器使新配置生效:
docker restart mysql-java8-container
-
方式二:运行docker中含有MySQL的容器后,在Navicat中运行hmall.sql
你可以在 Navicat 中直接打开 hmall.sql
文件并执行它。具体操作步骤如下:
- 打开 Navicat,连接到你运行的 MySQL 容器。
- 在 Navicat 中选择你希望导入数据库的 MySQL 实例。
- 使用 Navicat 打开
hmall.sql
文件。 - 点击执行按钮,这样 SQL 文件中的所有命令将会执行,数据库将会根据 SQL 文件中的定义创建并填充数据。
使用卷(volumes)来持久化数据
如果你在容器中创建了数据库和数据表,并且没有使用卷(volumes)来持久化数据,那么当容器停止、删除或重新创建时,这些数据会丢失。因为容器的文件系统是临时的,只存在于容器的生命周期内。
为了防止数据丢失,你需要使用卷来持久化数据库的数据。你可以将容器中的数据库文件目录映射到宿主机上的目录,或者使用Docker卷来存储数据库数据,这样即使容器停止或删除,数据仍然会保存在宿主机或卷中。
示例:如何持久化数据库数据
假设你使用的是MySQL数据库,可以通过如下方式将数据库的数据保存在卷中:
docker run -d \-v mysql_data:/var/lib/mysql \--name mysql_container \-e MYSQL_ROOT_PASSWORD=my-secret-pw \mysql:latest
在上面的命令中:
-v mysql_data:/var/lib/mysql
:这将创建一个名为mysql_data
的卷,并将其挂载到容器的/var/lib/mysql
目录,这个目录是MySQL存储数据的默认路径。- 这样即使容器停止或删除,数据库的数据也会被保存在
mysql_data
卷中,下一次启动容器时可以恢复这些数据。
如果你使用的是本地目录作为数据存储位置,可以这样做:
docker run -d \-v C:\path\to\host\mysql_data:/var/lib/mysql \--name mysql_container \-e MYSQL_ROOT_PASSWORD=my-secret-pw \mysql:latest
这样,即使容器被删除或停止,C:\path\to\host\mysql_data
目录中的数据仍然会被保留在主机上。
如果你没有手动挂载卷,但是docker在没有明确指定使用volumes
的情况下,仍然会自动为某些容器创建一个卷,尤其是像MySQL这样的数据库容器。即使你没有显式地为容器创建卷,Docker会在容器启动时自动为MySQL等服务创建一个名为<容器ID>_data
的匿名卷,用来持久化数据库的文件。例如下:
这个自动创建的卷通常位于Docker的内部管理目录(通常是Docker的默认数据目录),它会存储MySQL的数据库文件,即使你没有使用-v
选项来指定一个挂载卷。这个匿名卷的作用是确保数据库在容器重启、停止或删除后仍能保留数据。
你可以查看这些卷:
-
列出所有卷: 你可以通过
docker volume ls
命令查看所有卷,包括自动生成的匿名卷。docker volume ls
-
查看卷的详细信息: 可以通过
docker volume inspect <卷名>
来查看卷的详细信息,包括它的存储路径。docker volume inspect <卷名>
如何避免自动卷?
如果你想要管理卷并显式地指定数据存储位置,最好是在启动容器时使用 -v
参数来挂载自定义的卷或主机目录。例如:
docker run -d -v /path/to/host/mysql_data:/var/lib/mysql --name mysql_container -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest
这样,你就可以明确控制数据库数据的位置,而不是依赖Docker自动创建的匿名卷。