本文档介绍 Docker 容器的完整使用方法和常用命令。


目录

  1. 容器基础概念
  2. 容器生命周期管理
  3. 运行容器
  4. 容器操作命令
  5. 容器与宿主机交互
  6. 容器网络
  7. 容器数据持久化
  8. 容器资源限制
  9. 多容器编排
  10. 最佳实践
  11. 完整示例:ROS2 Humble Desktop 容器

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. 最佳实践

  1. 一个容器一个进程:便于扩展和管理
  2. 使用非 root 用户:提高安全性
  3. 利用 --rm:临时测试时自动清理
  4. 优先使用 exec 进入容器:不干扰主进程
  5. 数据持久化用 Volume:避免数据随容器删除丢失
  6. 合理设置资源限制:防止单容器占满宿主机
  7. 使用 .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。
  • --privilegedseccomp=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 环境。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐