Docker 从入门到实战系列(四):镜像 / 容器导入导出、容器互联与 SpringBoot 微服务打包

在 Docker 的实际使用中,除了基础的镜像和容器操作,镜像与容器的导入导出、容器之间的网络互联,以及将 SpringBoot 微服务打包为 Docker 镜像,都是高频的进阶操作。这些操作能极大提升 Docker 在项目部署、环境迁移和微服务架构中的实用性,本文将详细讲解这四类核心操作的实现步骤。

一、镜像的导入和导出

在实际工作中,我们常常需要将本地构建好的 Docker 镜像迁移到其他服务器,这时候就需要用到镜像的导入和导出功能,Docker 提供了saveload命令来实现该需求,操作简单且高效。

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.tar

2. 容器导入

将容器导出的压缩包导入为本地新的 Docker 镜像,使用docker import命令,需指定新镜像的名称和标签。

复制代码
# 格式:docker import 压缩包名.tar 新镜像名:新标签
# 示例:将mysqlv001.tar导入为mysql:v002镜像
docker import mysqlv001.tar mysql:v002

3. 容器信息查看

导入后可通过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

tomcat1:

tomcat2:

在同一个网络中的容器是可以相互通信的,测试时若容器未自带 ping 命令,需先安装:

复制代码
#进入容器执行
apt-get update
apt install iputils-ping
#使用ping命令测试容器间通信
ping 目标容器IP

ping:

实验证明:同一个网络下的 docker 容器可通过局域网 IP 相互通信。

(2)容器通信图

(3)网络模式

复制代码
[ root@iZbp 1ewOz fkjblswvyxb1jZ ~]# docker network ls
NETWORK ID ed62d580742c NAME bridge DRIVER bridge local SCOPE
dd350a152c0a 4b00268086b4 host none host null local local

3、创建新网络

复制代码
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 镜像名:标签 .
# 示例
[root@bowen 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/bash

5.2 启动容器

复制代码
docker start 容器名
# 示例
docker start student

5.3 访问

通过服务器 IP + 映射的宿主机端口,即可访问部署在 Docker 容器中的 SpringBoot 微服务,例如:http://47.92.175.245(映射 80 端口时可省略端口号)。

使用 Docker 部署 SpringBoot 微服务后,给他人交付仅需提供构建好的 Docker 镜像即可,实现 "一次构建,到处运行"。

相关推荐
爱吃山竹的大肚肚1 天前
RocketMQ 4.x + Spring Boot 生产级集成方案(完整笔记)
spring boot·rocketmq·java-rocketmq
进击切图仔1 天前
ROS 跨机通信与 Docker 多机环境搭建
运维·docker·容器
毕设源码_严学姐1 天前
计算机毕业设计springboot心理健康辅导系统 高校学生心灵关怀服务平台的设计与实现 校园智慧心理服务系统的设计与实现
spring boot·后端·课程设计
xiaoye37081 天前
docker 迁移mysql容器
mysql·docker
姗姗的鱼尾喵1 天前
Java 面试内容分享
java·spring boot·面试
杰克尼1 天前
苍穹外卖--day11
java·数据库·spring boot·mybatis·notepad++
AnalogElectronic1 天前
云原生学习day1ubuntu安装docker,基础镜像打包
学习·docker·云原生
摇滚侠1 天前
Java SpringBoot 项目,项目启动后执行的方法,有哪些方式实现
java·开发语言·spring boot
RDCJM1 天前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
KubeSphere 云原生1 天前
云原生周刊:Docker 是什么?容器革命的起点
docker·云原生·容器