侧边栏壁纸
博主头像
爱探索

行动起来,活在当下

  • 累计撰写 43 篇文章
  • 累计创建 12 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Docker 命令

jelly
2024-07-05 / 0 评论 / 0 点赞 / 73 阅读 / 0 字

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 [镜像名称]:[版本号]

```

删除镜像

  1. 删除指定镜像

    docker rmi -f [image id] [image id] ...

  2. 删除所有镜像

    docker rmi -f $(docker image -aq)

删除容器

  1. 删除指定容器

    docker rm -f containerid
    1

  2. 删除未启动成功的容器

    docker rm $(docker ps -a|grep Created|awk '{print $1}')
    或者
    docker rm $(docker ps -qf status=created)

  3. 删除退出状态的容器'

    docker rm $(docker ps -a|grep Exited|awk '{print $1}')
    或者
    docker rm $(docker ps -qf status=exited)

  4. 删除所有

下载镜像

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 intCPU 份额(相对权重)
--cpus decimalCPU 数量
--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 stringIPv4 地址(例如,172.30.100.104)
--ip6 stringIPv6 地址(例如,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 mapSysctl 选项(默认 map[])
--tmpfs list挂载一个 tmpfs 目录
-t, --tty分配一个伪终端
--ulimit ulimitUlimit 选项(默认 [])
-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
  1. 方式一 exec

    docker exec -it 容器 /bin/bash

    • -it 交互模式
    • /bin/bash shell选择
  2. 方式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控制项对卷的影响

  1. 指定宿主路径与容器路径

    -v 宿主绝对路径:容器内部绝对路径

    docker run -v /var/docker/tomcat:/usr/local/tomcat

    这种挂载映射不会创建卷

  2. 具名挂载

    -v 卷名:容器内路径

    docker run -v redis_config:/usr/local/redis/conf

    注:当指定的卷不存时会创建卷,如果存在则直接使用

  3. 匿名挂载

    -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 可以避免数据在容器重启后丢失。
0

评论区