拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

玩转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}}’查看所有容器IDdocker 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 webzabbix项目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_DATABASEzabbix-MYSQL_USERzabbix-MYSQL_PASSWORDzabbix_pwd-MYSQL_ROOT_PASSWORDroot_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-serverutf8 --collation-serverutf8_bin --default-authentication-pluginmysql_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_HOSTmysql-server-MYSQL_DATABASEzabbix-MYSQL_USERzabbix-MYSQL_PASSWORDzabbix_pwd-MYSQL_ROOT_PASSWORDroot_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_HOSTzabbix-server-DB_SERVER_HOSTmysql-server-MYSQL_DATABASEzabbix-MYSQL_USERzabbix-MYSQL_PASSWORDzabbix_pwd-MYSQL_ROOT_PASSWORDroot_pwd-PHP_TZAsia/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构建镜像# 首行必须配置基础镜像如果不打标签默认是latestFROMimage:tag# 指明镜像维护者及其联系方式已废弃一般使用LABEL代替MAINTAINERname# LABEL为镜像添加元数据用于描述镜像的作者、版本、用途、来源等信息。LABELkeyvaluekeyvaluekeyvalue...# ARG用于向构建过程传递参数而不会在容器运行时自动保留在使用 docker build 命令构建镜像时使用 --build-arg 标志来为 ARG 变量赋值当变量名和ENV设置的变量名一样时ARG的只会被 ENV定义的值覆盖ARGname[default value]# RUN用于在镜像容器中执行命令可以有多RUNcommand# EXPOSE用于暴露容器运行时的监听端口给外部默认是TCP指定udp需在端口号后加/udpEXPOSE804431112/udp# 指定容器的工作目录相当于cd命令可多个WORKDIR /path/to/workdir# 设置环境变量可多个ENVkeyvalue# ADD将宿主机文件拷贝到镜像中并自动解压tar压缩包文件名可以正则模糊匹配ADDsrc...dest# COPY类似ADD但不会自动解压COPYsrc...dest# VOLUME用于目录挂载VOLUME[/var/www,/var/log/apache2,/etc/apache2]# ENTRYPOINT 用于定义容器启动时的固定入口程序。无论用户在 docker run 后面传什么ENTRYPOINT 都会被执行当使用 docker run 命令启动一个基于该镜像的容器时Docker 守护进程会执行 ENTRYPOINT 所指定的命令。这个命令会成为容器的“主进程”PID 1ENTRYPOINT[executable,param1,param2]# 指定容器启动时要运行的命令指令需放在最后CMD[catalina.sh,run]构建镜像命令docker build -timage:tag.使用当前目录作为上下文但使用其他位置的 Dockerfiledocker build -timage:tag-f /path/to/Dockerfile .Docker镜像离线迁移镜像导出docker save -o 输出文件.tar 镜像名:标签镜像导入docker load -i 输入文件.tar
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门