从零吃透 Docker:五大真实场景实战,彻底弄懂容器隔离与企业级部署
Docker 是一款开源容器化引擎,核心作用是将应用代码、运行依赖、配置文件统一打包为镜像。基于镜像可以启动容器,利用 Linux 内核 Namespace、Cgroups 实现进程、网络、资源的轻量隔离。 和传统虚拟机不同:容器不需要搭载独立操作系统内核,直接共享宿主机 Linux 内核,因此启动速度快、资源占用极低。
以下是Docker和传统虚拟机的对比表:

Docker 实现了环境一致性:开发、测试、服务器、甲方环境完全统一,彻底解决 “本地能跑,其他机器报错” 的经典问题。 在 Windows 系统下,Docker Desktop 无法直接依托 Windows NT 内核运行,需要借助 WSL2 提供轻量化 Linux 内核作为底层支撑。
Docker 整体分为三大核心部件:
- Docker Client(客户端):你敲
docker run、docker compose命令的交互入口; - Docker Daemon(守护进程):后台服务,接收客户端指令,管理镜像、容器、网络、存储;
- Docker Registry(镜像仓库):存放公共 / 私有镜像(例如 Docker Hub)。

这里我说明docker中镜像和容器的关系:镜像是静态模板;容器是镜像运行起来的动态实例。 一个镜像,可以启动无数个独立容器。同时镜像是创建容器的只读模板,容器是镜像运行后的实例;镜像持久保存在磁盘,容器是临时运行环境。
我们再来分析一下docker命令在不同的业务场景中都能发挥什么样的作用吧!
场景一:在同样一台服务器上安装不同的nginx版本,并且两者互不干扰
首先,我们以管理员权限运行Windows PowerShell,打开后输入命令docker pull nginx:1.24.0, docker pull nginx:1.26.2来拉取nginx镜像。

随后我们启动两个独立的nginx容器,输入命令docker run -d --name nginx-1.24 -p 8080:80 nginx:1.24.0 ,docker run -d --name nginx-1.26 -p 8081:80 nginx:1.26.2。

输入命令docker ps来验证是否运行。同时进行浏览器访问测试。



使用命令docker images列出本地电脑上所有已经下载完成的 Docker 镜像(image)。

至此这个场景我们就搭建完成了!
场景二:实现多容器通信+MySQL容器化部署
首先,我们创建一个自定义网络,用于容器间通讯,使用命令docker network create blog-network。

然后我们使用命令docker run -d --name blog-mysql --network blog-network -e MYSQL_ROOT_PASSWORD=123321 -e MYSQL_DATABASE=wordpress mysql:5.7。后台创建并启动一个名为 blog-mysql 的 MySQL5.7 容器,接入自定义网络 blog-network;设置 root 密码 123321,并且自动新建 wordpress 数据库。


启动后我们进行MySQL验证和通信测试:输入命令docker ps来查看运行中的容器状态,确保状态为Up,输入命令docker exec -it blog-mysql mysql -u root -p123321 -e "show databases"来进入容器并登录MySQL,查看数据库。
使用命令docker run --rm --network blog-network alpine ping blog-mysql来启动临时的Alpine容器,测试自定义网络DNS解析。如果能收到 ping 回复,那么我们的Docker 网络 DNS 正常,多容器通信没问题!


场景三:编写 Dockerfile 文件,基于基础镜像封装 WordPress 程序,构建自定义博客网站镜像
输入命令mkdir -p blog-project/blog来创建项目目录,cd blog-project/blog进入项目根目录,vim Dockerfile创建并编辑Dockerfile,用来自定义构建博客镜像。

进入到vim界面后,输入大写字母A切换为插入模式。编辑如下内容:FROM wordpress:latest LABEL maintainer="wb@fendou.com" WORKDIR /var/www/html ENV WORDPRESS_DB_USER=root \ WORDPRESS_DB_PASSWORD=123321 \ WORDPRESS_DB_NAME=wordpress \ WORDPRESS_DB_HOST=blog-mysql EXPOSE 80 CMD ["apache2-foreground"]。然后exit退出编辑模式,输入:wq保存并退出即可。这份 Dockerfile 基于官方 WordPress 镜像自定义构建镜像,预配置数据库连接信息,声明 80 端口,容器启动自动运行 Apache 服务提供网站。
我们读取当前目录的 Dockerfile,再构建一个名为wb-blog、版本v1.0的自定义 Docker 镜像。输入命令: docker build -t wb-blog:v1.0 .


输入命令docker run -d --name blog-web --network blog-network -p 8080:80 wb-blog:v1.0,后台启动博客容器,命名 blog-web,接入 blog-network 网络,宿主机 8080 端口访问,使用 wb-blog:v1.0 镜像。
使用命令docker ps验证blog-mysql和blog-web容器状态是否为Up。

在浏览器网址栏中输入http://localhost:8080/即可打开。

选择语言,注册用户名密码安装wordpress后界面如下:

场景四:如何避免容器被删,数据直接清零
这种场景是新手朋友们很容器犯得错误,这会造成博客无法访问、重建容器后也会回到初始安装界面里面,而且所有的文章和配置数据也会全部丢失!
这是为什么呢?
因为容器的文件系统是"临时的",与容器生命周期强绑定。容器一旦被删除,其文件系统会被直接销毁,导致数据永久丢失。
所以我们必须及早预防。我们使用命令docker rm -f blog-mysql将刚才做的mysql容器删去。使用命令docker run -d --name blog-mysql -v blog-data:/var/lib/mysql --network blog-network -e MYSQL_ROOT_PASSWORD=wb123 -e MYSQL_DATABASE=wordpress mysql:5.7,通过挂载Docker数据卷 blog-data,可以持久化MySQL数据。

我们重新打开网址并注册安装登录。
现在我们试一下删了sql容器后文件系统中的数据还在不在。输入命令 docker run -d --name blog-mysql -v blog-data:/var/lib/mysql --network blog-network -e MYSQL_ROOT_PASSWORD=wb123 -e MYSQL_DATABASE=wordpress mysql:5.7
这样使用mysql:5.7镜像后台创建名为blog-mysql的容器,挂载持久化卷存放数据,并接入blog-network网络。重新刷新网站后发现网站可以正常打开,数据也没有丢失。


场景五:固化容器全部配置,简化多服务启停
docker run是学习工具,能够快速验证,但在实际生产过程中一直使用docker run跑命令效率太低,所以我们引进docker compose生产工具,这是部署多容器应用的行业标准。
以下是docker run和docker compose的对比表:

接下来我们试着搭一个compose,还是以博客网站为例吧!
我们先执行命令cd ..返回上一级目录,接着执行命令vim docker-compose.yml创建并编辑一个Docker compose的yaml文件。在这个配置文件中进行编辑所需内容。


编辑完成后我们执行命令docker compose up -d一键启动。

以下是docker的一些常用命令:
| 分类 | 命令 | 功能说明 |
|---|---|---|
| 基础查看 | docker -v | 查看 Docker 版本 |
| 基础查看 | docker images / docker image ls | 列出本地所有镜像 |
| 基础查看 | docker ps | 查看正在运行的容器 |
| 基础查看 | docker ps -a | 查看所有容器(运行 + 停止) |
| 基础查看 | docker network ls | 列出所有 Docker 网络 |
| 基础查看 | docker volume ls | 列出所有数据卷 |
| 镜像操作 | docker pull 镜像名:标签 | 拉取远程镜像 |
| 镜像操作 | docker build -t 镜像名:标签 . | 根据 Dockerfile 构建镜像 |
| 镜像操作 | docker rmi 镜像名/镜像ID | 删除镜像 |
| 镜像操作 | docker rmi -f 镜像名/镜像ID | 强制删除被容器占用的镜像 |
| 容器生命周期 | docker run [参数] 镜像名 | 创建并启动容器 |
| 容器生命周期 | docker start 容器ID/容器名 | 启动已有容器 |
| 容器生命周期 | docker stop 容器ID/容器名 | 优雅停止容器 |
| 容器生命周期 | docker restart 容器ID/容器名 | 重启容器 |
| 容器生命周期 | docker rm 容器ID/容器名 | 删除已停止容器 |
| 容器生命周期 | docker rm -f 容器ID/容器名 | 强制删除运行中的容器 |
| 容器生命周期 | docker exec -it 容器名 bash | 进入运行中容器终端 |
| 日志调试 | docker logs 容器名 | 查看容器历史日志 |
| 日志调试 | docker logs -f 容器名 | 实时持续监控容器日志 |
| 资源清理 | docker volume rm 卷名称 | 删除指定数据卷 |
| 资源清理 | docker network rm 网络名称 | 删除自定义网络 |
| 资源清理 | docker system prune | 清理停止容器、悬空镜像、无用网络 |
| 资源清理 | docker system prune -a | 清理所有未使用镜像(谨慎执行) |
| Compose 项目指令 | docker compose config | 校验 yaml 配置,输出完整解析内容 |
| Compose 项目指令 | docker compose up | 前台启动项目,打印完整过程日志 |
| Compose 项目指令 | docker compose up -d | 后台静默启动服务 |
| Compose 项目指令 | docker compose up -d --build | 后台启动,强制重新构建镜像 |
| Compose 项目指令 | docker compose down | 停止删除容器、网络,保留数据卷 |
| Compose 项目指令 | docker compose down -v | 删除容器、网络、数据卷(彻底重置环境) |
| Compose 项目指令 | docker compose logs -f | 实时查看整套项目所有服务日志 |
| Compose 项目指令 | docker compose restart 服务名 | 单独重启项目内某个服务 |
| 常用参数 | -d | 后台守护运行 |
| 常用参数 | -p 宿主机端口:容器端口 | 端口映射 |
| 常用参数 | -v | 挂载数据卷 |
| 常用参数 | -it | 开启交互式终端 |
| 常用参数 | --build | 启动前强制重新构建镜像 |
更多推荐

所有评论(0)