参考文献
容器生命周期管理
run
创建并启动新容器, 可选择启动参数
docker run (启动参数) 镜像名 [COMMAND] [ARG...]
核心运行模式
| 参数 | 含义 | 适用场景 |
|---|---|---|
-i |
保持标准输入(STDIN)打开 | 需要与容器进行交互输入 |
-t |
分配一个伪终端(TTY) | 需要终端界面(如进入 shell) |
-d |
后台运行(Detached mode), 返回容器 ID | 运行 Web 服务、数据库等长期驻留后台的服务 |
--rm |
容器退出后自动删除容器及其匿名卷 | 运行一次性任务、测试命令, 避免产生垃圾容器 |
💡 提示 -it 通常组合使用于前台交互(如 docker run -it ubuntu bash) -d 用于后台运行, 尽量避免 -itd 混用, 除非你明确需要在后台保留 TTY 分配
- 示例, 交互模式启动容器, 分配终端后台运行
docker run -itd --rm alpine
示例输出
0d0be4d9d8......
基础配置参数
--name为容器指定一个自定义名称(不指定则随机生成)
docker run -d --name my-nginx nginx
使用docker ps查看, 示例输出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c07bd71388a9 nginx "sh" 3 seconds ago Up 3 seconds my-nginx
-e/--env设置环境变量, 支持直接赋值或从文件读取
# 直接赋值
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
# 从文件读取 (新增)
docker run -d --env-file ./env.list my-app
--restart
设置容器重启策略
-restart=always 使得容器在退出时总是重启
--privileged
给予容器内进程几乎与宿主机root用户等同的权限
网络与端口映射
-p/--publish
将容器内部端口映射到宿主机端口, 允许外部网络访问容器内部
-p 主机端口:容器端口
示例, 将主机9999端口映射至容器80端口
docker run -itd -p 9999:80 nginx
--net/--network指定容器连接的网络(如 bridge, host, none 或自定义网络)
数据持久化(挂载)
-v(--volume)
挂载本地目录或卷到容器内, 指定路径不存在时docker会自动创建, 用于日常开发、简单的目录映射
-v 宿主机目录路径:容器目录路径:(可选挂载选项, ro为只读, 默认rw读写权限)
示例, 挂载本地code/到容器/master/code
docker run -it --rm -v ./code:/master/code busybox
--mount
挂载本地绝对路径目录到容器中, 需指定挂载类型(如 bind、volume、tmpfs), 不会自动创建不存在的宿主机目录, 用于生产环境、需要严格控制权限和类型的场景
--mount type=挂载类型,source=挂载源,target=容器内挂载路径,(options)
graph LR;
P(参数)
P-->Type(type)
Type-->Type1(bind 绑定挂载)
Type-->Type2(volume Docker卷)
Type--> Type3(tmpfs 临时文件系统)
P-->Source(source)
Source-->Source1(bind类型)-->Source11(宿主机目录路径)
Source-->Source2(volume类型)-->Source21(Docker卷名)
P-->Target(target)-->Target1(容器内挂载路径)
P-->Options(options)
Options-->Options1(readonly 只读)
Options-->Options2(consistency 一致性)
将本地${HOME}/code/挂载到容器/code下, 权限为只读
docker run -it --rm --mount type=bind,source="${HOME}/code/",target="/code/",readonly busybox
若在容器内删除/code, 则报错
rm: can't remove .... Read-only file system
资源限制 (新增补充)
--memory/-m
限制内存使用量(如 512m, 1g)
--cpus
限制 CPU 使用核数(如 1.5 表示 1.5 个核心)
docker run -d -m 512m --cpus 1.0 my-app
状态控制
start/stop/restart
启动、停止和重启容器
start
docker start 容器名/ID
stop
优雅停止容器(发送 SIGTERM, 超时后 SIGKILL)
docker stop 容器名/ID
kill
立即终止一或多个正在运行容器
docker kill 容器名/ID
pause/unpause
暂停和恢复容器中所有进程
rename
重命名容器
docker rename 原名称 新名称
删除与清理
rm
删除一或多个已经停止容器
正常删除
docker rm 容器名/ID
- 强制删除
docker rm -f 容器名/ID
批量删除
- 删除所有容器
docker rm $(docker ps -aq)
- 先停用删除
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
- 删除异常容器
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
日常操作与监控
ps
列出容器运行状态
docker ps (-a, 所有容器)
终端输出如下类似格式内容, 第一列哈希值表示容器ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cdec889bc9e busybox "sh" About a minute ago Up About a minute box
logs
查看日志, 排查容器问题的最重要命令
# 查看完整日志
docker logs my-nginx
# 实时追踪日志输出 (类似 tail -f)
docker logs -f my-nginx
# 查看最后 100 行日志, 并显示时间戳
docker logs --tail 100 -t my-nginx
exec
在正在运行的容器内执行命令, 强烈推荐使用 exec, 因为 exec 退出时不会导致容器停止
docker exec (参数) 镜名/ID 命令
graph LR;
P(参数)
P-->I("-i")-->I1(保持STDIN打开)
P-->T("-t")-->T1(分配一个伪终端)
P-->D("-d")-->D1(分离模式, 在后台运行)
在busybox创建容器中创建self_test/, 再使用ls -la查看
docker run -itd --name=box busybox
docker exec -it box mkdir self_test
docker exec -it box ls -la
宿主机终端类似有如下输出
total 52
drwxr-xr-x 1 root root 4096 Feb 5 01:25 .
drwxr-xr-x 1 root root 4096 Feb 5 01:25 ..
......
drwxr-xr-x 2 root root 4096 Feb 5 01:25 self_test
dr-xr-xr-x 13 root root 0 Feb 5 01:25 sys
......
进入容器
docker exec -it 容器名/ID shell解释器
执行多指令
docker exec (参数) 容器名/ID shell解释器 -c '命令1 && 命令2'
- 示例, ubuntu安装mysql-clinet
docker run -itd --name=ubuntu_test ubuntu:18.04
docker exec -it ubuntu_test bash -c 'apt-get update && apt-get install -y mysql-client'
inspect
获取docker对象(容器、镜像、卷、网络等)详细信息
IP地址
docker inspect 容器名/ID | grep IPAddress
获取容器ID
$(docker ps | grep "容器名" | awk '{print $1}')
# 或者
$(docker ps -aqf "name=容器名")
| 参数 | 说明 |
|---|---|
a |
即使容器没运行也能获取 |
q |
仅输出容器ID |
f |
filter |
export/import
打包容器
docker export 容器名/ID:tag 压缩包
加载容器
docker import 压缩包 容器名/ID:tag
文件系统
cp
用于宿主机与容器之间文件拷贝
宿主机拷贝到容器
docker cp 宿主机路径 容器名/ID:容器内路径
- 示例, 拷贝宿主机
test/到容器5d6根目录下
docker cp test/ 5d6:/
容器拷贝到宿主机
docker cp 容器名/ID:容器内路径 宿主机路径
- 示例, 拷贝容器5d6的
dev/到宿主机当前路径下
docker cp 5d6:/dev .
commit
将指定容器提交为镜像
docker commit -a (作者信息) -m (提交信息) 容器名/ID 目标镜像名:(tag)
- 示例, 将容器bdfb176f914a提交为镜像self_image:v0.1
docker commit bdfb176f914a self_image:v0.1
diff
显示docker容器文件系统变更
docker-compose 多容器编排
docker compose是一个工具, 用于定义和运行多容器docker应用程序
安装
下载对应docker-compose二进制文件, 移动到/usr/local/bin/
- 示例, 创建
docker-compose.yml
version: "3.8" # V2 中 version 字段已可选, 但保留以兼容旧习惯
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
restart: always
depends_on:
- app
app:
image: node:18-alpine
working_dir: /app
volumes:
- .:/app
command: sh -c "npm install && npm start"
environment:
- NODE_ENV=production
web服务使用nginx镜像, 映射主机80端口到容器80端口, 挂载本地nginx.conf到容器中配置目录
app服务使用node.js镜像, 设置工作目录/app, 挂载当前目录到容器中, 执行npm start
app服务依赖于web服务启动
命令
启动应用程序
在docker-compose.yml文件当前目录执行
docker-compose up -d
以后台模式启动所有服务
查看服务状态
docker-compose ps
停止服务
docker-compose stop
重启服务
docker-compose restart
构建
使用自定义Dockerfile构建镜像
docker-compose build
删除应用程序
docker-compose rm
查看日志
docker-compose logs
服务执行命令
docker-compose exec 服务名称 命令
删除
停止移除所有容器、网络和卷
docker-compose down