05.Docker 容器命令

发布于:2025-02-21 ⋅ 阅读:(22) ⋅ 点赞:(0)

Docker 容器命令

1. 启动容器用法

[root@Ubuntu2204 ~]#docker run --help

用法: docker run [选项] 镜像 [命令] [参数...]
	 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

选项:
      --add-host list                  添加自定义主机到 IP 的映射 (格式: host:ip)
  -a, --attach list                    连接到标准输入、输出或错误流
      --blkio-weight uint16            限制块设备 IO(相对权重),范围为 101000,或 0 表示禁用 (默认值: 0)
      --blkio-weight-device list       块设备 IO 权重(相对设备权重)(默认值: [])
      --cap-add list                   添加 Linux 能力
      --cap-drop list                  删除 Linux 能力
      --cgroup-parent string           容器的可选父 cgroup
      --cgroupns string                使用的 cgroup 命名空间 (host|private)
                                       'host':    在 Docker 主机的 cgroup 命名空间中运行容器
                                       'private': 在容器自己的私有 cgroup 命名空间中运行容器
                                       '':        使用守护程序通过 default-cgroupns-mode 配置的 cgroup 命名空间 (默认值)
      --cidfile string                 将容器 ID 写入文件
      --cpu-period int                 限制 CPU CFS(完全公平调度器)周期
      --cpu-quota int                  限制 CPU CFS(完全公平调度器)配额
      --cpu-rt-period int              限制 CPU 实时周期(微秒)
      --cpu-rt-runtime int             限制 CPU 实时运行时间(微秒)
  -c, --cpu-shares int                 CPU 共享(相对权重)
      --cpus decimal                   CPU 数量
      --cpuset-cpus string             允许执行的 CPU(格式: 0-3, 0,1)
      --cpuset-mems string             允许执行的内存节点(格式: 0-3, 0,1)
  -d, --detach                         在后台运行容器并打印容器 ID
      --detach-keys string             覆盖分离容器的键序列
      --device list                    将主机设备添加到容器
      --device-cgroup-rule list        向允许的设备列表中添加规则
      --device-read-bps list           限制从设备读取的速度(每秒字节数)(默认值: [])
      --device-read-iops list          限制从设备读取的速度(每秒 IO 次数)(默认值: [])
      --device-write-bps list          限制写入设备的速度(每秒字节数)(默认值: [])
      --device-write-iops list         限制写入设备的速度(每秒 IO 次数)(默认值: [])
      --disable-content-trust          跳过镜像验证 (默认值: true)
      --dns list                       设置自定义 DNS 服务器
      --dns-option list                设置 DNS 选项
      --dns-search list                设置自定义 DNS 搜索域
      --domainname string              容器 NIS 域名
      --entrypoint string              覆盖镜像的默认 ENTRYPOINT
  -e, --env list                       设置环境变量
      --env-file list                  从文件中读取环境变量
      --expose list                    暴露端口或端口范围
      --gpus gpu-request               添加到容器的 GPU 设备 ('all' 表示传递所有 GPU)
      --group-add list                 添加额外的组加入
      --health-cmd string              检查健康状态运行的命令
      --health-interval duration       运行检查的时间间隔 (ms|s|m|h) (默认值: 0s)
      --health-retries int             报告不健康所需的连续失败次数
      --health-start-period duration   容器初始化前的启动期,在此期间不会开始健康重试倒计时 (ms|s|m|h) (默认值: 0s)
      --health-timeout duration        允许单次检查运行的最大时间 (ms|s|m|h) (默认值: 0s)
      --help                           打印使用说明
  -h, --hostname string                容器主机名
      --init                           在容器内运行 init,转发信号并回收进程
  -i, --interactive                    即使未连接也保持标准输入打开
      --ip string                      IPv4 地址 (例如: 172.30.100.104)
      --ip6 string                     IPv6 地址 (例如: 2001:db8::33)
      --ipc string                     使用的 IPC 模式
      --isolation string               容器隔离技术
      --kernel-memory bytes            内核内存限制
  -l, --label list                     设置容器的元数据
      --label-file list                从换行分隔的文件中读取标签
      --link list                      添加链接到另一个容器
      --link-local-ip list             容器的 IPv4/IPv6 链接本地地址
      --log-driver string              容器的日志驱动
      --log-opt list                   日志驱动选项
      --mac-address string             容器的 MAC 地址 (例如: 92:d0:c6:0a:29:33)
  -m, --memory bytes                   内存限制
      --memory-reservation bytes       内存软限制
      --memory-swap bytes              交换限制等于内存加交换: '-1' 表示启用无限交换
      --memory-swappiness int          调整容器内存交换行为 (范围: 0100) (默认值: -1)
      --mount mount                    将文件系统挂载附加到容器
      --name string                    为容器分配名称
      --network network                将容器连接到网络
      --network-alias list             为容器添加网络作用域别名
      --no-healthcheck                 禁用容器指定的 HEALTHCHECK
      --oom-kill-disable               禁用 OOM Killer
      --oom-score-adj int              调整主机的 OOM 偏好 (范围: -10001000)
      --pid string                     使用的 PID 命名空间
      --pids-limit int                 调整容器的 PIDs 限制 (设置为 -1 表示不限制)
      --platform string                如果服务器支持多平台,则设置平台
      --privileged                     给予此容器扩展权限
  -p, --publish list                   将容器的端口发布到主机
  -P, --publish-all                    将所有暴露的端口发布到随机端口
      --pull string                    在运行前拉取镜像 ("always"|"missing"|"never") (默认值: "missing")
      --read-only                      以只读方式挂载容器的根文件系统
      --restart string                 容器退出时应用的重启策略 (默认值: "no")
      --rm                             容器退出时自动删除容器
      --runtime string                 此容器使用的运行时
      --security-opt list              安全选项
      --shm-size bytes                 /dev/shm 的大小
      --sig-proxy                      将接收到的信号代理给进程 (默认值: true)
      --stop-signal string             停止容器的信号 (默认值: "SIGTERM")
      --stop-timeout int               停止容器的超时时间(秒)
      --storage-opt list               容器存储驱动选项
      --sysctl map                     Sysctl 选项 (默认值: map[])
      --tmpfs list                     挂载 tmpfs 目录
  -t, --tty                            分配伪终端
      --ulimit ulimit                  Ulimit 选项 (默认值: [])
  -u, --user string                    用户名或 UID (格式: <name|uid>[:<group|gid>])
      --userns string                  使用的用户命名空间
      --uts string                     使用的 UTS 命名空间
  -v, --volume list                    绑定挂载卷
      --volume-driver string           容器的可选卷驱动
      --volumes-from list              从指定的容器挂载卷
  -w, --workdir string                 容器内的工作目录

注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止。

[root@Ubuntu2204 ~]#docker run hello-world

# 启动的容器在执行完 shell 命令就退出,用于测试
[root@Ubuntu2204 ~]#docker run alpine echo "HELLO"

# 指定容器名称
[root@Ubuntu2204 ~]#docker run --name web1 nginx

# 运行交互式容器并退出
[root@Ubuntu2204 ~]#docker run -it --name web2 nginx
root@35a32e21d4a3:/# exit
exit

注意:用 exit 退出后容器也停止,同时按三个键 ctrl+p+q 退出后容器不会停止。

# 一次性运行容器,退出后立即删除,用于测试
[root@Ubuntu2204 ~]#docker run --rm busybox ls /

# 开机自动运行容器
[root@Ubuntu2204 ~]#docker run -d --name nginx --restart=always nginx
[root@Ubuntu2204 ~]#reboot 

# 设置容器内的主机名
[root@Ubuntu2204 ~]#docker run -it --name b1 -h b1.com busybox
/ # hostname
b1.com

重启策略 --restart

策略 描述
no 不要自动重启容器。(默认)
on-failure[:max-retries] 如果容器由于错误而退出,请重新启动容器,该错误表现为非零退出代码。(可选)使用该选项限制 Docker 守护程序尝试重新启动容器的次数。该策略仅在容器退出失败时提示重启。如果守护程序重新启动,它不会重新启动容器。
always 如果容器停止,请始终重新启动容器。如果手动停止,则仅当 Docker 守护程序重新启动或手动重新启动容器本身时,才会重新启动。
unless-stopped 当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。

–privileged 选项

大约在 0.6 版,–privileged 选项被引入 docker。使用该参数,container 内的 root 拥有真正的 root 权限。 否则,container 内的 root只是外部的一个普通用户权限。privileged 启动的容器,可以看到很多 host 上的设备,并且可以执行 mount。甚至允许你在 docker 容器中启动 docker 容器。

什么是守护式容器: 能够长期运行 无需交互式会话 适合运行应用程序和服务

2. 显示当前存在容器

[root@Ubuntu2204 ~]#docker ps --help 

用法: docker ps [选项]

列出容器

选项:
  -a, --all             显示所有容器(默认仅显示正在运行的容器)
  -f, --filter 过滤器    根据提供的条件过滤输出
      --format 字符串    使用 Go 模板格式化容器输出
  -n, --last 整数        显示最后创建的 n 个容器(包括所有状态)(默认值: -1)
  -l, --latest          显示最新创建的容器(包括所有状态)
      --no-trunc        不截断输出
  -q, --quiet           仅显示容器 ID
  -s, --size            显示总文件大小
  
[root@Ubuntu2204 ~]#docker ps -a

3. 查看容器内的进程

[root@Ubuntu2204 ~]#docker top --help 

用法: docker top 容器 [ps 选项]

显示容器中运行的进程


[root@Ubuntu2204 ~]#docker run -it --name web1 nginx:stable-alpine3.20-perl
[root@Ubuntu2204 ~]#docker top web1

4. 查看容器资源使用情况

[root@Ubuntu2204 ~]#docker stats --help

用法: docker stats [选项] [容器...]

显示一个或多个容器资源使用情况的实时流

选项:
  -a, --all             显示所有容器(默认仅显示正在运行的容器)
      --format 字符串    使用 Go 模板格式化输出
      --no-stream       禁用实时统计信息流,仅拉取第一个结果
      --no-trunc        不截断输出
    
[root@Ubuntu2204 ~]#docker run -it --name web1 nginx:stable-alpine3.20-perl
[root@Ubuntu2204 ~]#docker stats web1

5. 查看容器的详细信息

docker inspect 可以查看 docker 各种对象的详细信息,包括:镜像,容器,网络等。

[root@Ubuntu2204 ~]#docker inspect --help 

用法: docker inspect [选项] 名称|ID [名称|ID...]

选项:
  -f, --format 字符串   使用给定的 Go 模板格式化输出
  -s, --size           如果类型为容器,则显示总文件大小
      --type 字符串     返回指定类型的 JSON 数据
      
[root@Ubuntu2204 ~]#docker inspect web1

6. 删除容器

docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉。

[root@Ubuntu2204 ~]#docker rm --help

用法: docker rm [选项] 容器 [容器...]

删除一个或多个容器

选项:
  -f, --force     强制删除正在运行的容器(使用 SIGKILL)
  -l, --link      删除指定的链接
  -v, --volumes   删除与容器关联的匿名卷

[root@Ubuntu2204 ~]#docker container prune --help

用法: docker container prune [选项]

删除所有已停止的容器

选项:
      --filter 过滤器   提供过滤值(例如 'until=<时间戳>')
  -f, --force           不提示确认,直接执行

# 删除所有容器
[root@Ubuntu2204 ~]#docker rm -f `docker ps -a -q`
[root@Ubuntu2204 ~]#docker ps -a -q | xargs docker rm -f

7. 容器的启动和停止

docker start|stop|restart|pause|unpause 名称|ID

# 批量正常启动或关闭所有容器
[root@Ubuntu2204 ~]#docker start $(docker ps -a -q)  
[root@Ubuntu2204 ~]#docker stop $(docker ps -a -q) 

8. 给正在运行的容器发信号

docker kill 可以给容器发信号,默认号 SIGKILL,即 9 信号。

[root@Ubuntu2204 ~]#docker kill --help

用法: docker kill [选项] 容器 [容器...]

终止一个或多个正在运行的容器

选项:
  -s, --signal 字符串   发送到容器的信号 (默认为 "KILL")

[root@Ubuntu2204 ~]#docker kill web1

9. 进入正在运行的容器

使用 exec 命令,在运行中的容器启动新进程,可以执行单次命令,以及进入容器 测试环境使用此方式,使用 exit 退出,但容器还在运行。

[root@Ubuntu2204 ~]#docker exec --help

用法: docker exec [选项] 容器 名称 [参数...]

在运行中的容器内执行命令

选项:
  -d, --detach               分离模式:在后台运行命令
      --detach-keys 字符串    覆盖分离容器的键序列
  -e, --env 列表              设置环境变量
      --env-file 列表         从文件中读取环境变量
  -i, --interactive          即使未连接也保持标准输入打开
      --privileged           给予命令扩展权限
  -t, --tty                  分配伪终端
  -u, --user 字符串           用户名或 UID(格式: <name|uid>[:<group|gid>])
  -w, --workdir 字符串        容器内的工作目录
  
#常见用法
docker exec -it 容器ID sh|bash

[root@Ubuntu2204 ~]#docker exec -it fcd4687e3ba6 bash
root@fcd4687e3ba6:/# exit
exit

10. 暴露所有容器端口

容器启动后,默认处于预定义的 NAT 网络中,所以外部网络的主机无法直接访问容器中网络服务 docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从 32768 开始使用随机端口时,当停止容器后再启动可能会导致端口发生变化。

-P , --publish-all=true | false 默认为false

# 映射容器所有暴露端口至随机本地端口
[root@Ubuntu2204 ~]#docker run -itd --name web3 -P  nginx:stable-alpine3.20-perl

# docker port 可以查看容器的端口映射关系
[root@Ubuntu2204 ~]#docker port web3

11. 指定端口映射

docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口

注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同

# 容器 80 端口映射到宿主机本地端口 81
[root@Ubuntu2204 ~]#docker run  -p 81:80 --name nginx nginx

# 修改已经创建的容器的端口映射关系
[root@Ubuntu2204 ~]#cat /var/lib/docker/containers/1e0f977af86bd0cf1f92e6c8b046b9fe146d731315ed1728a3929dbd43cbeb58/hostconfig.json 

PortBindings 后 80/tcp 对应的是容器内部的 80 端口,HostPort 对应的是映射到宿主机的端口 80 修改此处
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"80"}]},

12. 查看容器的日志

docker logs 可以查看容器中运行的进程在控制台输出的日志信息

[root@Ubuntu2204 ~]#docker logs --help 

用法: docker logs [选项] 容器

获取容器的日志

选项:
      --details        显示日志提供的额外详细信息
  -f, --follow         实时跟踪日志输出
      --since 字符串    显示自某个时间戳以来的日志(例如:2013-01-02T13:23:37Z 或相对时间如 42m 表示 42 分钟前)
  -n, --tail 字符串     从日志末尾显示的行数(默认值: "all")
  -t, --timestamps     显示时间戳
      --until 字符串    显示在某个时间戳之前的日志(例如:2013-01-02T13:23:37Z 或相对时间如 42m 表示 42 分钟前)

13. 传递运行命令

容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令

容器里的 PID 为 1 的守护进程的实现方式

  • 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
  • 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要 tail -f <服务访问日志> 会产生不必要的磁盘 IO
[root@Ubuntu2204 ~]#docker run -d alpine:3.21.2 tail -f /etc/hosts

14. 容器内部的hosts文件

容器会自动将容器的 ID 加入自已的 /etc/hosts 文件中,并解析成容器的 IP

# 修改容器的 hosts文件
[root@Ubuntu2204 ~]#docker run -it --rm --add-host www.aaa.com:8.8.8.8 busybox

15. 指定容器DNS

容器的 dns 服务器,默认采用宿主机的 dns 地址,可以用下面方式指定其它的 DNS 地址

  • 将 dns 地址配置在宿主机
  • 在容器启动时加选项 --dns=x.x.x.x
  • 在 /etc/docker/daemon.json 文件中指定

注意:–dns 指定优先级更高

# 在容器启动时加选项指定 DNS 地址(--dns 8.8.8.8)、指定域名(--dns-search aaa.com)
[root@Ubuntu2204 ~]#docker run -it --rm --dns 8.8.8.8 --dns-search aaa.com busybox:latest
/ # cat /etc/resolv.conf
search aaa.com
nameserver 8.8.8.8

# 在 /etc/docker/daemon.json 文件中指定
[root@Ubuntu2204 ~]#vim /etc/docker/daemon.json 
{
	"dns" : [  "114.114.114.114", "119.29.29.29"],
	"dns-search": [ "aaa.com", "bbb.org"]
}
[root@Ubuntu2204 ~]#systemctl restart docker

16. 容器内和宿主机之间复制文件

[root@Ubuntu2204 ~]#docker cp --help

用法: docker cp [选项] 容器:源路径 目标路径|-  
     docker cp [选项] 源路径|- 容器:目标路径

在容器和本地文件系统之间复制文件/文件夹  

使用 '-' 作为源,从标准输入读取 tar 归档文件,并将其解压到容器中的目录目标。  
使用 '-' 作为目标,将容器源的 tar 归档文件流输出到标准输出。

选项:
  -a, --archive       归档模式(复制所有 uid/gid 信息)  
  -L, --follow-link   始终在 SRC_PATH 中跟随符号链接  
 
# 复制容器的文件至宿主机
[root@ubuntu2204 ~]#docker cp  b1:/etc/hosts /root

# 宿主机文件复制到容器内
[root@ubuntu2204 ~]#docker cp /etc/hosts  b1:/root/

17. 传递环境变量

有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现

变量参考链接: https://hub.docker.com/_/mysql

[root@ubuntu2204 ~]#docker run --name mysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.30

18. 使用 systemd 控制容器运行