企业级容器技术Docker 20250917总结
一、Docker 的组成和定义
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个标准化的单元(称为 “容器”)中,从而确保应用在任何支持 Docker 的环境中都能以相同的方式运行。
简单来说,Docker 的核心思想是 “一次构建,到处运行”,解决了传统开发中 “在我电脑上能运行,到你电脑上就出错” 的环境一致性问题。
核心概念:
-
容器(Container):一个独立运行的应用单元,包含应用程序及其所有依赖(代码、运行时、库、环境变量等)。容器是轻量级的,因为它们共享主机的操作系统内核,不需要像虚拟机那样单独安装操作系统。
-
镜像(Image):容器的 “模板”,是一个只读的文件系统,包含运行应用所需的所有内容。可以把镜像理解为容器的源代码,容器是镜像的运行实例。
-
Dockerfile:用于构建镜像的文本文件,包含一系列指令(如安装软件、配置环境等),通过
docker build命令可生成镜像。 -
仓库(Repository):用于存储和分发 Docker 镜像的地方,类似代码仓库(如 GitHub),最常用的公共仓库是 Docker Hub。官方仓库: https://hub.docker.com/ 可搭建私有仓库harbor
-
Docker 主机(Host): 一个物理机或虚拟机,用于运行 Docker 服务进程和容器,也称为宿主机, node节点
-
Docker 服务端(Server):Docker守护进程,运行 docker 容器 docker engine
-
Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用 docker API
主要优势:
- 环境一致:消除开发、测试、生产环境的差异,减少 “环境问题”。
- 轻量高效:容器比虚拟机更节省资源,启动速度快(秒级)。
- 隔离性:不同容器之间相互隔离,避免依赖冲突。
- 可移植性:容器可以在任何支持 Docker 的平台(Linux、Windows、Mac 等)上运行。
常见用途:
- 应用程序的打包和分发
- 微服务架构的部署
- 持续集成 / 持续部署(CI/CD)流程
- 开发环境的快速搭建和隔离
例如,开发者可以在本地用 Docker 构建一个包含 Python 环境和特定库的容器,然后直接将这个容器部署到服务器,无需担心服务器上的环境配置问题。
1.Docker 优化配置
2.容器镜像管理
[root@ubuntu1804 ~] #docker search -s 100 centos # 搜索点赞 100 个以上的镜像(旧)
3.Alpine 介绍
将 宿主机当前目录下名为
repositories 的文件,复制到名为 alpine-image-3.16.2的容器内的 /etc/apk/repositories 路径。
docker exec -it haha /bin/sh #进入到haha容器,(Alpine 用
/bin/sh,其他系统可能用 /bin/bash)
- 镜像重建:当重新构建一个镜像时,Docker 会为新的镜像分配一个新的镜像 ID,而旧的镜像 ID 如果没有被其他标签引用,就会变成悬空镜像。例如:
# dockerfile文件第一次构建 docker build -t myimage:v1 . # 第二次构建,使用相同标签 docker build -t myimage:v1 . 第一次构建的旧镜像失去标签,成为悬空镜像(<none>:<none>)。 - 删除标签:如果手动删除了一个镜像的标签,且这个镜像没有被其他标签引用,那么它也会成为悬空镜像。例如:
docker pull nginx:latest docker tag nginx:latest mynginx:temp # 新增一个临时标签 docker rmi mynginx:temp # 仅删除标签,不删除镜像本身 如果被删除的 mynginx:temp 是该镜像唯一的标签,原镜像会变成悬空镜像。
4.镜像导出
常见用法
#导出为tar格式docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar
#导出为压缩格式
docker save IMAGE1 IMAGE2 ... | gzip > /path/file.tar.gz
5.镜像导入
6.删除镜像
docker rmi nginx:1.27
7. 镜像打标签
[root@ubuntu1804 ~]#docker tag alpine alpine:3.11 (之前存在alpine:latest镜像,重新打标签原标签文件不会被删除)
8. 拉取不可描述的镜像
利用下面网站做代理,可以实现拉取原本从国内可能无法直接访问的镜像
9. 总结: 企业使用镜像及常见操作
搜索、下载、导出、导入、删除
二、容器的操作基础命令
1. docker container相关命令如下

[root@ubuntu1804 ~] #docker run --rm --name b1 busybox wget -qO - 172.17.0.3
[root@ubuntu1804 ~] #docker run -d --name nginx -p 80:80 nginx #reboot后也自动关闭容器
2. --privileged 选项
3.查看容器信息
4.查看容器内的进程
[root@ubuntu1804 ~] #docker top db144f19 #db144f19是httpd生成容器的ID
5.各种命令
容易搞混淆的命令
docker run是新建容器的命令,无论是否已有同名镜像的容器,都会创建新实例。docker exec是进入已有容器的命令,用于复用已存在的容器。
三、实战案例
1.实战案例: 利用 Docker 快速部署自动化运维平台
2.实战案例:两个容器运行Wordpress博客系统
#方法1
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e
MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456
registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle
#连接数据库的信息通过环境变量指定,MySQL容器重启IP可能会发生变化
docker run -d --name wordpress -p 80:80 -e WORDPRESS_DB_HOST=`docker inspect
mysql --format "{{.NetworkSettings.Networks.bridge.IPAddress}}"` -e
WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=123456 -e
WORDPRESS_DB_NAME=wordpress registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
#方法2:需要初始化人为输入连接数据库信息
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e
MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456
registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle
#连接数据库的主机:宿主机的IP
docker run -d -p 80:80 --name wordpress -e WORDPRESS_DB_HOST=<宿主机的IP> -e
WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=123456 -e
WORDPRESS_DB_NAME=wordpress registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
docker run -d --name wordpress -p 80:80 registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
四、基于CRIU实现容器热迁移(了解)
# 启动 CRIU 功能(需要配置 Docker 守护进程启用实验性特性)
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"experimental": true
}
EOF
# 重启 Docker 服务使配置生效
systemctl restart docker
# 验证 checkpoint 功能(查看命令帮助确认是否启用成功)
docker checkpoint
五、Docker镜像的制作
1.实战案例: 基于 busybox 制作 httpd 镜像
2.实战案例: 基于官方镜像生成的容器制作 tomcat 镜像
3.实战案例: 基于Ubuntu的基础镜像用 apt 安装手动制作 nginx 的镜像
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe
multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe
multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe
multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe
multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe
multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted
universe multiverse
4.范例: 基于 alpine 定制新的镜像(练习)
6.利用 DockerFile 文件执行 docker build 自动构建镜像
https://gitee.com/lbtooth/RuoYiCloud/blob/master/docker/ruoyi/gateway/dockerfile
# 基础镜像
FROM openjdk:8-jre
# author
MAINTAINER ruoyi
# 挂载目录
VOLUME /home/ruoyi
# 创建目录
RUN mkdir -p /home/ruoyi
# 指定路径
WORKDIR /home/ruoyi
# 复制jar文件到路径
COPY ./jar/ruoyi-gateway.jar /home/ruoyi/ruoyi-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-jar","ruoyi-gateway.jar"]
# 第一阶段:构建阶段
FROM maven:3.8.6 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ /app/src/
RUN mvn package
# 第二阶段:运行阶段
FROM openjdk:17-jdk-slim
COPY --from=build /app/target/myapp.jar /app/myapp.jar
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
范例2:前端应用多阶段构建
# 第一阶段:构建阶段
FROM node:16 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 第二阶段:运行阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker多阶段构建是现代容器化应用开发的重要技术,它通过分离构建环境和运行环境,带来了诸多优势:
显著减小镜像体积:只包含运行所需的文件
增强安全性:减少攻击面,避免敏感信息泄露
简化构建流程:单个Dockerfile管理复杂构建过程
提高可维护性:清晰的阶段划分使构建逻辑更直观
六、容器数据持久保存方式(重点)
-v, --volume=[host-src:]container-dest[:<options>]
<options>
ro 从容器内对此数据卷是只读,不写此项默认为可读可写
rw 从容器内对此数据卷可读可写,此为默认值
host-src 宿主机目录如果不存在,会自动创建
container-dest 容器目录如果不存在,会自动创建
方式2: 匿名卷
1.实战案例: 目录数据卷
2.实战案例: MySQL使用的数据卷
3.实战案例: 文件数据卷
4.实战案例: 匿名数据卷
-v 后面第一个路径(/usr/share/nginx/html)是容器内的路径
5.实战案例: 命名数据卷
6.实战案例:实现 wordpress 持久化(练习)
七、数据卷容器(了解)
1.实战案例: 数据卷容器
[root@ubuntu1804 ~] #docker exec -it volume-server bash
[root@ubuntu1804 ~] #docker stop volume-server
八、Docker 网络管理
更多推荐


所有评论(0)