Docker容器操作详解:从启动到管理
4.1 容器核心概念
当执行 docker run 时,Docker 会按以下顺序查找镜像:先检查本地仓库,若存在则直接启动;若不存在,则连接镜像仓库搜索。如果镜像仓库中存在目标镜像,Docker 会下载并启动;若仓库中也不存在,则会抛出错误信息。
结合多架构镜像支持,完整的容器启动逻辑可以概括为:
本地查找 → 镜像仓库查找 → 根据系统架构选择合适的镜像版本 → 下载并运行。
4.2 创建并启动容器的两种模式
4.2.1 交互模式运行 Ubuntu
拉取镜像并启动一个终端会话:
docker pull ubuntu
docker run --name my-ubuntu -i -t ubuntu /bin/bash
参数说明:
- --name:为容器指定自定义命名
- -i -t(可合并为 -it):以交互模式运行并分配伪终端
- /bin/bash:容器启动后执行 bash 命令,进入终端界面
运行后,终端提示符变为 root@<容器ID>:/#,其中 <容器ID> 是系统生成的唯一标识。此时可在容器内执行 Linux 命令,但需要注意的是,该 Ubuntu 是精简版,部分常用工具可能缺失。
输入 exit 可退出容器,但容器会立即终止运行。
4.2.2 交互模式运行 Tomcat
使用 Tomcat 8.5.32 版本进行演示(此版本 webapps 目录未被修改):
docker run --name my-tomcat -it tomcat:8.5.32 /bin/bash
执行 ls -l 可查看 Tomcat 根目录结构。需要注意,通过 /bin/bash 进入时,Tomcat 服务并未启动。
要真正启动 Tomcat,需省略 /bin/bash 并指定端口映射:
docker run --name tomcat8081 -it -p 8081:8080 tomcat:8.5.32
-p 参数用于端口映射,格式为 宿主机端口:容器内端口。启动后,Tomcat 日志会持续输出到控制台,通过浏览器访问 主机IP:8081 即可验证服务运行。
4.2.3 分离模式运行 Tomcat
使用 -d 参数使容器在后台运行:
docker run --name my-tomcat03 -d -p 8083:8080 tomcat:8.5.32
执行后返回容器 ID,通过 docker ps 可查看正在运行的容器列表。支持同时启动多个 Tomcat 容器,并映射到不同的宿主机端口。
若使用大写 -P,系统会自动分配一个宿主机端口映射到容器内部端口:
docker run --name my-tomcat-auto -d -P tomcat:8.5.32
4.2.4 分离模式运行 Ubuntu 的问题
Ubuntu 容器以分离模式启动后会立即退出,因为容器没有运行需要持续等待的进程:
docker run -d ubuntu:latest
通过 docker ps -a 可看到该容器已处于 Exited 状态。
4.3 仅创建容器:docker create
docker create 用于创建容器但不启动,与 docker run 参数类似,但不支持 -d:
docker create --name my-tom -p 8084:8080 tomcat:8.5.32
4.4 退出交互模式容器的两种方式
4.4.1 退出并停止:exit
docker run --name my-ubuntu01 -it ubuntu:latest
在容器内执行 exit 后,容器会停止运行。
4.4.2 退出不停止:Ctrl + P + Q
先按下 Ctrl + P,再按 Q,可回到宿主机终端,同时容器保持运行状态。
4.5 容器状态查询命令
docker ps:列出所有运行中的容器docker ps -a:列出所有容器(包括已停止的)docker ps -q:仅输出容器 IDdocker ps -l:显示最近创建的容器docker ps -n 5:显示最近创建的 5 个容器
4.6 进入运行中的容器
4.6.1 exec:新建进程进入
docker exec -i -t my-tomcat /bin/bash
此命令会在容器内创建新进程,exit 仅结束该进程,不影响容器运行。
4.6.2 exec:不进入容器直接执行命令
docker exec -i -t my-tomcat ls -l
直接在外部查看容器内目录结构。
4.6.3 attach:附加到容器主进程
先以交互模式启动 Ubuntu 容器,按 Ctrl + P + Q 退出但不停止,再执行:
docker attach my-ubuntu
此时 exit 会直接停止容器,因为 attach 连接的是容器的主进程。
4.6.4 attach 查看 Tomcat 输出
docker attach my-tomcat
该命令会显示 Tomcat 的运行日志,按 Ctrl + C 结束 Tomcat 进程,容器也随之退出。
4.7 查看容器内进程:docker top
docker top my-tomcat
显示指定容器的进程详情,可通过 grep 过滤结果。
4.8 容器日志管理
4.8.1 查看全部日志
docker logs my-tomcat
4.8.2 查看最近 N 条日志
docker logs -n 5 my-tomcat
4.8.3 指定起始时间
docker logs --since="2024-07-08" --tail=3 my-tomcat
docker logs --since="50m" --tail=3 my-tomcat
4.8.4 指定截止时间
docker logs --until="2024-07-09" --tail=3 my-tomcat
docker logs --until=20m --tail=3 my-tomcat
4.8.5 显示时间戳
docker logs -t --tail=3 my-tomcat
4.8.6 实时追踪日志
docker logs -f --tail=3 my-tomcat
4.9 容器生命周期管理
docker start my-tomcat:启动已停止的容器docker restart my-tomcat:重启运行中的容器docker stop my-tomcat:优雅停止(等待当前请求处理完毕)docker kill my-tomcat:强制停止(立即终止)docker stop $(docker ps -qa):停止所有容器docker pause my-tomcat:暂停容器服务docker unpause my-tomcat:恢复容器服务
4.10 删除容器
docker rm ubuntu02:删除已停止的容器docker rm -f ubuntu01:强制删除运行中的容器docker rm -f $(docker ps -aq):删除所有容器
4.11 文件复制:docker cp
4.11.1 从容器复制到宿主机
docker cp my-tomcat:/usr/local/tomcat/export.tar /usr/local
4.11.2 从宿主机复制到容器
docker cp export.tar my-tomcat:/usr/local/tomcat
4.11.3 不支持容器间直接复制
docker cp my-tomcat01:/file my-tomcat02:/path # 无效操作
4.12 将容器提交为镜像
4.12.1 准备容器环境
docker pull centos:7
docker run --name centos-test -it centos:7
在容器内安装 net-tools 工具:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y net-tools
4.12.2 生成新镜像
docker commit -a "user <user@example.com>" -m "added net-tools" centos-test centos7:net-tools
4.12.3 使用新镜像
docker run --name my-centos -it centos7:net-tools
4.12.4 创建悬虚镜像
不指定 repository 和 tag 即可生成悬虚镜像:
docker commit centos-test
4.13 容器导入/导出
4.13.1 导出容器
docker export -o tomcat8.tar tomcat01
4.13.2 导入为镜像
docker import tomcat8.tar tomcat-custom:1.0
4.13.3 与 save/load 的对比
| 功能 | export/import | save/load |
|---|---|---|
| 作用对象 | 容器 | 镜像 |
| 历史记录 | 丢弃,仅保留当前快照 | 保留完整分层信息 |
| 批量操作 | 一次一个容器 | 一次多个镜像 |
| 导入后镜像 ID | 与原镜像不同 | 与原镜像相同 |
| 指定标签 | 可以指定 | 不可指定,沿用原镜像标签 |
4.13.4 与 docker commit 的对比
相同点:两者都能将容器转化为镜像。
区别:export/import 生成的镜像仅有一层,而 commit 生成的镜像包含原镜像的所有分层。
4.14 docker system 命令集
4.14.1 查看磁盘占用
docker system df
docker system df -v
4.14.2 查看事件记录
docker system events --since="2024-07-09"
4.14.3 查看系统详情
docker info
4.14.4 清理无用数据
docker system prune
该命令会删除已停止的容器、悬空镜像、无连接的网络和构建缓存。