Docker 命令_各种参数简介(run、v、rm、-w、-u、-e)

======

■前言

DevOps 使用到的工具・术语_sun0322-CSDN 博客

 

■快速入门

Docker 快速入门_w 无问西东 - CSDN 博客

docker -v 挂载问题:_hnmpf 的博客 - CSDN 博客_docker-v

Docker 入门,看这一篇就够了 - 简书

 

■帮助文档

Docker run reference | Docker Documentation

 

■介绍

1.run 的各种参数

Docker 基础 - W-D - 博客园

 
  1. docker run [OPTIONS] IMAGE [COMMOND] [ARGS...]
  2.  
  3. # OPTIONS 说明
  4. --name="容器新名字": 为容器指定一个名称;
  5. -d: 后台运行容器,并返回容器ID,也即启动守护式容器;
  6. -i:以交互模式运行容器,通常与 -t 同时使用;
  7. -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  8. -P: 随机端口映射;
  9. -p: 指定端口映射,有以下四种格式
  10. ip:hostPort:containerPort
  11. ip::containerPort
  12. hostPort:containerPort
  13. containerPort
  14. -w: 指定命令执行时,所在的路径
  15.  
  16.  
  17. # IMAGE
  18. XXX_IMAGE_NAME:XXX_IMAGE_VER
  19.  
  20.  
  21. # COMAND
  22. 例:mvn -Duser.home=xxx -B clean package -Dmaven.test.skip=true
  23.  
 

---

 
  1. 常用OPTIONS补足:
  2. --name:容器名字
  3. --network:指定网络
  4. --rm:容器停止自动删除容器
  5.  
  6. -i--interactive,交互式启动
  7. -t:--tty,分配终端
  8. -v:--volume,挂在数据卷
  9. -d:--detach,后台运行
  10.  
 

--- (-w 在 run 中,貌似也可直接使用)

 
  1. 在已运行的容器中运行命令
  2. docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
  3. 常用选项:
  4. -d:--detach ,后台运行命令
  5. -e, --env list 设置env
  6. -i, --interactive 启用交互式
  7. -t, --tty 启用终端
  8. -u, --user string 指定用户 (格式: <name|uid>[:<group|gid>])
  9. -w, --workdir string 指定工作目录
 

---

在容器内执行 /bin/bash 命令

 
  1. # eg: 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
  2. docker run -it centos /bin/bash
 

2.1.docker -v 挂载 (目录)

      我们可以多次挂载

                    ・挂载 maven

       ・挂载 jenkins

    相关资料

      (十)Docker-V 详解 - sixinshuier - 博客园

      docker -v 挂载问题:_hnmpf 的博客 - CSDN 博客_docker-v

 
  1. 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
  2.  
  3. # docker run -it -v /test:/soft centos /bin/bash
  4.  
  5. 冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
 

关于 Docker 目录挂载的总结 - iVictor - 博客园

 
  1. 关于Docker目录挂载的总结
  2.  
  3. # docker run -it -v /test:/soft centos /bin/bash
  4.  
  5. 一、容器目录不可以为相对路径
  6.  
  7. 二、宿主机目录如果不存在,则会自动生成
  8.  
  9. # docker run -it -v test1:/soft centos /bin/bash
  10.  
  11. 三、宿主机的目录如果为相对路
  12. ・容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录
  13.  
  14. ・所谓的相对路径指的是/var/lib/docker/volumes/
  15.     与宿主机的当前目录无关。
  16.  
  17. 四、如果在容器内修改了目录的属主和属组,那么对应的挂载点会跟着修改
 

 

・更多挂载目录的方法 (可以使用镜像直接挂载)

docker - 修改容器的挂载目录三种方式_zedelei 的博客 - CSDN 博客_docker 修改挂载目录

 

2.2.docker -v 挂载 (Volume)

Docker 学习笔记(6)——Docker Volume - 简书

・基础
Docker 的数据持久化 --- 数据不随着 container 的结束而结束,
数据存在于 host 机器上:(①或②中的一种)
  ・①存在于 host 的某个指定目录中(使用 bind mount),
  ・②使用 docker 自己管理的 volume(/var/lib/docker/volumes 下)。
 

・Docker Volume 例子

 
  1. 。。。
  2. -v maven-repository-volume:/MyPoroject/mvn/.m2
  3. 。。。
 

・查看【maven-repository-volume】的 volume:
docker volume inspect my-volume

・注意:
host 机器的目录路径必须为全路径 (即需要以 / 或~/ 开始的路径),
不然 docker 会把这个目录当做 volume
 

3.docker --rm

容器退出时就能够自动清理容器内部的文件系统

docker run 的 --rm 选项详解_大方子 - CSDN 博客_docker--rm

Detached (-d)🔗

To start a container in detached mode, you use -d=true or just -d option. By design, containers started in detached mode exit when the root process used to run the container exits, unless you also specify the --rm option. If you use -d with --rm, the container is removed when it exits or when the daemon exits, whichever happens first.

 

4.docker -w  -it

          Working directory inside the container

$ docker  run -w /path/to/dir/ -i -t  ubuntu pwd

he -w lets the command being executed inside directory given, here /path/to/dir/. If the path does not exist it is created inside the container.

WORKDIR 指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行。

 
  1.   docker run -it -w <work_dir> <container_image_name> <command>
  2.  
  3.   示例:
  4.  
  5.   docker run -it -w /home/jello centos /bin/bash
 

--

        

■例子 (-w)

   docker run --rm \

     -v 指定 maven Repository \

     -v 指定 Jenkins Home \

     -w 打包对象工程所在目录 CONTAINER_IMAGE_NAME:IMAGE_VER \

    mvn clean package

 

5.docker -u

指定执行命令时,所使用的用户,不指定时,默认以 root 用户执行。

指定时,指定的时 ID,关于 linux 中的 ID,参照下面文章中的 No.37

Unix_Linux_常用命令总结_sun0322-CSDN 博客

 

6.docker -e

指定环境变量

-e XXX_XXX="xxxxxxxxxxx"

 

■关于每一行结尾的反斜线

Docker run reference | Docker Documentation

 

■mvn 命令行执行

在 命令行 (cmd) 执行 Maven 命令,对 java 工程进行打包 操作 (指定 settings.xml)_sun0322-CSDN 博客_命令行运行 maven 项目

 

■更多参数

docker 常用命令总结 - Wshile - 博客园

Name, shorthand Default Description
--add-host   Add a custom host-to-IP mapping (host:ip)
--attach , -a   Attach to STDIN, STDOUT or STDERR
--blkio-weight   Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--blkio-weight-device   Block IO weight (relative device weight)
--cap-add   Add Linux capabilities
--cap-drop   Drop Linux capabilities
--cgroup-parent   Optional parent cgroup for the container
--cidfile   Write the container ID to the file
--cpu-count   CPU count (Windows only)
--cpu-percent   CPU percent (Windows only)
--cpu-period   Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota   Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period   API 1.25+
Limit CPU real-time period in microseconds
--cpu-rt-runtime   API 1.25+
Limit CPU real-time runtime in microseconds
--cpu-shares , -c   CPU shares (relative weight)
--cpus   API 1.25+
Number of CPUs
--cpuset-cpus   CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems   MEMs in which to allow execution (0-3, 0,1)
--detach , -d   Run container in background and print container ID
--detach-keys   Override the key sequence for detaching a container
--device   Add a host device to the container
--device-cgroup-rule   Add a rule to the cgroup allowed devices list
--device-read-bps   Limit read rate (bytes per second) from a device
--device-read-iops   Limit read rate (IO per second) from a device
--device-write-bps   Limit write rate (bytes per second) to a device
--device-write-iops   Limit write rate (IO per second) to a device
--disable-content-trust true Skip image verification
--dns   Set custom DNS servers
--dns-opt   Set DNS options
--dns-option   Set DNS options
--dns-search   Set custom DNS search domains
--domainname   Container NIS domain name
--entrypoint   Overwrite the default ENTRYPOINT of the image
--env , -e   Set environment variables
--env-file   Read in a file of environment variables
--expose   Expose a port or a range of ports
--gpus   API 1.40+
GPU devices to add to the container (‘all’ to pass all GPUs)
--group-add   Add additional groups to join
--health-cmd   Command to run to check health
--health-interval   Time between running the check (ms|s|m|h) (default 0s)
--health-retries   Consecutive failures needed to report unhealthy
--health-start-period   API 1.29+
Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout   Maximum time to allow one check to run (ms|s|m|h) (default 0s)
--help   Print usage
--hostname , -h   Container host name
--init   API 1.25+
Run an init inside the container that forwards signals and reaps processes
--interactive , -i   Keep STDIN open even if not attached
--io-maxbandwidth   Maximum IO bandwidth limit for the system drive (Windows only)
--io-maxiops   Maximum IOps limit for the system drive (Windows only)
--ip   IPv4 address (e.g., 172.30.100.104)
--ip6   IPv6 address (e.g., 2001:db8::33)
--ipc   IPC mode to use
--isolation   Container isolation technology
--kernel-memory   Kernel memory limit
--label , -l   Set meta data on a container
--label-file   Read in a line delimited file of labels
--link   Add link to another container
--link-local-ip   Container IPv4/IPv6 link-local addresses
--log-driver   Logging driver for the container
--log-opt   Log driver options
--mac-address   Container MAC address (e.g., 92:d0:c6:0a:29:33)
--memory , -m   Memory limit
--memory-reservation   Memory soft limit
--memory-swap   Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap
--memory-swappiness -1 Tune container memory swappiness (0 to 100)
--mount   Attach a filesystem mount to the container
--name   Assign a name to the container
--net   Connect a container to a network
--net-alias   Add network-scoped alias for the container
--network   Connect a container to a network
--network-alias   Add network-scoped alias for the container
--no-healthcheck   Disable any container-specified HEALTHCHECK
--oom-kill-disable   Disable OOM Killer
--oom-score-adj   Tune host’s OOM preferences (-1000 to 1000)
--pid   PID namespace to use
--pids-limit   Tune container pids limit (set -1 for unlimited)
--platform   experimental (daemon)API 1.32+
Set platform if server is multi-platform capable
--privileged   Give extended privileges to this container
--publish , -p   Publish a container’s port(s) to the host
--publish-all , -P   Publish all exposed ports to random ports
--read-only   Mount the container’s root filesystem as read only
--restart no Restart policy to apply when a container exits
--rm   Automatically remove the container when it exits
--runtime   Runtime to use for this container
--security-opt   Security Options
--shm-size   Size of /dev/shm
--sig-proxy true Proxy received signals to the process
--stop-signal SIGTERM Signal to stop a container
--stop-timeout   API 1.25+
Timeout (in seconds) to stop a container
--storage-opt   Storage driver options for the container
--sysctl   Sysctl options
--tmpfs   Mount a tmpfs directory
--tty , -t   Allocate a pseudo-TTY
--ulimit   Ulimit options
--user , -u   Username or UID (format: <name|uid>[:<group|gid>])
--userns   User namespace to use
--uts   UTS namespace to use
--volume , -v   Bind mount a volume
--volume-driver   Optional volume driver for the container
--volumes-from   Mount volumes from the specified container(s)
--workdir , -w   Working directory inside the container

docker 常用命令总结 - Wshile - 博客园

 
  1. -d, --detach=false # 后台运行容器,并返回容器ID;
  2. -i, --interactive=false # 以交互模式运行容器,通常与 -t 同时使用;
  3. -t, --tty=false # 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  4. -u, --user="" # 指定容器的用户
  5. -a, --attach=[] # 登录容器(必须是以docker run -d启动的容器)
  6. -w, --workdir="" # 指定容器的工作目录
  7. -c, --cpu-shares=0 # 设置容器CPU权重,在CPU共享场景使用
  8. -e, --env=[] # 指定环境变量,容器中可以使用该环境变量
  9. -m, --memory="" # 指定容器的内存上限
  10. -P, --publish-all=false # 指定容器暴露的端口
  11. -p, --publish=[] # 指定容器暴露的端口
  12. -h, --hostname="" # 指定容器的主机名
  13. -v, --volume=[] # 给容器挂载存储卷,挂载到容器的某个目录
  14. --volumes-from=[] # 给容器挂载其他容器上的卷,挂载到容器的某个目录
  15. --cap-add=[] # 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  16. --cap-drop=[] # 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  17. --cidfile="" # 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
  18. --cpuset="" # 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  19. --device=[] # 添加主机设备给容器,相当于设备直通
  20. --dns=[] # 指定容器的dns服务器
  21. --dns-search=[] # 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  22. --entrypoint="" # 覆盖image的入口点
  23. --env-file=[] # 指定环境变量文件,文件格式为每行一个环境变量
  24. --expose=[] # 指定容器暴露的端口,即修改镜像的暴露端口
  25. --link=[] # 指定容器间的关联,使用其他容器的IP、env等信息
  26. --lxc-conf=[] # 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  27. --name="" # 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  28. --net="bridge" # 容器网络设置:
  29. bridge # 使用docker daemon指定的网桥
  30. host # 容器使用主机的网络
  31. container:NAME_or_ID > # 使用其他容器的网路,共享IP和PORT等网络资源
  32. none # 容器使用自己的网络(类似--net=bridge),但是不进行配置
  33. --privileged=false # 指定容器是否为特权容器,特权容器拥有所有的capabilities
  34. --restart="no" # 指定容器停止后的重启策略:
  35. no # 容器退出时不重启
  36. on-failure # 容器故障退出(返回值非零)时重启
  37. always # 容器退出时总是重启
  38. --rm=false # 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  39. --sig-proxy=true # 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
 

---

■更多命令 --- docker 的一些命令

・常用操作命令

================================

查看 docker 服务运行状况

ps -el | grep -i docker

-

停止 Docker 服务
service docker stop

-

启动 docker 服务

service docker start

================================

查看有哪些镜像
docker search yourAppName

-

获取镜像
docker pull imageName

-

查看安装了的镜像
docker images

-

查看运行的容器
docker ps

-

查看所有的容器
docker ps -a

-

停止容器运行
docker stop <container_id>

-

重新启动容器
docker resatart <container_id>

-

删除容器
docker rm yourContainerID 

-

删除镜像
docker rmi yourImageName

-

查看容器开启时的 log
docker logs -f yourContainerName

-

进入容器内部执行命令
docker exec -it yourContainerID bash

===============

查看 Log
docker logs -f <image_name>

 

・查看 Docker 信息

docker info

【环境搭建】Docker 镜像相关操作(切换镜像源、查询、获取、查看、创建、上传、保存、删除等)_查看 docker 镜像源_Fighting_hawk 的博客 - CSDN 博客

 

===

■实际使用

创建 Jenkins 服务

使用 Docker 快速创建一个 Jenkins 服务_sun0322 的博客 - CSDN 博客

创建 WebSphere 服务

使用 Docker 创建一个 WebSphere 服务_sun0322 的博客 - CSDN 博客

Docker 命令无效时,解决办法

所有 docker 命令无效,解决办法_sun0322 的博客 - CSDN 博客

==

un 的各种参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run [OPTIONS] IMAGE [COMMOND] [ARGS...]
# OPTIONS 说明
    --name="容器新名字": 为容器指定一个名称;
    -d: 后台运行容器,并返回容器ID,也即启动守护式容器;
    -i:以交互模式运行容器,通常与 -t 同时使用;
    -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -P: 随机端口映射;
    -p: 指定端口映射,有以下四种格式
          ip:hostPort:containerPort
          ip::containerPort
          hostPort:containerPort
          containerPort
    -w: 指定命令执行时,所在的路径
# IMAGE
XXX_IMAGE_NAME:XXX_IMAGE_VER
# COMAND
例:mvn -Duser.home=xxx -B clean package -Dmaven.test.skip=true

常用 OPTIONS 补足:

--name:容器名字
--network:指定网络
--rm:容器停止自动删除容器
 
-i:--interactive, 交互式启动
-t:--tty,分配终端
-v:--volume, 挂在数据卷
-d:--detach,后台运行

(-w 在 run 中,似乎也可直接使用)

在已运行的容器中运行命令

1
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

常用选项:

  -d:--detach ,后台运行命令
  -e, --env list             设置 env
  -i, --interactive         启用交互式
  -t, --tty                     启用终端
  -u, --user string        指定用户 (格式: <name|uid>[:<group|gid>])
  -w, --workdir string       指定工作目录

在容器内执行 /bin/bash 命令

1
2
# eg: 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash

docker -v 挂载 (目录)

比如我要启动一个 centos 容器,宿主机的 /test 目录挂载到容器的 /soft 目录,可通过以下方式指定:

1
# docker run -it -v /test:/soft centos /bin/bash

冒号 ":" 前面的目录是宿主机目录,后面的目录是容器内目录。

关于 docker 目录挂载的总结

1
# docker run -it -v /test:/soft centos /bin/bash

一、容器目录不可以为相对路径

二、宿主机目录如果不存在,则会自动生成

1
# docker run -it -v test1:/soft centos /bin/bash

三、宿主机的目录如果为相对路

・容器内的 /soft 目录挂载的是宿主机上的 /var/lib/docker/volumes/test1/_data 目录

・所谓的相对路径指的是 /var/lib/docker/volumes/,与宿主机的当前目录无关。

四、如果在容器内修改了目录的属主和属组,那么对应的挂载点会跟着修改

其他更多挂载目录的方法 (可以使用镜像直接挂载)

docker - 修改容器的挂载目录三种方式

docker -v 挂载 (Volume)

Docker 的数据持久化 — 数据不随着 container 的结束而结束,
数据存在于 host 机器上:(以下两种中的一种)

  • 存在于 host 的某个指定目录中(使用 bind mount),
  • 使用 docker 自己管理的 volume(/var/lib/docker/volumes 下)

Docker Volume 示例

1
-v maven-repository-volume:/MyPoroject/mvn/.m2

查看【maven-repository-volume】的 volume:

1
docker volume inspect my-volume

注意:

  • host 机器的目录路径必须为全路径 (即需要以 / 或~/ 开始的路径),
  • 不然 docker 会把这个目录当做 volume

docker --rm

容器退出时就能够自动清理容器内部的文件系统。
即当使用 docker stop 后,会直接删除容器,若数据没有挂载出来的话就直接被删除了,所以这个需要看自己具体的业务场景去使用。

docker run 的–rm 选项详解

docker -w -it

-w 指的是在哪个目录下去执行这个命令。这个目录指的是容器内的目录。

1
2
3
docker run -i --rm --name getSign \
-v /opt/getSign:/usr/src/app -v /opt/getSign:/root/.npm \
-w /usr/src/app dockerhub.com/common/node:19.7.0 bash -c "pnpm install && pnpm run build:dev"

可以看到上面的示例,我把容器外的 /opt/getSign 的代码目录挂载到了容器内的 /usr/src/app 目录。那么此时我的代码就是在容器内的 /usr/src/app 目录下了,所以我想执行 pnpm 命令的时候,需要指定执行目录为 -w /usr/src/app 这个目录。

 FROM ubuntu:16.04  ⇽--- 使用一个Debian派生的基础镜像 RUN apt-get update && apt-get install -y locales  ⇽--- 更新软件包索引并且安装locales软件包 RUN locale-gen en_US.UTF-8  ⇽--- 生成美式英语的locale文件,使用UTF-8编码 ENV LANG en_US.UTF-8  ⇽--- 设置LANG环境变量 ENV LANGUAGE en_US:en  ⇽--- 设置LANGUAGE环境变量 CMD env  ⇽--- 默认命令env将会展示容器里的环境设置

用户可能想知道LANG和LANGUAGE变量之间的区别是什么。简而言之,LANG是首选语言和编码设置的默认设置。它也提供了一个应用查找更多指定LC_*这样的设置时的一个默认值。LANGUAGE则提供了一个有序的应用程序首选语言列表(如果主要语言不可用)。可以通过执行man locale获取更多信息。

使用dockerstop而不是dockerkill来干净地终结容器。要理解的关键点在于dockerkill的行为表现的和标准的命令行程序kill是不一样的。除非另有说明,一般执行kill程序时它会给指定的进程发送一个TERM(也就是信号值15)信号。该信号指示程序应该终结,但是它不会强制要求程序退出。大多数程序在收到该信号时会执行某些清理任务,但是该程序也可以执行它自己喜欢的操作,包括忽略该信号。相反,KILL信号(也就是信号值9)会强制终止指定的程序。令人不解的是,docker kill会针对正在运行的容器发送一个KILL信号,让容器里的进程没有机会处理终止过程。这意味着它可能会将一些杂乱的文件(比如包含正在运行的进程ID的文件)遗留在文件系统里。视应用程序管理状态的能力而定,当用户再次启动该容器时可能会有问题,也可能不会。而更令人困惑的是,docker stop命令的行为类似于标准的kill命令,它会发送一个TERM信号(见表5-1),不同的是它将会等待10秒,然后在容器未停止的情况下再发送KILL信号。

总而言之,不要像使用kill那样使用dockerkill,最好养成使用dockerstop的习惯。

docker-machine的命令列表

想要在互联网上跨宿主机共享卷。解决方案使用一项叫Resilio的技术在互联网上共享数据卷。

想要在容器里使用一个外部卷,但是希望只允许Docker访问这些文件。解决方案启动一个数据容器,然后在运行其他容器时带上--volumes-from标志。图5-5展示了数据容器模式的结构,并且解读了它的工作原理。有个要注意的关键点是,在第二台宿主机里,容器并不需要知道数据位于磁盘的哪个具体位置。它们只需要知道数据容器的名字,一切便准备就绪。这样做可以使容器的操作更加具备可移植性。与直接映射宿主机目录的方式相比,这个方案的另一个好处是这些文件的访问是由Docker管理的,这也就意味着不太可能出现非Docker进程影响其内容的情况。注意一个常常让人困惑不解的问题便是纯数据容器是否需要运行起来。答案是,不需要!它只需要存在,在宿主机上运行过,而且没有被删除。让我们通过一个简单的例子直观地展示一下该如何使用这一技巧。首先,运行一个数据容器:

$ docker run -v /shared-data --name dc busybox \ touch /shared-data/somefile

-v参数并没有将卷映射到一个宿主机目录,因此它将会在这个容器的管辖范围内创建一个目录。这个目录通过touch填充了一个文件,然后容器立刻退出了—— 一个数据容器在使用的时候不需要处于运行状态。我们使用了一个小而实用的busybox镜像来减少我们数据容器所需的额外成本。

然后便可以运行其他容器来访问刚创建的文件:

docker run -t -i --volumes-from dc busybox /bin/sh

/ # ls /shared-data

somefile

--volumes-from标志允许用户通过把它们挂载到当前容器的形式来引用数据容器里的文件——只需要传入定义

卷的容器ID即可。busybox镜像里没有bash,因此必须启动一个简化版shell来确认dc容器里的/shared-data目录对用户而言是的确可用的。用户可以启动任意数量的容器,它们都从指定数据容器的卷里做读和写。要用卷就无须使用这个模式——读者可能会发现这个方案比直接挂载一个宿主机目录管理起来要更困难些。但是,如果想要将管理数据的职责完全委派给Docker进行单点管理而不受其他宿主机进程干扰,数据容器也许能够满足这一需求。

警告如果应用程序从多个容器写日志到同一数据容器,很重要的一点便是要确保每个容器日志文件写入的是一个唯一的文件路径。如果无法确保这一点,不同的容器便有可能覆盖或截断该文件,从而造成数据的丢失,或者可能写入的数据是交错混杂的,这就很难解析文件中的内容。类似地,如果对数据容器调用--volumes-from,就是允许该容器潜在地覆盖自己的目录,因此也要小心这里的命名冲突。重要的是要了解,采用这种模式可能会导致占用大量的磁盘空间,而且调试起来可能相对困难些。由于Docker仅在数据容器里管理该卷,并且在引用该数据卷的最后一个容器退出时也不会把卷删掉,因此任何放到卷里的数据都将得到保留。这是为了防止意外的数据丢失。关于管理这项操作的建议,参见技巧43。

 

posted @ 2024-06-28 17:01  CharyGao  阅读(294)  评论(0编辑  收藏  举报