在 Docker 的实际使用中除了基础的镜像和容器操作镜像与容器的导入导出、容器之间的网络互联以及将 SpringBoot 微服务打包为 Docker 镜像都是高频的进阶操作。这些操作能极大提升 Docker 在项目部署、环境迁移和微服务架构中的实用性本文将详细讲解这四类核心操作的实现步骤。一、镜像的导入和导出在实际工作中我们常常需要将本地构建好的 Docker 镜像迁移到其他服务器这时候就需要用到镜像的导入和导出功能Docker 提供了save和load命令来实现该需求操作简单且高效。1. 镜像导出将本地已有的 Docker 镜像保存为压缩包文件支持两种命令格式推荐使用镜像名 标签的方式可读性更高。# 格式1通过重定向导出 docker save 镜像名:tag 压缩包名.tar # 格式2通过-o参数指定导出文件更推荐 docker save -o 压缩包名.tar 镜像名:tag # 示例导出nginx最新版镜像为nginx.tar docker save -o nginx.tar nginx:latest执行完成后当前目录会生成对应的.tar压缩包该包包含了镜像的完整分层结构和配置信息。2. 镜像导入将导出的镜像压缩包载入到本地 Docker 镜像仓库同样支持两种命令格式导入后可直接通过docker images查看镜像信息。# 格式1通过-i参数指定导入文件 docker load -i 压缩包名.tar # 格式2通过重定向导入 docker load 压缩包名.tar # 示例导入nginx.tar镜像包 docker load -i nginx.tar二、容器的导入和导出镜像的导入导出针对的是静态的镜像文件而容器的导入导出则是针对运行中的容器实例可以将容器的当前状态保存为压缩包迁移后恢复为新的镜像适合对容器定制化后的环境迁移。1. 容器导出将指定的容器运行中或停止状态均可导出为镜像压缩包使用docker export命令通过-o参数指定导出文件。# 格式docker export 容器ID/容器名 -o 压缩包名.tar # 示例将ID为5cd4ed01b84c的mysql容器导出为mysqlv001.tar docker export 5cd4ed01b84c -o mysqlv001.tar2. 容器导入将容器导出的压缩包导入为本地新的 Docker 镜像使用docker import命令需指定新镜像的名称和标签。# 格式docker import 压缩包名.tar 新镜像名:新标签 # 示例将mysqlv001.tar导入为mysql:v002镜像 docker import mysqlv001.tar mysql:v0023. 容器信息查看导入后可通过docker inspect命令查看容器 / 镜像的详细元数据包括网络配置、挂载目录、环境变量等方便验证导入结果。# 格式docker inspect 容器ID/容器名/镜像ID/镜像名 docker inspect 5cd4ed01b84c三、容器互联Docker 中容器默认是相互隔离的但在实际项目中多个容器之间往往需要通信如 Tomcat 容器访问 MySQL 容器这就需要配置容器互联。Docker 的容器通信基于虚拟网络实现核心分为宿主机访问容器、同网络容器互访、跨网络容器互访三种场景。1、宿主机访问容器通过网络映射将宿主机的端口和容器的端口建立映射。当外网访问宿主机的端口时宿主机会将请求发给容器映射的端口。docker run -itd 宿主机端口:容器端口 .... 镜像2、同一宿主机下的容器之间相互访问(1) 虚拟网络docker 守护进程 (docker 引擎) 是可以创建虚拟网络的。默认的网络名称叫 docker0 。创建容器时如果没有指定加入哪个网络默认加入 docker0 容器会被分配172.17.0.X段 IP网关 gateway 为172.17.0.1。tomcat1tomcat2:在同一个网络中的容器是可以相互通信的测试时若容器未自带 ping 命令需先安装#进入容器执行 apt-get update apt install iputils-ping #使用ping命令测试容器间通信 ping 目标容器IPping:实验证明同一个网络下的 docker 容器可通过局域网 IP 相互通信。(2)容器通信图(3)网络模式[ rootiZbp 1ewOz fkjblswvyxb1jZ ~]# docker network ls NETWORK ID ed62d580742c NAME bridge DRIVER bridge local SCOPE dd350a152c0a 4b00268086b4 host none host null local local3、创建新网络docker network create -d bridge 网络名创建容器时可通过指定网络将容器划分至不同网络组tomcat1 和 tomcat2 在 docker0 网络中二者可通信tomcat3 和 tomcat4 在 mynet01 网络中二者可通信不同网络中的容器如 docker0 和 mynet01默认无法通信4、同一宿主机下的不同网络之间的通信如果tomcat1想要和tomcat3、tomcat4通信需要将tomcat1加入到mynet01网络中。这样tomcat1既在docker0中又在mynet01中。加入操作我们查看容器我们tomcat1去ping tomcat3四、SpringBoot 微服务打包 Docker 镜像1、构建 SpringBoot 项目注意如果项目中用到 mysql 数据库则事先需要把链接数据库的 ip 改为服务器的 ip 地址。2、打包运行测试成功即可将 SpringBoot 项目通过 Maven/Gradle 打包为 jar 包在本地执行java -jar 包名.jar测试确保项目能正常启动运行。3、编写 dockerfile注意docker 命令全部大写这是规定。# From 关键字表示jar包依赖的环境。java:8 相当于jdk1.8 FROM java:8 #ADD命令将本地jar包添加到容器中并自定义名称 # blog-0.0.1-SNAPSHOT.jar:这是你上传jar包的名称。也可以简写为: *.jar # /blog.jar:这是自定义的名称。但是注意要有之前的/ ADD blog-0.0.1-SNAPSHOT.jar /blog.jar #MAINTAINER 作者名称。可以删除不写。 MAINTAINER libowen #EXPOSE 项目暴露的端口号 EXPOSE 8080 #/blog.jar此处的名称要和ADD命令后面的一样。 ENTRYPOINT [java,-jar,/blog.jar]4、构建镜像4.1. 复制 jar 和 Dockerfile 到服务器将打包好的 SpringBoot jar 包和编写完成的 Dockerfile 文件上传到目标服务器如阿里云服务器的同一目录下。4.2. 构建镜像docker build -t 镜像名:标签 . # 示例 [rootbowen springboot]# docker build -t student:1.0 .构建完成后可通过docker images查看构建好的镜像信息。5、发布运行5.1 使用镜像创建容器docker run -itd -p 80:80 --name 容器名 镜像名:标签 /bin/bash # 示例 docker run -itd -p 80:80 --name student student:1.0 /bin/bash5.2 启动容器docker start 容器名 # 示例 docker start student5.3 访问通过服务器 IP 映射的宿主机端口即可访问部署在 Docker 容器中的 SpringBoot 微服务例如http://47.92.175.245映射 80 端口时可省略端口号。使用 Docker 部署 SpringBoot 微服务后给他人交付仅需提供构建好的 Docker 镜像即可实现 “一次构建到处运行”。