Docker 容器使用指南:详细指令集,快速了解容器创建步骤
本文档详细介绍了 Docker 容器的完整使用方法和常用命令,主要内容包括:容器基础概念(镜像与容器的关系)、生命周期管理(创建/启动/停止/删除)、运行参数配置(端口映射/环境变量等)、常用操作命令(进入容器/查看日志/文件复制)、与宿主机的交互(网络/数据卷)、资源限制以及多容器编排(Docker Compose)。文档还提供了 ROS2 Humble Desktop 容器的完整搭建示例,涵盖
·
本文档介绍 Docker 容器的完整使用方法和常用命令。
目录
1. 容器基础概念
容器 是镜像的运行实例。可以类比:
- 镜像 = 类(Class)
- 容器 = 实例(Instance)
一个镜像可以创建多个容器,每个容器相互隔离、互不影响。
2. 容器生命周期管理
创建并启动容器
# 前台运行(会占用终端)
docker run <镜像名>
# 后台运行(-d 参数)
docker run -d <镜像名>
# 指定容器名称
docker run -d --name mycontainer <镜像名>
查看容器状态
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 只显示容器 ID
docker ps -q
# 查看容器详细信息
docker inspect <容器名或ID>
启动 / 停止 / 重启容器
docker start <容器名或ID> # 启动已停止的容器
docker stop <容器名或ID> # 优雅停止
docker kill <容器名或ID> # 强制终止
docker restart <容器名或ID> # 重启
docker pause <容器名或ID> # 暂停(冻结进程)
docker unpause <容器名或ID> # 恢复
删除容器
docker rm <容器名或ID> # 删除已停止的容器
docker rm -f <容器名或ID> # 强制删除(包括运行中的)
docker container prune # 删除所有已停止的容器
3. 运行容器
基本运行参数
| 参数 | 说明 |
|---|---|
-d |
后台运行(detached) |
-it |
交互式 + 分配伪终端(常用 together) |
-p / --publish |
端口映射:宿主机:容器 |
-P |
随机映射容器内所有 EXPOSE 端口 |
-e |
设置环境变量 |
--name |
指定容器名称 |
--rm |
退出后自动删除容器 |
示例
# 运行 Nginx,映射 80 端口,后台运行
docker run -d -p 8080:80 --name web nginx
# 交互式运行(进入容器 bash)
docker run -it ubuntu /bin/bash
# 执行单次命令后退出
docker run --rm ubuntu echo "Hello Docker"
# 带环境变量运行
docker run -d -e MYSQL_ROOT_PASSWORD=mypass mysql
指定启动命令
# 覆盖镜像默认的 CMD
docker run ubuntu cat /etc/os-release
# 使用 entrypoint
docker run --entrypoint /bin/sh nginx
4. 容器操作命令
进入运行中的容器
# 使用 exec(推荐)
docker exec -it <容器名或ID> /bin/bash
docker exec -it <容器名或ID> /bin/sh
# 使用 attach(会看到主进程输出,Ctrl+P+Q 退出而不停止容器)
docker attach <容器名或ID>
查看日志
docker logs <容器名或ID> # 查看全部日志
docker logs -f <容器名或ID> # 实时跟踪(类似 tail -f)
docker logs --tail 100 <容器名或ID> # 只看最后 100 行
docker logs -t <容器名或ID> # 显示时间戳
查看进程和资源
docker top <容器名或ID> # 查看容器内进程
docker stats <容器名或ID> # 实时 CPU/内存 等资源使用
复制文件
# 从容器复制到宿主机
docker cp <容器名或ID>:/path/in/container /local/path
# 从宿主机复制到容器
docker cp /local/path <容器名或ID>:/path/in/container
5. 容器与宿主机交互
端口映射
# 单端口
docker run -p 8080:80 nginx
# 指定宿主机 IP
docker run -p 127.0.0.1:8080:80 nginx
# 多端口
docker run -p 8080:80 -p 443:443 nginx
挂载卷(Volume / Bind Mount)
# 命名卷(由 Docker 管理)
docker run -v mydata:/app/data nginx
# 绑定挂载(指定宿主机路径)
docker run -v /host/path:/container/path nginx
# 只读挂载
docker run -v /host/path:/container/path:ro nginx
6. 容器网络
网络模式
| 模式 | 说明 |
|---|---|
bridge |
默认,容器通过虚拟网桥通信 |
host |
使用宿主机网络栈 |
none |
无网络 |
container:<name> |
与指定容器共享网络 |
常用网络命令
docker network ls # 列出网络
docker network inspect bridge # 查看网络详情
docker run --network host nginx # 使用 host 网络
docker network connect mynet <容器> # 将容器加入网络
docker network disconnect mynet <容器>
创建自定义网络
docker network create -d bridge mynet
docker run -d --name web1 --network mynet nginx
docker run -d --name web2 --network mynet nginx
# web1 和 web2 可通过容器名相互访问
7. 容器数据持久化—创建新容器时指定(唯一有效方式)
Volume(推荐)
# 创建卷
docker volume create myvol
# 使用卷
docker run -v myvol:/data nginx
# 查看卷
docker volume ls
docker volume inspect myvol
Bind Mount(绑定挂载)
# 宿主机路径:容器路径
docker run -v C:\Users\Cheng\data:/app/data nginx
tmpfs 挂载(内存)
docker run --tmpfs /app/cache:rw,size=100m nginx
8. 容器资源限制
# 限制内存
docker run -m 512m nginx
# 限制 CPU(相对权重)
docker run --cpus="0.5" nginx
# 限制 CPU 核数
docker run --cpuset-cpus="0-1" nginx
# 组合
docker run -m 1g --cpus="1.0" --name limited nginx
9. 多容器编排
Docker Compose(推荐)
# docker-compose.yml 示例
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: secret
docker compose up -d # 启动
docker compose down # 停止并删除
docker compose ps # 查看状态
10. 最佳实践
- 一个容器一个进程:便于扩展和管理
- 使用非 root 用户:提高安全性
- 利用
--rm:临时测试时自动清理 - 优先使用
exec进入容器:不干扰主进程 - 数据持久化用 Volume:避免数据随容器删除丢失
- 合理设置资源限制:防止单容器占满宿主机
- 使用
.dockerignore:减小镜像体积
11. 完整示例:ROS2 Humble Desktop 容器
本示例用于搭建带图形界面的 ROS2 开发环境,让容器能访问宿主机上的显示、硬件和资源。仅适用于 Linux 宿主机(依赖 X11、/dev 等)。
脚本代码
#!/bin/bash
xhost +local:root 2>/dev/null
docker run -it --rm \
--name ros2-humble \
--hostname $(hostname) \
--user root \
--workdir /home/ros/workspace \
--privileged \
--network host \
--ipc host \
--pid host \
--uts host \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-e QT_QPA_PLATFORM=xcb \
-e LIBGL_ALWAYS_SOFTWARE=0 \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e ROS_DOMAIN_ID=0 \
-e RMW_IMPLEMENTATION=rmw_fastrtps_cpp \
-e TZ=$(cat /etc/timezone) \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v $HOME/.Xauthority:/root/.Xauthority:rw \
-v $HOME/workspace:/home/ros/workspace:rw \
-v $HOME/.bashrc:/root/.bashrc:ro \
-v $HOME/.bash_history:/root/.bash_history:rw \
-v /dev:/dev:rw \
-v /sys:/sys:ro \
-v /proc:/proc:ro \
-v /run:/run:rw \
-v /tmp:/tmp:rw \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/machine-id:/etc/machine-id:ro \
-v /var/run/dbus:/var/run/dbus:rw \
-v $HOME/.gitconfig:/root/.gitconfig:ro \
-v $HOME/.ssh:/root/.ssh:ro \
-v $HOME/.vscode-server:/root/.vscode-server:rw \
--device=/dev/dri:/dev/dri:rw \
--device=/dev/snd:/dev/snd:rw \
--device=/dev/input:/dev/input:rw \
--device=/dev/bus/usb:/dev/bus/usb:rw \
--device=/dev/ttyUSB0:/dev/ttyUSB0:rw \
--device=/dev/ttyACM0:/dev/ttyACM0:rw \
--group-add audio \
--group-add video \
--group-add dialout \
--group-add plugdev \
--group-add netdev \
--ulimit core=-1 \
--ulimit nofile=1024:524288 \
--ulimit memlock=-1 \
--ulimit stack=-1 \
--ulimit nproc=65535 \
--cap-add=SYS_PTRACE \
--cap-add=SYS_ADMIN \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--security-opt seccomp=unconfined \
--health-cmd="ros2 topic list || exit 1" \
--health-interval=30s \
--health-timeout=10s \
--health-retries=3 \
osrf/ros:humble-desktop-full \
bash -c "source /opt/ros/humble/setup.bash && exec bash"
xhost -local:root 2>/dev/null
参数说明
| 分类 | 参数 | 作用 |
|---|---|---|
| 基础 | --hostname $(hostname) |
与宿主机同名,便于网络与主机名识别 |
--user root |
以 root 运行,便于访问硬件和系统资源 | |
--workdir /home/ros/workspace |
工作目录 | |
| 资源隔离 | --privileged |
关闭大部分安全隔离,可访问所有设备 |
--network host |
使用宿主机网络,ROS2 多机通信更方便 | |
--ipc host |
共享 IPC 命名空间,支持共享内存 | |
--pid host |
共享 PID 命名空间,可看到宿主机进程 | |
--uts host |
共享主机名与域名 | |
| 图形显示 | -e DISPLAY=$DISPLAY |
X11 显示地址 |
-e QT_X11_NO_MITSHM=1 |
避免 Qt 与 X11 共享内存冲突 | |
-e QT_QPA_PLATFORM=xcb |
Qt 使用 XCB 平台插件 | |
-v /tmp/.X11-unix |
挂载 X11 socket,用于显示输出 | |
-v $HOME/.Xauthority |
X11 认证 | |
| NVIDIA | NVIDIA_VISIBLE_DEVICES=all |
暴露全部 GPU |
NVIDIA_DRIVER_CAPABILITIES=all |
使用图形与计算等全部能力 | |
| ROS2 | ROS_DOMAIN_ID=0 |
默认 DDS 域 ID |
RMW_IMPLEMENTATION=rmw_fastrtps_cpp |
使用 Fast DDS 作为 RMW | |
| 时区/语言 | TZ, LANG, LC_ALL |
与宿主机保持一致 |
| 工作目录 | $HOME/workspace |
宿主机工程目录挂载到容器,便于开发 |
.bashrc, .bash_history |
沿用宿主机的 Shell 配置和命令历史 | |
| 硬件设备 | /dev, /sys, /proc |
访问设备与系统信息 |
--device=/dev/dri |
GPU 显示输出 | |
--device=/dev/snd |
声卡 | |
--device=/dev/input |
键盘、鼠标等输入设备 | |
--device=/dev/bus/usb |
USB 设备 | |
--device=/dev/ttyUSB0, /dev/ttyACM0 |
串口、Arduino 等 | |
| 系统配置 | /etc/localtime, /etc/timezone |
时区同步 |
/etc/machine-id, /var/run/dbus |
D-Bus 等系统服务 | |
| 用户配置 | .gitconfig, .ssh |
Git 配置与 SSH 密钥 |
.vscode-server |
VS Code Remote 在容器内使用 | |
| 权限组 | audio, video, dialout, plugdev, netdev |
访问音频、视频、串口、USB、网络等 |
| ulimit | core=-1, nofile=1024:524288 等 |
放宽资源限制,适应调试和 ROS2 需求 |
| cap-add | SYS_PTRACE, SYS_ADMIN 等 |
调试、网络配置、资源管理等能力 |
seccomp=unconfined |
关闭 seccomp 过滤 | |
| 健康检查 | --health-cmd, --health-interval 等 |
定期执行 ros2 topic list 检查 ROS2 是否可用 |
| xhost | xhost +local:root / -local:root |
允许/收回容器内 root 使用本地 X Server |
使用前注意
- 运行前需执行
xhost +local:root,使本地 root 可连接 X Server。脚本已包含该命令,若手动执行docker run,需自行先运行。 - 确保宿主机已安装并运行 X11。若使用 Wayland,可能需要配置 XWayland。
--privileged与seccomp=unconfined会减弱隔离,仅在可信环境或开发场景使用。- 若没有串口或 USB 设备,
/dev/ttyUSB0、/dev/ttyACM0等挂载可能报错,可按需注释或移除。
常用命令速查
| 操作 | 命令 |
|---|---|
| 运行 | docker run -d -p 端口:端口 --name 名称 镜像 |
| 查看 | docker ps / docker ps -a |
| 进入 | docker exec -it 容器 /bin/bash |
| 日志 | docker logs -f 容器 |
| 停止 | docker stop 容器 |
| 删除 | docker rm -f 容器 |
文档基于 Docker 官方文档和常见实践整理,适用于 Docker Desktop 及 Linux 环境。
更多推荐
所有评论(0)