Docker是否可以在Linux,macOS和Windows上运行?
您可以在Docker容器中运行Linux和Windows程序以及可执行文件。Docker平台在Linux(x86-64,ARM和许多其他CPU架构)和Windows(x86-64)上本地运行。
Docker Inc.构建的产品可让您在Linux,Windows和macOS上构建和运行容器。
Docker技术为普通LXC增添了什么?
Docker技术不能替代LXC。“ LXC”是指Linux内核(特别是名称空间和控制组)的功能,这些功能允许彼此进行沙盒处理并控制其资源分配。在此低级内核功能基础之上,Docker提供了具有多种强大功能的工具:
- 跨机器的可移植部署。Docker定义了一种用于将应用程序及其所有依赖项捆绑到一个称为容器的对象的格式。该容器可以转移到任何启用了Docker的计算机上。可以在此处执行容器,并确保在开发,测试和生产中暴露给应用程序的执行环境相同。LXC实现了流程沙箱,这是便携式部署的重要先决条件,但不足以进行便携式部署。如果您将安装在自定义LXC配置中的应用程序的副本发送给我,则几乎可以肯定它不会像在您的计算机上那样在我的计算机上运行。您发送给我的应用程序与计算机的特定配置有关:网络,存储,日志记录等。Docker为这些计算机特定的设置定义了一个抽象。
- 以应用程序为中心。相对于机器,Docker针对应用程序的部署进行了优化。这反映在其API,用户界面,设计理念和文档中。相比之下,
lxc
帮助程序脚本将容器作为轻量级机器集中在容器上-基本上是启动速度更快且需要较少RAM的服务器。我们认为容器不仅限于此。 - 自动构建。泊坞窗包括为开发者自动工具从他们的源代码组装的容器,有超过应用的依赖,构建工具完全控制,包装等,他们都可以自由使用
make
,maven
,chef
,puppet
,salt,
Debian软件包,RPM包,源码包,或任意组合以上内容,无论机器的配置如何。 - 版本控制。Docker包含类似git的功能,用于跟踪容器的后续版本,检查版本之间的差异,提交新版本,回滚等。历史记录还包括容器的组装方式和组装者,因此您可以从生产服务器上获得完整的可追溯性一路回到上游开发者。Docker还实现了类似于的增量上传和下载,
git pull
因此可以仅通过发送差异来传输容器的新版本。 - 组件重复使用。任何容器都可以用作父映像来创建更多专用组件。这可以手动完成,也可以作为自动构建的一部分来完成。例如,您可以准备理想的Python环境,并将其用作10个不同应用程序的基础。您理想的PostgreSQL设置可以在将来的所有项目中重复使用。等等。
- 分享。Docker可以访问Docker Hub上的公共注册表,成千上万的人上传了有用的图像:从Redis,CouchDB,PostgreSQL到IRC Bouncers到Rails应用服务器再到Hadoop到各种Linux发行版的基础图像。该注册表还包括由Docker团队维护的有用容器的官方“标准库”。注册表本身是开源的,因此任何人都可以部署自己的注册表来存储和传输私有容器,例如用于内部服务器部署。
- 工具生态系统。Docker定义了一个API,用于自动和自定义容器的创建和部署。有大量工具与Docker集成以扩展其功能。类似于PaaS的部署(Dokku,Deis,Flynn),多节点编排(Maestro,Salt,Mesos,Openstack Nova),管理仪表板(docker-ui,Openstack Horizon,Shipyard),配置管理(Chef,Puppet),持续集成(Jenkins,Strider和Travis)等。Docker正在迅速将自己确立为基于容器的工具的标准。
Docker容器和VM之间有什么区别?
有一个很棒的StackOverflow答案显示了差异。
容器退出时,我是否会丢失数据?
一点也不!您的应用程序写入磁盘的所有数据都会保留在其容器中,直到您明确删除该容器为止。即使在容器停止后,该容器的文件系统仍然存在。
Docker容器可扩展到多远?
当今世界上一些大的服务器场都是基于容器的。诸如Google和Twitter之类的大型Web部署以及诸如Heroku之类的平台提供商都基于容器技术运行,其规模为数十万甚至数百万个容器。
如何连接Docker容器?
当前,推荐的连接容器的方法是通过Docker网络功能。您可以查看有关如何使用Docker网络的详细信息。
如何在Docker容器中运行多个进程?
对于大多数用例,不建议使用此方法。为了获得大的效率和隔离度,每个容器应解决一个特定的关注领域。但是,如果需要在单个容器中运行多个服务,请参阅 在容器中运行多个服务。
如何报告Docker的安全性问题?
您可以在此处了解项目的安全策略 ,并向此邮箱报告安全问题 。
为什么我需要用DCO签署对Docker的提交?
阅读有关DCO简介的博客文章。
构建映像时,我应该选择系统库还是捆绑的库?
这是关于docker-dev邮件列表的讨论的摘要。
实际上,所有程序都依赖于第三方库。大多数情况下,它们使用动态链接和某种程序包依赖性,因此,当多个程序需要同一个库时,该库仅安装一次。
但是,某些程序会捆绑其第三方库,因为它们依赖于这些库的非常特定的版本。
创建Docker映像时,好使用捆绑的库,还是应该构建这些程序以使它们使用默认的系统库?
有关系统库的关键不是节省磁盘或内存空间。这是关于安全性。所有主要发行版都拥有专门的安全团队,密切关注已发布的漏洞,并自行发布公告,从而认真地处理安全问题。( 有关这些过程的示例,请参见Debian安全信息。)但是,上游开发人员并不总是实现类似的做法。
在设置Docker映像以从源代码编译程序之前,如果要使用捆绑库,则应检查上游作者是否提供了便捷的方式来宣布安全漏洞,以及他们是否及时更新了捆绑库。如果他们没有这样做,那么您正在使自己(和图像的用户)面临安全漏洞。
同样,在使用他人构建的软件包之前,您应检查提供这些软件包的渠道是否实施了类似的安全佳实践。首先,下载并安装“多合一” .deb或.rpm听起来很不错,除非您无法确定它包含容易受到Heartbleed错误影响的OpenSSL库的副本。
为什么DEBIAN_FRONTEND=noninteractive
不鼓励使用Dockerfiles?
在Debian和Ubuntu上构建Docker映像时,您可能会看到以下错误:
unable to initialize frontend: Dialog
这些错误不会阻止映像的生成,但是会通知您安装过程试图打开一个对话框,但没有成功。通常,可以安全地忽略这些错误。
有人通过使用以下方法更改DEBIAN_FRONTEND
Dockerfile中的环境变量来规避这些错误:
ENV DEBIAN_FRONTEND=noninteractive
这样可以防止安装程序在安装过程中打开对话框,从而停止错误。
虽然这听起来像是个好主意,但可能会有副作用。该 DEBIAN_FRONTEND
环境变量是由从图像中内置所有图像和容器继承,有效地改变他们的行为。在交互式安装软件时,使用这些映像的人会遇到问题,因为安装程序不会显示任何对话框。
正因为如此,而且由于设置DEBIAN_FRONTEND
来noninteractive
主要是“美容”的变化,我们不鼓励改变它。
如果确实需要更改其设置,请确保 之后将其更改回其 默认值。
Connection reset by peer
向容器中运行的服务发出请求时为什么会得到提示?
通常,如果服务已绑定到您的本地主机,则会返回此消息。结果,从外部进入容器的请求被丢弃。若要更正此问题,请在本地主机上更改服务的配置,以便该服务接受来自所有IP的请求。如果不确定如何执行此操作,请查看操作系统的文档。
为什么Cannot connect to the Docker daemon. Is the docker daemon running on this host?
在使用docker-machine时会出现问题?
该错误指出,Docker客户端无法连接到虚拟机。这意味着在其下工作的虚拟机docker-machine
未运行,或者客户端未正确指向该虚拟机 。
要验证Docker计算机是否正在运行,您可以使用docker-machine ls
命令并docker-machine start
根据需要启动它。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown
$ docker-machine start default
您需要告诉Docker与该机器对话。您可以使用docker-machine env
命令执行此操作 。例如,
$ eval "$(docker-machine env default)"
$ docker ps