Docker 是一款开源容器化引擎,核心作用是将应用代码、运行依赖、配置文件统一打包为镜像基于镜像可以启动容器,利用 Linux 内核 Namespace、Cgroups 实现进程、网络、资源的轻量隔离。 和传统虚拟机不同:容器不需要搭载独立操作系统内核,直接共享宿主机 Linux 内核,因此启动速度快、资源占用极低。

以下是Docker和传统虚拟机的对比表:

        Docker 实现了环境一致性:开发、测试、服务器、甲方环境完全统一,彻底解决 “本地能跑,其他机器报错” 的经典问题。 在 Windows 系统下,Docker Desktop 无法直接依托 Windows NT 内核运行,需要借助 WSL2 提供轻量化 Linux 内核作为底层支撑。

Docker 整体分为三大核心部件:

  1. Docker Client(客户端):你敲 docker rundocker compose 命令的交互入口;
  2. Docker Daemon(守护进程):后台服务,接收客户端指令,管理镜像、容器、网络、存储;
  3. 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.0docker 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启动前强制重新构建镜像

更多推荐