
一、上期回顾
二、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卷与绑定挂载
所有评论(0)