Skip to content

1. privileged 参数

作用

  • 当容器以 --privileged 模式运行时,会获得宿主机的几乎所有内核权限(类似于宿主机的 root 权限)。
  • 容器可以访问宿主机的设备(如 /dev 下的设备),并能够执行一些需要高权限的操作(如修改内核参数、挂载文件系统等)。

使用场景

  • 需要容器直接操作宿主机硬件(如 GPU、USB 设备)。
  • 运行需要内核级功能的工具(如 systemdDocker-in-Docker)。
  • 调试容器内部问题(如使用 straceperf 工具)。

示例

bash
docker run --privileged -it ubuntu /bin/bash

注意事项

  • 安全风险:特权模式会破坏容器隔离性,可能被恶意程序利用。
  • 替代方案:尽量使用 --cap-add--device 参数授予最小必要权限(如 --cap-add SYS_ADMIN)。

2. restart 参数

作用

  • 控制容器在退出时的自动重启策略。
  • 支持多种策略,确保容器在意外终止或宿主机重启后恢复运行。

可选值

行为
no默认,不自动重启。
on-failure[:max-retries]仅在非零退出码时重启(可指定最大重试次数)。
always无论退出状态如何,始终重启(宿主机重启后也会启动)。
unless-stopped类似 always,但若容器被手动停止,则不会自动重启。

使用场景

  • 生产环境中确保服务高可用(如 Web 服务器、数据库)。
  • 宿主机重启后自动恢复容器。

示例

bash
docker run --restart=always nginx
docker run --restart=on-failure:5 redis

注意事项

  • alwaysunless-stopped 的区别:
    • always:即使容器被手动停止,宿主机重启后仍会启动。
    • unless-stopped:手动停止后,宿主机重启也不会启动。

3. network 参数

作用

  • 指定容器的网络模式,控制容器如何与宿主机、其他容器或外部网络通信。

常见模式

模式行为
bridge默认模式,容器连接到 Docker 的虚拟网桥(docker0),通过 NAT 与外部通信。
host容器共享宿主机的网络命名空间,直接使用宿主机 IP 和端口。
none禁用所有网络(仅保留回环接口 lo)。
container:<name>共享指定容器的网络命名空间。
自定义网络用户定义的桥接或覆盖网络,支持 DNS 自动发现和多容器通信。

使用场景

  • host:需要高性能网络(如负载均衡器)。
  • bridge:隔离容器网络,适用于大多数场景。
  • 自定义网络:多容器应用(如微服务)需要内部 DNS 通信。

示例

bash
# 使用宿主机网络
docker run --network=host nginx

# 创建自定义网络并连接容器
docker network create mynet
docker run --network=mynet --name app1 myapp
docker run --network=mynet --name app2 myapp

注意事项

  • host 模式会暴露容器端口到宿主机,可能引发端口冲突。
  • 自定义网络支持更灵活的服务发现(通过容器名通信)。

/src/technology/docker/docker%20run%E5%B8%B8%E7%94%A8%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html