Merge branch 'master' into english

This commit is contained in:
Kang Huaishuai 2019-09-01 19:58:45 +08:00
commit 0699e96e36
69 changed files with 537 additions and 557 deletions

View File

@ -1,17 +1,15 @@
workspace: kind: pipeline
base: /srv/gitbook-src type: docker
path: . name: build
pipeline: steps:
build: - name: build
image: yeasy/docker_practice:latest image: yeasy/docker_practice:latest
# pull: true pull: if-not-exists # always never
environment: environment:
- TZ=Asia/Shanghai TZ: Asia/Shanghai
secrets: [key1, key2] commands:
commands: - docker-entrypoint.sh build
# - echo $${key1}
# - echo $KEY2 trigger:
- docker-entrypoint.sh build branch:
when: - master
event: [push, pull_request, tag, deployment]
branch: master

View File

@ -21,11 +21,11 @@ about: Create a report to help us improve
* [x] Others (Pls describe below) * [x] Others (Pls describe below)
### Docker Version ### Docker Version
<!--如果你的 Docker 版本低于 18.09 请尽可能升级到该版本保留你的 Docker 版本其他选项删除--> <!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本保留你的 Docker 版本其他选项删除-->
<!--if Docker version under 18.09, please upgrade Docker to 18.09--> <!--if Docker version under 19.03, please upgrade Docker to 19.03-->
* [x] Edge (v18.09) * [x] Edge (v19.03)
* [x] Stable (v18.09) * [x] Stable (v19.03)
* [x] 1.13.0 or Before * [x] 1.13.0 or Before
### Problem Description ### Problem Description

View File

@ -21,11 +21,11 @@ about: Create a issue about Docker
* [x] Others (Pls describe below) * [x] Others (Pls describe below)
### Docker Version ### Docker Version
<!--如果你的 Docker 版本低于 18.09 请尽可能升级到该版本保留你的 Docker 版本其他选项删除--> <!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本保留你的 Docker 版本其他选项删除-->
<!--if Docker version under 18.09, please upgrade Docker to 18.09--> <!--if Docker version under 19.03, please upgrade Docker to 19.03-->
* [x] Edge (v18.09) * [x] Edge (v19.03)
* [x] Stable (v18.09) * [x] Stable (v19.03)
* [x] 1.13.0 or Before * [x] 1.13.0 or Before
### Problem Description ### Problem Description

18
.github/workflows/ci.yaml vendored Normal file
View File

@ -0,0 +1,18 @@
on:
push:
pull_request:
name: CI
jobs:
build:
name: Build GitBook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: 2
- name: Build
uses: docker://yeasy/docker_practice
with:
args: build

View File

@ -17,14 +17,20 @@ script:
after_success: after_success:
- sudo chmod -R 777 _book - sudo chmod -R 777 _book
- echo "FROM nginx:1.13.8-alpine" >> Dockerfile
- echo "FROM nginx:alpine" >> Dockerfile
- echo "COPY _book /usr/share/nginx/html" >> Dockerfile - echo "COPY _book /usr/share/nginx/html" >> Dockerfile
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- docker build -t dockerpracticecn/docker_practice:us-en .
- docker run -dit --rm -p 4000:80 dockerpracticecn/docker_practice:us-en - docker build -t dockerpracticesig/docker_practice:us-en .
- docker run -dit --rm -p 4000:80 dockerpracticesig/docker_practice:us-en
- sleep 5 - sleep 5
- curl 127.0.0.1:4000 - curl 127.0.0.1:4000
- docker push dockerpracticecn/docker_practice:us-en
- docker push dockerpracticesig/docker_practice:us-en
- cd _book - cd _book
- git init - git init
- git remote add origin "$REPO" - git remote add origin "$REPO"

View File

@ -1,4 +1,4 @@
FROM node:9-alpine FROM node:alpine
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai

View File

@ -11,7 +11,7 @@
"-livereload", "-livereload",
"image-captions", "image-captions",
"github", "github",
"page-treeview", "page-treeview@2.9.8",
"editlink" "editlink"
], ],
"pluginsConfig": { "pluginsConfig": {

View File

@ -6,12 +6,14 @@ if [ $1 = "sh" ];then sh ; exit 0; fi
rm -rf node_modules _book rm -rf node_modules _book
cp -a . ../gitbook srcDir=$PWD
cd ../gitbook cp -a . /srv/gitbook
cd /srv/gitbook
main(){ main(){
if [ "$1" = build ];then gitbook build; cp -a _book ../gitbook-src; echo $START; date "+%F %T"; exit 0; fi if [ "$1" = build ];then gitbook build && cp -a _book $srcDir && echo $START && date "+%F %T" && exit 0; fi
exec gitbook serve exec gitbook serve
exit 0 exit 0
} }

View File

@ -1,10 +1,11 @@
## 主要修订记录 ## 主要修订记录
* 1.1.0 2019-06-30 * 1.1.0 2019-12-31
* 全面支持 v19.x 新版本
* 增加 `BuildKit` * 增加 `BuildKit`
* 增加 `docker manifest` 命令使用说明 * 增加 `docker manifest` 命令使用说明
* 移除 `Ubuntu 14.04` `Debian 8` `Debian 7` * 移除 `Ubuntu 14.04` `Debian 8` `Debian 7`
* 1.0.0: 2018-12-31 * 1.0.0: 2018-12-31
* 全面支持 v18.x 新版本 * 全面支持 v18.x 新版本
* 添加如何调试 Docker * 添加如何调试 Docker

View File

@ -4,15 +4,22 @@
**v1.1.0** **v1.1.0**
| 语言 | 构建状态 | - |
| :------------- | :------------- | :--- |
| [zh-hans](https://github.com/yeasy/docker_practice) | [![](https://travis-ci.org/yeasy/docker_practice.svg?branch=master)](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/) |
| [us-en](https://github.com/yeasy/docker_practice/tree/english) | [![](https://travis-ci.org/yeasy/docker_practice.svg?branch=english)](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/us_en) |
| [zh-hant](https://github.com/yeasy/docker_practice/tree/zh-Hant) | [![](https://travis-ci.org/yeasy/docker_practice.svg?branch=zh-hant)](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/zh_hant) |
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松 [Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
无论是应用开发者运维人员还是其他信息技术从业人员都有必要认识和掌握 Docker节约有限的生命 无论是应用开发者运维人员还是其他信息技术从业人员都有必要认识和掌握 Docker节约有限的生命
本书既适用于具备基础 Linux 知识的 Docker 初学者也希望可供理解原理和实现的高级用户参考同时书中给出的实践案例可供在进行实际部署时借鉴前六章为基础内容供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍包括数据管理网络等高级操作 10 ~ 13 章介绍了容器生态中的几个核心项目1415 章讨论了关于 Docker 安全和实现技术等高级话题后续章节则分别介绍包括 EtcdCoreOSKubernetesMesos容器云等相关热门开源项目最后还展示了使用容器技术的典型的应用场景和实践案例 本书既适用于具备基础 Linux 知识的 Docker 初学者也希望可供理解原理和实现的高级用户参考同时书中给出的实践案例可供在进行实际部署时借鉴前六章为基础内容供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍包括数据管理网络等高级操作 10 ~ 13 章介绍了容器生态中的几个核心项目1415 章讨论了关于 Docker 安全和实现技术等高级话题后续章节则分别介绍包括 EtcdCoreOSKubernetesMesos容器云等相关热门开源项目最后还展示了使用容器技术的典型的应用场景和实践案例
* 在线阅读[GitBook](https://yeasy.gitbooks.io/docker_practice/content/)[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)[国内镜像](https://github.com/yeasy/docker_practice/wiki/%E9%A1%B9%E7%9B%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F) * 在线阅读[GitBook](https://yeasy.gitbooks.io/docker_practice/content/)[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)[GitBook 国内镜像](https://docker_practice.gitee.io/)[GitBook 英文版国内镜像](https://docker_practice.gitee.io/us_en)[国内镜像](https://github.com/yeasy/docker_practice/wiki/%E9%A1%B9%E7%9B%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F)
* 下载[pdf](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD), [epub](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD) * 下载[pdf](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD)[epub](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD)
* [离线阅读](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3) * [离线阅读 `$ docker run -it --rm -p 4000:80 dockerpracticesig/docker_practice`](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
* [英文翻译](https://github.com/yeasy/docker_practice/issues/363)
Docker 自身仍在快速发展中生态环境也在蓬勃成长建议初学者使用最新稳定版本的 Docker 进行学习实践欢迎 [参与项目维护](CONTRIBUTING.md) Docker 自身仍在快速发展中生态环境也在蓬勃成长建议初学者使用最新稳定版本的 Docker 进行学习实践欢迎 [参与项目维护](CONTRIBUTING.md)

View File

@ -144,8 +144,10 @@
* [CentOS Fedora](cases/os/centos.md) * [CentOS Fedora](cases/os/centos.md)
* [SUMMARY](cases/os/summary.md) * [SUMMARY](cases/os/summary.md)
* [CI/CD](cases/ci/README.md) * [CI/CD](cases/ci/README.md)
* [Drone](cases/ci/drone.md) * [GitHub Actions](cases/ci/actions/README.md)
* [Travis CI](cases/ci/travis.md) * [Drone](cases/ci/drone/README.md)
* [Install Drone](cases/ci/drone/install.md)
* [Travis CI](cases/ci/travis/README.md)
* [Docker Open Source](opensource/README.md) * [Docker Open Source](opensource/README.md)
* [LinuxKit](opensource/linuxkit.md) * [LinuxKit](opensource/linuxkit.md)
* [Appendix](appendix/README.md) * [Appendix](appendix/README.md)

View File

@ -4,7 +4,7 @@
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。 [Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
该仓库位于 `https://hub.docker.com/_/nginx/` 提供了 Nginx 1.0 ~ 1.15.x 各个版本的镜像 该仓库位于 `https://hub.docker.com/_/nginx/` 提供了 Nginx 1.0 ~ 1.17.x 各个版本的镜像
### 使用方法 ### 使用方法

View File

@ -4,7 +4,7 @@
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。 [Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
该仓库位于 `https://hub.docker.com/_/node/` 提供了 Node.js 0.10 ~ 11.x 各个版本的镜像 该仓库位于 `https://hub.docker.com/_/node/` 提供了 Node.js 0.10 ~ 12.x 各个版本的镜像
### 使用方法 ### 使用方法

View File

@ -4,7 +4,7 @@
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。 [Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
该仓库位于 `https://hub.docker.com/_/ubuntu/` 提供了 Ubuntu 12.04 ~ 18.04 各个版本的镜像 该仓库位于 `https://hub.docker.com/_/ubuntu/` 提供了 Ubuntu 12.04 ~ 19.04 各个版本的镜像
### 使用方法 ### 使用方法

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

View File

@ -0,0 +1,28 @@
# GitHub Actions
GitGub Actions GitHub 推出的一款 CI/CD 工具
我们可以在每个 job step 中使用 Docker 执行构建步骤
```yaml
on: push
name: CI
jobs:
my-job:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: 2
- name: run docker container
uses: docker://golang:alpine
with:
args: go version
```
## 参考资料
* [Actions Docs](https://help.github.com/en/categories/automating-your-workflow-with-github-actions)

View File

@ -1,17 +0,0 @@
workspace:
base: /srv/drone-demo
path: .
pipeline:
build:
image: golang:alpine
# pull: true
environment:
- KEY=VALUE
secrets: [key1, key2]
commands:
# - echo $$KEY
- pwd
- ls
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
- ./app

View File

@ -1,35 +0,0 @@
version: '3'
services:
drone-server:
image: drone/drone:0.8-alpine
ports:
- 443:443
# - "${PRO_PUBLIC_IP}:8000:8000"
volumes:
- drone-data:/var/lib/drone/:rw
# - ${SSL_PATH}:/etc/certs
restart: always
environment:
- DRONE_SECRET=drone
- DRONE_OPEN=false
- DRONE_ADMIN=GITHUB_SERNAME
- DRONE_HOST=https://drone.yeasy.com
- DRONE_GITHUB=true
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT_PRO}
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET_PRO}
drone-agent:
image: drone/agent:0.8-alpine
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_SECRET=drone
- DRONE_SERVER=drone-server:9000
dns: 114.114.114.114
volumes:
drone-data:

View File

@ -1,183 +0,0 @@
## Drone
基于 `Docker` `CI/CD` 工具 `Drone` 所有编译测试的流程都在 `Docker` 容器中进行
开发者只需在项目中包含 `.drone.yml` 文件将代码推送到 git 仓库`Drone` 就能够自动化的进行编译测试发布
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程当然在实际开发过程中你的代码也许不在 GitHub 托管那么你可以尝试使用 `Gogs` + `Drone` 来进行 `CI/CD`
### 要求
* 拥有公网 IP域名 (如果你不满足要求可以尝试在本地使用 Gogs + Drone)
* 域名 SSL 证书 (目前国内有很多云服务商提供免费证书)
* 熟悉 `Docker` 以及 `Docker Compose`
* 熟悉 `Git` 基本命令
* `CI/CD` 有一定了解
### 新建 GitHub 应用
登录 GitHub https://github.com/settings/applications/new 新建一个应用。
![](../.image/drone-github.png)
接下来查看这个应用的详情记录 `Client ID` `Client Secret`之后配置 Drone 会用到
### 配置 Drone
我们通过使用 `Docker Compose` 来启动 `Drone`编写 `docker-compose.yml` 文件
```yaml
version: '3'
services:
drone-server:
image: drone/drone:0.8-alpine
ports:
- 443:443
# - "${PRO_PUBLIC_IP}:8000:8000"
volumes:
- drone-data:/var/lib/drone/:rw
- ${SSL_PATH}:/etc/certs:rw
restart: always
environment:
- DRONE_SECRET=drone
- DRONE_OPEN=false
- DRONE_ADMIN=${GITHUB_SERNAME}
- DRONE_HOST=${DRONE_HOST}
- DRONE_GITHUB=true
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
- DRONE_SERVER_CERT=/etc/certs/drone.domain.com.crt
- DRONE_SERVER_KEY=/etc/certs/drone.domain.com.key
drone-agent:
image: drone/agent:0.8-alpine
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_SECRET=drone
- DRONE_SERVER=drone-server:9000
dns: 114.114.114.114
volumes:
drone-data:
```
替换 `${SSL_PATH}` 为你网站的 SSL 证书路径
替换 `${GITHUB_SERNAME}` 为你 GitHub 的用户名该用户将成为 Drone 的管理员
替换 `${DRONE_HOST}` 为你部署 Drone 的域名
替换 `${DRONE_GITHUB_CLIENT}` 为你 GitHub 应用的 `Client ID`
替换 `${DRONE_GITHUB_SECRET}` 为你 GitHub 应用的 `Client Secret`
*注意* 如果你的服务器占用了 `443` 端口请配置 Nginx 代理这里不再赘述
#### 启动 Drone
```bash
$ docker-compose up -d
```
### Drone 关联项目
Github 新建一个名为 `drone-demo` 的仓库
打开我们已经部署好的 Drone 网站使用 GitHub 账号登录在界面中关联刚刚新建的 `drone-demo` 仓库
### 编写项目源代码
在本机初始化一个 git 仓库
```bash
$ mkdir drone-demo
$ cd drone-demo
$ git init
$ git remote add origin git@github.com:username/drone-demo.git
```
这里以一个简单的 `Go` 程序为例该程序输出 `Hello World!`
编写 `app.go` 文件
```go
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}
```
编写 `.drone.yml` 文件
```yaml
workspace:
base: /srv/drone-demo
path: .
pipeline:
build:
image: golang:alpine
# pull: true
environment:
- KEY=VALUE
secrets: [key1, key2]
commands:
- echo $$KEY
- pwd
- ls
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
- ./app
```
`workspace` 指明 git 源代码克隆的目标路径本例中 git 源代码将被克隆到 golang 容器中的 `/srv/drone-demo` 目录中
`pipeline` 指明构建所需的 Docker 镜像环境变量编译指令等
现在目录结构如下
```bash
.
.drone.yml
app.go
```
### 推送项目源代码到 GitHub
```bash
$ git add .
$ git commit -m "test drone ci"
$ git push origin master
```
### 查看项目构建过程及结果
打开我们部署好的 `Drone` 网站即可看到构建结果
![](../.image/drone-build.png)
当然我们也可以把构建结果上传到 GitHubDocker Registry云服务商提供的对象存储或者生产环境中
本书 GitBook 也使用 Drone 进行 CI/CD具体配置信息请查看本书根目录 [`.drone.yml`](https://github.com/yeasy/docker_practice/blob/master/.drone.yml) 文件。
## 参考链接
* [Drone Github](https://github.com/drone/drone)
* [Drone 文档](http://docs.drone.io/)

View File

@ -0,0 +1,6 @@
DRONE_SERVER_HOST=
DRONE_SERVER_PROTO=
DRONE_RPC_SECRET=
HOSTNAME=
DRONE_GITHUB_CLIENT_ID=
DRONE_GITHUB_CLIENT_SECRET=

2
cases/ci/drone/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.env
ssl/*

99
cases/ci/drone/README.md Normal file
View File

@ -0,0 +1,99 @@
# Drone
基于 `Docker` `CI/CD` 工具 `Drone` 所有编译测试的流程都在 `Docker` 容器中进行
开发者只需在项目中包含 `.drone.yml` 文件将代码推送到 git 仓库`Drone` 就能够自动化的进行编译测试发布
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程当然在实际开发过程中你的代码也许不在 GitHub 托管那么你可以尝试使用 `Gogs` + `Drone` 来进行 `CI/CD`
## Drone 关联项目
Github 新建一个名为 `drone-demo` 的仓库
打开我们已经 [部署好的 Drone 网站](install.md) 或者 [Drone Cloud](https://cloud.drone.io),使用 GitHub 账号登录,在界面中关联刚刚新建的 `drone-demo` 仓库。
## 编写项目源代码
初始化一个 git 仓库
```bash
$ mkdir drone-demo
$ cd drone-demo
$ git init
$ git remote add origin git@github.com:username/drone-demo.git
```
这里以一个简单的 `Go` 程序为例该程序输出 `Hello World!`
编写 `app.go` 文件
```go
package main
import "fmt"
func main(){
fmt.Printf("Hello World!\n");
}
```
编写 `.drone.yml` 文件
```yaml
kind: pipeline
type: docker
name: build
steps:
- name: build
image: golang:alpine
pull: if-not-exists # always never
environment:
KEY: VALUE
commands:
- echo $KEY
- pwd
- ls
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
- ./app
trigger:
branch:
- master
```
现在目录结构如下
```bash
.
.drone.yml
app.go
```
## 推送项目源代码到 GitHub
```bash
$ git add .
$ git commit -m "test drone ci"
$ git push origin master
```
## 查看项目构建过程及结果
打开我们部署好的 `Drone` 网站或者 Drone Cloud即可看到构建结果
![](../.image/drone-build.png)
当然我们也可以把构建结果上传到 GitHubDocker Registry云服务商提供的对象存储或者生产环境中
本书 GitBook 也使用 Drone 进行 CI/CD具体配置信息请查看本书根目录 [`.drone.yml`](https://github.com/yeasy/docker_practice/blob/master/.drone.yml) 文件。
## 参考链接
* [Drone Github](https://github.com/drone/drone)
* [Drone 文档](http://docs.drone.io/)
* [Drone 示例](https://github.com/docker-practice/drone-demo)

View File

@ -0,0 +1,19 @@
kind: pipeline
type: docker
name: build
steps:
- name: build
image: golang:alpine
pull: if-not-exists # always never
environment:
KEY: VALUE
commands:
- echo $KEY
- pwd
- ls
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
- ./app
trigger:
branch:
- master

View File

@ -0,0 +1 @@
# Drone Demo

View File

@ -3,5 +3,5 @@ package main
import "fmt" import "fmt"
func main(){ func main(){
fmt.Printf("Hello World!"); fmt.Printf("Hello World!\n");
} }

View File

@ -0,0 +1,39 @@
version: '3'
services:
drone-server:
image: drone/drone:1
ports:
- 443:443
- 80:80
volumes:
- drone-data:/data:rw
- ./ssl:/etc/certs
restart: always
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-drone.domain.com}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
drone-agent:
image: drone/agent:1
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_RUNNER_NAME=${HOSTNAME:-demo}
- DRONE_RUNNER_CAPACITY=2
dns: 114.114.114.114
volumes:
drone-data:

87
cases/ci/drone/install.md Normal file
View File

@ -0,0 +1,87 @@
# 部署 Drone
## 要求
* 拥有公网 IP域名 (如果你不满足要求可以尝试在本地使用 Gogs + Drone)
* 域名 SSL 证书 (目前国内有很多云服务商提供免费证书)
* 熟悉 `Docker` 以及 `Docker Compose`
* 熟悉 `Git` 基本命令
* `CI/CD` 有一定了解
## 新建 GitHub 应用
登录 GitHub https://github.com/settings/applications/new 新建一个应用。
![](https://docs.drone.io/screenshots/github_application_create.png)
接下来查看这个应用的详情记录 `Client ID` `Client Secret`之后配置 Drone 会用到
## 配置 Drone
我们通过使用 `Docker Compose` 来启动 `Drone`编写 `docker-compose.yml` 文件
```yaml
version: '3'
services:
drone-server:
image: drone/drone:1
ports:
- 443:443
- 80:80
volumes:
- drone-data:/data:rw
- ./ssl:/etc/certs
restart: always
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-https://drone.yeasy.com}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
drone-agent:
image: drone/agent:1
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_RUNNER_NAME=${HOSTNAME:-demo}
- DRONE_RUNNER_CAPACITY=2
dns: 114.114.114.114
volumes:
drone-data:
```
新建 `.env` 文件输入变量及其值
```bash
# 必填 服务器地址例如 drone.domain.com
DRONE_SERVER_HOST=
DRONE_SERVER_PROTO=https
DRONE_RPC_SECRET=secret
HOSTNAME=demo
# 必填 GitHub 应用页面查看
DRONE_GITHUB_CLIENT_ID=
# 必填 GitHub 应用页面查看
DRONE_GITHUB_CLIENT_SECRET=
```
### 启动 Drone
```bash
$ docker-compose up -d
```

View File

@ -1,6 +1,7 @@
## Compose 命令说明 ## Compose 命令说明
### 命令对象与格式 ### 命令对象与格式
对于 Compose 来说大部分命令的对象既可以是项目本身也可以指定为项目中的服务或者容器如果没有特别的说明命令对象将是项目这意味着项目中所有的服务都会受到命令影响 对于 Compose 来说大部分命令的对象既可以是项目本身也可以指定为项目中的服务或者容器如果没有特别的说明命令对象将是项目这意味着项目中所有的服务都会受到命令影响
执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式 执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式
@ -66,6 +67,7 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
列出 Compose 文件中包含的镜像 列出 Compose 文件中包含的镜像
#### `kill` #### `kill`
格式为 `docker-compose kill [options] [SERVICE...]` 格式为 `docker-compose kill [options] [SERVICE...]`
通过发送 `SIGKILL` 信号来强制停止服务容器 通过发送 `SIGKILL` 信号来强制停止服务容器
@ -77,6 +79,7 @@ $ docker-compose kill -s SIGINT
``` ```
#### `logs` #### `logs`
格式为 `docker-compose logs [options] [SERVICE...]` 格式为 `docker-compose logs [options] [SERVICE...]`
查看服务容器的输出默认情况下docker-compose 将对不同的服务输出使用不同的颜色来区分可以通过 `--no-color` 来关闭颜色 查看服务容器的输出默认情况下docker-compose 将对不同的服务输出使用不同的颜色来区分可以通过 `--no-color` 来关闭颜色
@ -84,11 +87,13 @@ $ docker-compose kill -s SIGINT
该命令在调试问题的时候十分有用 该命令在调试问题的时候十分有用
#### `pause` #### `pause`
格式为 `docker-compose pause [SERVICE...]` 格式为 `docker-compose pause [SERVICE...]`
暂停一个服务容器 暂停一个服务容器
#### `port` #### `port`
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT` 格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`
打印某个容器端口所映射的公共端口 打印某个容器端口所映射的公共端口
@ -100,6 +105,7 @@ $ docker-compose kill -s SIGINT
* `--index=index` 如果同一服务存在多个容器指定命令对象容器的序号默认为 1 * `--index=index` 如果同一服务存在多个容器指定命令对象容器的序号默认为 1
#### `ps` #### `ps`
格式为 `docker-compose ps [options] [SERVICE...]` 格式为 `docker-compose ps [options] [SERVICE...]`
列出项目中目前的所有容器 列出项目中目前的所有容器
@ -109,6 +115,7 @@ $ docker-compose kill -s SIGINT
* `-q` 只打印容器的 ID 信息 * `-q` 只打印容器的 ID 信息
#### `pull` #### `pull`
格式为 `docker-compose pull [options] [SERVICE...]` 格式为 `docker-compose pull [options] [SERVICE...]`
拉取服务依赖的镜像 拉取服务依赖的镜像
@ -122,6 +129,7 @@ $ docker-compose kill -s SIGINT
推送服务依赖的镜像到 Docker 镜像仓库 推送服务依赖的镜像到 Docker 镜像仓库
#### `restart` #### `restart`
格式为 `docker-compose restart [options] [SERVICE...]` 格式为 `docker-compose restart [options] [SERVICE...]`
重启项目中的服务 重启项目中的服务
@ -131,6 +139,7 @@ $ docker-compose kill -s SIGINT
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时默认为 10 * `-t, --timeout TIMEOUT` 指定重启前停止容器的超时默认为 10
#### `rm` #### `rm`
格式为 `docker-compose rm [options] [SERVICE...]` 格式为 `docker-compose rm [options] [SERVICE...]`
删除所有停止状态的服务容器推荐先执行 `docker-compose stop` 命令来停止容器 删除所有停止状态的服务容器推荐先执行 `docker-compose stop` 命令来停止容器
@ -195,6 +204,7 @@ $ docker-compose run --no-deps web python manage.py shell
* `-T` 不分配伪 tty意味着依赖 tty 的指令将无法运行 * `-T` 不分配伪 tty意味着依赖 tty 的指令将无法运行
#### `scale` #### `scale`
格式为 `docker-compose scale [options] [SERVICE=NUM...]` 格式为 `docker-compose scale [options] [SERVICE=NUM...]`
设置指定服务运行的容器个数 设置指定服务运行的容器个数
@ -214,11 +224,13 @@ $ docker-compose scale web=3 db=2
* `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10 * `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10
#### `start` #### `start`
格式为 `docker-compose start [SERVICE...]` 格式为 `docker-compose start [SERVICE...]`
启动已经存在的服务容器 启动已经存在的服务容器
#### `stop` #### `stop`
格式为 `docker-compose stop [options] [SERVICE...]` 格式为 `docker-compose stop [options] [SERVICE...]`
停止已经处于运行状态的容器但不删除它通过 `docker-compose start` 可以再次启动这些容器 停止已经处于运行状态的容器但不删除它通过 `docker-compose start` 可以再次启动这些容器
@ -232,11 +244,13 @@ $ docker-compose scale web=3 db=2
查看各个服务容器内运行的进程 查看各个服务容器内运行的进程
#### `unpause` #### `unpause`
格式为 `docker-compose unpause [SERVICE...]` 格式为 `docker-compose unpause [SERVICE...]`
恢复处于暂停状态中的服务 恢复处于暂停状态中的服务
#### `up` #### `up`
格式为 `docker-compose up [options] [SERVICE...]` 格式为 `docker-compose up [options] [SERVICE...]`
该命令十分强大它将尝试自动完成包括构建镜像重新创建服务启动服务并关联服务相关容器的一系列操作 该命令十分强大它将尝试自动完成包括构建镜像重新创建服务启动服务并关联服务相关容器的一系列操作
@ -270,6 +284,11 @@ $ docker-compose scale web=3 db=2
* `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10 * `-t, --timeout TIMEOUT` 停止容器时候的超时默认为 10
#### `version` #### `version`
格式为 `docker-compose version` 格式为 `docker-compose version`
打印版本信息 打印版本信息
### 参考资料
* [官方文档](https://docs.docker.com/compose/reference/overview/)

View File

@ -18,7 +18,7 @@ services:
注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令需要 Dockerfile等来自动构建生成镜像 注意每个服务都必须通过 `image` 指令指定镜像或 `build` 指令需要 Dockerfile等来自动构建生成镜像
如果使用 `build` 指令 `Dockerfile` 中设置的选项(例如`CMD`, `EXPOSE`, `VOLUME`, `ENV` ) 将会自动被获取无需在 `docker-compose.yml` 再次设置 如果使用 `build` 指令 `Dockerfile` 中设置的选项(例如`CMD`, `EXPOSE`, `VOLUME`, `ENV` ) 将会自动被获取无需在 `docker-compose.yml` 重复设置
下面分别介绍各个指令的用法 下面分别介绍各个指令的用法
@ -460,7 +460,7 @@ sysctls:
### `volumes` ### `volumes`
数据卷所挂载路径设置可以设置宿主机路径 `HOST:CONTAINER` 或加上访问模式 `HOST:CONTAINER:ro` 数据卷所挂载路径设置可以设置为宿主机路径(`HOST:CONTAINER`)或者数据卷名称(`VOLUME:CONTAINER`)并且可以设置访问模式 `HOST:CONTAINER:ro`
该指令中路径支持相对路径 该指令中路径支持相对路径
@ -471,6 +471,21 @@ volumes:
- ~/configs:/etc/configs/:ro - ~/configs:/etc/configs/:ro
``` ```
如果路径为数据卷名称必须在文件中配置数据卷
```yaml
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
```
### 其它指令 ### 其它指令
此外还有包括 `domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir` 等指令基本跟 `docker run` 中对应参数的功能一致 此外还有包括 `domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir` 等指令基本跟 `docker run` 中对应参数的功能一致
@ -557,3 +572,7 @@ MONGO_VERSION=3.6
``` ```
执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器 执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器
### 参考资料
* [官方文档](https://docs.docker.com/compose/compose-file/)

View File

@ -1 +1,2 @@
django_example django_example
manage.py

View File

@ -6,7 +6,7 @@ services:
web: web:
build: . build: .
command: python3 manage.py runserver 0.0.0.0:8000 command: python manage.py runserver 0.0.0.0:8000
volumes: volumes:
- .:/code - .:/code
ports: ports:

View File

@ -1,22 +0,0 @@
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_example.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)

View File

@ -1,2 +1,2 @@
Django>=1.8,<2.0 Django>=2.0,<3.0
psycopg2 psycopg2>=2.7,<3.0

View File

@ -2,7 +2,11 @@ version: "3"
services: services:
db: db:
image: mysql:5.7 image: mysql:8.0
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes: volumes:
- db_data:/var/lib/mysql - db_data:/var/lib/mysql
restart: always restart: always

View File

@ -13,18 +13,18 @@ FROM python:3
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
RUN mkdir /code RUN mkdir /code
WORKDIR /code WORKDIR /code
ADD requirements.txt /code/ COPY requirements.txt /code/
RUN pip install -r requirements.txt RUN pip install -r requirements.txt
ADD . /code/ COPY . /code/
``` ```
以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像更多关于如何编写 `Dockerfile` 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) [ Dockerfile 使用](../dockerfile/README.md) 以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像更多关于如何编写 `Dockerfile` 文件的信息可以查看 [ Dockerfile 使用](../image/dockerfile/README.md)
第二步 `requirements.txt` 文件里面写明需要安装的具体依赖包名 第二步 `requirements.txt` 文件里面写明需要安装的具体依赖包名
```bash ```bash
Django>=1.8,<2.0 Django>=2.0,<3.0
psycopg2 psycopg2>=2.7,<3.0
``` ```
第三步`docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库使用的 Docker 镜像镜像之间的连接挂载到容器的卷以及服务开放的端口 第三步`docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库使用的 Docker 镜像镜像之间的连接挂载到容器的卷以及服务开放的端口
@ -38,7 +38,7 @@ services:
web: web:
build: . build: .
command: python3 manage.py runserver 0.0.0.0:8000 command: python manage.py runserver 0.0.0.0:8000
volumes: volumes:
- .:/code - .:/code
ports: ports:
@ -47,15 +47,15 @@ services:
- db - db
``` ```
查看 [`docker-compose.yml` 章节](yml_ref.md) 了解更多详细的工作机制 查看 [`docker-compose.yml` 章节](compose_file.md) 了解更多详细的工作机制
现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了 现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了
```bash ```bash
$ docker-compose run web django-admin.py startproject django_example . $ docker-compose run web django-admin startproject django_example .
``` ```
Compose 先使用 `Dockerfile` web 服务建一个镜像接着使用这个镜像在容器里运行 `django-admin.py startproject django_example` 指令 由于 web 服务所使用的镜像并不存在所以 Compose 先使用 `Dockerfile` web 服务建一个镜像接着使用这个镜像在容器里运行 `django-admin startproject django_example` 指令
这将在当前目录生成一个 `Django` 应用 这将在当前目录生成一个 `Django` 应用
@ -67,7 +67,7 @@ Dockerfile docker-compose.yml django_example manage.py
如果你的系统是 Linux,记得更改文件权限 如果你的系统是 Linux,记得更改文件权限
```bash ```bash
sudo chown -R $USER:$USER . $ sudo chown -R $USER:$USER .
``` ```
首先我们要为应用设置好数据库的连接信息用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容 首先我们要为应用设置好数据库的连接信息用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容

View File

@ -4,14 +4,12 @@
`Compose` 可以通过 Python 的包管理工具 `pip` 进行安装也可以直接下载编译好的二进制文件使用甚至能够直接在 Docker 容器中运行 `Compose` 可以通过 Python 的包管理工具 `pip` 进行安装也可以直接下载编译好的二进制文件使用甚至能够直接在 Docker 容器中运行
前两种方式是传统方式适合本地环境下安装使用最后一种方式则不破坏系统环境更适合云计算场景 `Docker Desktop for Mac/Windows` 自带 `docker-compose` 二进制文件安装 Docker 之后可以直接使用
`Docker for Mac` `Docker for Windows` 自带 `docker-compose` 二进制文件安装 Docker 之后可以直接使用
```bash ```bash
$ docker-compose --version $ docker-compose --version
docker-compose version 1.17.1, build 6d101fb docker-compose version 1.24.1, build 4667896b
``` ```
Linux 系统请使用以下介绍的方法安装 Linux 系统请使用以下介绍的方法安装
@ -23,7 +21,8 @@ Linux 系统请使用以下介绍的方法安装。
例如 Linux 64 位系统上直接下载对应的二进制包 例如 Linux 64 位系统上直接下载对应的二进制包
```bash ```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
``` ```
@ -43,7 +42,7 @@ $ sudo pip install -U docker-compose
```bash ```bash
Collecting docker-compose Collecting docker-compose
Downloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded Downloading docker-compose-1.24.1.tar.gz (149kB): 149kB downloaded
... ...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
``` ```
@ -51,66 +50,9 @@ Successfully installed docker-compose cached-property requests texttable websock
### bash 补全命令 ### bash 补全命令
```bash ```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose $ curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
``` ```
### 容器中执行
Compose 既然是一个 Python 应用自然也可以直接用容器来执行它
```bash
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```
实际上查看下载的 `run.sh` 脚本内容如下
```bash
set -e
VERSION="1.8.0"
IMAGE="docker/compose:$VERSION"
# Setup options for connecting to docker host
if [ -z "$DOCKER_HOST" ]; then
DOCKER_HOST="/var/run/docker.sock"
fi
if [ -S "$DOCKER_HOST" ]; then
DOCKER_ADDR="-v $DOCKER_HOST:$DOCKER_HOST -e DOCKER_HOST"
else
DOCKER_ADDR="-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH"
fi
# Setup volume mounts for compose config and context
if [ "$(pwd)" != '/' ]; then
VOLUMES="-v $(pwd):$(pwd)"
fi
if [ -n "$COMPOSE_FILE" ]; then
compose_dir=$(dirname $COMPOSE_FILE)
fi
# TODO: also check --file argument
if [ -n "$compose_dir" ]; then
VOLUMES="$VOLUMES -v $compose_dir:$compose_dir"
fi
if [ -n "$HOME" ]; then
VOLUMES="$VOLUMES -v $HOME:$HOME -v $HOME:/root" # mount $HOME in /root to share docker.config
fi
# Only allocate tty if we detect one
if [ -t 1 ]; then
DOCKER_RUN_OPTIONS="-t"
fi
if [ -t 0 ]; then
DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -i"
fi
exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"
```
可以看到它其实是下载了 `docker/compose` 镜像并运行
### 卸载 ### 卸载
如果是二进制包方式安装的删除二进制文件即可 如果是二进制包方式安装的删除二进制文件即可

View File

@ -17,13 +17,16 @@ ADD Gemfile /myapp/Gemfile
RUN bundle install RUN bundle install
ADD . /myapp ADD . /myapp
``` ```
以上内容指定应用将使用安装了 RubyBundler 以及其依赖件的镜像更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) [Dockerfile 使用](../dockerfile/README.md)
以上内容指定应用将使用安装了 RubyBundler 以及其依赖件的镜像更多关于如何编写 Dockerfile 文件的信息可以查看 [Dockerfile 使用](../image/dockerfile/README.md)
下一步我们需要一个引导加载 Rails 的文件 `Gemfile` 等一会儿它还会被 `rails new` 命令覆盖重写 下一步我们需要一个引导加载 Rails 的文件 `Gemfile` 等一会儿它还会被 `rails new` 命令覆盖重写
```bash ```bash
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'rails', '4.0.2' gem 'rails', '4.0.2'
``` ```
最后`docker-compose.yml` 文件才是最神奇的地方 `docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库每个镜像的来源数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建镜像之间的连接以及服务开放的端口 最后`docker-compose.yml` 文件才是最神奇的地方 `docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库每个镜像的来源数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建镜像之间的连接以及服务开放的端口
```yaml ```yaml
@ -45,11 +48,13 @@ services:
links: links:
- db - db
``` ```
所有文件就绪后我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了 所有文件就绪后我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了
```bash ```bash
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle $ docker-compose run web rails new . --force --database=postgresql --skip-bundle
``` ```
`Compose` 会先使用 `Dockerfile` web 服务创建一个镜像接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令一旦这个命令运行完后应该就可以看一个崭新的应用已经生成了 `Compose` 会先使用 `Dockerfile` web 服务创建一个镜像接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令一旦这个命令运行完后应该就可以看一个崭新的应用已经生成了
```bash ```bash
@ -60,16 +65,19 @@ Gemfile.lock condocker-compose log
README.rdoc condocker-compose.ru public README.rdoc condocker-compose.ru public
Rakefile db test Rakefile db test
``` ```
在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释这样我们便可以使用 Javascript 运行环境 在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释这样我们便可以使用 Javascript 运行环境
```bash ```bash
gem 'therubyracer', platforms: :ruby gem 'therubyracer', platforms: :ruby
``` ```
现在我们已经有一个新的 `Gemfile` 文件需要再重新创建镜像这个会步骤会改变 Dockerfile 文件本身所以需要重建一次 现在我们已经有一个新的 `Gemfile` 文件需要再重新创建镜像这个会步骤会改变 Dockerfile 文件本身所以需要重建一次
```bash ```bash
$ docker-compose build $ docker-compose build
``` ```
应用现在就可以启动了但配置还未完成Rails 默认读取的数据库目标是 `localhost` 我们需要手动指定容器的 `db` 同样的还需要把用户名修改成和 postgres 镜像预定的一致 应用现在就可以启动了但配置还未完成Rails 默认读取的数据库目标是 `localhost` 我们需要手动指定容器的 `db` 同样的还需要把用户名修改成和 postgres 镜像预定的一致
打开最新生成的 `database.yml` 文件用以下内容替换 打开最新生成的 `database.yml` 文件用以下内容替换
@ -87,11 +95,13 @@ test:
<<: *default <<: *default
database: myapp_test database: myapp_test
``` ```
现在就可以启动应用了 现在就可以启动应用了
```bash ```bash
$ docker-compose up $ docker-compose up
``` ```
如果一切正常你应该可以看到 PostgreSQL 的输出几秒后可以看到这样的重复信息 如果一切正常你应该可以看到 PostgreSQL 的输出几秒后可以看到这样的重复信息
```bash ```bash
@ -99,11 +109,13 @@ myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu] myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000 myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
``` ```
最后 我们需要做的是创建数据库打开另一个终端运行 最后 我们需要做的是创建数据库打开另一个终端运行
```bash ```bash
$ docker-compose run web rake db:create $ docker-compose run web rake db:create
``` ```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了 这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了
![](../_images/docker-compose-rails-screenshot.png) ![](../_images/docker-compose-rails-screenshot.png)

View File

@ -17,7 +17,11 @@ version: "3"
services: services:
db: db:
image: mysql:5.7 image: mysql:8.0
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes: volumes:
- db_data:/var/lib/mysql - db_data:/var/lib/mysql
restart: always restart: always

View File

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

View File

@ -1,8 +1,6 @@
# CoreOS 介绍 # CoreOS 介绍
提起 Docker我们不得不提的就是 [CoreOS](https://coreos.com/). [CoreOS](https://coreos.com/) 对 Docker 甚至容器技术的发展都带来了巨大的推动作用。其提供了运行现代基础设施的特性,支持大规模服务部署,使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
CoreOS Docker 甚至容器技术的发展都带来了巨大的推动作用其提供了运行现代基础设施的特性支持大规模服务部署使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能
# CoreOS 特性 # CoreOS 特性
@ -30,4 +28,4 @@ CoreOS 可以在一个机器上很好地运行,但是它被设计用来搭建
## 服务发现 ## 服务发现
很容易定位服务在集群的那里运行并当发生变化时进行通知它是复杂高动态集群必不可少的 CoreOS 中构建高可用和自动故障负载 很容易定位服务在集群的那里运行并当发生变化时进行通知它是复杂高动态集群必不可少的

View File

@ -6,13 +6,6 @@
`CoreOS` 的第一个重要组件就是使用 `etcd` 来实现的服务发现 `CoreOS` `etcd` 默认以 `rkt` 容器方式运行 `CoreOS` 的第一个重要组件就是使用 `etcd` 来实现的服务发现 `CoreOS` `etcd` 默认以 `rkt` 容器方式运行
```bash
$ rkt list
UUID APP IMAGE NAME STATE CREATED STARTED NETWORKS
57581644 etcd quay.io/coreos/etcd:v3.2.10 running 1 minute ago 1 minute ago
```
`etcd` 使用方法请查看 [etcd 章节](../etcd/) `etcd` 使用方法请查看 [etcd 章节](../etcd/)
## 容器管理 ## 容器管理

View File

@ -1,85 +0,0 @@
# 快速搭建 CoreOS 集群
在这里我们要搭建一个集群环境毕竟单机环境没有什么挑战不是
然后为了在你的电脑运行一个集群环境我们使用 Vagrant
*Vagrant 的使用这里不再阐述请自行学习*
如果你第一次接触 CoreOS 这样的分布式平台运行一个集群看起来好像一个很复杂的任务这里我们给你展示在本地快速搭建一个 CoreOS 集群环境是多么的容易
## 准备工作
首先要确认在你本地的机器上已经安装了最新版本的 Virtualbox, Vagrant git
这是我们可以在本地模拟集群环境的前提条件如果你已经拥有请继续否则自行搜索学习
## 配置工作
CoreOS 官方代码库获取基本配置并进行修改
首先获取模板配置文件
```bash
$ git clone https://github.com/coreos/coreos-vagrant
$ cd coreos-vagrant
$ cp user-data.sample user-data
```
获取新的 token
```bash
$ curl https://discovery.etcd.io/new
```
把获取的 token 放到 user-data 文件中示例如下
```yml
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/<token>
```
## 启动集群
默认情况下CoreOS Vagrantfile 将会启动单机
我们需要复制并修改 config.rb.sample 文件.
复制文件
```bash
cp config.rb.sample config.rb
```
修改集群配置参数 num_instances为3
启动集群
```bash
vagrant up
=>
Bringing machine 'core-01' up with 'virtualbox' provider...
Bringing machine 'core-02' up with 'virtualbox' provider...
Bringing machine 'core-03' up with 'virtualbox' provider...
==> core-01: Box 'coreos-alpha' could not be found. Attempting to find and install...
core-01: Box Provider: virtualbox
core-01: Box Version: >= 0
==> core-01: Adding box 'coreos-alpha' (v0) for provider: virtualbox
core-01: Downloading: http://storage.core-os.net/coreos/amd64-usr/alpha/coreos_production_vagrant.box
core-01: Progress: 46% (Rate: 6105k/s, Estimated time remaining: 0:00:16)
```
添加 ssh 的公匙
```bash
ssh-add ~/.vagrant.d/insecure_private_key
```
连接集群中的第一台机器
```bash
vagrant ssh core-01 -- -A
```

View File

@ -1,8 +1,8 @@
version: "3" version: "3"
services: services:
# $ docker-compose up server => up a serverOnly Support Linux or macOS # $ docker-compose up server => up a serverOnly Support Linux or macOS
server: server:
image: yeasy/docker_practice:latest image: yeasy/docker_practice:latest
ports: ports:
@ -19,13 +19,10 @@ services:
- ./:/srv/gitbook-src - ./:/srv/gitbook-src
command: build command: build
# $ docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice # $ docker run -it --rm -p 4000:80 dockerpracticesig/docker_practice
# $ docker up offline
offline: offline:
# this image build by travis ci # this image build by travis ci
image: dockerpracticecn/docker_practice image: dockerpracticesig/docker_practice
ports: ports:
- 4000:80 - 4000:80

View File

@ -9,7 +9,7 @@ version: "3.6"
services: services:
node1: node1:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node1-data:/etcd-data - node1-data:/etcd-data
expose: expose:
@ -41,7 +41,7 @@ services:
- docker-etcd - docker-etcd
node2: node2:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node2-data:/etcd-data - node2-data:/etcd-data
networks: networks:
@ -73,7 +73,7 @@ services:
- docker-etcd - docker-etcd
node3: node3:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node3-data:/etcd-data - node3-data:/etcd-data
networks: networks:

View File

@ -2,7 +2,7 @@ version: "3.6"
services: services:
node1: node1:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node1-data:/etcd-data - node1-data:/etcd-data
expose: expose:
@ -34,7 +34,7 @@ services:
- docker-etcd - docker-etcd
node2: node2:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node2-data:/etcd-data - node2-data:/etcd-data
networks: networks:
@ -66,7 +66,7 @@ services:
- docker-etcd - docker-etcd
node3: node3:
image: quay.io/coreos/etcd image: quay.io/coreos/etcd:v3.4.0
volumes: volumes:
- node3-data:/etcd-data - node3-data:/etcd-data
networks: networks:

View File

@ -2,7 +2,7 @@
`etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的 `etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的
`etcd` 项目二进制发行包中已经包含了 `etcdctl` 工具没有的话可以从 [github.com/coreos/etcd/releases](https://github.com/coreos/etcd/releases) 下载。 `etcd` 项目二进制发行包中已经包含了 `etcdctl` 工具没有的话可以从 [github.com/etcd-io/etcd/releases](https://github.com/etcd-io/etcd/releases) 下载。
`etcdctl` 支持如下的命令大体上分为数据库操作和非数据库操作两类后面将分别进行解释 `etcdctl` 支持如下的命令大体上分为数据库操作和非数据库操作两类后面将分别进行解释

View File

@ -2,7 +2,7 @@
`etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的 `etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的
`etcd` 项目二进制发行包中已经包含了 `etcdctl` 工具没有的话可以从 [github.com/coreos/etcd/releases](https://github.com/coreos/etcd/releases) 下载。 `etcd` 项目二进制发行包中已经包含了 `etcdctl` 工具没有的话可以从 [github.com/etcd-io/etcd/releases](https://github.com/etcd-io/etcd/releases) 下载。
`etcdctl` 支持如下的命令大体上分为数据库操作和非数据库操作两类后面将分别进行解释 `etcdctl` 支持如下的命令大体上分为数据库操作和非数据库操作两类后面将分别进行解释
@ -14,10 +14,10 @@ USAGE:
etcdctl etcdctl
VERSION: VERSION:
3.2.10 3.4.0
API VERSION: API VERSION:
3.2 3.4
COMMANDS: COMMANDS:

View File

@ -1,19 +1,19 @@
## 安装 ## 安装
`etcd` 基于 `Go` 语言实现因此用户可以从 [项目主页](https://github.com/coreos/etcd) 下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 `Docker` 镜像文件来体验。 `etcd` 基于 `Go` 语言实现因此用户可以从 [项目主页](https://github.com/etcd-io/etcd) 下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 `Docker` 镜像文件来体验。
>注意本章节内容基于 etcd `3.x` 版本 >注意本章节内容基于 etcd `3.4.x` 版本
### 二进制文件方式下载 ### 二进制文件方式下载
编译好的二进制文件都在 [github.com/coreos/etcd/releases](https://github.com/coreos/etcd/releases/) 页面,用户可以选择需要的版本,或通过下载工具下载。 编译好的二进制文件都在 [github.com/etcd-io/etcd/releases](https://github.com/etcd-io/etcd/releases/) 页面,用户可以选择需要的版本,或通过下载工具下载。
例如使用 `curl` 工具下载压缩包并解压 例如使用 `curl` 工具下载压缩包并解压
```bash ```bash
$ curl -L https://github.com/coreos/etcd/releases/download/v3.2.10/etcd-v3.2.10-linux-amd64.tar.gz -o etcd-v3.2.10-linux-amd64.tar.gz $ curl -L https://github.com/etcd-io/etcd/releases/download/v3.4.0/etcd-v3.4.0-linux-amd64.tar.gz -o etcd-v3.4.0-linux-amd64.tar.gz
$ tar xzvf etcd-v3.2.10-linux-amd64.tar.gz $ tar xzvf etcd-v3.4.0-linux-amd64.tar.gz
$ cd etcd-v3.2.10-linux-amd64 $ cd etcd-v3.4.0-linux-amd64
``` ```
解压后可以看到文件包括 解压后可以看到文件包括
@ -35,14 +35,7 @@ $ sudo cp etcd* /usr/local/bin/
```bash ```bash
$ etcd $ etcd
2017-12-03 11:18:34.406082 I | etcdmain: etcd Version: 3.2.10 ...
2017-12-03 11:18:34.406226 I | etcdmain: Git SHA: GitNotFound
2017-12-03 11:18:34.406235 I | etcdmain: Go Version: go1.9.2
2017-12-03 11:18:34.406242 I | etcdmain: Go OS/Arch: darwin/amd64
2017-12-03 11:18:34.406250 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-12-03 11:18:34.406265 N | etcdmain: failed to detect default host (default host not supported on darwin_amd64)
2017-12-03 11:18:34.406279 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-12-03 11:18:34.406457 N | etcdmain: the server is already initialized as member before, starting as etcd member...
2017-12-03 11:18:34.411579 I | embed: listening for peers on http://localhost:2380 2017-12-03 11:18:34.411579 I | embed: listening for peers on http://localhost:2380
2017-12-03 11:18:34.411938 I | embed: listening for client requests on localhost:2379 2017-12-03 11:18:34.411938 I | embed: listening for client requests on localhost:2379
``` ```
@ -68,22 +61,27 @@ hello world
镜像名称为 `quay.io/coreos/etcd`可以通过下面的命令启动 `etcd` 服务监听到 `2379` `2380` 端口 镜像名称为 `quay.io/coreos/etcd`可以通过下面的命令启动 `etcd` 服务监听到 `2379` `2380` 端口
```bash ```bash
$ export NODE1=192.168.1.21 $ docker run \
-p 2379:2379 \
$ docker run --name etcd \ -p 2380:2380 \
-p 2379:2379 \ --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
-p 2380:2380 \ --name etcd-gcr-v3.4.0 \
--volume=etcd-data:/etcd-data \ quay.io/coreos/etcd:v3.4.0 \
quay.io/coreos/etcd:latest \ /usr/local/bin/etcd \
/usr/local/bin/etcd \ --name s1 \
--data-dir=/etcd-data --name node1 \ --data-dir /etcd-data \
--initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \ --listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://0.0.0.0:2379 \
--initial-cluster node1=http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://0.0.0.0:2380 \
--initial-cluster s1=http://0.0.0.0:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
``` ```
>注意etcd 官方标注 `quay.io/coreos/etcd` 即将废弃启用新的 `gcr.io/etcd-development/etcd` 镜像但后者由于网络原因国内不能下载到该镜像这里仍然使用前者作为演示
打开新的终端按照上一步的方法测试 `etcd` 是否成功启动 打开新的终端按照上一步的方法测试 `etcd` 是否成功启动
### macOS 中运行 ### macOS 中运行

View File

@ -4,7 +4,7 @@
`etcd` `CoreOS` 团队于 2013 6 月发起的开源项目它的目标是构建一个高可用的分布式键值`key-value`数据库基于 `Go` 语言实现我们知道在分布式系统中各种服务的配置信息的管理分享服务的发现是一个很基本同时也是很重要的问题`CoreOS` 项目就希望基于 `etcd` 来解决这一问题 `etcd` `CoreOS` 团队于 2013 6 月发起的开源项目它的目标是构建一个高可用的分布式键值`key-value`数据库基于 `Go` 语言实现我们知道在分布式系统中各种服务的配置信息的管理分享服务的发现是一个很基本同时也是很重要的问题`CoreOS` 项目就希望基于 `etcd` 来解决这一问题
`etcd` 目前在 [github.com/coreos/etcd](https://github.com/coreos/etcd) 进行维护。 `etcd` 目前在 [github.com/etcd-io/etcd](https://github.com/etcd-io/etcd) 进行维护。
受到 [Apache ZooKeeper](https://zookeeper.apache.org/) 项目和 [doozer](https://github.com/ha/doozerd) 项目的启发,`etcd` 在设计的时候重点考虑了下面四个要素: 受到 [Apache ZooKeeper](https://zookeeper.apache.org/) 项目和 [doozer](https://github.com/ha/doozerd) 项目的启发,`etcd` 在设计的时候重点考虑了下面四个要素:

View File

@ -40,7 +40,7 @@ FROM scratch
如果你以 `scratch` 为基础镜像的话意味着你不以任何镜像为基础接下来所写的指令将作为镜像第一层开始存在 如果你以 `scratch` 为基础镜像的话意味着你不以任何镜像为基础接下来所写的指令将作为镜像第一层开始存在
不以任何系统为基础直接将可执行文件复制进镜像的做法并不罕见比如 [`swarm`](https://hub.docker.com/_/swarm/)、[`coreos/etcd`](https://quay.io/repository/coreos/etcd)。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 `FROM scratch` 会让镜像体积更加小巧。使用 [Go 语言](https://golang.org/) 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。 不以任何系统为基础直接将可执行文件复制进镜像的做法并不罕见比如 [`swarm`](https://hub.docker.com/_/swarm/)、[`etcd`](https://quay.io/repository/coreos/etcd)。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 `FROM scratch` 会让镜像体积更加小巧。使用 [Go 语言](https://golang.org/) 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
### RUN 执行命令 ### RUN 执行命令

View File

@ -17,7 +17,7 @@ $ docker run --name webserver -d -p 80:80 nginx
这条命令会用 `nginx` 镜像启动一个容器命名为 `webserver`并且映射了 80 端口这样我们可以用浏览器去访问这个 `nginx` 服务器 这条命令会用 `nginx` 镜像启动一个容器命名为 `webserver`并且映射了 80 端口这样我们可以用浏览器去访问这个 `nginx` 服务器
如果是在 Linux 本机运行的 Docker或者如果使用的是 Docker for MacDocker for Windows那么可以直接访问<http://localhost>;如果使用的是 Docker Toolbox或者是在虚拟机、云服务器上安装的 Docker则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址。 如果是在 Linux 本机运行的 Docker或者如果使用的是 Docker Desktop for Mac/Windows那么可以直接访问<http://localhost>;如果使用的是 Docker Toolbox或者是在虚拟机、云服务器上安装的 Docker则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址。
直接用浏览器访问的话我们会看到默认的 Nginx 欢迎页面 直接用浏览器访问的话我们会看到默认的 Nginx 欢迎页面
@ -116,7 +116,7 @@ e43d811ce2f4 4 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "da
docker run --name web2 -d -p 81:80 nginx:v2 docker run --name web2 -d -p 81:80 nginx:v2
``` ```
这里我们命名为新的服务为 `web2`并且映射到 `81` 端口如果是 Docker for Mac/Windows Linux 桌面的话我们就可以直接访问 <http://localhost:81> 看到结果,其内容应该和之前修改后的 `webserver` 一样。 这里我们命名为新的服务为 `web2`并且映射到 `81` 端口如果是 Docker Desktop for Mac/Windows Linux 桌面的话我们就可以直接访问 <http://localhost:81> 看到结果,其内容应该和之前修改后的 `webserver` 一样。
至此我们第一次完成了定制镜像使用的是 `docker commit` 命令手动操作给旧的镜像添加了新的一层形成新的镜像对镜像多层存储应该有了更直观的感觉 至此我们第一次完成了定制镜像使用的是 `docker commit` 命令手动操作给旧的镜像添加了新的一层形成新的镜像对镜像多层存储应该有了更直观的感觉

View File

@ -69,7 +69,7 @@ $ docker image ls -a
### 列出部分镜像 ### 列出部分镜像
不加任何参数的情况下`docker image ls` 会列出所有顶镜像但是有时候我们只希望列出部分镜像`docker image ls` 有好几个参数可以帮助做到这个事情 不加任何参数的情况下`docker image ls` 会列出所有顶镜像但是有时候我们只希望列出部分镜像`docker image ls` 有好几个参数可以帮助做到这个事情
根据仓库名列出镜像 根据仓库名列出镜像

View File

@ -17,7 +17,7 @@ COPY database/ /app/database/
COPY composer.json /app/ COPY composer.json /app/
RUN cd /app \ RUN cd /app \
&& composer config -g repo.packagist composer https://packagist.laravel-china.org \ && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer install \ && composer install \
--ignore-platform-reqs \ --ignore-platform-reqs \
--no-interaction \ --no-interaction \

View File

@ -76,7 +76,7 @@ COPY database/ /app/database/
COPY composer.json composer.lock /app/ COPY composer.json composer.lock /app/
RUN cd /app \ RUN cd /app \
&& composer config -g repo.packagist composer https://packagist.laravel-china.org \ && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer install \ && composer install \
--ignore-platform-reqs \ --ignore-platform-reqs \
--no-interaction \ --no-interaction \
@ -184,7 +184,7 @@ COPY database/ /app/database/
COPY composer.json /app/ COPY composer.json /app/
RUN cd /app \ RUN cd /app \
&& composer config -g repo.packagist composer https://packagist.laravel-china.org \ && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer install \ && composer install \
--ignore-platform-reqs \ --ignore-platform-reqs \
--no-interaction \ --no-interaction \

View File

@ -64,7 +64,7 @@ Untagged: node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b16442
因此当我们使用上面命令删除镜像的时候实际上是在要求删除某个标签的镜像所以首先需要做的是将满足我们要求的所有镜像标签都取消这就是我们看到的 `Untagged` 的信息因为一个镜像可以对应多个标签因此当我们删除了所指定的标签后可能还有别的标签指向了这个镜像如果是这种情况那么 `Delete` 行为就不会发生所以并非所有的 `docker image rm` 都会产生删除镜像的行为有可能仅仅是取消了某个标签而已 因此当我们使用上面命令删除镜像的时候实际上是在要求删除某个标签的镜像所以首先需要做的是将满足我们要求的所有镜像标签都取消这就是我们看到的 `Untagged` 的信息因为一个镜像可以对应多个标签因此当我们删除了所指定的标签后可能还有别的标签指向了这个镜像如果是这种情况那么 `Delete` 行为就不会发生所以并非所有的 `docker image rm` 都会产生删除镜像的行为有可能仅仅是取消了某个标签而已
当该镜像所有的标签都被取消了该镜像很可能会失去了存在的意义因此会触发删除行为镜像是多层存储结构因此在删除的时候也是从上层向基础层方向依次进行判断删除镜像的多层结构让镜像复用变非常容易因此很有可能某个其它镜像正依赖于当前镜像的某一层这种情况依旧不会触发删除该层的行为直到没有任何层依赖当前层时才会真实的删除当前层这就是为什么有时候会奇怪为什么明明没有别的标签指向这个镜像但是它还是存在的原因也是为什么有时候会发现所删除的层数和自己 `docker pull` 看到的层数不一样的 当该镜像所有的标签都被取消了该镜像很可能会失去了存在的意义因此会触发删除行为镜像是多层存储结构因此在删除的时候也是从上层向基础层方向依次进行判断删除镜像的多层结构让镜像复用变非常容易因此很有可能某个其它镜像正依赖于当前镜像的某一层这种情况依旧不会触发删除该层的行为直到没有任何层依赖当前层时才会真实的删除当前层这就是为什么有时候会奇怪为什么明明没有别的标签指向这个镜像但是它还是存在的原因也是为什么有时候会发现所删除的层数和自己 `docker pull` 看到的层数不一样的原因
除了镜像依赖以外还需要注意的是容器对镜像的依赖如果有用这个镜像启动的容器存在即使容器没有运行那么同样不可以删除这个镜像之前讲过容器是以镜像为基础再加一层容器存储层组成这样的多层存储结构去运行的因此该镜像如果被这个容器所依赖的那么删除必然会导致故障如果这些容器是不需要的应该先将它们删除然后再来删除镜像 除了镜像依赖以外还需要注意的是容器对镜像的依赖如果有用这个镜像启动的容器存在即使容器没有运行那么同样不可以删除这个镜像之前讲过容器是以镜像为基础再加一层容器存储层组成这样的多层存储结构去运行的因此该镜像如果被这个容器所依赖的那么删除必然会导致故障如果这些容器是不需要的应该先将它们删除然后再来删除镜像

View File

@ -8,9 +8,9 @@
Docker CE 支持以下版本的 [Fedora](https://fedoraproject.org/) 操作系统: Docker CE 支持以下版本的 [Fedora](https://fedoraproject.org/) 操作系统:
* 26 (Docker CE v18.03 及以下版本)
* 27
* 28 * 28
* 29
* 30
#### 卸载旧版本 #### 卸载旧版本

View File

@ -1,14 +1,14 @@
## macOS 安装 Docker ## macOS 安装 Docker Desktop CE
### 系统要求 ### 系统要求
[Docker for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS El Capitan 10.11。 [Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS El Capitan 10.11。
### 安装 ### 安装
#### 使用 Homebrew 安装 #### 使用 Homebrew 安装
[Homebrew](https://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker for Mac因此可以很方便的使用 Homebrew Cask 来进行安装: [Homebrew](https://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker Desktop for Mac因此可以很方便的使用 Homebrew Cask 来进行安装:
```bash ```bash
$ brew cask install docker $ brew cask install docker
@ -16,7 +16,7 @@ $ brew cask install docker
#### 手动下载安装 #### 手动下载安装
如果需要手动下载请点击以下链接下载 [Stable](https://download.docker.com/mac/stable/Docker.dmg) 或 [Edge](https://download.docker.com/mac/edge/Docker.dmg) 版本的 Docker for Mac。 如果需要手动下载请点击以下链接下载 [Stable](https://download.docker.com/mac/stable/Docker.dmg) 或 [Edge](https://download.docker.com/mac/edge/Docker.dmg) 版本的 Docker Desktop for Mac。
如同 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` 文件夹即可(其间需要输入用户密码)。
@ -44,11 +44,11 @@ $ brew cask install docker
```bash ```bash
$ docker --version $ docker --version
Docker version 18.09.0, build 4d60db4 Docker version 19.03.1, build 74b1e89
$ docker-compose --version $ docker-compose --version
docker-compose version 1.23.2, build 1110ad01 docker-compose version 1.24.1, build 4667896b
$ docker-machine --version $ docker-machine --version
docker-machine version 0.16.0, build 702c267f docker-machine version 0.16.1, build cce350d7
``` ```
如果 `docker version``docker info` 都正常的话可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/) 如果 `docker version``docker info` 都正常的话可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/)
@ -57,7 +57,7 @@ docker-machine version 0.16.0, build 702c267f
$ docker run -d -p 80:80 --name webserver nginx $ docker run -d -p 80:80 --name webserver nginx
``` ```
服务运行后可以访问 <http://localhost>,如果看到了 "Welcome to nginx!",就说明 Docker for Mac 安装成功了。 服务运行后可以访问 <http://localhost>,如果看到了 "Welcome to nginx!",就说明 Docker Desktop for Mac 安装成功了。
![](_images/install-mac-example-nginx.png) ![](_images/install-mac-example-nginx.png)
@ -71,3 +71,7 @@ $ docker rm webserver
### 镜像加速 ### 镜像加速
如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](mirror.md) 如果在使用过程中发现拉取 Docker 镜像十分缓慢可以配置 Docker [国内镜像加速](mirror.md)
### 参考链接
* [官方文档](https://docs.docker.com/docker-for-mac/install/)

View File

@ -58,7 +58,7 @@ Registry Mirrors:
国内无法直接获取 `gcr.io/*` 镜像我们可以将 `gcr.io/<repo-name>/<image-name>:<version>` 替换为 `gcr.azk8s.cn/<repo-name>/<image-name>:<version>` ,例如 国内无法直接获取 `gcr.io/*` 镜像我们可以将 `gcr.io/<repo-name>/<image-name>:<version>` 替换为 `gcr.azk8s.cn/<repo-name>/<image-name>:<version>` ,例如
```bash ```bash
# docker pull gcr.io/google_containers/hyperkube-amd64:v1.9.2 # $ docker pull gcr.io/google_containers/hyperkube-amd64:v1.9.2
docker pull gcr.azk8s.cn/google_containers/hyperkube-amd64:v1.9.2 $ docker pull gcr.azk8s.cn/google_containers/hyperkube-amd64:v1.9.2
``` ```

View File

@ -10,8 +10,6 @@ Docker CE 支持以下版本的 [Raspbian](https://www.raspberrypi.org/downloads
* Raspbian Stretch * Raspbian Stretch
* Raspbian Jessie (Docker CE v18.06 及以下版本)
** `Raspbian` 是树莓派的开发与维护机构 [树莓派基金会](http://www.raspberrypi.org/) 推荐用于树莓派的首选系统,其基于 `Debian`。 ** `Raspbian` 是树莓派的开发与维护机构 [树莓派基金会](http://www.raspberrypi.org/) 推荐用于树莓派的首选系统,其基于 `Debian`。
### 使用 APT 安装 ### 使用 APT 安装

View File

@ -8,6 +8,8 @@
Docker CE 支持以下版本的 [Ubuntu](https://www.ubuntu.com/server) 操作系统: Docker CE 支持以下版本的 [Ubuntu](https://www.ubuntu.com/server) 操作系统:
* Disco 19.04
* Cosmic 18.10
* Bionic 18.04 (LTS) * Bionic 18.04 (LTS)
* Xenial 16.04 (LTS) * Xenial 16.04 (LTS)

View File

@ -22,6 +22,10 @@ Wait a moment and click Got it to start using Docker CE.
![](_images/install-win-success-popup-cloud.png) ![](_images/install-win-success-popup-cloud.png)
### Accelerate Images(In China) ### Registry Mirror(In China)
If you pull docker images very slowly, then you can configurate [Registry Mirror](mirror.md). If you pull docker images very slowly, then you can configurate [Registry Mirror](mirror.md).
### Links
* [Docs](https://docs.docker.com/docker-for-windows/install/)

View File

@ -6,6 +6,12 @@ Docker has aroused widespread concern and discussion and had 5.2w stars and 1w f
Docker develops with [GO](https://golang.org/) launched by Google, based on [cgroup](https://zh.wikipedia.org/wiki/Cgroups) and [namespace](https://en.wikipedia.org/wiki/Linux_namespaces) of Linux Kernel and [Union FS](https://en.wikipedia.org/wiki/Union_mount) like [AUFS](https://en.wikipedia.org/wiki/Aufs) to package and isolate the processes which is belong to [Operating system level virtualization technology](https://en.wikipedia.org/wiki/Operating-system-level_virtualization). It is also called container because of the isolated process is independent of the host and other isolated processes. The initial implementation is based on [LXC](https://linuxcontainers.org/lxc/introduction/). It removed LXC and use [libcontainer](https://github.com/docker/libcontainer) instead which is developed by themself since 0.7. Starting with 1.11, it uses [runC](https://github.com/opencontainers/runc) and [containerd](https://github.com/containerd/containerd) further. Docker develops with [GO](https://golang.org/) launched by Google, based on [cgroup](https://zh.wikipedia.org/wiki/Cgroups) and [namespace](https://en.wikipedia.org/wiki/Linux_namespaces) of Linux Kernel and [Union FS](https://en.wikipedia.org/wiki/Union_mount) like [AUFS](https://en.wikipedia.org/wiki/Aufs) to package and isolate the processes which is belong to [Operating system level virtualization technology](https://en.wikipedia.org/wiki/Operating-system-level_virtualization). It is also called container because of the isolated process is independent of the host and other isolated processes. The initial implementation is based on [LXC](https://linuxcontainers.org/lxc/introduction/). It removed LXC and use [libcontainer](https://github.com/docker/libcontainer) instead which is developed by themself since 0.7. Starting with 1.11, it uses [runC](https://github.com/opencontainers/runc) and [containerd](https://github.com/containerd/containerd) further.
![Docker Architecture](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/media/docker-on-linux.png)
> `runc` is a Linux command-line tool for creating and running containers according to the [OCI container runtime specification](https://github.com/opencontainers/runtime-spec).
> `containerd` is a daemon that manages container life cycle from downloading and unpacking the container image to container execution and supervision.
Docker is further packaged on a container basis, from file system, network interconnection to process isolation, etc, greatly simplifying container craetion and maintenance. Docker is further packaged on a container basis, from file system, network interconnection to process isolation, etc, greatly simplifying container craetion and maintenance.
The images below compare the differences between Docker and Traditional Virtualization. The traditional Virtual machine technology is to virtualize a set of hadware to run a complete operation system and run the required application process on this system. The application process in the container runs directly on the host kernel, and the container does not have its own Kernel and hadware virtualiztion. Therefore, container are lighter than traditional virtual machines. The images below compare the differences between Docker and Traditional Virtualization. The traditional Virtual machine technology is to virtualize a set of hadware to run a complete operation system and run the required application process on this system. The application process in the container runs directly on the host kernel, and the container does not have its own Kernel and hadware virtualiztion. Therefore, container are lighter than traditional virtual machines.
@ -14,6 +20,4 @@ The images below compare the differences between Docker and Traditional Virtuali
![Docker](_images/docker.png) ![Docker](_images/docker.png)
[docker-soft]:https://en.wikipedia.org/wiki/Docker_(software) [docker-soft]:https://en.wikipedia.org/wiki/Docker_(software)

View File

@ -4,13 +4,13 @@ Docker Machine 可以在多种操作系统平台上安装,包括 Linux、macOS
### macOSWindows ### macOSWindows
Docker for MacDocker for Windows 自带 `docker-machine` 二进制包安装之后即可使用 `Docker Desktop for Mac/Windows` 自带 `docker-machine` 二进制包安装之后即可使用
查看版本信息 查看版本信息
```bash ```bash
$ docker-machine -v $ docker-machine -v
docker-machine version 0.13.0, build 9ba6da9 docker-machine version 0.16.1, build cce350d7
``` ```
### Linux ### Linux
@ -20,7 +20,8 @@ docker-machine version 0.13.0, build 9ba6da9
例如 Linux 64 位系统上直接下载对应的二进制包 例如 Linux 64 位系统上直接下载对应的二进制包
```bash ```bash
$ sudo curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine $ sudo curl -L https://github.com/docker/machine/releases/download/v0.16.1/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine $ sudo chmod +x /usr/local/bin/docker-machine
``` ```
@ -28,5 +29,5 @@ $ sudo chmod +x /usr/local/bin/docker-machine
```bash ```bash
$ docker-machine -v $ docker-machine -v
docker-machine version 0.13.0, build 9ba6da9 docker-machine version 0.16.1, build cce350d7
``` ```

View File

@ -50,7 +50,7 @@ $ docker-machine create \
#### Windows 10 #### Windows 10
Windows 10 安装 Docker for Windows 之后不能再安装 VirtualBox也就不能使用 `virtualbox` 驱动来创建 Docker Machine我们可以选择使用 `hyperv` 驱动 Windows 10 安装 Docker Desktop for Windows 之后不能再安装 VirtualBox也就不能使用 `virtualbox` 驱动来创建 Docker Machine我们可以选择使用 `hyperv` 驱动
> 注意必须事先在 `Hyper-V` 管理器中新建一个 **外部虚拟交换机** 执行下面的命令时使用 `--hyperv-virtual-switch=MY_SWITCH` 指定虚拟交换机名称 > 注意必须事先在 `Hyper-V` 管理器中新建一个 **外部虚拟交换机** 执行下面的命令时使用 `--hyperv-virtual-switch=MY_SWITCH` 指定虚拟交换机名称

7
manifest Normal file
View File

@ -0,0 +1,7 @@
DOCKER_VERSION=19.03.1
DOCKER_COMPOSE_VERSION=1.24.1
DOCKER_MACHINE_VERSION=0.16.1
ETCD_VERSION=3.4.0
KUBERNETES_VERSION=1.14.3
UBUNTU=18.04
DEBIAN=9

View File

@ -116,4 +116,4 @@ REPOSITORY TAG IMAGE ID CREAT
### 其他 ### 其他
对于 Docker for Windows Docker for Mac 在设置中编辑 `daemon.json` 增加和上边一样的字符串即可 对于 Docker Desktop for Windows Docker Desktop for Mac 在设置中编辑 `daemon.json` 增加和上边一样的字符串即可