一、上期回顾

每天半小时,轻松学Docker第四篇:Docker 镜像管理


二、Docker核心概念

概念(英文) 核心作用 简单类比
Image(镜像) 存储应用及依赖的静态文件系统,构建后内容不变 虚拟机快照、类(面向对象)
Container(容器) 镜像运行后的实体,独立运行的进程,可创建 / 启停 / 删除 运行中的虚拟机、类的实例
Repository(仓库) 集中存储、分发镜像,按标签区分不同版本 代码仓库(如 Git)、软件仓库

二、容器运行核心要点

配置类别 核心作用 关键价值
开放端口 将容器内端口与宿主机端口绑定,转发外部访问请求到容器内部监听端口 实现容器外部可访问
环境变量 容器创建时动态配置变量,满足容器内程序运行需求 提升容器灵活性,适配多场景
存储绑定 关联宿主机存储 / 卷与容器,使容器数据写入宿主机存储(而非随容器删除消失) 实现数据持久化,避免数据丢失
重启策略 设定容器在宿主机 / Docker 引擎重启后的重启规则 保障容器运行稳定性

三、容器的创建与运行

1、从镜像创建容器

# 基本语法
docker create [选项] 镜像名 [命令] [参数]

root@debase:/home# docker create --name mariadb mariadb
600f9d4b969585aa6ccbae272c985268789ba43acc5b9d878db0daa202ee1fe7
root@debase:/home# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS    PORTS     NAMES
600f9d4b9695   mariadb   "docker-entrypoint.s…"   2 seconds ago   Created             mariadb

2、直接运行容器

# 运行并进入交互模式
docker run -it mariadb /bin/bash

# 后台运行容器
docker run -d --name mariadb  mariadb 

# 运行并映射端口
docker run -d \
  --name mariadb \
  -p 3306:3306 \
  -e MARIADB_ROOT_PASSWORD=123456 \
  mariadb
685b381ec7ab95b87f910cc8932839d2f9fdf74a4d2802c75b567308a7924acf
root@debase:/home# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   15 seconds ago   Up 15 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb

3、Docker run与Docker create核心区别

对比维度 docker run docker create
核心作用 创建并立即启动容器(一步完成 “创建 + 启动”) 仅创建容器(生成容器实例),不启动容器
容器状态 执行后容器处于 up(运行中)状态 执行后容器处于 created(已创建)状态
典型场景 需快速启动容器并使用服务(如启动数据库、Web 服务) 需先配置容器(如挂载额外存储、设置网络),再手动启动
后续操作 无需额外启动命令,可直接用 docker stop 停止 需配合 docker start <容器名/ID> 启动容器
命令示例 docker run --name my-nginx -p 80:80 nginx docker create --name my-nginx -p 80:80 nginx

4、容器创建 / 运行核心参数表

参数分类 参数格式 / 示例 核心作用
容器标识 --name <容器名> 为容器指定自定义名称(如 --name mariadb),避免随机生成名称,便于管理
端口映射 -p <主机端口>:<容器端口>-p 8080:80-p 8080-8090:80-90 将主机端口与容器端口绑定,实现外部访问容器服务;支持单端口或端口范围映射
数据卷挂载 -v <主机路径>:<容器路径>-v /data:/app/data--mount type=bind,source=/data,target=/app/data 关联主机目录 / 卷与容器目录,实现数据持久化(避免容器删除后数据丢失);--mount 格式更灵活,支持更多配置(如读写权限)
环境变量 -e <KEY>=<VALUE>-e MARIADB_ROOT_PASSWORD=123456-e DATABASE_URL="mysql://user:pass@db" 为容器设置环境变量,满足容器内程序运行需求(如数据库密码、配置路径)
网络配置 --network <网络模式>--network bridge(默认)--network host 指定容器使用的网络模式:- bridge:默认桥接网络(容器独立 IP)- host:使用主机网络(容器与主机共享网络栈)
重启策略 --restart <策略>--restart unless-stopped 设置容器重启规则(如 unless-stopped 表示除非手动停止,否则异常退出后重启)
用户配置 -u <用户ID/用户名>-u root 指定容器内执行命令的用户(避免默认使用 root,提升安全性)
日志配置 --log-driver <驱动>--log-driver json-file 指定容器日志的存储驱动,便于日志收集和管理(默认 json-file

四、容器的列表与日志查看

1、容器状态管理

1.1、查看容器列表

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看最近创建的容器
docker ps -l

# 查看容器大小信息
docker ps -s
root@debase:/home# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   15 seconds ago   Up 15 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb

# 格式化输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

1.2、容器状态监控

# 查看容器详细信息
docker inspect 容器名/容器ID

# 查看容器资源使用情况
docker stats

# 实时监控特定容器
docker stats mariadb

# 查看容器进程
docker top mariadb

2、容器日志查看与分析

2.1、基础日志操作

# 查看容器日志
docker logs mariadb

# 实时查看日志
docker logs -f mariadb

# 查看最近日志
docker logs --tail 100 mariadb

# 查看指定时间段的日志
docker logs --since 2024-01-01T00:00:00 mariadb

# 带时间戳的日志
docker logs -t mariadb

2.2、高级日志配置

# 使用自定义日志驱动
docker run --log-driver=json-file --log-opt max-size=100m --log-opt max-file=3

# 日志导出到文件
docker logs mariadb > container.log

# 过滤特定级别的日志
docker logs mariadb | grep "ERROR"

五、容器登录

1、交互式登录容器

1.1、进入运行中容器

# 使用exec进入容器
docker exec -it mariadb /bin/bash

root@debase:/home# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   21 minutes ago   Up 20 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb
root@debase:/home# docker exec -it mariadb  /bin/bash
root@685b381ec7ab:/# 

# 使用attach连接(不推荐,会看到所有输出)
docker attach mariadb 

# 以特定用户身份进入
docker exec -it --user root mariadb  /bin/bash

1.2、创建时配置登录环境

# 运行并立即进入
docker run -it --name newmariadb  mariadb  /bin/bash

root@debase:/home# docker run -it --name newmariadb mariadb /bin/bash
root@1af79f981417:/# exit
exit
root@debase:/home# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS                                       NAMES
1af79f981417   mariadb   "docker-entrypoint.s…"   11 seconds ago   Exited (0) 2 seconds ago                                               newmariadb
685b381ec7ab   mariadb   "docker-entrypoint.s…"   22 minutes ago   Up 22 minutes              0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb
root@debase:/home# 

# 设置工作目录
docker run -it -w /app ubuntu:latest /bin/bash

# 设置环境变量
docker run -it -e PS1="\u@\h:\w\\$ " ubuntu:latest /bin/bash

2、批量命令执行

2.1、在容器内执行命令

# 执行单次命令
docker exec mariadb ls -la /lib
root@debase:/home# docker exec mariadb ls -la /lib
lrwxrwxrwx 1 root root 7 Apr 22  2024 /lib -> usr/lib


# 执行复杂命令
docker exec mariadb  sh -c "cd /app && npm install"

# 拷贝文件到容器
docker cp test111111 mariadb:/home
root@debase:/home# touch test111111
root@debase:/home# docker cp test111111  mariadb:/home/ 
Successfully copied 1.54kB to mariadb:/home/
root@debase:/home# docker exec mariadb ls -la /home
total 8
drwxr-xr-x 1 root root 4096 Sep 30 08:42 .
drwxr-xr-x 1 root root 4096 Sep 30 08:42 ..
-rw-r--r-- 1 root root    0 Sep 30 08:42 test111111

# 从容器拷贝文件
docker cp mariadb:/home/test111111 ./

六、容器启动与重启策略

1、容器生命周期管理

1.1、启动与停止

# 启动容器
docker start mariadb

# 停止容器
docker stop mariadb

# 强制停止
docker kill mariadb

# 重启容器
docker restart mariadb
root@debase:/home/rz# docker restart mariadb
mariadb
root@debase:/home/rz# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   29 minutes ago   Up 2 seconds               0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb
root@debase:/home/rz# 

# 暂停与恢复
docker pause mariadb
root@debase:/home/rz# docker pause mariadb
mariadb
root@debase:/home/rz# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   28 minutes ago   Up 28 minutes (Paused)     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb

docker unpause mariadb
root@debase:/home/rz# docker unpause mariadb
mariadb
root@debase:/home/rz# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   29 minutes ago   Up 29 minutes              0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb

2、重启策略详解

2.1、配置重启策略

# 不自动重启(默认)
docker run --restart no

# 失败时重启
docker run --restart on-failure

# 失败时重启,最多重试5次
docker run --restart on-failure:5

# 总是重启(除非手动停止)
docker run --restart always

# 除非停止,否则总是重启
docker run --restart unless-stopped

2.2、实践示例

# 数据库容器:失败时自动重启
docker run -d \
  --name restart-mariadb \
  --restart on-failure:5 \
  -e MYSQL_ROOT_PASSWORD=secret \
  mariadb

# Web服务:总是重启
docker run -d \
  --name mariadb \
  --restart always \
  -p 80:80 \
  mariadb

七、容器数据备份与删除

1、数据备份策略

1.1、数据卷备份

docker run --rm \
  -v mariadb-data:/volume \  # 挂载MariaDB数据卷(mariadb-data)到临时容器的/volume
  -v $(pwd):/backup \        # 挂载当前目录到临时容器的/backup,用于输出备份文件
  alpine \                   # 使用轻量的alpine镜像执行备份命令
  tar czf /backup/mariadb-backup.tar.gz -C /volume ./  # 压缩数据卷内容到备份文件(命名为mariadb-backup.tar.gz)

docker run --rm \
  -v mariadb-data:/volume \  # 挂载要恢复的MariaDB数据卷到临时容器的/volume
  -v $(pwd):/backup \        # 挂载当前目录(含备份文件)到临时容器的/backup
  alpine \                   # 使用alpine镜像执行恢复命令
  sh -c "rm -rf /volume/* && tar xzf /backup/mariadb-backup.tar.gz -C /volume"  # 先清空数据卷旧内容,再解压恢复

1.2、容器数据导出

# 导出容器文件系统
docker export mariadb > container.tar
root@debase:/home/rz# docker export mariadb > mariadb.tar
root@debase:/home/rz# ll
total 324932
drwx------ 2 rz   rz        4096 Sep 30 16:54 ./
drwxr-xr-x 3 root root      4096 Sep 30 16:42 ../
-rw-r--r-- 1 root root 332698624 Sep 30 16:54 mariadb.tar

# 从导出的文件创建镜像
docker import container.tar my-image:backup
root@debase:/home/rz# docker import mariadb.tar import-mariadb
sha256:5205351161656ae1c5e64c7252b3542ec07bc34718324b35c491fb64c5ec963e
root@debase:/home/rz# docker images
REPOSITORY       TAG               IMAGE ID       CREATED         SIZE
import-mariadb   latest            520535116165   5 seconds ago   327MB

2、容器清理

2.1、安全删除容器

# 停止并删除容器
docker stop mariadb && docker rm mariadb 

# 强制删除运行中的容器
docker rm -f mariadb 

# 删除所有停止的容器
docker container prune
root@debase:/home/rz# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
282795d2fcec   mariadb   "docker-entrypoint.s…"   9 minutes ago    Exited (1) 9 minutes ago                                                restart-mariadb
1af79f981417   mariadb   "docker-entrypoint.s…"   19 minutes ago   Exited (0) 18 minutes ago                                               newmariadb
685b381ec7ab   mariadb   "docker-entrypoint.s…"   41 minutes ago   Up 12 minutes               0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb
root@debase:/home/rz# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
282795d2fcecfc054cdf7cfed0db3b0937637c86d976724ca51f2609b5658ba0
1af79f98141787ab114c0275042c414b31d15dea1a1453e4d465913a2d329317

Total reclaimed space: 5B
root@debase:/home/rz# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
685b381ec7ab   mariadb   "docker-entrypoint.s…"   42 minutes ago   Up 12 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb

# 删除指定条件的容器
docker rm $(docker ps -aq -f status=exited)

2.2、数据清理

# 删除容器但保留数据卷
docker rm mariadb 

# 删除容器及关联的数据卷
docker rm -v mariadb 

# 清理所有未使用的数据卷
docker volume prune

八、容器导出与镜像导入

1、容器导出

1.1、导出容器快照

# 导出容器为tar包
docker export -o my-container.tar mariadb

# 使用重定向导出
docker export mariadb > my-container.tar

# 导出特定路径
docker exec mariadb tar czf - /path/to/export > export.tar.gz

2、容器导入

# 导入tar包为镜像
docker import my-container.tar my-image:tag

# 从URL导入
docker import http://example.com/container.tar my-image:latest

# 带提交信息
cat my-container.tar | docker import - my-image:latest --message "导入备份"

九、容器的保存自定义镜像

1、使用commit保存更改

1.1、提交正在运行的容器为镜像

# 基本提交
docker commit mariadb mariadb-image:test

# 提交并添加元数据
docker commit \
  --author "开发者姓名" \
  --message "描述更改内容" \
  mariadb  \
  mariadb-image:test
root@debase:/home/rz# docker commit \
  --author "开发者姓名" \
  --message "描述更改内容" \
  mariadb  \
  mariadb-image:test
sha256:9bac35e304872e71d484c663bba9a6fb9cf4bbbe3e96323adba11bbb857bd207
root@debase:/home/rz# docker images
REPOSITORY       TAG               IMAGE ID       CREATED         SIZE
mariadb-image    test              9bac35e30487   5 seconds ago   330MB

# 示例
docker commit \
  --message "安装了Node.js和依赖包" \
  mariadb  \
  mariadb-image:test

1.2、最佳实践

不建议在运行中的容器进行commit,需要保证一致性,停止容器在保存

# 停止容器后再提交(保证一致性)
docker stop mariadb && docker commit mariadb mariadb-image:test && docker start mariadb

# 提交前清理临时文件
docker exec mariadb apt-get clean
docker exec mariadb rm -rf /tmp/*

2、镜像管理

# 给镜像打标签
docker tag 源镜像名:标签 新镜像名:新标签

# 推送到镜像仓库
docker push 用户名/镜像名:标签

# 保存镜像到文件
docker save -o my-images.tar 镜像名:标签 另一个镜像:标签

# 从文件加载镜像
docker load -i my-images.tar

十、总结与预告

核心技能 关键命令 主要用途
容器创建与运行 docker run -d -p 80:80 nginx
docker run -v /data:/app nginx
docker run -e KEY=value nginx
启动容器、端口映射、数据持久化、环境配置
状态监控 docker ps -a
docker logs -f 容器名
docker stats
查看容器状态、实时日志、资源使用情况
交互操作 docker exec -it 容器名 bash
docker exec 容器名 ls /app
docker cp 文件 容器名:/路径
进入容器、执行命令、文件拷贝
生命周期管理 docker start/stop/restart 容器名
docker run --restart always
docker pause 容器名
启动停止容器、配置重启策略、暂停恢复
数据管理 docker export 容器名 > backup.tar
docker rm -f 容器名
docker container prune
数据备份、删除容器、清理资源
镜像定制 docker commit 容器名 新镜像名:标签
docker tag 旧镜像 新镜像:标签
docker save 镜像名 > image.tar
保存容器为镜像、打标签、导出镜像

1、下节课程预告

每天半小时,轻松学Docker第六篇:Docker卷与绑定挂载

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐