1. Docker 和虚拟机有啥不同?
答:Docker 是轻量级的沙盒,在其中运行的只是应用,虚拟机里面还有额外的系统。
查看twt论坛
2.Docker安全么?
答:Docker利用了Linux内核中很多安全特性来保证不同容器之间的隔离,并且通过签名机制来对镜像进行验证。大量生产环境的部署证明,Docker虽然隔离性无法与虚拟机相比,但仍然具有极高的安全性。
3.如何清理后台停止的容器?
答:可以使用sudo docker rm $sudo (docker ps -a -q)命令。
4.如何查看镜像支持的环境变量?
答:可以使用docker run Image env命令。
5.当启动容器的时候提示:exec format error?如何解决问题
答:检查启动命令是否具有可执行权限,进入手工运行脚本进行排查。
6.本地的镜像文件都存放在哪里?
答:与Docker相关的本地资源都存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的内容文件。
7.如何退出一个镜像的bash,而不终止它?
答:按Ctrl-p Ctrl-q。
8.退出容器时自动删除?
答:使用-rm选项,例如sudo docker run -rm -it ubuntu
9.怎么快速查看本地的镜像和容器?
答:可以通过docker images来快速查看本地镜像;通过docker ps -a快速查看本地容器。
镜像相关:
1.如何批量清理临时镜像文件?
答:可以使用sudo docker rmi $(sudo docker iamges -q -f danging=true)命令
2.如何查看镜像支持的环境变量?
答:使用sudo docker run IMAGE env
3.本地的镜像文件都存放在哪里?
答:与Docker相关的本地资源都存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的内容文件。
4.构建Docker镜像应该遵循哪些原则?
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括:
尽量选取满足需求但较小的基础系统镜像,建议选择debian:wheezy镜像,仅有86MB大小
清理编译生成文件、安装包的缓存等临时文件
安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖
从安全的角度考虑,应用尽量使用系统的库和依赖
使用Dockerfile创建镜像时要添加.dockerignore文件或使用干净的工作目录
容器相关
1.容器退出后,通过docker ps命令查看不到,数据会丢失么?
答:容器退出后会处于终止(exited)状态,此时可以通过docker ps -a查看,其中数据不会丢失,还可以通过docker start来启动,只有删除容器才会清除数据。
2.如何停止所有正在运行的容器?
答:使用docker kill $(sudo docker ps -q)
这里-q待确认,是-a吗?
3.如何清理批量后台停止的容器?
答:使用docker rm $(sudo docker ps -a -q)
4.如何临时退出一个正在交互的容器的终端,而不终止它?
答:按Ctrl+p,后按Ctrl+q,如果按Ctrl+c会使容器内的应用进程终止,进而会使容器终止。
5.很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
答:使用docker logs,后面跟容器的名称或者ID信息。
6.使用docker port命令映射容器的端口时,系统报错ERROR:No public ‘80’
published for ...,是什么意思?
答:创建镜像时Dockerfile要指定正确的EXPOSE的端口,容器启动时指定PublishAllport=true
7.可以在一个容器中同时运行多个应用进程吗?
答:一般不推荐在同一个容器内运行多个应用进程,如果有类似需求,可以通过额外的进程管理机制,比如supervisord来管理所运行的进程。
8.如何控制容器占用系统资源(CPU,内存)的份额?
答:在使用docker create 命令创建容器或使用docker run创建并运行容器的时候可以使用-c|-cpu-shares[=0]参数来调整同期使用CPU的权重,使用-m|-memory参数来调整容器使用内存的大小。
仓库相关
1.仓库(Repository)、注册服务器(Registry)、注册索引(Index)有何关系?
答:首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像,注测服务器是存放实际镜像的地方,注册索引则负责维护用户的账号,权限,搜索,标签等管理。注册服务器利用注册索引来实现认证等管理。
2.从非官方仓库(如:http://dl.dockerpool.com)下载镜像的时候,有时候会提示“ERROR:Invalid registry endpoint https://dl.docker.com:5000/v1/...” ?
答:Docker自1.3.0版本往后,加强了对镜像安全性地验证,需要手动添加对非官方仓库的信任。
DOCKER_OPTS="-insecure-registry dl.dockerpool.com:5000"
重启docker服务
配置相关
1.Docker的配置文件放在哪里。如何修改配置?
答:Ubuntu系统下Docker的配置文件是/etc/default/docker,CentOS系统配置文件存放在/etc/sysconfig/docker
2.如何更改Docker的默认存储设置?
答:Docker的默认存储存放位置是/var/lib/docker,如果希望将docker的本地文件存储到其他分区,可以使用Linux软连接的方式来做。
Docker与虚拟化
1.Docker与LXC(Linux Container)有何不同?
答:LXC利用Linux上相关技术实现容器,Docker则在如下的几个方面进行了改进:
移植性:通过抽象容器配置,容器可以实现一个平台移植到另一个平台;
镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
版本管理:类似于GIT的版本管理理念,用户可以更方便的创建、管理镜像文件;
仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
周边工具:各种现有的工具(配置管理、云平台)对Docker的支持,以及基于Docker的Pass、CI等系统,让Docker的应用更加方便和多样化。
2,Docker与Vagrant有何不同?
答:两者的定位完全不同
Vagrant类似于Boot2Docker(一款运行Docker的最小内核),是一套虚拟机的管理环境,Vagrant可以在多种系统上和虚拟机软件中运行,可以在Windows、Mac等非Linux平台上为Docker支持,自身具有较好的包装性和移植性。
原生Docker自身只能运行在Linux平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
3.开发环境中Docker与Vagrant该如何选择?
答:Docker不是虚拟机,而是进程隔离,对于资源的消耗很少,单一开发环境Vagrant是虚拟机上的封装,虚拟机本身会消耗资源。
Other FAQ
1.Docker能在非Linux平台(Windows——MacOS)上运行吗?
答:可以
2.如何将一台宿主机的docker环境迁移到另外一台宿主机?
答:停止Docker服务,将整个docker存储文件复制到另外一台宿主机上,然后调整另外一台宿主机的配置即可。
3.Docker容器创建后,删除了/var/run/netsns目录下的网络名字空间文件,可以手动恢复它:
答:查看容器进程ID,比如1234 sudo docker inspect --format=‘{{.State.pid}}’ $container_id 1234 # 到proc目录下,把对应的网络名字空间文件链接到/var/run/netsns,然后通过正常的系统命令查看操作容器的名字空间。
容器技术
2、 Docker 是什么?
Docker 是一个容器化平台,它包装你所有开发环境依赖成一个整体,像一个容
器。保证项目开发,如开发、测试、发布等各生产环节都可以无缝工作在不同
的平台
Docker 容器:将一个软件包装在一个完整的文件系统中,该文件系统包含运行
所需的一切:代码,运行时,系统工具,系统库等。可以安装在服务器上的任
何东西。
这保证软件总是运行在相同的运行环境,无需考虑基础环境配置的改变。
5、如何使用 Docker 技术创建与环境无关的容器系统?
Docker 技术有三中主要的技术途径辅助完成此需求:
存储卷(Volumes)
环境变量(Environment variable)注入
只读(Read-only)文件系统
6、Dockerfile 配置文件中的 COPY 和 ADD 指令有什么不同?
虽然 ADD 和 COPY 功能相似,推荐 COPY 。
那是因为 COPY 比 ADD 更直观易懂。 COPY 只是将本地文件拷入容器这么简
单,而 ADD 有一些其它特性功能(诸如,本地归档解压和支持远程网址访问
等),这些特性在指令本身体现并不明显。因此,有必要使用 ADD 指令的最好
例子是需要在本地自动解压归档文件到容器中的情况,如 ADD
rootfs.tar.xz 。
7、 Docker 映像(image)是什么?
Docker image 是 Docker 容器的源。换言之,Docker images 用于创建
Docker 容器(containers)。映像(Images)通过 Docker build 命令创建,
当 run 映像时,它启动成一个 容器(container)进程。 做好的映像由于可
能非常庞大,常注册存储在诸如 registry.hub.docker.com 这样的公共平台
上。映像常被分层设计,每层可单独成为一个小映像,由多层小映像再构成大
映像,这样碎片化的设计为了使映像在互联网上共享时,最小化传输数据需
求。
8、Docker 容器(container)是什么?
Docker containers -- Docker 容器 -- 是包含其所有运行依赖环境,但与其
它容器共享操作系统内核的应用,它运行在独立的主机操作系统用户空间进程
中。Docker 容器并不紧密依赖特定的基础平台:可运行在任何配置的计算机,
任何平台以及任何云平台上。
9、Docker 中心(hub)什么概念?
Docker hub 是云基础的 Docker 注册服务平台,它允许用户进行访问 Docker
中心资源库,创建自己的 Docker 映像并测试,推送并存储创建好的 Docker
映像,连接 Docker 云平台将已创建好的指定 Docker 映像布署到本地主机等
任务。它提供了一个查找发现 Docker 映像,发布 Docker 映像及控制变化升
级的资源中心,成为用户组或团队协作开发中保证自动化开发流程的有效技术
途径。
10、在任意给定时间点指出一个 Docker 容器可能存在的运行阶
段?
在任意时间点,一个 Docker 容器可能存在以下运行阶段:
运行中(Running)
已暂停(Paused)
重启中(Restarting)
已退出(Exited)
11、 有什么方法确定一个 Docker 容器运行状态?
使用如下命令行命令确定一个 Docker 容器的运行状态
$ docker ps –a
这将列表形式输出运行在主机上的所有 Docker 容器及其运行状态。从这个列
表中很容易找到想要的容器及其运行状态。
12 、在 Dockerfile 配置文件中最常用的指令有哪些?
一些最常用的指令如下:
FROM:使用 FROM 为后续的指令建立基础映像。在所有有效的 Dockerfile
中, FROM 是第一条指令。
LABEL:LABEL 指令用于组织项目映像,模块,许可等。在自动化布署方面
LABEL 也有很大用途。在 LABEL 中指定一组键值对,可用于程序化配置或布署
Docker 。
RUN:RUN 指令可在映像当前层执行任何命令并创建一个新层,用于在映像层中
添加功能层,也许未来的层会依赖它。
CMD:使用 CMD 指令为执行的容器提供默认值。在 Dockerfile 文件中,若添
加多个 CMD 指令,只有最后的 CMD 指令运行。
13、 什么类型的应用(无状态性或有状态性)更适合 Docker 容
器技术?
对于 Docker 容器创建无状态性(Stateless)的应用更可取。通过从应用项目
中将与状态相关的信息及配置提取掉,我们可以在项目环境外建立不依赖项目
环境的 Docker 容器。这样,我们可以在任意产品中运行同一容器,只需根据
产品需要像问 & 答(QA)一样给其配置环境即可。 这帮助我们在不同场景重
用相同的 Docker 映像。另外,使用 无状态性(Stateless)容器应用相比有
状态性(Stateful)容器应用更具伸缩性,也容易创建。
14、 解释基本 Docker 应用流程
初始,所有都有赖于 Dockerfile 配置文件。Dockerfile 配置文件就是创建
Docker image (映像) 的源代码。
48
一旦 Dockerfile 配置好了,就可以创建(build)并生成 'image(映像)
' ,'image' 就是 Dockerfile 配置文件中 「源代码」的「编译」版本。
一旦有了 'image' ,就可以在 registry(注册中心) 发布它。 'registry'
类似 git 的资源库 -- 你可以推送你的映像(image),也可取回库中的映像
(image)。
之后,你就可以使用 image 去启动运行 'containers(容器)'。运行中的容
器在许多方面,与虚拟机非常相似,但容器的运行不需要虚拟管理软件的运
行。
15、Docker Image 和 Docker Layer (层) 有什么不同?
Image:一个 Docker Image 是由一系列 Docker 只读层(read-only Layer)
创建出来的。
Layer:在 Dockerfile 配置文件中完成的一条配置指令,即表示一个 Docker
层(Layer)。
如下 Dockerfile 文件包含 4 条指令,每条指令创建一个层(Layer)。
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
重点,每层只对其前一层进行一(某)些进化。
16、虚拟化技术是什么?
最初的构想,virtualisation(虚拟化) 被认为是逻辑划分大型主机使得多个
应用可以并行运行的一种技术方案。然而,随着技术公司及开源社区的推进,
现实发生了戏剧性的转变,以致产生了以一种或某种方式操作特权指令可以在
单台基于 x86 硬件的系统上同时运行多个(种)操作系统的技术。
实质的效果是,虚拟化技术允许你在一个硬件平台下运行 2 个完全不同的操作
系统。每个客户操作系统可完成像系统自检、启动、载入系统内核等像在独立
硬件上的一切动作。同时也具备坚实的安全基础,例如,客户操作系统不能获
取完全访问主机或其它客户系统的权限,及其它涉及安全,可能把系统搞坏的
操作。
基于对客户操作系统虚拟硬件、运行环境模拟方法的不同,对虚拟化技术进行
分类,主要的有如下 3 种虚拟化技术种类:
? 全模拟(Emulation)
? 半虚拟(Paravirtualization)
? 基于容器的虚拟化(Container-based virtualization)
17、虚拟管理层(程序)是什么?
hypervisor -- 虚拟管理层(程序)-- 负责创建客户虚拟机系统运行所需虚拟
硬件环境。它监管客户虚拟操作系统的运行,并为客户系统提供必要的运行资
源,保证客户虚拟系统的运行。虚拟管理层(程序)驻留在物理主机系统和虚
拟客户系统之间,为虚拟客户系统提供必要的虚拟服务。如何理解它,它侦听
运行在虚拟机中的客户操作系统的操作并在主机操作系统中模拟客户操作系统
所需硬件资源请求。满足客户机的运行需求。
50
虚拟化技术的快速发展,主要在云平台,由于在虚拟管理程序的帮助下,可允
许在单台物理服务器上生成多个虚拟服务器,驱动着虚拟化技术快速发展及广
泛应用。诸如,Xen,VMware,KVM 等,以及商业化的处理器硬件生产厂商也加
入在硬件层面支持虚拟化技术的支持。诸如,Intel 的 VT 和 AMD-V 。
18、Docker 群(Swarm)是什么?
Docker Swarm -- Docker 群 -- 是原生的 Docker 集群服务工具。它将一群
Docker 主机集成为单一一个虚拟 Docker 主机。利用一个 Docker 守护进程,
通过标准的 Docker API 和任何完善的通讯工具,Docker Swarm 提供透明地将
Docker 主机扩散到多台主机上的服务。
19、在使用 Docker 技术的产品中如何监控其运行?
Docker 在产品中提供如 运行统计和 Docker 事件的工具。可以通过这些工具
命令获取 Docker 运行状况的统计信息或报告。
Docker stats : 通过指定的容器 id 获取其运行统计信息,可获得容器对
CPU,内存使用情况等的统计信息,类似 Linux 系统中的 top 命令。
Docker events :Docker 事件是一个命令,用于观察显示运行中的 Docker 一
系列的行为活动。
一般的 Docker 事件有:attach(关联),commit(提交),die(僵死),
detach(取消关联),rename(改名),destory(销毁)等。也可使用多个选
项对事件记录筛选找到想要的事件信息。
20 、什么是孤儿卷及如何删除它?
孤儿卷是未与任何容器关联的卷。在 Docker v。1.9 之前的版本中,删除这些
孤儿卷存在很大问题。
21、什么是半虚拟化(Paravirtualization)?
Paravirtualization,也称为第 1 类虚拟机管理(层)程序,其直接在硬件或
裸机(bare-metal)上运行,提供虚拟机直接使用物理硬件的服务,它帮助主
机操作系统,虚拟化硬件和实际硬件进行协作以实现最佳性能。这种虚拟层管
理技术的程序一般占用系统资源较小,其本身并不需要占用大量系统资源。
这种虚拟层管理程序有 Xen, KVM 等。
22、Docker 技术与虚拟机技术有何不同?
Docker 不是严格意义上的虚拟化硬件的技术。它依赖 container-based
virtualization(基于容器的虚拟化) 的技术实现工具,或可以认为它是操作
系统用户运行级别的虚拟化。因此, Docker 最初使用 LXC 驱动它,后来移至
由 libcontainer 基础库驱动它,现已更名为 runc 。 Docker 主要致力于应
用容器内的应用程序的自动化部署。应用容器设计用于包装和运行单一服务,
而操作系统设计用于运行多进程任务,提供多种运算服务的能力。如虚拟机中
等同完全操作系统的能力。因此,Docker 被认为是容器化系统上管理容器及应
用容器化的布署工具。
与虚拟机不同,容器无需启动操作系统内核,因此,容器可在不到 1 秒钟
时间内运行起来。这个特性,使得容器化技术比其它虚拟化技术更具有独
特性及可取性。
? 由于容器化技术很少或几乎不给主机系统增加负载,因此,基于容器的虚
拟化技术具有近乎原生的性能表现。
? 基于容器的虚拟化,与其他硬件虚拟化不同,运行时不需要其他额外的虚
拟管理层软件。
? 主机上的所有容器共享主机操作系统上的进程调度,从而节省了额外的资
源的需求。
? 与虚拟机 image 相比,容器(Docker 或 LXC images)映像较小, 因
此,容器映像易于分发。
? 容器中的资源分配由 Cgroups 实现。 Cgroup 不会让容器占用比给它们分
配的更多的资源。但是,现在其它的虚拟化技术,对于虚拟机,主机的所
有资源都可见,但无法使用。这可以通过在容器和主机上同时运行 top 或
htop 来观察到。在两个环境中的输出看起来相同。
23、请解释一下 docerfile 配置文件中的 ONBUILD 指令的用途
含义?
配置文件中的 ONBUILD 指令为创建的 Docker image (映像)加入在将来执行
的指令(译注:在当前配置文件生成的映像中并不执行), 用于在以这个创建
的映像为基础的创建的子映像(image) 中执行或定制。 举例, 以基映像创
建自己的映像时,可定制创建特有的用户化的配置环境。
( 译注: 由于原文较短,关于这个问题容易迷惑。 译者认为,总体来说关键
理解 -- 以基础映像创建自有的映像过程中,基础映像中所有的创建层或指令
是以整体或固化的方式导入自有映像中的,自有映像是不能对这个过程进行自
有定制。 而 ONBUILD 指令提供了将某些层从基础映像中剥离出来提供给之后
以自有映像为基础映像派生新的映像的可定制途径。这对发布映像而普适在不
同的运行环境定制非常有用。不当之处,请指正!)
24、有否在创建有状态性的 Docker 应用的较好实践? 最适合的
场景有什么?
有状态性 Docker 应用的问题关键在于状态数据保存在哪儿的问题。 若所有数
据保存在容器内, 当更新软件版本或想将 Docker 容器移到其它机器上时,
找回这些在运行中产生的状态数据将非常困难。
您需要做的是将这些表达运行状态的数据保存在永久卷中。参考如下 3 种模
式。
译注:
1 图中文字: 数据保存在容器中,当容器停止运行时,运行状态数据丢失!
2 图中文字: 数据保存在主机卷(Host Volume)中,当主机停机时,运行状
态数据将无法访问
3 图中文字: 数据保存在网络文件系统卷中,数据访问不依赖容器的运行与主
机的运行
若您使用:docker run -v hostFolder:/containerfolder 命令运行您的容
器, 容器运行中任何对 /containerfolder 目录下数据的改变, 将永久保存
在主机的 hostfolder 目录下。 使用网络文件系统(nfs)与此类似。 那样您
就可以运行您的容器在任何主机上且其运行状态数据被保存在网络文件系统
上。
25、在 Windows 系统上可以运行原生的 Docker 容器吗?
在 'Windows Server 2016' 系统上, 你可以运行 Windows 的原生容器, 微
软推出其映像是 'Windows Nano Server' , 一个轻量级的运行在容器中的
Windows 原生系统。 您可以在其中布署基于 .NET 的应用。
译注: 结合 Docker 的基本技术原理,参考后面的 问题 26 和 问题 27, 可
推测, 微软在系统内核上开发了对 Docker 的支持, 支持其闭源系统的容器
化虚拟技术。但译者认为, Windows 系统本就是闭源紧耦合的系统, 好像你
在本机上不装 .NET 组件,各应用能很好运行似的。何必再弄个容器,浪费资
源。这只是译者自己之孔见,想喷就喷! 另: Windows Server 2016 版本之
后的都可支持这种原生 Docker 技术,如 Windows Server 2018 版。
26、在非 Linux 操作系统平台上如何运行 Docker ?
容器化虚拟技术概念可能来源于,在 Linux 内核版本 2.6.24 上加入的对 命
名空间( namespace) 的技术支持特性。 容器化进程加入其进程 ID 到其创
建的每个进程上并且对每个进程中的系统级调用进行访问控制及审查。 其本身
是由系统级调用 clone () 克隆出来的进程, 允许其创建属于自己命名空间的
进程实例,而区别于之前的,归属与整个本机系统的进程实例。
如果上述在 Linux 系统内核上的技术实现成为可能, 那么明显的问题是如何
在 非 Linux 系统上运行容器化的 Docker 。过去, Mac 和 Windows 系统上
运行 Docker 容器都使用 Linux 虚拟机(VMs) 技术, Docker 工具箱使用的
容器运行在 Virtual Box 虚拟机上。 现在,最新的情况是, Windows 平台上
使用的是 Hyper-V 产品技术,Mac 平台上使用的是 Hypervisor.framework
(框架)产品技术。
27、容器化技术在底层的运行原理?
2006 年前后, 人们,包括一些谷歌的雇员, 在 Linux 内核级别上实现了一
种新的名为 命名空间(namespace) 的技术(实际上这种概念在 FreeBSD 系
统上由来已久)。我们知道,操作系统的一个功能就是进程共享公共资源, 诸
如,网络和硬盘空间等。 但是,如果一些公共资源被包装在一个命名空间中,
只允许属于这个命名空间中的进程访问又如何呢? 也就是说,可以分配一大块
硬盘空间给命名空间 X 供其使用,但是,命名空间 Y 中的进程无法看到或访
问这部分资源。 同样地, 命名空间 Y 中分配的资源,命名空间 X 中的进程
也无法访问。当然, X 中的进程无法与 Y 中的进程进行交互。这提供了某种
对公共资源的虚拟化和隔离的技术。
这就是 Docker 技术的底层工作原理: 每个容器运行在它自己的命名空间中,
但是,确实与其它运行中的容器共用相同的系统内核。 隔离的产生是由于系统
内核清楚地知道命名空间及其中的进程,且这些进程调用系统 API 时,内核保
证进程只能访问属于其命名空间中的资源。
图上文字说明: 运行中的容器是隔离的。准确地说, 各容器共享操作系统内
核及操作系统 API。
28、说说容器化技术与虚拟化技术的优缺点
仅有下面的一些对比:
不能像虚拟机那样在容器上运行与主机完全不同的操作系统。 然而, 可以在
容器上运行不同的 Linux 发布版,由于容器共享系统内核的缘故。容器的隔离
性没有虚拟机那么健壮。事实上, 在早期容器化技术实现上,存在某种方法使
客户容器可接管整个主机系统。
也可看到,载入新容器并运行,并不会像虚拟机那样装载一个新的操作系统进
来。
所有的容器共享同一系统内核, 这也就是容器被认为非常轻量化的原因。
同样的原因,不像虚拟机, 你不须为容器预分配大量的内存空间, 因为它不
是运行新的整个的操作系统。 这使得在一个操作系统主机上,可以同时运行成
百上千个容器应用, 在运行完整操作系统的虚拟机上,进行这么多的并行沙箱
实验是不可能的。
29、如何使 Docker 适应多种运行环境?
您必然想改变您的 Docker 应用配置以更适应现实运行环境的变化。下面包含
一些修改建议:
移除应用代码中对任何固定存储卷的绑定,由于代码驻留在容器内部,而不能
从外部进行修正。
绑定应用端口到主机上的不同端口
差异化设置环境变量 (例如: 减少日志冗余或者使能发电子邮件)
设定重启策略(例如: restart: always ), 避免长时间宕机
加入额外的服务(例如: log aggregator)
由于以上原因, 您更需要一个 Compose 配置文件,大概叫
production.yml ,它配置了恰当的产品整合服务。 这个配置文件只需包含您
选择的合适的原始 Compose 配置文件中,你改动的部分。
docker-compose -f docker-com
30、为什么 Docker compose 采取的是并不等待前面依赖服务项
的容器启动就绪后再启动的组合容器启动策略?
Docker 的 Compose 配置总是以依赖启动序列来启动或停止 Compose 中的服务
容器, 依赖启动序列是由 Compose 配置文件中的 depends_on , links ,
volumes_from 和 network_mode: "service : ..." 等这些配置指令所确定
的。
然而, Compose 启动中, 各容器的启动并不等待其依赖容器(这必定是你整
个应用中的某个依赖的服务或应用)启动就绪后才启动。使用这种策略较好的
理由如下:
等待一个数据库服务(举例)就绪这样的问题, 在大型分布式系统中仅是相比
其它大问题的某些小问题。 在实际发布产品运维中, 您的数据库服务会由于
各种原因,或者迁移宿主机导致其不可访问。 您发布的产品需要有应对这样状
况的弹性。
掌控这些, 开发设计您的应用, 使其在访问数据库失效的情况下, 能够试图
重连数据库, 直至其连接到数据库为止。
最佳的解决方案是在您的应用代码中检查是否有应对意外的发生,无论是任何
原因导致的启动或连接失效都应考虑在内。