目录

一、Docker 到底是什么?解决了什么问题?

1. Docker 的核心定义

2. 为什么需要 Docker?核心解决 “环境不一致” 问题

3. Docker 的核心思想:集装箱式隔离

二、Docker 和虚拟机的区别?看完再也不混淆

1. 虚拟机的工作原理

2. Docker 容器的工作原理

三、Docker 的三大核心要素:镜像、容器、仓库

1. 镜像(Image):应用的 “安装包”

2. 容器(Container):运行中的 “应用实例”

3. 仓库(Repository):镜像的 “云服务器”

四、Docker 快速上手:从安装到运行第一个容器

前置条件

步骤 1:安装 Docker

步骤 2:配置镜像加速(必做,解决拉取镜像慢的问题)

步骤 3:运行第一个 Docker 容器 ——hello-world

步骤 4:查看本地镜像和容器

五、Docker 常用核心命令:日常操作足够用

1. 镜像相关命令

2. 容器相关命令

3. 实用小命令

六、网络映射与数据卷(Volume)

1. 网络映射

2. 数据卷 Volume(目录映射)

七、常用中间件的 Docker 部署

1. JDK8

2. MySQL

3. Nginx

八、Docker 镜像定制

1. docker commit(提交容器为镜像)

2. Dockerfile(核心构建方式)

实战:定制 JDK+Tomcat 镜像

九、镜像 / 容器的导入导出与镜像上传

1. 镜像的导入导出(用于离线部署)

2. 容器的导入导出

3. 镜像上传至 Docker Hub

十、容器互联

1. 宿主机访问容器

2. 同一宿主机容器间通信

3. 不同网络容器间通信

十一、SpringBoot 微服务打包 Docker 镜像(实战核心)

十二、Docker 的典型应用场景:为什么企业都在用?

1. 应用的快速交付和部署

2. 环境隔离和资源管控

3. 微服务架构的部署

4. 弹性扩缩容

十三、总结

在开发和运维的日常工作中,你是否总被这些问题困扰:本地运行好好的项目,部署到服务器就报错;换台机器就要重新配置一遍环境,费时又费力;不同项目的环境依赖冲突,根本无法共存?如果答案是肯定的,那你一定要了解Docker—— 这个能彻底解决环境一致性问题的容器化技术,如今已经成为后端开发、DevOps 工程师的必备技能,而且它并没有想象中那么难。

这篇文章会用最通俗的语言,讲清 Docker 的核心概念、工作原理,还会附上实用的入门操作,让你从零开始,快速上手 Docker。

一、Docker 到底是什么?解决了什么问题?

1. Docker 的核心定义

Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵从 Apache2.0 协议。简单来说,Docker 可以把你的应用程序以及它运行所需要的所有依赖(比如 JDK、Tomcat、MySQL、配置文件等),一起打包成一个轻量级、可移植的容器。这个容器就像一个 “标准化的快递箱”,可以发布到任何支持 Docker 的 Linux 机器上,并且能保证在任何环境下,容器里的应用都能一模一样地运行

2. 为什么需要 Docker?核心解决 “环境不一致” 问题

在 Docker 出现之前,开发和运维之间的 “代沟” 一直难以跨越:开发说 “我的机器上能跑”,运维部署后却各种报错,根源就是开发环境、测试环境、生产环境的不一致

比如你在 Windows 上用 JDK8+Tomcat9 开发了一个 Java 项目,部署到 Linux 服务器时,不仅要重新安装 JDK 和 Tomcat,还要保证版本一致、配置相同,稍有偏差就会出问题;如果服务器上还有其他项目用 JDK11,还会出现依赖冲突。

而 Docker 的思路是 **“带环境安装”**:把应用和它的 “运行环境” 一起打包,无论放到哪台机器,只要装了 Docker,就能直接运行,彻底消除了 “在我这能跑” 的尴尬。

3. Docker 的核心思想:集装箱式隔离

Docker 的核心灵感来自集装箱:一艘货轮上的集装箱,每个都独立封装货物,互不干扰,还能标准化运输。Docker 也是如此,通过隔离机制,把服务器上的每个应用都封装在独立的容器里,容器之间互不影响,还能最大化利用服务器的硬件资源。

和我们熟悉的虚拟机不同,Docker 的隔离是轻量级的,不需要虚拟硬件和完整的操作系统,这让它启动更快、占用资源更少 —— 虚拟机启动需要几分钟,Docker 容器启动只需秒级,镜像大小也从几个 G 降到几个 M。

二、Docker 和虚拟机的区别?看完再也不混淆

很多人刚接触 Docker 时,会把它和 VMware、VirtualBox 这些虚拟机混为一谈,其实二者的虚拟化方式有本质区别,简单来说:虚拟机是 “模拟一台完整的电脑”,Docker 是 “模拟应用的运行环境”

1. 虚拟机的工作原理

虚拟机需要在宿主机上安装虚拟机管理程序(Hypervisor),然后在上面运行完整的客户操作系统,每个应用都需要一个独立的客户系统,再在系统里安装依赖和应用。

特点:笨重、资源占用高、启动慢。比如你开 3 个虚拟机,就要占用 3 个系统的磁盘和内存,磁盘占用通常以 G 为单位,启动需要几分钟。

2. Docker 容器的工作原理

Docker 不需要虚拟完整的操作系统,而是基于宿主机的内核,通过Docker 守护进程(Docker Daemon) 管理所有容器。每个容器只封装应用和它的依赖,共享宿主机的内核,容器之间通过沙箱机制隔离,互不干扰。

特点:轻量、资源占用低、启动快。容器的磁盘占用以 M 为单位,启动只需几秒,一台物理机可以运行成百上千个 Docker 容器,服务器资源能被压榨到极致。

特性 虚拟机 Docker 容器
内核 每个虚拟机有独立内核 共享宿主机内核
磁盘占用 大(几个 G) 小(几个 M)
启动速度 慢(几分钟) 快(秒级)
资源利用率
隔离性 完全隔离(硬件级) 进程级隔离(轻量级)
移植性 差(依赖虚拟机环境) 强(标准化容器)

简单理解:虚拟机是 “装一台电脑”,Docker 是 “装一个应用的运行环境”

三、Docker 的三大核心要素:镜像、容器、仓库

学习 Docker,只要掌握三个核心概念就够了,它们之间环环相扣,是 Docker 的基础,记住一句话:从仓库拉取镜像,通过镜像创建容器,应用最终运行在容器里

1. 镜像(Image):应用的 “安装包”

Docker 镜像就像我们电脑上的软件安装包(比如 exe、dmg 文件),是一个静态的、只读的文件,包含了运行应用所需的所有文件:代码、运行环境、依赖库、配置文件等。

比如官方的tomcat:8.5镜像,就包含了完整的 Tomcat8.5 运行环境,mysql:5.7镜像包含了 MySQL5.7 的所有配置和依赖。镜像不能直接运行,需要通过它创建容器。

2. 容器(Container):运行中的 “应用实例”

Docker 容器是镜像的运行时实体,就像安装包安装后运行的软件程序。如果把镜像比作 “类”,那容器就是类创建的 “实例”—— 一个镜像可以创建无数个容器,每个容器都是独立的,支持创建、启动、停止、删除、暂停等操作。

容器是可写的,运行过程中产生的数据会保存在容器内(如果需要持久化,可通过数据卷挂载到宿主机),我们对应用的所有操作,都是在容器中进行的。

3. 仓库(Repository):镜像的 “云服务器”

Docker 仓库就像代码仓库(Git/GitHub),是用来存放和管理 Docker 镜像的地方,分为公有仓库私有仓库

  • 公有仓库:最常用的是 Docker 官方的Docker Hubhttps://hub.docker.com/),还有国内的阿里云、腾讯云镜像仓库,里面有海量的官方镜像和第三方镜像,可直接免费拉取;
  • 私有仓库:企业内部搭建的仓库,用来存放公司自己的镜像,保证安全性。

四、Docker 快速上手:从安装到运行第一个容器

看完概念,我们来动手操作,以CentOS7为例,教你完成 Docker 的安装、配置,以及运行第一个hello-world容器,步骤简单,跟着做就能成。

前置条件

CentOS7 系统,内核版本 3.0 以上(可通过uname -r命令查看,一般 CentOS7 默认满足)。

步骤 1:安装 Docker

  1.  卸载旧版本(可选,若未安装过可跳过)

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
  2. 安装依赖工具包

    sudo yum install -y yum-utils

  3. 配置国内镜像仓库(推荐阿里云,速度快)

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. 安装 Docker 社区版(CE,免费够用)

    sudo yum install docker-ce docker-ce-cli containerd.io
  5. 启动 Docker 并设置开机自启

    # 启动Docker
    sudo systemctl start docker
    # 设置开机自启
    sudo systemctl enable docker
    # 验证是否安装成功(查看版本)
    docker version

如果能看到 Docker 的客户端和服务端版本信息,说明安装成功!

步骤 2:配置镜像加速(必做,解决拉取镜像慢的问题)

Docker Hub 在国外,直接拉取镜像速度很慢,国内云服务商都提供了镜像加速服务,这里以阿里云为例:

创建配置文件目录

编写配置文件

刷新配置并重启 Docker

除了阿里云,国内还有腾讯云...,可根据自己的需求替换。

步骤 3:运行第一个 Docker 容器 ——hello-world

这是 Docker 的经典测试案例,运行后如果能看到成功提示,说明 Docker 环境完全正常:

sudo docker run hello-world

运行后,Docker 会先检查本地是否有hello-world镜像,如果没有,会自动从 Docker Hub 拉取,然后创建并运行容器,最终在控制台输出 **“Hello from Docker!”**,就说明成功了!

步骤 4:查看本地镜像和容器

# 查看本地所有镜像
docker images
# 查看所有容器(包括停止的)
docker ps -a

五、Docker 常用核心命令:日常操作足够用

掌握以下命令,就能完成 Docker 的日常操作,建议收藏备用,核心围绕镜像容器展开。

1. 镜像相关命令

# 查看本地所有镜像
docker images
# 从仓库拉取镜像(格式:docker pull 镜像名:版本,不写版本默认latest最新版)
docker pull tomcat:8.5
docker pull mysql:5.7
# 搜索仓库中的镜像
docker search 镜像名
# 删除本地镜像(-f强制删除,可删除多个)
docker rmi -f 镜像ID/镜像名:版本
# 删除本地所有镜像
docker rmi -f $(docker images -aq)

2. 容器相关命令

# 查看正在运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 创建并运行容器(最常用,参数详解)
docker run -itd --name 容器名 -p 宿主机端口:容器端口 镜像名 /bin/bash
# -itd:交互式+后台运行;--name:指定容器名;-p:端口映射(宿主机→容器)
# 示例:运行tomcat容器,宿主机8080端口映射到容器8080端口,命名为tomcat01
docker run -itd --name tomcat01 -p 8080:8080 tomcat:8.5
# 启动已停止的容器
docker start 容器ID/容器名
# 停止运行中的容器
docker stop 容器ID/容器名
# 重启容器
docker restart 容器ID/容器名
# 进入运行中的容器(执行命令、操作文件)
docker exec -it 容器ID/容器名 /bin/bash
# 删除容器(-f强制删除,可删除多个)
docker rm -f 容器ID/容器名
# 删除所有停止的容器
docker rm -f $(docker ps -aq --status=exited)
# 查看容器日志(-tf实时查看,--tail 10查看最后10行)
docker logs -tf --tail 10 容器ID/容器名

3. 实用小命令

# 查看Docker系统信息(镜像、容器数量等)
docker info
# 查看命令帮助(任何命令加--help即可)
docker 命令 --help
# 拷贝文件(宿主机↔容器)
docker cp 宿主机路径 容器ID:容器内路径  # 宿主机→容器
docker cp 容器ID:容器内路径 宿主机路径  # 容器→宿主机

六、网络映射与数据卷(Volume)

1. 网络映射

默认宿主机与容器网络不通,需通过-p/-P实现端口映射,让外网通过宿主机端口访问容器内应用:

  • 格式:docker run -itd -p 宿主机IP:宿主机端口:容器端口 --name 容器名 镜像名
  • 实战:Tomcat 容器默认端口 8080,映射宿主机 3344 端口后,外网可通过宿主机IP:3344访问 Tomcat。

注意:官方 Tomcat 镜像的webapps目录默认无文件,需将webapps.dist中的内容拷贝到webapps才能显示默认页面。

2. 数据卷 Volume(目录映射)

核心作用:将宿主机的目录与容器的目录做映射,实现存储空间共享,解决容器数据持久化问题(容器销毁后,宿主机数据仍保留),也是项目部署的核心方式。

  • 核心命令:docker run -itd -p 端口映射 -v 宿主机目录:容器目录 --name 容器名 镜像名
  • 实战部署:将项目文件上传到宿主机映射目录,容器会自动同步,无需进入容器操作。

七、常用中间件的 Docker 部署

1. JDK8

docker search jdk8 # 搜索镜像
docker pull kdvolder/jdk8 # 拉取镜像
docker run -it --name jdk8 kdvolder/jdk8 /bin/bash # 运行容器,java -version验证

2. MySQL

关键要点:需配置root 远程访问数据卷持久化,运行时不添加 /bin/bash,核心命令:

docker pull mysql:5.7 # 拉取指定版本(推荐5.7,避免最新版兼容问题)
# 运行容器:端口映射+数据卷挂载+设置root密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 进入容器配置root远程访问
docker exec -it mysql01 /bin/bash
mysql -uroot -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES; # 刷新权限

3. Nginx

关键要点:映射配置文件html 目录,实现宿主机直接修改配置和部署项目:

docker pull nginx # 拉取镜像
docker run -itd -p 80:80 --name nginx01 nginx # 临时运行容器,拷贝配置文件到宿主机
docker cp nginx01:/etc/nginx/nginx.conf /usr/nginx # 拷贝主配置文件
docker cp nginx01:/usr/share/nginx/html /usr/nginx # 拷贝html目录
docker rm -f nginx01 # 删除临时容器
# 重新运行容器:映射配置文件+html目录
docker run --name nginx02 -d -p 80:80 -v /usr/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/nginx/html:/usr/share/nginx/html nginx

八、Docker 镜像定制

提供两种方式,Dockerfile 为官方推荐方式,灵活性更高,适用于生产环境。

1. docker commit(提交容器为镜像)

类似 Git 提交,将修改后的容器打包为新镜像,适用于快速定制,缺点:无构建记录,不适合批量部署

  • 核心命令:docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:版本TAG
  • 实战:修改官方 Tomcat 镜像后,提交为自定义镜像,避免重复配置。

2. Dockerfile(核心构建方式)

Dockerfile 是构建镜像的命令脚本,通过一系列大写指令定义镜像构建步骤,可追溯、可复用,是企业级定制的核心方式。

指令 作用
FROM 指定基础镜像(所有镜像的基础,如 centos:7、java:8)
MAINTAINER 指定镜像作者(姓名 + 邮箱),可选
RUN 镜像构建时执行的命令(如创建目录、安装软件)
ADD 将本地文件 / 压缩包拷贝到镜像中,自动解压压缩包
WORKDIR 指定镜像的工作目录,后续命令均基于此目录
VOLUME 定义数据卷挂载目录
EXPOSE 声明容器暴露的端口(仅声明,需 - p 实际映射)
ENV 设置环境变量(如 JAVA_HOME、PATH)
CMD/ENTRYPOINT 指定容器启动时执行的命令,ENTRYPOINT 可追加命令,CMD 仅最后一个生效
ONBUILD 当镜像被继承时,触发执行的命令

构建与运行

docker build -f Dockerfile文件路径 -t 镜像名:版本 . # 构建镜像,末尾的.表示构建上下文目录
docker run -itd -p 端口映射 --name 容器名 自定义镜像名:版本 # 运行自定义镜像
实战:定制 JDK+Tomcat 镜像

将 JDK 和 Tomcat 压缩包与 Dockerfile 放在同一目录,编写 Dockerfile 后构建,实现一站式运行 Java Web 环境(核心步骤:基础镜像→解压 JDK/Tomcat→设置环境变量→暴露端口→启动 Tomcat)。

九、镜像 / 容器的导入导出与镜像上传

1. 镜像的导入导出(用于离线部署)

# 导出镜像:将本地镜像保存为压缩包
docker save -o 导出文件名.tar 镜像名:版本/镜像ID
# 导入镜像:将压缩包载入本地镜像仓库
docker load -i 压缩包文件名.tar

2. 容器的导入导出

# 导出容器:将运行中的容器打包为压缩包
docker export 容器ID -o 导出文件名.tar
# 导入容器:将压缩包转为本地镜像
docker import 压缩包文件名.tar 新镜像名:版本

3. 镜像上传至 Docker Hub

docker login -u Docker Hub用户名 # 本地登录Docker Hub,输入密码验证
docker tag 本地镜像名:版本 用户名/镜像名:版本 # 为镜像打标签,符合仓库命名规范
docker push 用户名/镜像名:版本 # 上传镜像到Docker Hub
docker logout # 退出登录

十、容器互联

实现宿主机与容器容器与容器之间的网络通信,核心基于 Docker 的虚拟网络桥接模式

1. 宿主机访问容器

通过端口映射-p)实现,外网访问宿主机端口,宿主机将请求转发至容器对应端口。

2. 同一宿主机容器间通信

  1. Docker 默认创建docker0虚拟网络,所有未指定网络的容器均加入此网络,分配172.17.0.X网段 IP,网关为172.17.0.1
  2. 同一网络的容器可直接通过 IP 通信,需在容器中安装 ping 工具(apt-get update && apt install iputils-ping);
  3. 创建自定义网络:docker network create -d bridge 自定义网络名,指定网络运行容器:docker run -itd --name 容器名 --network 自定义网络名 镜像名,同一自定义网络的容器可互通。

3. 不同网络容器间通信

将其中一个容器加入另一个网络,实现跨网络通信,让容器同时属于多个网络,即可与不同网络的容器互通。

十一、SpringBoot 微服务打包 Docker 镜像(实战核心)

Docker 是微服务部署的核心工具,将 SpringBoot 项目打包为 Docker 镜像,可实现跨平台一键部署,核心步骤如下:

  1. 构建并测试 SpringBoot 项目:确保项目本地运行正常,若连接 MySQL,需将数据库 IP 改为服务器 IP;
  2. 打包为 JAR 包:通过 Maven/Gradle 打包为可执行 JAR 包;
  3. 编写 Dockerfile(极简版):
FROM java:8 # 基础镜像为JDK8
ADD 项目包名.jar /app.jar # 将本地JAR包拷贝到镜像,重命名为app.jar
EXPOSE 8080 # 声明项目端口
ENTRYPOINT ["java","-jar","/app.jar"] # 容器启动时运行JAR包
  1. 将 JAR 包和 Dockerfile 上传到服务器:放在同一目录;
  2. 构建镜像docker build -t 微服务镜像名:1.0 .
  3. 运行容器docker run -itd -p 80:8080 --name 微服务容器名 微服务镜像名:1.0
  4. 外网访问:通过服务器IP:80访问 SpringBoot 项目接口。

十二、Docker 的典型应用场景:为什么企业都在用?

Docker 的优势不仅是解决环境问题,还能大幅提升开发、测试、部署的效率,成为 DevOps 的核心工具,典型应用场景有:

1. 应用的快速交付和部署

开发人员写完代码后,将应用和环境一起打包成 Docker 镜像,测试人员直接拉取镜像运行,无需重新配置环境;测试通过后,运维人员直接将镜像部署到生产环境,一键发布,全程无手工配置,大幅缩短交付周期。

2. 环境隔离和资源管控

一台服务器上可以运行多个 Docker 容器,每个容器对应一个应用,容器之间完全隔离,避免了应用之间的依赖冲突;同时可以为容器分配指定的 CPU、内存资源,防止单个应用占用过多资源影响其他应用。

3. 微服务架构的部署

如今微服务架构成为主流,一个项目会拆分成多个微服务(比如用户服务、订单服务、支付服务),每个微服务都可以打包成独立的 Docker 容器,通过 Docker 进行管理,实现微服务的独立部署、升级、扩缩容

4. 弹性扩缩容

当业务高峰期来临时,需要快速增加应用实例,只需通过 Docker 镜像快速创建多个容器,配合 K8s(Kubernetes)可实现自动化扩缩容,业务低谷时再删除多余容器,最大化利用服务器资源。

十三、总结

Docker 的核心价值就是 **“标准化、轻量级、可移植”**,它用 “镜像 - 容器 - 仓库” 的模式,彻底解决了环境不一致的问题,让应用的开发、测试、部署变得简单、高效。

对于初学者来说,不用一开始就深究底层原理,先掌握核心概念常用命令,动手运行几个容器(比如 Tomcat、MySQL),感受一下 Docker 的便捷性,再逐步学习镜像定制、数据卷、容器互联、微服务打包等进阶内容。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐