Merge pull request #228 from yeasy/dev

Fix #227 #180
This commit is contained in:
康怀帅 2017-11-22 21:09:32 +08:00 committed by GitHub
commit 80a07aee73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 161 additions and 244 deletions

View File

@ -48,8 +48,7 @@
* [删除](container/rm.md) * [删除](container/rm.md)
* [访问仓库](repository/README.md) * [访问仓库](repository/README.md)
* [Docker Hub](repository/dockerhub.md) * [Docker Hub](repository/dockerhub.md)
* [私有仓库](repository/local_repo.md) * [私有仓库](repository/registry.md)
* [配置文件](repository/config.md)
* [数据管理](data_management/README.md) * [数据管理](data_management/README.md)
* [数据卷](data_management/volume.md) * [数据卷](data_management/volume.md)
* [数据卷容器](data_management/container.md) * [数据卷容器](data_management/container.md)

View File

@ -8,6 +8,6 @@
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷Volume](https://docs.docker.com/engine/tutorials/dockervolumes/)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷Volume](../data_management/volume.md)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 `run`,数据却不会丢失。 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 `run`,数据却不会丢失。

View File

@ -16,13 +16,13 @@ Docker Registry 公开服务是开放给用户使用、允许用户管理镜像
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry并拥有大量的高质量的官方镜像。除此以外还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/)CoreOS 相关的镜像存储在这里Google 的 [Google Container Registry](https://cloud.google.com/container-registry/)[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。 最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry并拥有大量的高质量的官方镜像。除此以外还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/)CoreOS 相关的镜像存储在这里Google 的 [Google Container Registry](https://cloud.google.com/container-registry/)[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解 由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Dcoekr](../install/mirror.md) 一节中有详细的配置方法
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。 国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com) 等。
### 私有 Docker Registry ### 私有 Docker Registry
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 Registry 服务的讲解。 除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。 开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。

View File

@ -1,17 +1,14 @@
## 删除容器 ## 删除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。 可以使用 `docker rm` 来删除一个处于终止状态的容器。例如
例如 ```bash
```
$ docker rm trusting_newton $ docker rm trusting_newton
trusting_newton trusting_newton
``` ```
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。 如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
## 清理所有处于终止状态的容器 ## 清理所有处于终止状态的容器
`docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。* `docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker container prune` 可以清理掉所有处于终止状态的容器。
## Docker 1.13+ ## Docker 1.13+

View File

@ -1,7 +1,7 @@
# CoreOS # CoreOS
CoreOS的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。 CoreOS 的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。
CoreOS的安装文件和运行依赖非常小,它提供了精简的Linux系统。它使用Linux容器在更高的抽象层来管理你的服务而不是通过常规的YUM和APT来安装包。 CoreOS 的安装文件和运行依赖非常小,它提供了精简的 Linux 系统。它使用 Linux 容器在更高的抽象层来管理你的服务,而不是通过常规的 YUM APT 来安装包。
同时CoreOS几乎可以运行在任何平台Vagrant, Amazon EC2, QEMU/KVM, VMware 和 OpenStack 等等,甚至你所使用的硬件环境。 同时CoreOS 几乎可以运行在任何平台Vagrant, Amazon EC2, QEMU/KVM, VMware 和 OpenStack 等等,甚至你所使用的硬件环境。

View File

@ -1,42 +1,42 @@
# CoreOS介绍 # CoreOS介绍
提起Docker我们不得不提的就是[CoreOS](https://coreos.com/). 提起 Docker我们不得不提的就是 [CoreOS](https://coreos.com/).
CoreOS对Docker甚至容器技术的发展都带来了巨大的推动作用。 CoreOS Docker 甚至容器技术的发展都带来了巨大的推动作用。
CoreOS是一种支持大规模服务部署的Linux系统。 CoreOS 是一种支持大规模服务部署的 Linux 系统。
CoreOS使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。 CoreOS 使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
CoreOS是一个新的Linux发行版。通过重构CoreOS提供了运行现代基础设施的特性。 CoreOS 是一个新的 Linux 发行版。通过重构CoreOS 提供了运行现代基础设施的特性。
CoreOS的这些策略和架构允许其它公司像GoogleFacebook和Twitter那样高弹性的运行自己得服务。 CoreOS 的这些策略和架构允许其它公司像 GoogleFacebook Twitter 那样高弹性的运行自己得服务。
CoreOS遵循Apache 2.0协议并且可以运行在现有的硬件或云提供商之上。 CoreOS 遵循 Apache 2.0 协议并且可以运行在现有的硬件或云提供商之上。
# CoreOS特性 # CoreOS特性
## 一个最小化操作系统 ## 一个最小化操作系统
CoreOS被设计成一个来构建你平台的最小化的现代操作系统。 CoreOS 被设计成一个来构建你平台的最小化的现代操作系统。
它比现有的Linux安装平均节省40%的RAM大约114M并允许从 PXE/iPXE 非常快速的启动。 它比现有的 Linux 安装平均节省 40% RAM大约 114M )并允许从 PXE/iPXE 非常快速的启动。
## 无痛更新 ## 无痛更新
利用主动和被动双分区方案来更新OS使用分区作为一个单元而不是一个包一个包得更新。 利用主动和被动双分区方案来更新 OS使用分区作为一个单元而不是一个包一个包得更新。
这使得每次更新变得快速,可靠,而且很容易回滚。 这使得每次更新变得快速,可靠,而且很容易回滚。
## Docker容器 ## Docker容器
应用作为Docker容器运行在CoreOS上。容器以包得形式提供最大得灵活性并且可以在几毫秒启动。 应用作为Docker容器运行在 CoreOS 上。容器以包得形式提供最大得灵活性并且可以在几毫秒启动。
## 支持集群 ## 支持集群
CoreOS可以在一个机器上很好地运行但是它被设计用来搭建集群。 CoreOS 可以在一个机器上很好地运行,但是它被设计用来搭建集群。
可以通过fleet很容易得使应用容器部署在多台机器上并且通过服务发现把他们连接在一起。 可以通过 fleet 很容易得使应用容器部署在多台机器上并且通过服务发现把他们连接在一起。
## 分布式系统工具 ## 分布式系统工具
@ -44,4 +44,4 @@ CoreOS可以在一个机器上很好地运行但是它被设计用来搭建
## 服务发现 ## 服务发现
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。在CoreOS中构建高可用和自动故障负载。 很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。在 CoreOS 中构建高可用和自动故障负载。

View File

@ -1,12 +1,12 @@
# CoreOS工具介绍 # CoreOS工具介绍
CoreOS提供了三大工具它们分别是服务发现容器管理和进程管理。 CoreOS 提供了三大工具,它们分别是:服务发现,容器管理和进程管理。
## 使用etcd服务发现 ## 使用etcd服务发现
CoreOS的第一个重要组件就是使用etcd来实现的服务发现。 CoreOS 的第一个重要组件就是使用 etcd 来实现的服务发现。
如果你使用默认的样例cloud-config文件那么etcd会在启动时自动运行。 如果你使用默认的样例 cloud-config 文件,那么 etcd 会在启动时自动运行。
例如: 例如:
@ -27,29 +27,29 @@ coreos:
discovery: https://discovery.etcd.io/<token> discovery: https://discovery.etcd.io/<token>
``` ```
配置文件里有一个token获取它可以通过如下方式 配置文件里有一个 token获取它可以通过如下方式
访问地址 访问地址
https://discovery.etcd.io/new https://discovery.etcd.io/new
你将会获取一个包含你得teoken得URL。 你将会获取一个包含你得 teoken 的 URL。
## 通过Docker进行容器管理 ## 通过Docker进行容器管理
第二个组件就是docker它用来运行你的代码和应用。 第二个组件就是 docker它用来运行你的代码和应用。
每一个CoreOS的机器上都安装了它具体使用请参考本书其他章节。 每一个 CoreOS 的机器上都安装了它,具体使用请参考本书其他章节。
## 使用fleet进行进程管理 ## 使用fleet进行进程管理
第三个CoreOS组件是fleet。 第三个 CoreOS 组件是 fleet。
它是集群的分布式初始化系统。你应该使用fleet来管理你的docker容器的生命周期。 它是集群的分布式初始化系统。你应该使用 fleet 来管理你的 docker 容器的生命周期。
Fleet通过接受systemd单元文件来工作同时在你集群的机器上通过单元文件中编写的偏好来对它们进行调度。 Fleet 通过接受 systemd 单元文件来工作,同时在你集群的机器上通过单元文件中编写的偏好来对它们进行调度。
首先让我们构建一个简单的可以运行docker容器的systemd单元。把这个文件保存在home目录并命名为hello.service 首先,让我们构建一个简单的可以运行 docker 容器的 systemd 单元。把这个文件保存在 home 目录并命名为 hello.service
```yml ```yml
hello.service hello.service
@ -101,4 +101,4 @@ Jun 04 19:05:06 core-01 bash[27503]: Hello World
fleetctl destroy hello.service fleetctl destroy hello.service
``` ```
至此就是CoreOS提供的三大工具。 至此,就是 CoreOS 提供的三大工具。

View File

@ -1,22 +1,22 @@
# 快速搭建CoreOS集群 # 快速搭建 CoreOS 集群
在这里我们要搭建一个集群环境,毕竟单机环境没有什么挑战不是? 在这里我们要搭建一个集群环境,毕竟单机环境没有什么挑战不是?
然后为了在你的电脑运行一个集群环境我们使用Vagrant。 然后为了在你的电脑运行一个集群环境,我们使用 Vagrant。
*Vagrant的使用这里不再阐述请自行学习* *Vagrant 的使用这里不再阐述,请自行学习*
如果你第一次接触CoreOS这样的分布式平台运行一个集群看起来好像一个很复杂的任务这里我们给你展示在本地快速搭建一个CoreOS集群环境是多么的容易。 如果你第一次接触 CoreOS 这样的分布式平台,运行一个集群看起来好像一个很复杂的任务,这里我们给你展示在本地快速搭建一个 CoreOS 集群环境是多么的容易。
## 准备工作 ## 准备工作
首先要确认在你本地的机器上已经安装了最新版本的Virtualbox, Vagrant 和 git。 首先要确认在你本地的机器上已经安装了最新版本的 Virtualbox, Vagrant 和 git。
这是我们可以在本地模拟集群环境的前提条件,如果你已经拥有,请继续,否则自行搜索学习。 这是我们可以在本地模拟集群环境的前提条件,如果你已经拥有,请继续,否则自行搜索学习。
## 配置工作 ## 配置工作
从CoreOS官方代码库获取基本配置并进行修改 CoreOS 官方代码库获取基本配置,并进行修改
首先,获取模板配置文件 首先,获取模板配置文件
@ -26,13 +26,13 @@ $ cd coreos-vagrant
$ cp user-data.sample user-data $ cp user-data.sample user-data
``` ```
获取新的token 获取新的 token
```bash ```bash
$ curl https://discovery.etcd.io/new $ curl https://discovery.etcd.io/new
``` ```
把获取的token放到user-data文件中示例如下 把获取的 token 放到 user-data 文件中,示例如下:
```yml ```yml
#cloud-config #cloud-config
@ -46,7 +46,7 @@ coreos:
默认情况下CoreOS Vagrantfile 将会启动单机。 默认情况下CoreOS Vagrantfile 将会启动单机。
我们需要复制并修改config.rb.sample文件. 我们需要复制并修改 config.rb.sample 文件.
复制文件 复制文件
@ -54,7 +54,7 @@ coreos:
cp config.rb.sample config.rb cp config.rb.sample config.rb
``` ```
修改集群配置参数num_instances为3。 修改集群配置参数 num_instances为3。
启动集群 启动集群
@ -72,7 +72,7 @@ Bringing machine 'core-03' up with 'virtualbox' provider...
core-01: Progress: 46% (Rate: 6105k/s, Estimated time remaining: 0:00:16) core-01: Progress: 46% (Rate: 6105k/s, Estimated time remaining: 0:00:16)
``` ```
添加ssh的公匙 添加 ssh 的公匙
```bash ```bash
ssh-add ~/.vagrant.d/insecure_private_key ssh-add ~/.vagrant.d/insecure_private_key
@ -86,7 +86,7 @@ vagrant ssh core-01 -- -A
## 测试集群 ## 测试集群
使用fleet来查看机器运行状况 使用 fleet 来查看机器运行状况
```bash ```bash
fleetctl list-machines fleetctl list-machines
@ -99,4 +99,4 @@ cb35b356... 172.17.8.103 -
如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。 如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。
那么之后你就可以基于CoreOS的三大工具做任务分发分布式存储等很多功能了。 那么之后你就可以基于 CoreOS 的三大工具做任务分发,分布式存储等很多功能了。

View File

@ -27,11 +27,9 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 `nginx` 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 `FROM` 就是指定**基础镜像**,因此一个 `Dockerfile``FROM` 是必备的指令,并且必须是第一条指令。 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 `nginx` 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 `FROM` 就是指定**基础镜像**,因此一个 `Dockerfile``FROM` 是必备的指令,并且必须是第一条指令。
在 [Docker Hub](https://hub.docker.com/explore/)[^1] 上有非常多的高质量的官方镜像, 在 [Docker Store](https://store.docker.com) 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://store.docker.com/images/nginx/)、[`redis`](https://store.docker.com/images/redis/)、[`mongo`](https://store.docker.com/images/mongo/)、[`mysql`](https://store.docker.com/images/mysql/)、[`httpd`](https://store.docker.com/images/httpd/)、[`php`](https://store.docker.com/images/php/)、[`tomcat`](https://store.docker.com/images/tomcat/) 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://store.docker.com/images/node)、[`openjdk`](https://store.docker.com/images/openjdk/)、[`python`](https://store.docker.com/images/python/)、[`ruby`](https://store.docker.com/images/ruby/)、[`golang`](https://store.docker.com/images/golang/) 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://hub.docker.com/_/nginx/)、[`redis`](https://hub.docker.com/_/redis/)、[`mongo`](https://hub.docker.com/_/mongo/)、[`mysql`](https://hub.docker.com/_/mysql/)、[`httpd`](https://hub.docker.com/_/httpd/)、[`php`](https://hub.docker.com/_/php/)、[`tomcat`](https://hub.docker.com/_/tomcat/) 等;
也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://hub.docker.com/_/node/)、[`openjdk`](https://hub.docker.com/_/openjdk/)、[`python`](https://hub.docker.com/_/python/)、[`ruby`](https://hub.docker.com/_/ruby/)、[`golang`](https://hub.docker.com/_/golang/) 等。 如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://store.docker.com/images/ubuntu/)、[`debian`](https://store.docker.com/images/debian/)、[`centos`](https://store.docker.com/images/centos/)、[`fedora`](https://store.docker.com/images/fedora/)、[`alpine`](https://store.docker.com/images/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://hub.docker.com/_/ubuntu/)、[`debian`](https://hub.docker.com/_/debian/)、[`centos`](https://hub.docker.com/_/centos/)、[`fedora`](https://hub.docker.com/_/fedora/)、[`alpine`](https://hub.docker.com/_/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。 除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
@ -221,8 +219,6 @@ $ docker build - < context.tar.gz
如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。 如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。
[^1]: [Docker Store](https://store.docker.com/)是发现公共Docker内容镜像发布和发行软件的新地方
# Docker 1.13+ # Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。 在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。

View File

@ -125,4 +125,4 @@ docker run --name web2 -d -p 81:80 nginx:v2
此外,使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为**黑箱镜像**,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 `docker diff` 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。 此外,使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为**黑箱镜像**,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 `docker diff` 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。 而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

View File

@ -28,6 +28,12 @@ ubuntu 14.04 1e0c3dd64ccd 4 weeks ago
```bash ```bash
$ docker system df $ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 24 0 1.992GB 1.992GB (100%)
Containers 1 0 62.82MB 62.82MB (100%)
Local Volumes 9 0 652.2MB 652.2MB (100%)
Build Cache 0B 0B
``` ```
### 虚悬镜像 ### 虚悬镜像

View File

@ -10,8 +10,8 @@ docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
具体的选项可以通过 `docker pull --help` 命令看到,这里我们说一下镜像名称的格式。 具体的选项可以通过 `docker pull --help` 命令看到,这里我们说一下镜像名称的格式。
* Docker Registry地址地址的格式一般是 `<域名/IP>[:端口号]`。默认地址是 Docker Hub。 * Docker Registry 地址:地址的格式一般是 `<域名/IP>[:端口号]`。默认地址是 Docker Hub。
* 仓库名:如之前所说,这里的仓库名是两段式名称, `<用户名>/<软件名>`。对于 Docker Hub如果不给出用户名则默认为 `library`,也就是官方镜像。 * 仓库名:如之前所说,这里的仓库名是两段式名称, `<用户名>/<软件名>`。对于 Docker Hub如果不给出用户名则默认为 `library`,也就是官方镜像。
比如: 比如:

View File

@ -13,14 +13,14 @@
[Homebrew](http://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker for Mac因此可以很方便的使用 Homebrew Cask 来进行安装: [Homebrew](http://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker for Mac因此可以很方便的使用 Homebrew Cask 来进行安装:
```bash ```bash
brew cask install docker $ brew cask install docker
``` ```
#### 手动下载安装 #### 手动下载安装
如果需要手动下载,可以通过这个链接下载:<https://download.docker.com/mac/stable/Docker.dmg> 如果需要手动下载,可以通过这个链接下载:<https://download.docker.com/mac/stable/Docker.dmg>
如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://blog.docker.com/2013/10/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间可能会询问系统密码)。 如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://blog.docker.com/2013/10/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间需要输入用户密码)。
<img src="_images/install-mac-dmg.png" width="80%" > <img src="_images/install-mac-dmg.png" width="80%" >

View File

@ -2,7 +2,7 @@
国内从 Docker Hub 拉取镜像有时会遇到困难此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: 国内从 Docker Hub 拉取镜像有时会遇到困难此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
* [Docker 官方提供的中国registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror) * [Docker 官方提供的中国 registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror)
* [阿里云加速器](https://cr.console.aliyun.com/#/accelerator) * [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)
* [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) * [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc)

View File

@ -6,13 +6,13 @@ Docker CE 支持 64 位版本的 Windows 10 Pro且必须开启 Hyper-V。
### 安装 ### 安装
点击以下链接下载 [stable](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) 或 [edge](https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe) 版本的 Docker CE。 点击以下链接下载 [Stable](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) 或 [Edge](https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe) 版本的 Docker CE。
下载好之后双击 Docker for Windows Installer.exe 开始安装。 下载好之后双击 Docker for Windows Installer.exe 开始安装。
### 运行 ### 运行
在 Windows 搜索栏 输入 Docker 点击 Docker for Windows 开始运行。 在 Windows 搜索栏输入 Docker 点击 Docker for Windows 开始运行。
![](_images/install-win-docker-app-search.png) ![](_images/install-win-docker-app-search.png)

View File

@ -1,6 +1,6 @@
## 什么是 Docker ## 什么是 Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟](https://www.opencontainers.org/)。 Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟OCI](https://www.opencontainers.org/)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持Google 也在其 PaaS 产品中广泛应用 Docker。 Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持Google 也在其 PaaS 产品中广泛应用 Docker。

View File

@ -18,7 +18,7 @@
对开发和运维([DevOps](https://zh.wikipedia.org/wiki/DevOps))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 对开发和运维([DevOps](https://zh.wikipedia.org/wiki/DevOps))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 [Dockerfile](https://docs.docker.com/engine/reference/builder/) 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 [Dockerfile](../image/dockerfile/) 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。
而且使用 `Dockerfile` 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。 而且使用 `Dockerfile` 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
@ -28,7 +28,7 @@
### 更轻松的维护和扩展 ### 更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术使得应用重复部分的复用更为容易也使得应用的维护更新更加简单基于基础镜像进一步扩展镜像也变得非常简单。此外Docker 团队同各个开源项目团队一起维护了一大批高质量的[官方镜像](https://hub.docker.com/explore/),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 Docker 使用的分层存储以及镜像的技术使得应用重复部分的复用更为容易也使得应用的维护更新更加简单基于基础镜像进一步扩展镜像也变得非常简单。此外Docker 团队同各个开源项目团队一起维护了一大批高质量的 [官方镜像](https://hub.docker.com/explore/),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
### 对比传统虚拟机总结 ### 对比传统虚拟机总结

View File

@ -1,57 +0,0 @@
## 仓库配置文件
Docker 的 Registry 利用配置文件提供了一些仓库的模板flavor用户可以直接使用它们来进行开发或生产部署。
### 模板
`config_sample.yml` 文件中,可以看到一些现成的模板段:
* `common`:基础配置
* `local`:存储数据到本地文件系统
* `s3`:存储数据到 AWS S3 中
* `dev`:使用 `local` 模板的基本配置
* `test`:单元测试使用
* `prod`生产环境配置基本上跟s3配置类似
* `gcs`:存储数据到 Google 的云存储
* `swift`:存储数据到 OpenStack Swift 服务
* `glance`:存储数据到 OpenStack Glance 服务,本地文件系统为后备
* `glance-swift`:存储数据到 OpenStack Glance 服务Swift 为后备
* `elliptics`:存储数据到 Elliptics key/value 存储
用户也可以添加自定义的模版段。
默认情况下使用的模板是 `dev`,要使用某个模板作为默认值,可以添加 `SETTINGS_FLAVOR` 到环境变量中,例如
```bash
export SETTINGS_FLAVOR=dev
```
另外,配置文件中支持从环境变量中加载值,语法格式为 `_env:VARIABLENAME[:DEFAULT]`
### 示例配置
```yml
common:
loglevel: info
search_backend: "_env:SEARCH_BACKEND:"
sqlalchemy_index_database:
"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"
prod:
loglevel: warn
storage: s3
s3_access_key: _env:AWS_S3_ACCESS_KEY
s3_secret_key: _env:AWS_S3_SECRET_KEY
s3_bucket: _env:AWS_S3_BUCKET
boto_bucket: _env:AWS_S3_BUCKET
storage_path: /srv/docker
smtp_host: localhost
from_addr: docker@myself.com
to_addr: my@myself.com
dev:
loglevel: debug
storage: local
storage_path: /home/myself/docker
test:
storage: local
storage_path: /tmp/tmpdockertmp
```
### 选项

View File

@ -1,7 +1,7 @@
## Docker Hub ## Docker Hub
目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。 目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
### 注册 ### 注册
你可以在 https://hub.docker.com 免费注册一个 Docker 账号。 你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。
### 登录 ### 登录
可以通过执行 `docker login` 命令交互式的输入用户名及密码来完成在命令行界面的登录。 可以通过执行 `docker login` 命令交互式的输入用户名及密码来完成在命令行界面的登录。
登录成功后,本地用户目录的 `.dockercfg` 中将保存用户的认证信息。 登录成功后,本地用户目录的 `.dockercfg` 中将保存用户的认证信息。

View File

@ -1,114 +0,0 @@
## 私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
本节介绍如何使用本地仓库。
`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库。
### 安装运行 docker-registry
#### 容器运行
在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。
```bash
$ docker run -d -p 5000:5000 registry
```
这将使用官方的 registry 镜像来启动本地的私有仓库。
用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。
```bash
$ docker run \
-e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \
-e STORAGE_PATH=/registry \
-e AWS_KEY=AKIAHSHB43HS3J92MXZ \
-e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \
-e SEARCH_BACKEND=sqlalchemy \
-p 5000:5000 \
registry
````
此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。
```bash
$ docker run -d \
-p 5000:5000 \
-v /home/user/registry-conf:/registry-conf \
-e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml \
registry
```
默认情况下,仓库会被创建在容器的 `/var/lib/registry `v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。
例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。
```bash
$ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
```
### 在私有仓库上传、下载、搜索镜像
创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000`
先在本机查看已有的镜像。
```bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
```
使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
```bash
$ docker tag ba58 192.168.7.26:5000/test
root ~ # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
使用 `docker push` 上传标记的镜像。
```bash
$ docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list
Pushing repository 192.168.7.26:5000/test (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 9bad880da3d2 already pushed, skipping
Image 25f11f5fb0cb already pushed, skipping
Image ebc34468f71d already pushed, skipping
Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
```
用 curl 查看仓库中的镜像。
```bash
$ curl http://192.168.7.26:5000/v1/search
{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
```
这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上传了。
现在可以到另外一台机器去下载这个镜像。
```bash
$ docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test
ba5877dc9bec: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25f11f5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
可以使用 `docker-compose push` 批量上传本地的镜像到私有 Docker 仓库,这里以 `127.0.0.1:5000` 为例:
编写 `docker-compose.yml` 文件
```yaml
version: "3.4"
services:
ubuntu:
image: 127.0.0.1:5000/ubuntu:latest
centos:
image: 127.0.0.1:5000/centos:centos7
```
在该文件路径下执行 `docker-compose push` 即可将上面的两个镜像上传到私有仓库中。

90
repository/registry.md Normal file
View File

@ -0,0 +1,90 @@
## 私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
本节介绍如何使用本地仓库。
`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 `docker-registry` v2。
### 安装运行 docker-registry
#### 容器运行
你可以通过获取官方 `registry` 镜像来运行。
```bash
$ docker run -d -p 5000:5000 --restart=always --name registry registry
```
这将使用官方的 registry 镜像来启动本地的私有仓库。默认情况下,仓库会被创建在容器的 `/var/lib/registry ` 下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 `/opt/data/registry` 目录。
```bash
$ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
```
### 在私有仓库上传、搜索、下载镜像
创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 `127.0.0.1:5000`
先在本机查看已有的镜像。
```bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
```
使用 `docker tag``ubuntu:latest` 这个镜像标记为 `127.0.0.1:5000/ubuntu:latest`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
```bash
$ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB
```
使用 `docker push` 上传标记的镜像。
```bash
$ docker push 127.0.0.1:5000/ubuntu:latest
The push refers to repository [127.0.0.1:5000/ubuntu]
373a30c24545: Pushed
a9148f5200b0: Pushed
cdd3de0940ab: Pushed
fc56279bbb33: Pushed
b38367233d37: Pushed
2aebd096e0e2: Pushed
latest: digest: sha256:fe4277621f10b5026266932ddf760f5a756d2facd505a94d2da12f4f52f71f5a size: 1568
```
`curl` 查看仓库中的镜像。
```bash
$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}
```
这里可以看到 `{"repositories":["ubuntu"]}`,表明镜像已经被成功上传了。
先删除已有镜像,再尝试去下载这个镜像。
```bash
$ docker rmi 127.0.0.1:5000/ubuntu:latest
$ docker pull 127.0.0.1:5000/ubuntu:latest
Pulling repository 127.0.0.1:5000/ubuntu:latest
ba5877dc9bec: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25f11f5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB
```