Docker 容器命令
- Docker 容器命令
- 1. 启动容器用法
- 2. 显示当前存在容器
- 3. 查看容器内的进程
- 4. 查看容器资源使用情况
- 5. 查看容器的详细信息
- 6. 删除容器
- 7. 容器的启动和停止
- 8. 给正在运行的容器发信号
- 9. 进入正在运行的容器
- 10. 暴露所有容器端口
- 11. 指定端口映射
- 12. 查看容器的日志
- 13. 传递运行命令
- 14. 容器内部的hosts文件
- 15. 指定容器DNS
- 16. 容器内和宿主机之间复制文件
- 17. 传递环境变量
- 18. 使用 systemd 控制容器运行
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(相对权重),范围为 10 到 1000,或 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 调整容器内存交换行为 (范围: 0 到 100) (默认值: -1)--mount mount 将文件系统挂载附加到容器--name string 为容器分配名称--network network 将容器连接到网络--network-alias list 为容器添加网络作用域别名--no-healthcheck 禁用容器指定的 HEALTHCHECK--oom-kill-disable 禁用 OOM Killer--oom-score-adj int 调整主机的 OOM 偏好 (范围: -1000 到 1000)--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