Docker 命令
注 :Docker version 27.0.3, build 7d4bcd8 。
docker 基础命令
- run 从镜像创建并运行一个新容器
- exec 在运行中的容器中执行命令
- ps 列出容器
- build 根据 Dockerfile 构建镜像
- pull 从注册表下载镜像
- push 将镜像上传到注册表
- images 列出镜像
- login 登录注册表
- logout 从注册表登出
- search 在 Docker Hub 搜索镜像
- inspect 查看元数据
- version 显示 Docker 版本信息
- info 显示系统范围的信息
搜索,下载
```shell
docker search [镜像名称]
# 如果没有版本号则默认为最新版本
docker pull [镜像名称]:[版本号]
```
删除镜像
-
删除指定镜像
docker rmi -f [image id] [image id] ...
-
删除所有镜像
docker rmi -f $(docker image -aq)
删除容器
-
删除指定容器
docker rm -f containerid
1 -
删除未启动成功的容器
docker rm $(docker ps -a|grep Created|awk '{print $1}')
或者
docker rm $(docker ps -qf status=created) -
删除退出状态的容器'
docker rm $(docker ps -a|grep Exited|awk '{print $1}')
或者
docker rm $(docker ps -qf status=exited) -
删除所有
下载镜像
1.搜索镜像: docker search [镜像名称]
2.搜索镜像: docker pull [[name]]
启动与停止
停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)
镜像相关命令 images
命令 | 描述 |
---|---|
-a, --all | 显示所有镜像(默认隐藏中间镜像) |
--digests | 显示摘要 |
-f, --filter filter | 根据提供的过滤条件过滤输出 |
--format string | 使用自定义模板格式化输出: 'table':以表格格式打印输出,并带有列标题(默认) 'table TEMPLATE': 使用给定的 Go 模板以表格格式打印输出 'json': 以 JSON 格式打印 'TEMPLATE':使用给定的 Go 模板打印输出。 请参阅 格式说明 以获取有关使用模板格式化输出的更多信息 |
--no-trunc | 不要截断输出 |
-q, --quiet | 仅显示镜像 ID |
示例
```shell
# 查看当前所有镜像
# REPOSITORY:名称 TAG:版本 IMAGE ID:id CREATED:创建时间 size:大小
root@VM-24-3-debian:~# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
1panel/openresty 1.21.4.3-3-2-focal 1d98d81c0cd7 3 weeks ago 667MB
redis 7.2.5 aceb1262c1ea 6 weeks ago 117MB
redis latest aceb1262c1ea 6 weeks ago 117MB
wordpress 1 f69c279b5d7a 6 weeks ago 685MB
wordpress 6.5.3 c4d738408447 8 weeks ago 685MB
mysql 8.2.0 bc861cf238f2 6 months ago 619MB
# 查看当前所有镜像并json输出(内容多删减了部分)
root@VM-24-3-debian:~# docker images -a --format json
{"Containers":"N/A","CreatedAt":"2024-06-11 16:32:16 +0800 CST","CreatedSince":"3 weeks ago","Digest":"\u003cnone\u003e","ID":"1d98d81c0cd7","Repository":"1panel/openresty","SharedSize":"N/A","Size":"667MB","Tag":"1.21.4.3-3-2-focal","UniqueSize":"N/A","VirtualSize":"667.1MB"}
{"Containers":"N/A","CreatedAt":"2024-05-23 07:17:59 +0800 CST","CreatedSince":"6 weeks ago","Digest":"\u003cnone\u003e","ID":"aceb1262c1ea","Repository":"redis","SharedSize":"N/A","Size":"117MB","Tag":"7.2.5","UniqueSize":"N/A","VirtualSize":"116.5MB"}
```
容器相关命令 ps
命令 | 说明 |
---|---|
-a, --all | 显示所有容器(默认只显示运行中的) |
-f, --filter filter | 根据提供的过滤条件过滤输出 |
--format string | 使用自定义模板格式化输出: 'table': 以表格格式打印输出,并带有列标题(默认 'table TEMPLATE': 使用给定的 Go 模板以表格格式打印输出 'json': 以 JSON 格式打印 'TEMPLATE': 使用给定的 Go 模板打印输出。 请参阅 格式说明 以获取有关使用模板格式化输出的更多信息 |
-n, --last int | 显示最后创建的 n 个容器(包括所有状态)(默认 -1) |
-l, --latest | 显示最新创建的容器(包括所有状态) |
--no-trunc | 不要截断输出 |
-q, --quiet | 仅显示容器 ID |
-s, --size | 显示总文件大小 |
ps示例
``` shell
# CONTAINER ID:容器ID IMAGE:使用地镜像 COMMAND:命令 CREATED:创建时间 STATUS:容器状态 PORTS:端口映射 NAMES:容器名称
# 查看所有容器
root@VM-24-3-debian:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf734d3a166e redis:7.2.5 "docker-entrypoint.s…" 24 hours ago Exited redis_test1
923ad1b46db1 openresty:1.21.4. "/usr/local/openrest…" 8 days ago Up 8 days openresty
03f869dd03a0 wordpress:6.5.3 "docker-entrypoint.s…" 8 days ago Up 8 days 0.0.0.0:8080->80/tcp, :::8080->80/tcp wordpress
962a4fcd37a9 redis:7.2.5 "docker-entrypoint.s…" 2 weeks ago Up 8 days 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp dev-redis
# 查看最近创建的容器
root@VM-24-3-debian:~# docker ps -l
cf734d3a166e redis:7.2.5 "docker-entrypoint.s…" 24 hours ago Exited redis_test1
# 查看最近创建的容器并只显示id
root@VM-24-3-debian:~# docker ps -l -q
cf734d3a166e
# 查看最近创建的三个容器,并只显示id
root@VM-24-3-debian:~# docker ps -n3 -q
cf734d3a166e
923ad1b46db1
03f869dd03a0
```
创建容器相关命令run
选项 | 描述 |
---|---|
--add-host list | 添加自定义的主机到 IP 映射(host:ip) |
--annotation map | 向容器添加注释(传递到 OCI 运行时)(默认 map[]) |
-a, --attach list | 附加到 STDIN, STDOUT 或 STDERR |
--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) 1. 'host': 在 Docker 主机的 cgroup 命名空间中运行容器; 2. 'private': 在容器自己的私有 cgroup 命名空间中运行容器; 3. ''(空字符串):使用守护进程上通过 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 | 允许执行的 MEM(0-3, 0,1) |
-d, --detach | 在后台运行容器并打印容器 ID |
--detach-keys string | 覆盖分离容器的键序列 |
--device list | 向容器添加主机设备 |
--device-cgroup-rule list | 向 cgroup 允许的设备列表添加规则 |
--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-interval duration | 在开始期间运行检查的时间间隔((ms、s、m、h)(默认 0s) |
--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 | 即使没有附加也保持 STDIN 开放 |
--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 | 将容器的端口(s)发布到主机 |
-P, --publish-all | 将所有暴露的端口发布到随机端口 |
--pull string | 在运行前拉取镜像("always", "missing", "never")(默认 "missing") |
-q, --quiet | 抑制拉取输出 |
--read-only | 将容器的根文件系统以只读方式挂载 |
--restart string | 当容器退出时应用的重启策略(默认 "no") |
--rm | 当容器退出时自动删除容器及其关联的匿名卷 |
--runtime string | 为此容器使用的运行时 |
--security-opt list | 安全选项 |
--shm-size bytes | /dev/shm 的大小 |
--sig-proxy | 将接收到的信号代理到进程(默认 true) |
--stop-signal string | 停止容器的信号 |
--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 | 从指定的容器(s)挂载卷 |
-w, --workdir string | 容器内部的工作目录 |
run简单示例
```shell
# 1. 创建一个redis容器容器名称为redis_dev
# 2. 将容器端口6379映射到主机的6000
# 3. 将本地目录/var/docker/redis/redis_dev/conf/redis.conf 映射到容器/etc/redis/redis.conf 可读写
# 4. 将本地目录/var/docker/redis/redis_dev/data 映射容器 /data 只读
# 5. 后台运行
# 6. 并启动一下/bin/bash会话
docker run \
--name redis_dev \
-d -it \
-p 6000:6379 \
-v /var/docker/redis/redis_dev/conf/redis.conf:/etc/redis/redis.conf:rw \
-v /var/docker/redis/redis_dev/data:/data:ro \
redis \
/bin/bash
## 执行命令
root@jelly-linux:~# docker run \
> --name redis_dev \
> -d -it \
> -p 6000:6379 \
> -v /var/docker/redis/redis_dev/conf/redis.conf:/etc/redis/redis.conf:rw \
> -v /var/docker/redis/redis_dev/data:/data:ro \
> redis \
> /bin/bash
2b84c7eb465f48a2f023794cc7b9c20f5e6254068c0107a6b64675e2575f3cf5
root@jelly-linux:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b84c7eb465f redis "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 0.0.0.0:6000->6379/tcp, :::6000->6379/tcp redis_dev
```
日志相关命令
docker logs [选项] 容器
选项 | 描述 |
---|---|
--details | 显示日志提供的额外细节 |
-f , --follow | 持续跟踪日志输出 |
--since string | 显示从指定时间戳(例如 "2013-01-02T13:23:37Z")或相对时间(例如 "42m" 表示42分钟前)以来的日志 |
-n , --tail string | 从日志的末尾显示指定数量的行(默认 "all") |
-t , --timestamps | 显示时间戳 |
--until string | 显示指定时间戳(例如 "2013-01-02T13:23:37Z")或相对时间(例如 "42m" 表示42分钟前)之前的日志 |
查看容器内部进程 top
docker top 容器
查看元数据 inspect
docker inspect 容器
选项 | 描述 |
---|---|
-f , --format string | 使用自定义模板格式化输出:json : 以 JSON 格式打印TEMPLATE : 使用给定的 Go 模板打印输出。有关使用模板格式化输出的更多信息,请参考 Docker 官方文档 |
-s , --size | 如果类型是容器,则显示总文件大小 |
--type string | 返回指定类型的 JSON |
进入容器
- exce
- attach
-
方式一 exec
docker exec -it 容器 /bin/bash
- -it 交互模式
- /bin/bash shell选择
-
方式2 attach
docker attach 容器 /bin/bash
提交容器生成镜像commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项 | 描述 |
---|---|
-a , --author | 指定镜像作者,例如 "John Hannibal " |
-c , --change | 将 Dockerfile 指令应用于创建的镜像 |
-m , --message | 提交新镜像时使用的提交消息 |
-p , --pause | 提交镜像时暂停容器(默认为 true) |
``` shell
# 提交容器 c1c9a70d6fbb
root@jelly-linux:~# docker commit -a jelly -m "add webapps app" c1c9a70d6fbb tomcatjelly:1.0
sha256:8f61de40f960a2fcfde8628ab9d45de3df83591f1af8d09e7e57cc2f3215b398
root@jelly-linux:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcatjelly 1.0 8f61de40f960 33 seconds ago 455MB
```
docker 卷管理
docker volume COMMAND
COMMAND | 描述 | 使用 |
---|---|---|
create | 创建一个新的Docker卷。 | docker volume create [OPTIONS] [VOLUME] OPTIONS: 1. -d, --driver string:指定卷驱动程序名称(默认为“local”) 2. --label list:设置卷的元数据 3. -o, --opt map:设置驱动程序特定选项(默认映射[]) |
inspect | 查看卷的详细配置和状态。 | docker volume inspect [OPTIONS] VOLUME [VOLUME...] OPTIONS: 1. -f, --format string |
ls | 列出当前系统中的所有Docker卷。 | docker volume ls [OPTIONS] OPTIONS: 1. -f, --filter filter 2. --format string 3. -q, --quiet:只显示卷名 |
prune | 删除未使用的本地卷,释放空间。 | docker volume prune [OPTIONS] OPTIONS: 1. -a, --all:删除所有未使用的卷,而不仅仅是匿名卷 2. --filter filter:提供过滤器值(例如:”标签= <标记>”) 3. -f, --force:不提示确认 |
rm | 删除指定的Docker卷。 | docker volume rm [OPTIONS] VOLUME [VOLUME...] OPTIONS: 1. -f,——force强制删除一个或多个卷 |
volume示例
``` shell
# 创建redis_config卷
root@jelly-linux:~# docker volume create redis_config
\
#查看卷
root@jelly-linux:~# docker volume ls
DRIVER VOLUME NAME
local redis_config
#查看redis_config卷元数据
root@jelly-linux:~# docker volume inspect redis_config
[
{
"CreatedAt": "2024-07-05T13:56:58+08:00", # 创建时间
"Driver": "local", # 卷驱动程序名称
"Labels": null, #这个字段包含卷的标签。标签是键值对,用于提供元数据,帮助用户识别和组织卷
"Mountpoint": "/var/lib/docker/volumes/redis_config/_data", # 主机挂载点
"Name": "redis_config", #卷名称
"Options": null, #个字段包含了创建卷时指定的选项。这些选项可以是特定于驱动的配置参数。如果创建卷时没有指定任何选项,这个字段将是null
"Scope": "local" #这个字段表明卷的作用域。local表示卷仅在创建它的Docker主机上可用,不是跨主机共享的。
}
]
```
run -v对卷的影响
docker run 中-v控制项对卷的影响
-
指定宿主路径与容器路径
-v 宿主绝对路径:容器内部绝对路径
docker run -v /var/docker/tomcat:/usr/local/tomcat
这种挂载映射不会创建卷
-
具名挂载
-v 卷名:容器内路径
docker run -v redis_config:/usr/local/redis/conf
注:当指定的卷不存时会创建卷,如果存在则直接使用
-
匿名挂载
-v 容器内部路径
docker run -v /usr/local/redis/conf
注:这是会创建一个匿名挂载点
示例:
```shell #创建容器,并配置容器挂载/usr/local/redis/conf root@jelly-linux:~# docker run -it -d --name myredis -v /usr/local/redis/conf redis /bin/bash 1cde8e3586928a5ee2ef6524ade378415e3f1c48faff54a598b1a0abac9015da #查看容器元数据(只截取了部分) root@jelly-linux:~# docker inspect myredis ..... { "Type": "volume", "Name": "d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751",#卷名称 自动生成 "Source": "/var/lib/docker/volumes/d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751/_data", "Destination": "/usr/local/redis/conf", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ..... # 查看卷列表 root@jelly-linux:~# docker volume ls DRIVER VOLUME NAME local d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751 # 上面创建的匿名卷,VOLUME NAME为自动生成 # 查看卷元数据 root@jelly-linux:~# docker volume inspect d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751 [ { "CreatedAt": "2024-07-05T14:22:16+08:00", "Driver": "local", "Labels": { "com.docker.volume.anonymous": "" }, "Mountpoint": "/var/lib/docker/volumes/d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751/_data", "Name": "d494cd440eab5447ac3779cf08768e3a889c3dae38195f447003850f063f8751", "Options": null, "Scope": "local" } ] ```
docker run --volumes-from
挂载一个或多个其他容器的卷到当前容器中
``` shell
root@jelly-linux:~# docker run -it -d --name debian1 -v share:/share debian /bin/bash
2428a824dc2dfe858481a44da1f646ef24c511e745daba175e79872087036d3d
root@jelly-linux:~# docker inspect debian1
"Mounts": [
{
"Type": "volume",
"Name": "share",
"Source": "/var/lib/docker/volumes/share/_data",
"Destination": "/share",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
root@jelly-linux:~# docker run -it -d --name debian2 --volumes-from debian1 debian /bin/bash
6b447ba93ae183c3c79505d53f100d02ba0e0ffc0e16b9d2f2317a92c09fb0e1
# 可以看到他们都挂载了同样的卷
root@jelly-linux:~# docker inspect debian2
"Mounts": [
{
"Type": "volume",
"Name": "share",
"Source": "/var/lib/docker/volumes/share/_data",
"Destination": "/share",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
# 还可以添加权限
docker run --volumes-from SOURCE_CONTAINER:ro ...
```
使用场景
- 数据共享:如果你有一个包含数据库数据的容器,你可以使用 --volumes-from 将这些数据共享给其他需要访问数据库的应用容器。
- 持久化存储:对于需要持久化存储的应用,比如数据库或配置信息,使用 --volumes-from 可以避免数据在容器重启后丢失。
评论区