玩转Docker三板斧:容器·镜像·编排——附迁移实战
2026/9/19 10:57:41 网站建设 项目流程

玩转Docker三板斧:容器·镜像·编排——附迁移实战

  • Docker容器生命周期
  • Docker常用命令
  • Docker容器与镜像关系
  • Docker Compose多容器编排
  • Dockerfile构建镜像
  • Docker镜像离线迁移

Docker容器生命周期

7 种标准状态:‌Created → Running/Paused → Exited → Removed‌(含过渡态 Restarting/Removing/Dead)。

Docker常用命令

查看版本:docker version
运行容器(退出删除):docker run --rm --network 网络名称 hello-world
运行容器(后台运行):docker run -d -p 宿主机端口号:容器端口号 --name 容器命名 镜像名称:标签
查看所有容器:docker ps -a --format ‘{{.Names}} {{.Status}} {{.Ports}}’
查看所有容器ID:docker ps -aq
查看容器实时状态:docker inspect -f ‘{{.NetworkSettings.Networks}}’ 容器名称/容器ID
停止指定容器:docker stop 容器名称/容器ID
删除运行中的容器:docker rm -f 容器名称/容器ID
删除已停止的所有容器:docker container prune -f
进入正在运行的容器内执行命令:docker exec -it 容器名称/容器ID 命令
查看容器日志:docker logs 容器名称/容器ID
查看容器写层:docker container diff 容器名称/容器ID
查看容器资源使用情况:docker stats
挂载数据目录:docker run --rm -v 宿主机路径:容器路径 镜像名称:标签
创建容器设置环境变量docker run -e 变量名=变量值 镜像名称:标签
查看所有数据目录:docker volume ls
查看所有网络:docker network ls
拉取镜像:docker pull 镜像名称:标签
查看镜像:docker images --format ‘{{.Repository}}’
查看镜像层的改动:docker history 镜像名称:标签/镜像ID
删除镜像:docker rmi 镜像名称:标签/镜像ID
当前路径构建镜像:docker build -t 镜像名称:标签 .

Docker容器与镜像关系

镜像是一个静态的只读模板,包含了运行应用程序所需的所有内容,如应用代码、运行时环境、系统工具及依赖库等。容器则是镜像的运行实例,它通过镜像启动后形成独立进程空间,并在镜像的基础上添加了可写层。镜像作为模板为容器提供运行所需的文件系统和配置,而容器则是镜像在运行时的具体表现。因此,容器和镜像的关系可以概括为:镜像是容器的模板,容器是镜像的运行实例。

Docker Compose多容器编排

将服务分别存放到不同容器中,要求容器启动有先后顺序,保证上游容器内的服务启动成功后再启动下游容器,才能实现跨容器进行服务调用,基于人工一个个容器启动效率低下的痛点,使用Docker Compose工具进行多容器高效编排。
常用命令
启动所有容器:docker-compose up -d
停用移除所有容器及网络相关:docker-compose down
列出项目中所有容器:docker-compose ps
查看所有容器日志:docker-compose logs
查看单个容器服务日志:docker-compose logs web

zabbix项目compose.yml示例如下:

version:'3.8'# name定义项目名称,容器创建的名称是项目名称-服务名-序号(1,2,3,4...),如果没定义name则项目名称取当前所在文件夹名称name:zbxservices:# MySQL 数据库服务名mysql-server:image:mysql:8.0# 可以自定义容器名称container_name:zabbix-mysql# 容器重启策略:no默认,不自动重启;# always 任何退出都重启;# unless-stopped 总是重启,除非手动停止;# on-failure 仅非正常退出(非0状态码)时重启restart:unless-stopped# 镜像拉取策略:always 每次启动都拉取;# never 仅使用本地镜像,不存在则报错;# if_not_present/missing 本地不存在时才拉取(默认);# build 先构建再拉取(需配合build配置)pull_policy:if_not_present# 容器内变量定义environment:-MYSQL_DATABASE=zabbix-MYSQL_USER=zabbix-MYSQL_PASSWORD=zabbix_pwd-MYSQL_ROOT_PASSWORD=root_pwd# 端口映射ports:-3306:3306# 数据卷映射volumes:-mysql-data:/var/lib/mysqlhealthcheck:# 健康检查命令test:["CMD","mysqladmin","ping","-h","localhost","-uroot","-proot_pwd"]# 健康检查间隔,单位h/m/sinterval:10s# 健康检查命令运行超时时间,超过时间视为失败timeout:5s# 连续失败达到设置次数后,容器状态视为unhealthyretries:5start_period:30s# 给该容器添加网络,如果没有添加,则会默认去创建一个以"项目名_default"命名的网络然后把该容器添加进去networks:-zabbix-net# 设置启动参数command:>--character-set-server=utf8 --collation-server=utf8_bin --default-authentication-plugin=mysql_native_password# Zabbix Serverzabbix-server:#配合image使用,启动容器检查本地是否存在image的镜像,如无该标签镜像则先进行构建,如果Dockerfile发生修改也会重新构建并用新镜像对标签进行覆盖#build:#context: ./app#dockerfile: Dockerfileimage:zabbix/zabbix-server-mysql:7.4-ubuntu-latestcontainer_name:zabbix-serverrestart:unless-stoppedpull_policy:if_not_presentenvironment:-DB_SERVER_HOST=mysql-server-MYSQL_DATABASE=zabbix-MYSQL_USER=zabbix-MYSQL_PASSWORD=zabbix_pwd-MYSQL_ROOT_PASSWORD=root_pwdports:-10051:10051# 该容器依赖mysql-server服务健康,等待其容器健康检查通过后再启动depends_on:mysql-server:condition:service_healthyhealthcheck:test:["CMD-SHELL","netstat -tln | grep 10051 || exit 1"]interval:30stimeout:10sretries:3start_period:60snetworks:-zabbix-net# Zabbix Web 界面 (Nginx + PHP)zabbix-web:image:zabbix/zabbix-web-nginx-mysql:7.4-ubuntu-latestcontainer_name:zabbix-webrestart:unless-stoppedpull_policy:if_not_presentenvironment:-ZBX_SERVER_HOST=zabbix-server-DB_SERVER_HOST=mysql-server-MYSQL_DATABASE=zabbix-MYSQL_USER=zabbix-MYSQL_PASSWORD=zabbix_pwd-MYSQL_ROOT_PASSWORD=root_pwd-PHP_TZ=Asia/Shanghaiports:-8080:8080-8443:8443depends_on:mysql-server:condition:service_healthy# 等待zabbix-server启动完再启动zabbix-server:condition:service_startedhealthcheck:test:["CMD","curl","-f","http://localhost:8080"]interval:30stimeout:5sretries:3start_period:60snetworks:-zabbix-net# 需要定义创建网络,给前面容器使用,网络名称是项目名称_网络服务名networks:# 网络服务名zabbix-net:driver:bridge# 需要定义创建数据卷,给前面容器使用volumes:# 后面值为空,是常见写法,使用默认配置mysql-data:

Dockerfile构建镜像

# 首行必须配置基础镜像,如果不打标签默认是latestFROM<image>:<tag># 指明镜像维护者及其联系方式,已废弃,一般使用LABEL代替MAINTAINER<name># LABEL为镜像添加元数据,用于描述镜像的作者、版本、用途、来源等信息。LABEL<key>=<value><key>=<value><key>=<value>...# ARG用于向构建过程传递参数,而不会在容器运行时自动保留,在使用 docker build 命令构建镜像时,使用 --build-arg 标志来为 ARG 变量赋值,当变量名和ENV设置的变量名一样时,ARG的只会被 ENV定义的值覆盖ARG<name>[=<default value>]# RUN用于在镜像容器中执行命令,可以有多RUN<command># EXPOSE用于暴露容器运行时的监听端口给外部,默认是TCP,指定udp需在端口号后加/udpEXPOSE804431112/udp# 指定容器的工作目录,相当于cd命令,可多个WORKDIR /path/to/workdir# 设置环境变量,可多个ENV<key>=<value># ADD将宿主机文件拷贝到镜像中,并自动解压tar压缩包,文件名可以正则模糊匹配ADD<src>...<dest># COPY类似ADD,但不会自动解压COPY<src>...<dest># VOLUME用于目录挂载VOLUME["/var/www","/var/log/apache2","/etc/apache2"]# ENTRYPOINT 用于定义容器启动时的固定入口程序。无论用户在 docker run 后面传什么,ENTRYPOINT 都会被执行,当使用 docker run 命令启动一个基于该镜像的容器时,Docker 守护进程会执行 ENTRYPOINT 所指定的命令。这个命令会成为容器的“主进程”(PID 1)ENTRYPOINT["executable","param1","param2"]# 指定容器启动时要运行的命令,指令需放在最后CMD["catalina.sh","run"]

构建镜像命令:docker build -t<image>:<tag>.
使用当前目录作为上下文,但使用其他位置的 Dockerfile:
docker build -t<image>:<tag>-f /path/to/Dockerfile .

Docker镜像离线迁移

镜像导出:docker save -o <输出文件>.tar <镜像名>:<标签>
镜像导入:docker load -i <输入文件>.tar

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询