From d55dffa43b29b5241d6cabbdfa7e0cb8b7a34b79 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Fri, 30 Mar 2018 16:41:01 +0800 Subject: [PATCH] =?UTF-8?q?:bookmark:=20Docker=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/docker/README.md | 2 + docs/docker/advanced/docker-design.md | 24 +++++++ docs/docker/basics/docker-containers.md | 1 + docs/docker/basics/docker-dockerfile.md | 86 ++++++++++++++++++++++++ docs/docker/basics/docker-helloworld.md | 71 +++++++++++++++++++ docs/docker/basics/docker-services.md | 36 ++++++++++ docs/docker/docker-quickstart.md | 36 +++++++--- docs/docker/docker.xmind | Bin 136130 -> 203979 bytes 8 files changed, 245 insertions(+), 11 deletions(-) create mode 100644 docs/docker/basics/docker-containers.md create mode 100644 docs/docker/basics/docker-dockerfile.md create mode 100644 docs/docker/basics/docker-helloworld.md create mode 100644 docs/docker/basics/docker-services.md diff --git a/docs/docker/README.md b/docs/docker/README.md index 93afb51..b9d8c23 100644 --- a/docs/docker/README.md +++ b/docs/docker/README.md @@ -8,7 +8,9 @@ - [x] [Docker 快速指南](docker-quickstart.md) - [ ] 基础篇(basics) + - [x] [Docker 简介](basics/docker-introduction.md) - [x] [Docker 安装](basics/docker-install.md) + - [x] [Docker 之 Hello World](basics/docker-helloworld.md) - [ ] 配置(configuration) - [ ] 进阶篇(advanced) - [x] [Docker 的设计](advanced/docker-design.md) diff --git a/docs/docker/advanced/docker-design.md b/docs/docker/advanced/docker-design.md index 44551a2..88cad43 100644 --- a/docs/docker/advanced/docker-design.md +++ b/docs/docker/advanced/docker-design.md @@ -1,3 +1,23 @@ + + +- [Docker 的设计](#docker-%E7%9A%84%E8%AE%BE%E8%AE%A1) + - [Docker 架构](#docker-%E6%9E%B6%E6%9E%84) + - [Docker 守护进程(docker daemon)](#docker-%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%EF%BC%88docker-daemon%EF%BC%89) + - [Docker 客户端](#docker-%E5%AE%A2%E6%88%B7%E7%AB%AF) + - [Docker 注册中心](#docker-%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83) + - [Docker 对象](#docker-%E5%AF%B9%E8%B1%A1) + - [镜像](#%E9%95%9C%E5%83%8F) + - [容器](#%E5%AE%B9%E5%99%A8) + - [服务](#%E6%9C%8D%E5%8A%A1) + - [底层技术](#%E5%BA%95%E5%B1%82%E6%8A%80%E6%9C%AF) + - [命名空间](#%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4) + - [控制组](#%E6%8E%A7%E5%88%B6%E7%BB%84) + - [联合文件系统](#%E8%81%94%E5%90%88%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F) + - [容器格式](#%E5%AE%B9%E5%99%A8%E6%A0%BC%E5%BC%8F) + - [资料](#%E8%B5%84%E6%96%99) + + + # Docker 的设计 ## Docker 架构 @@ -71,3 +91,7 @@ Linux 上的 Docker Engine 也依赖于另一种称为控制组(`cgroups`) ### 容器格式 Docker 引擎将命名空间,控制组和 UnionFS 组合成一个名为容器格式的包装器。默认的容器格式是`libcontainer`。将来,Docker 可以通过与诸如 BSD Jails 或 Solaris Zones 等技术集成来支持其他容器格式。 + +## 资料 + +* https://docs.docker.com/engine/docker-overview/ diff --git a/docs/docker/basics/docker-containers.md b/docs/docker/basics/docker-containers.md new file mode 100644 index 0000000..9cb77ea --- /dev/null +++ b/docs/docker/basics/docker-containers.md @@ -0,0 +1 @@ +Docker 容器 \ No newline at end of file diff --git a/docs/docker/basics/docker-dockerfile.md b/docs/docker/basics/docker-dockerfile.md new file mode 100644 index 0000000..49ed570 --- /dev/null +++ b/docs/docker/basics/docker-dockerfile.md @@ -0,0 +1,86 @@ +# Dockerfile + +## 格式 + +Dockerfile 中,对于指令不区分大小写,但是推荐使用大写,来区别于参数。 + +Dockerfile 中,将按照指令(instruction)出现次序依次执行。**注意:Dockerfile 必须从 `FROM` 指令开始。** + +Dockerfile 中,将 `#` 开头的行作为注释,除非该行是有效的解析指令(parser directives)。一行中的 `#` 标记被视为参数。注释中不支持换行符。 + +示例: + +``` +# Comment +RUN echo 'we are running some # of cool things' +``` + +## 解析指令(parser directives) + +解析指令是可选的,并且会影响 Dockerfile 中后续行的处理方式。解析指令不会将图层添加到构建中,并且不会显示为构建步骤。解析指令以 `# directive=value` 的形式写入特殊类型的注释。单个指令只能使用一次。 + +一旦注释,空行或构建指令已被处理,Docker 不再查找解析指令。相反,它将任何符合解析指令格式的内容视为注释,不会尝试验证它是否可能是解析指令。因此,所有解析指令都必须位于Dockerfile 的最顶端。 + +解析指令不区分大小写。但是,约定是小写。约定还包括在任何解析指令之后的空白行。解析指令不支持续行符。 + +以下列举几个不合规范的示例。 + +因为续行符而无效: + +``` +# direc \ +tive=value +``` + +因为出现两次解析指令而无效: + +``` +# directive=value1 +# directive=value2 + +FROM ImageName +``` + +解析指令由于出现在构建指令后,而被视为注释: + +``` +FROM ImageName +# directive=value +``` + +解析指令由于出现在注释后,而被视为注释: + +``` +# About my dockerfile +# directive=value +FROM ImageName +``` + +因为无法识别,未知的指令被视为注释。此外,因为前一个未知指定被视为注释,后一个指令相当于出现在注释后,而也被视为了注释: + +``` +# unknowndirective=value +# knowndirective=value +``` + +解析器指令中允许使用非分行空白。因此,以下几行都是一致对待的: + +``` +#directive=value +# directive =value +# directive= value +# directive = value +# dIrEcTiVe=value +``` + +### escape + +``` +# escape=\ (backslash) +``` + +``` +# escape=` (backtick) +``` + +在 Dockerfile 中, \ No newline at end of file diff --git a/docs/docker/basics/docker-helloworld.md b/docs/docker/basics/docker-helloworld.md new file mode 100644 index 0000000..1c034cd --- /dev/null +++ b/docs/docker/basics/docker-helloworld.md @@ -0,0 +1,71 @@ +# Docker 之 Hello World + +## 前提 + +确保你的环境上已经成功安装 Docker。 + +## Hello World 实例 + +1. 使用 `docker version` 命令确保你的环境已成功安装 Docker。 + +``` +# docker version +Client: + Version: 1.13.1 + API version: 1.26 + Package version: + Go version: go1.8.3 + Git commit: 774336d/1.13.1 + Built: Wed Mar 7 17:06:16 2018 + OS/Arch: linux/amd64 + +Server: + Version: 1.13.1 + API version: 1.26 (minimum version 1.12) + Package version: + Go version: go1.8.3 + Git commit: 774336d/1.13.1 + Built: Wed Mar 7 17:06:16 2018 + OS/Arch: linux/amd64 + Experimental: false +``` + +2. 使用 `docker run` 命令运行 Hello World 镜像。 + +``` +docker run hello-world + +Unable to find image 'hello-world:latest' locally +latest: Pulling from library/hello-world +ca4f61b1923c: Pull complete +Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7 +Status: Downloaded newer image for hello-world:latest + +Hello from Docker! +This message shows that your installation appears to be working correctly. +... +``` + +3. 使用 `docker image ls`命令查看镜像 + +``` +docker image ls +REPOSITORY TAG IMAGE ID CREATED SIZE +docker.io/maven latest 76c9ab5df55b 7 days ago 737 MB +docker.io/python 2.7-slim 5541369755c4 13 days ago 139 MB +docker.io/hello-world latest f2a91732366c 4 months ago 1.85 kB +docker.io/java 8-jre e44d62cf8862 14 months ago 311 MB +docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB +``` + +4. 使用 `docker container ls --all` 命令查看容器 + +如果查看正在运行的容器,不需要添加 `--all` 参数。 + +``` +docker container ls --all +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +a661d957c6fa hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago mystifying_swartz +3098f24a1064 docker.io/hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago sad_yonath +4c98c4f18a39 hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago admiring_banach +``` \ No newline at end of file diff --git a/docs/docker/basics/docker-services.md b/docs/docker/basics/docker-services.md new file mode 100644 index 0000000..036a0fe --- /dev/null +++ b/docs/docker/basics/docker-services.md @@ -0,0 +1,36 @@ +# Docker 服务 + +## 关于服务 + +在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,如果您想象一个视频共享网站,它可能包含用于将应用程序数据存储在数据库中的服务,用户上传文件后在后台传输的服务,前端应用服务等等。 + +服务实际上只是“生产环境中的容器”。一个服务只运行一个镜像,但它需要制定镜像的运行方式 - 应该使用哪个端口,容器应该运行多少副本,以便服务具有所需的容量,以及等等。缩放服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多计算资源。 + +幸运的是,使用 Docker 平台定义,运行和扩展服务非常简单 - 只需编写一个 docker-compose.yml 文件即可。 + +## docker-compose.yml 文件 + +它是一个YAML文件,它定义了Docker容器在生产中的行为方式。 + + +``` +version: "3" +services: + web: + # replace username/repo:tag with your name and image details + image: username/repo:tag + deploy: + replicas: 5 + resources: + limits: + cpus: "0.1" + memory: 50M + restart_policy: + condition: on-failure + ports: + - "80:80" + networks: + - webnet +networks: + webnet: +``` \ No newline at end of file diff --git a/docs/docker/docker-quickstart.md b/docs/docker/docker-quickstart.md index 9617476..1ce21be 100644 --- a/docs/docker/docker-quickstart.md +++ b/docs/docker/docker-quickstart.md @@ -1,3 +1,24 @@ + + +- [Docker 快速指南](#docker-%E5%BF%AB%E9%80%9F%E6%8C%87%E5%8D%97) + - [Orientation](#orientation) + - [概念](#%E6%A6%82%E5%BF%B5) + - [Docker 的优点](#docker-%E7%9A%84%E4%BC%98%E7%82%B9) + - [容器和镜像](#%E5%AE%B9%E5%99%A8%E5%92%8C%E9%95%9C%E5%83%8F) + - [容器和虚拟机](#%E5%AE%B9%E5%99%A8%E5%92%8C%E8%99%9A%E6%8B%9F%E6%9C%BA) + - [Containers](#containers) + - [Dockerfile](#dockerfile) + - [创建并运行一个镜像](#%E5%88%9B%E5%BB%BA%E5%B9%B6%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E9%95%9C%E5%83%8F) + - [共享镜像](#%E5%85%B1%E4%BA%AB%E9%95%9C%E5%83%8F) + - [Services](#services) + - [Swarms](#swarms) + - [Stacks](#stacks) + - [Deploy](#deploy) + - [常用命令行](#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C) + - [资料](#%E8%B5%84%E6%96%99) + + + # Docker 快速指南 ## Orientation @@ -6,17 +27,6 @@ Docker 是一个让开发者或系统管理员使用容器来**开发**、**部署**和**运行**应用的平台。 -容器化即使用 linux 容器来部署应用。 - -#### Docker 的优点 - -* 灵活的:即使是最复杂的应用也可以容器化。 -* 轻量级:容器利用和共享主机内核。 -* 可交换:你可以随意部署更新和升级。 -* 可移植:你可以本地构建,部署到云端,并在任何地方运行。 -* 可扩展:你可以添加并自动分配容器拷贝。 -* 可堆叠:你可以随意垂直堆叠服务。 - #### 容器和镜像 镜像是一个可执行的包,这个包中含有运行一个应用所需要的一切:代码、运行环境、库、环境变量、配置文件。 @@ -227,3 +237,7 @@ docker tag username/repository:tag # 标记 以上传到注册 docker push username/repository:tag # 上传标记过的镜像到注册中心 docker run username/repository:tag # 运行一个注册中心上的镜像 ``` + +## 资料 + +* https://docs.docker.com/get-started/ diff --git a/docs/docker/docker.xmind b/docs/docker/docker.xmind index 76d249eecbee94c478e8113034704d8e907e6f62..e57d9582bdf2739857e70c353041f5b6178f1f7f 100644 GIT binary patch delta 28208 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