Merge branch 'master' into english
commit
0699e96e36
32
.drone.yml
32
.drone.yml
|
@ -1,17 +1,15 @@
|
|||
workspace:
|
||||
base: /srv/gitbook-src
|
||||
path: .
|
||||
pipeline:
|
||||
build:
|
||||
image: yeasy/docker_practice:latest
|
||||
# pull: true
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
secrets: [key1, key2]
|
||||
commands:
|
||||
# - echo $${key1}
|
||||
# - echo $KEY2
|
||||
- docker-entrypoint.sh build
|
||||
when:
|
||||
event: [push, pull_request, tag, deployment]
|
||||
branch: master
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
steps:
|
||||
- name: build
|
||||
image: yeasy/docker_practice:latest
|
||||
pull: if-not-exists # always never
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
commands:
|
||||
- docker-entrypoint.sh build
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
|
|
|
@ -21,11 +21,11 @@ about: Create a report to help us improve
|
|||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 18.09 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 18.09, please upgrade Docker to 18.09-->
|
||||
<!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 19.03, please upgrade Docker to 19.03-->
|
||||
|
||||
* [x] Edge (v18.09)
|
||||
* [x] Stable (v18.09)
|
||||
* [x] Edge (v19.03)
|
||||
* [x] Stable (v19.03)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
|
|
|
@ -21,11 +21,11 @@ about: Create a issue about Docker
|
|||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 18.09 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 18.09, please upgrade Docker to 18.09-->
|
||||
<!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 19.03, please upgrade Docker to 19.03-->
|
||||
|
||||
* [x] Edge (v18.09)
|
||||
* [x] Stable (v18.09)
|
||||
* [x] Edge (v19.03)
|
||||
* [x] Stable (v19.03)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
|
|
|
@ -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
|
14
.travis.yml
14
.travis.yml
|
@ -17,14 +17,20 @@ script:
|
|||
|
||||
after_success:
|
||||
- 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 "$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
|
||||
- curl 127.0.0.1:4000
|
||||
- docker push dockerpracticecn/docker_practice:us-en
|
||||
|
||||
- docker push dockerpracticesig/docker_practice:us-en
|
||||
|
||||
- cd _book
|
||||
- git init
|
||||
- git remote add origin "$REPO"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:9-alpine
|
||||
FROM node:alpine
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"-livereload",
|
||||
"image-captions",
|
||||
"github",
|
||||
"page-treeview",
|
||||
"page-treeview@2.9.8",
|
||||
"editlink"
|
||||
],
|
||||
"pluginsConfig": {
|
||||
|
|
|
@ -6,12 +6,14 @@ if [ $1 = "sh" ];then sh ; exit 0; fi
|
|||
|
||||
rm -rf node_modules _book
|
||||
|
||||
cp -a . ../gitbook
|
||||
srcDir=$PWD
|
||||
|
||||
cd ../gitbook
|
||||
cp -a . /srv/gitbook
|
||||
|
||||
cd /srv/gitbook
|
||||
|
||||
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
|
||||
exit 0
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
## 主要修订记录
|
||||
|
||||
* 1.1.0 2019-06-30
|
||||
* 1.1.0 2019-12-31
|
||||
* 全面支持 v19.x 新版本
|
||||
* 增加 `BuildKit`
|
||||
* 增加 `docker manifest` 命令使用说明
|
||||
* 移除 `Ubuntu 14.04` `Debian 8` `Debian 7`
|
||||
|
|
13
README.md
13
README.md
|
@ -4,15 +4,22 @@
|
|||
|
||||
**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,节约有限的生命。
|
||||
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 13 章介绍了容器生态中的几个核心项目;14、15 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、CoreOS、Kubernetes、Mesos、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
|
||||
* 在线阅读:[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)
|
||||
* 下载:[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)
|
||||
* 在线阅读:[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)
|
||||
* [离线阅读 `$ 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)。
|
||||
|
||||
|
|
|
@ -144,8 +144,10 @@
|
|||
* [CentOS Fedora](cases/os/centos.md)
|
||||
* [SUMMARY](cases/os/summary.md)
|
||||
* [CI/CD](cases/ci/README.md)
|
||||
* [Drone](cases/ci/drone.md)
|
||||
* [Travis CI](cases/ci/travis.md)
|
||||
* [GitHub Actions](cases/ci/actions/README.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)
|
||||
* [LinuxKit](opensource/linuxkit.md)
|
||||
* [Appendix](appendix/README.md)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
[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 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
[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 各个版本的镜像。
|
||||
|
||||
### 使用方法
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
[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 |
|
@ -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)
|
|
@ -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
|
|
@ -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:
|
|
@ -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)
|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub,Docker 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/)
|
|
@ -0,0 +1,6 @@
|
|||
DRONE_SERVER_HOST=
|
||||
DRONE_SERVER_PROTO=
|
||||
DRONE_RPC_SECRET=
|
||||
HOSTNAME=
|
||||
DRONE_GITHUB_CLIENT_ID=
|
||||
DRONE_GITHUB_CLIENT_SECRET=
|
|
@ -0,0 +1,2 @@
|
|||
.env
|
||||
ssl/*
|
|
@ -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)
|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub,Docker 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)
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
# Drone Demo
|
|
@ -3,5 +3,5 @@ package main
|
|||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!");
|
||||
fmt.Printf("Hello World!\n");
|
||||
}
|
|
@ -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:
|
|
@ -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
|
||||
```
|
|
@ -1,6 +1,7 @@
|
|||
## Compose 命令说明
|
||||
|
||||
### 命令对象与格式
|
||||
|
||||
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
|
||||
|
||||
执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式。
|
||||
|
@ -66,6 +67,7 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
|||
列出 Compose 文件中包含的镜像。
|
||||
|
||||
#### `kill`
|
||||
|
||||
格式为 `docker-compose kill [options] [SERVICE...]`。
|
||||
|
||||
通过发送 `SIGKILL` 信号来强制停止服务容器。
|
||||
|
@ -77,6 +79,7 @@ $ docker-compose kill -s SIGINT
|
|||
```
|
||||
|
||||
#### `logs`
|
||||
|
||||
格式为 `docker-compose logs [options] [SERVICE...]`。
|
||||
|
||||
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
|
||||
|
@ -84,11 +87,13 @@ $ docker-compose kill -s SIGINT
|
|||
该命令在调试问题的时候十分有用。
|
||||
|
||||
#### `pause`
|
||||
|
||||
格式为 `docker-compose pause [SERVICE...]`。
|
||||
|
||||
暂停一个服务容器。
|
||||
|
||||
#### `port`
|
||||
|
||||
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`。
|
||||
|
||||
打印某个容器端口所映射的公共端口。
|
||||
|
@ -100,6 +105,7 @@ $ docker-compose kill -s SIGINT
|
|||
* `--index=index` 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
|
||||
|
||||
#### `ps`
|
||||
|
||||
格式为 `docker-compose ps [options] [SERVICE...]`。
|
||||
|
||||
列出项目中目前的所有容器。
|
||||
|
@ -109,6 +115,7 @@ $ docker-compose kill -s SIGINT
|
|||
* `-q` 只打印容器的 ID 信息。
|
||||
|
||||
#### `pull`
|
||||
|
||||
格式为 `docker-compose pull [options] [SERVICE...]`。
|
||||
|
||||
拉取服务依赖的镜像。
|
||||
|
@ -122,6 +129,7 @@ $ docker-compose kill -s SIGINT
|
|||
推送服务依赖的镜像到 Docker 镜像仓库。
|
||||
|
||||
#### `restart`
|
||||
|
||||
格式为 `docker-compose restart [options] [SERVICE...]`。
|
||||
|
||||
重启项目中的服务。
|
||||
|
@ -131,6 +139,7 @@ $ docker-compose kill -s SIGINT
|
|||
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时(默认为 10 秒)。
|
||||
|
||||
#### `rm`
|
||||
|
||||
格式为 `docker-compose rm [options] [SERVICE...]`。
|
||||
|
||||
删除所有(停止状态的)服务容器。推荐先执行 `docker-compose stop` 命令来停止容器。
|
||||
|
@ -195,6 +204,7 @@ $ docker-compose run --no-deps web python manage.py shell
|
|||
* `-T` 不分配伪 tty,意味着依赖 tty 的指令将无法运行。
|
||||
|
||||
#### `scale`
|
||||
|
||||
格式为 `docker-compose scale [options] [SERVICE=NUM...]`。
|
||||
|
||||
设置指定服务运行的容器个数。
|
||||
|
@ -214,11 +224,13 @@ $ docker-compose scale web=3 db=2
|
|||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
#### `start`
|
||||
|
||||
格式为 `docker-compose start [SERVICE...]`。
|
||||
|
||||
启动已经存在的服务容器。
|
||||
|
||||
#### `stop`
|
||||
|
||||
格式为 `docker-compose stop [options] [SERVICE...]`。
|
||||
|
||||
停止已经处于运行状态的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器。
|
||||
|
@ -232,11 +244,13 @@ $ docker-compose scale web=3 db=2
|
|||
查看各个服务容器内运行的进程。
|
||||
|
||||
#### `unpause`
|
||||
|
||||
格式为 `docker-compose unpause [SERVICE...]`。
|
||||
|
||||
恢复处于暂停状态中的服务。
|
||||
|
||||
#### `up`
|
||||
|
||||
格式为 `docker-compose up [options] [SERVICE...]`。
|
||||
|
||||
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
|
||||
|
@ -270,6 +284,11 @@ $ docker-compose scale web=3 db=2
|
|||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
#### `version`
|
||||
|
||||
格式为 `docker-compose version`。
|
||||
|
||||
打印版本信息。
|
||||
|
||||
### 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/reference/overview/)
|
||||
|
|
|
@ -18,7 +18,7 @@ services:
|
|||
|
||||
注意每个服务都必须通过 `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`
|
||||
|
||||
数据卷所挂载路径设置。可以设置宿主机路径 (`HOST:CONTAINER`) 或加上访问模式 (`HOST:CONTAINER:ro`)。
|
||||
数据卷所挂载路径设置。可以设置为宿主机路径(`HOST:CONTAINER`)或者数据卷名称(`VOLUME:CONTAINER`),并且可以设置访问模式 (`HOST:CONTAINER:ro`)。
|
||||
|
||||
该指令中路径支持相对路径。
|
||||
|
||||
|
@ -471,6 +471,21 @@ volumes:
|
|||
- ~/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` 中对应参数的功能一致。
|
||||
|
@ -557,3 +572,7 @@ MONGO_VERSION=3.6
|
|||
```
|
||||
|
||||
执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器。
|
||||
|
||||
### 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/compose-file/)
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
django_example
|
||||
manage.py
|
||||
|
|
|
@ -6,7 +6,7 @@ services:
|
|||
|
||||
web:
|
||||
build: .
|
||||
command: python3 manage.py runserver 0.0.0.0:8000
|
||||
command: python manage.py runserver 0.0.0.0:8000
|
||||
volumes:
|
||||
- .:/code
|
||||
ports:
|
||||
|
|
|
@ -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)
|
|
@ -1,2 +1,2 @@
|
|||
Django>=1.8,<2.0
|
||||
psycopg2
|
||||
Django>=2.0,<3.0
|
||||
psycopg2>=2.7,<3.0
|
||||
|
|
|
@ -2,7 +2,11 @@ version: "3"
|
|||
services:
|
||||
|
||||
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:
|
||||
- db_data:/var/lib/mysql
|
||||
restart: always
|
||||
|
|
|
@ -13,18 +13,18 @@ FROM python:3
|
|||
ENV PYTHONUNBUFFERED 1
|
||||
RUN mkdir /code
|
||||
WORKDIR /code
|
||||
ADD requirements.txt /code/
|
||||
COPY requirements.txt /code/
|
||||
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` 文件里面写明需要安装的具体依赖包名。
|
||||
|
||||
```bash
|
||||
Django>=1.8,<2.0
|
||||
psycopg2
|
||||
Django>=2.0,<3.0
|
||||
psycopg2>=2.7,<3.0
|
||||
```
|
||||
|
||||
第三步,`docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。
|
||||
|
@ -38,7 +38,7 @@ services:
|
|||
|
||||
web:
|
||||
build: .
|
||||
command: python3 manage.py runserver 0.0.0.0:8000
|
||||
command: python manage.py runserver 0.0.0.0:8000
|
||||
volumes:
|
||||
- .:/code
|
||||
ports:
|
||||
|
@ -47,15 +47,15 @@ services:
|
|||
- db
|
||||
```
|
||||
|
||||
查看 [`docker-compose.yml` 章节](yml_ref.md) 了解更多详细的工作机制。
|
||||
查看 [`docker-compose.yml` 章节](compose_file.md) 了解更多详细的工作机制。
|
||||
|
||||
现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了。
|
||||
|
||||
```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` 应用。
|
||||
|
||||
|
@ -67,7 +67,7 @@ Dockerfile docker-compose.yml django_example manage.py
|
|||
如果你的系统是 Linux,记得更改文件权限。
|
||||
|
||||
```bash
|
||||
sudo chown -R $USER:$USER .
|
||||
$ sudo chown -R $USER:$USER .
|
||||
```
|
||||
|
||||
首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。
|
||||
|
|
|
@ -4,14 +4,12 @@
|
|||
|
||||
`Compose` 可以通过 Python 的包管理工具 `pip` 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。
|
||||
|
||||
前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
|
||||
|
||||
`Docker for Mac` 、`Docker for Windows` 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。
|
||||
`Docker Desktop for Mac/Windows` 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。
|
||||
|
||||
```bash
|
||||
$ docker-compose --version
|
||||
|
||||
docker-compose version 1.17.1, build 6d101fb
|
||||
docker-compose version 1.24.1, build 4667896b
|
||||
```
|
||||
|
||||
Linux 系统请使用以下介绍的方法安装。
|
||||
|
@ -23,7 +21,8 @@ Linux 系统请使用以下介绍的方法安装。
|
|||
例如,在 Linux 64 位系统上直接下载对应的二进制包。
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
|
@ -43,7 +42,7 @@ $ sudo pip install -U docker-compose
|
|||
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
@ -51,66 +50,9 @@ Successfully installed docker-compose cached-property requests texttable websock
|
|||
### 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` 镜像并运行。
|
||||
|
||||
### 卸载
|
||||
|
||||
如果是二进制包方式安装的,删除二进制文件即可。
|
||||
|
|
|
@ -17,13 +17,16 @@ ADD Gemfile /myapp/Gemfile
|
|||
RUN bundle install
|
||||
ADD . /myapp
|
||||
```
|
||||
以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。
|
||||
|
||||
以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [Dockerfile 使用](../image/dockerfile/README.md)。
|
||||
|
||||
下一步,我们需要一个引导加载 Rails 的文件 `Gemfile` 。 等一会儿它还会被 `rails new` 命令覆盖重写。
|
||||
|
||||
```bash
|
||||
source 'https://rubygems.org'
|
||||
gem 'rails', '4.0.2'
|
||||
```
|
||||
|
||||
最后,`docker-compose.yml` 文件才是最神奇的地方。 `docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的 PostgreSQL 镜像,web 应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。
|
||||
|
||||
```yaml
|
||||
|
@ -45,11 +48,13 @@ services:
|
|||
links:
|
||||
- db
|
||||
```
|
||||
|
||||
所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。
|
||||
|
||||
```bash
|
||||
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
|
||||
```
|
||||
|
||||
`Compose` 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。
|
||||
|
||||
```bash
|
||||
|
@ -60,16 +65,19 @@ Gemfile.lock condocker-compose log
|
|||
README.rdoc condocker-compose.ru public
|
||||
Rakefile db test
|
||||
```
|
||||
|
||||
在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释,这样我们便可以使用 Javascript 运行环境:
|
||||
|
||||
```bash
|
||||
gem 'therubyracer', platforms: :ruby
|
||||
```
|
||||
|
||||
现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,所以需要重建一次)。
|
||||
|
||||
```bash
|
||||
$ docker-compose build
|
||||
```
|
||||
|
||||
应用现在就可以启动了,但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。
|
||||
打开最新生成的 `database.yml` 文件。用以下内容替换:
|
||||
|
||||
|
@ -87,11 +95,13 @@ test:
|
|||
<<: *default
|
||||
database: myapp_test
|
||||
```
|
||||
|
||||
现在就可以启动应用了。
|
||||
|
||||
```bash
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息:
|
||||
|
||||
```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 WEBrick::HTTPServer#start: pid=1 port=3000
|
||||
```
|
||||
|
||||
最后, 我们需要做的是创建数据库,打开另一个终端,运行:
|
||||
|
||||
```bash
|
||||
$ docker-compose run web rake db:create
|
||||
```
|
||||
|
||||
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。
|
||||
|
||||
![](../_images/docker-compose-rails-screenshot.png)
|
||||
|
|
|
@ -17,7 +17,11 @@ version: "3"
|
|||
services:
|
||||
|
||||
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:
|
||||
- db_data:/var/lib/mysql
|
||||
restart: always
|
||||
|
|
|
@ -4,4 +4,4 @@ CoreOS 的设计是为你提供能够像谷歌一样的大型互联网公司一
|
|||
|
||||
CoreOS 的安装文件和运行依赖非常小,它提供了精简的 Linux 系统。它使用 Linux 容器在更高的抽象层来管理你的服务,而不是通过常规的 YUM 和 APT 来安装包。
|
||||
|
||||
同时,CoreOS 几乎可以运行在任何平台:VirtualBox, Amazon EC2, QEMU/KVM, VMware 和 OpenStack 等等,甚至你所使用的硬件环境。
|
||||
同时,CoreOS 几乎可以运行在任何平台:`VirtualBox`, `Amazon EC2`, `QEMU/KVM`, `VMware` 和 `OpenStack` 等 。
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
# CoreOS 介绍
|
||||
|
||||
提起 Docker,我们不得不提的就是 [CoreOS](https://coreos.com/).
|
||||
|
||||
CoreOS 对 Docker 甚至容器技术的发展都带来了巨大的推动作用。其提供了运行现代基础设施的特性,支持大规模服务部署,使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
|
||||
[CoreOS](https://coreos.com/) 对 Docker 甚至容器技术的发展都带来了巨大的推动作用。其提供了运行现代基础设施的特性,支持大规模服务部署,使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
|
||||
|
||||
# CoreOS 特性
|
||||
|
||||
|
@ -30,4 +28,4 @@ CoreOS 可以在一个机器上很好地运行,但是它被设计用来搭建
|
|||
|
||||
## 服务发现
|
||||
|
||||
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。在 CoreOS 中构建高可用和自动故障负载。
|
||||
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。
|
||||
|
|
|
@ -6,13 +6,6 @@
|
|||
|
||||
`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/)。
|
||||
|
||||
## 容器管理
|
||||
|
|
|
@ -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
|
||||
```
|
|
@ -1,8 +1,8 @@
|
|||
version: "3"
|
||||
|
||||
services:
|
||||
|
||||
# $ docker-compose up server => up a server,Only Support Linux or macOS
|
||||
|
||||
server:
|
||||
image: yeasy/docker_practice:latest
|
||||
ports:
|
||||
|
@ -19,13 +19,10 @@ services:
|
|||
- ./:/srv/gitbook-src
|
||||
command: build
|
||||
|
||||
# $ docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice
|
||||
|
||||
# $ docker up offline
|
||||
|
||||
# $ docker run -it --rm -p 4000:80 dockerpracticesig/docker_practice
|
||||
offline:
|
||||
# this image build by travis ci
|
||||
image: dockerpracticecn/docker_practice
|
||||
image: dockerpracticesig/docker_practice
|
||||
ports:
|
||||
- 4000:80
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ version: "3.6"
|
|||
services:
|
||||
|
||||
node1:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node1-data:/etcd-data
|
||||
expose:
|
||||
|
@ -41,7 +41,7 @@ services:
|
|||
- docker-etcd
|
||||
|
||||
node2:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node2-data:/etcd-data
|
||||
networks:
|
||||
|
@ -73,7 +73,7 @@ services:
|
|||
- docker-etcd
|
||||
|
||||
node3:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node3-data:/etcd-data
|
||||
networks:
|
||||
|
|
|
@ -2,7 +2,7 @@ version: "3.6"
|
|||
services:
|
||||
|
||||
node1:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node1-data:/etcd-data
|
||||
expose:
|
||||
|
@ -34,7 +34,7 @@ services:
|
|||
- docker-etcd
|
||||
|
||||
node2:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node2-data:/etcd-data
|
||||
networks:
|
||||
|
@ -66,7 +66,7 @@ services:
|
|||
- docker-etcd
|
||||
|
||||
node3:
|
||||
image: quay.io/coreos/etcd
|
||||
image: quay.io/coreos/etcd:v3.4.0
|
||||
volumes:
|
||||
- node3-data:/etcd-data
|
||||
networks:
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
`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` 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
`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` 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。
|
||||
|
||||
|
@ -14,10 +14,10 @@ USAGE:
|
|||
etcdctl
|
||||
|
||||
VERSION:
|
||||
3.2.10
|
||||
3.4.0
|
||||
|
||||
API VERSION:
|
||||
3.2
|
||||
3.4
|
||||
|
||||
|
||||
COMMANDS:
|
||||
|
|
|
@ -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` 工具下载压缩包,并解压。
|
||||
|
||||
```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
|
||||
$ tar xzvf etcd-v3.2.10-linux-amd64.tar.gz
|
||||
$ cd etcd-v3.2.10-linux-amd64
|
||||
$ 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.4.0-linux-amd64.tar.gz
|
||||
$ cd etcd-v3.4.0-linux-amd64
|
||||
```
|
||||
|
||||
解压后,可以看到文件包括
|
||||
|
@ -35,14 +35,7 @@ $ sudo cp etcd* /usr/local/bin/
|
|||
|
||||
```bash
|
||||
$ 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.411938 I | embed: listening for client requests on localhost:2379
|
||||
```
|
||||
|
@ -68,22 +61,27 @@ hello world
|
|||
镜像名称为 `quay.io/coreos/etcd`,可以通过下面的命令启动 `etcd` 服务监听到 `2379` 和 `2380` 端口。
|
||||
|
||||
```bash
|
||||
$ export NODE1=192.168.1.21
|
||||
|
||||
$ docker run --name etcd \
|
||||
-p 2379:2379 \
|
||||
-p 2380:2380 \
|
||||
--volume=etcd-data:/etcd-data \
|
||||
quay.io/coreos/etcd:latest \
|
||||
/usr/local/bin/etcd \
|
||||
--data-dir=/etcd-data --name node1 \
|
||||
--initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \
|
||||
--advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \
|
||||
--initial-cluster node1=http://${NODE1}:2380
|
||||
$ docker run \
|
||||
-p 2379:2379 \
|
||||
-p 2380:2380 \
|
||||
--mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
|
||||
--name etcd-gcr-v3.4.0 \
|
||||
quay.io/coreos/etcd:v3.4.0 \
|
||||
/usr/local/bin/etcd \
|
||||
--name s1 \
|
||||
--data-dir /etcd-data \
|
||||
--listen-client-urls http://0.0.0.0:2379 \
|
||||
--advertise-client-urls http://0.0.0.0:2379 \
|
||||
--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` 是否成功启动。
|
||||
|
||||
### macOS 中运行
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
`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` 在设计的时候重点考虑了下面四个要素:
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ FROM 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 执行命令
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ $ docker run --name webserver -d -p 80:80 nginx
|
|||
|
||||
这条命令会用 `nginx` 镜像启动一个容器,命名为 `webserver`,并且映射了 80 端口,这样我们可以用浏览器去访问这个 `nginx` 服务器。
|
||||
|
||||
如果是在 Linux 本机运行的 Docker,或者如果使用的是 Docker for Mac、Docker for Windows,那么可以直接访问:<http://localhost>;如果使用的是 Docker Toolbox,或者是在虚拟机、云服务器上安装的 Docker,则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址。
|
||||
如果是在 Linux 本机运行的 Docker,或者如果使用的是 Docker Desktop for Mac/Windows,那么可以直接访问:<http://localhost>;如果使用的是 Docker Toolbox,或者是在虚拟机、云服务器上安装的 Docker,则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址。
|
||||
|
||||
直接用浏览器访问的话,我们会看到默认的 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
|
||||
```
|
||||
|
||||
这里我们命名为新的服务为 `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` 命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ $ docker image ls -a
|
|||
|
||||
### 列出部分镜像
|
||||
|
||||
不加任何参数的情况下,`docker image ls` 会列出所有顶级镜像,但是有时候我们只希望列出部分镜像。`docker image ls` 有好几个参数可以帮助做到这个事情。
|
||||
不加任何参数的情况下,`docker image ls` 会列出所有顶层镜像,但是有时候我们只希望列出部分镜像。`docker image ls` 有好几个参数可以帮助做到这个事情。
|
||||
|
||||
根据仓库名列出镜像
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ COPY database/ /app/database/
|
|||
COPY composer.json /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 \
|
||||
--ignore-platform-reqs \
|
||||
--no-interaction \
|
||||
|
|
|
@ -76,7 +76,7 @@ COPY database/ /app/database/
|
|||
COPY composer.json composer.lock /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 \
|
||||
--ignore-platform-reqs \
|
||||
--no-interaction \
|
||||
|
@ -184,7 +184,7 @@ COPY database/ /app/database/
|
|||
COPY composer.json /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 \
|
||||
--ignore-platform-reqs \
|
||||
--no-interaction \
|
||||
|
|
|
@ -64,7 +64,7 @@ Untagged: node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b16442
|
|||
|
||||
因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 `Untagged` 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 `Delete` 行为就不会发生。所以并非所有的 `docker image rm` 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
|
||||
|
||||
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 `docker pull` 看到的层数不一样的源。
|
||||
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变得非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 `docker pull` 看到的层数不一样的原因。
|
||||
|
||||
除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
|
||||
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
|
||||
Docker CE 支持以下版本的 [Fedora](https://fedoraproject.org/) 操作系统:
|
||||
|
||||
* 26 (Docker CE v18.03 及以下版本)
|
||||
* 27
|
||||
* 28
|
||||
* 29
|
||||
* 30
|
||||
|
||||
#### 卸载旧版本
|
||||
|
||||
|
|
|
@ -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](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
|
||||
$ 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` 文件夹即可(其间需要输入用户密码)。
|
||||
|
||||
|
@ -44,11 +44,11 @@ $ brew cask install docker
|
|||
|
||||
```bash
|
||||
$ docker --version
|
||||
Docker version 18.09.0, build 4d60db4
|
||||
Docker version 19.03.1, build 74b1e89
|
||||
$ 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 0.16.0, build 702c267f
|
||||
docker-machine version 0.16.1, build cce350d7
|
||||
```
|
||||
|
||||
如果 `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
|
||||
```
|
||||
|
||||
服务运行后,可以访问 <http://localhost>,如果看到了 "Welcome to nginx!",就说明 Docker for Mac 安装成功了。
|
||||
服务运行后,可以访问 <http://localhost>,如果看到了 "Welcome to nginx!",就说明 Docker Desktop for Mac 安装成功了。
|
||||
|
||||
![](_images/install-mac-example-nginx.png)
|
||||
|
||||
|
@ -71,3 +71,7 @@ $ docker rm webserver
|
|||
### 镜像加速
|
||||
|
||||
如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker [国内镜像加速](mirror.md)。
|
||||
|
||||
### 参考链接
|
||||
|
||||
* [官方文档](https://docs.docker.com/docker-for-mac/install/)
|
||||
|
|
|
@ -58,7 +58,7 @@ Registry Mirrors:
|
|||
国内无法直接获取 `gcr.io/*` 镜像,我们可以将 `gcr.io/<repo-name>/<image-name>:<version>` 替换为 `gcr.azk8s.cn/<repo-name>/<image-name>:<version>` ,例如
|
||||
|
||||
```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
|
||||
```
|
||||
|
|
|
@ -10,8 +10,6 @@ Docker CE 支持以下版本的 [Raspbian](https://www.raspberrypi.org/downloads
|
|||
|
||||
* Raspbian Stretch
|
||||
|
||||
* Raspbian Jessie (Docker CE v18.06 及以下版本)
|
||||
|
||||
*注:* `Raspbian` 是树莓派的开发与维护机构 [树莓派基金会](http://www.raspberrypi.org/) 推荐用于树莓派的首选系统,其基于 `Debian`。
|
||||
|
||||
### 使用 APT 安装
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
Docker CE 支持以下版本的 [Ubuntu](https://www.ubuntu.com/server) 操作系统:
|
||||
|
||||
* Disco 19.04
|
||||
* Cosmic 18.10
|
||||
* Bionic 18.04 (LTS)
|
||||
* Xenial 16.04 (LTS)
|
||||
|
||||
|
|
|
@ -22,6 +22,10 @@ Wait a moment and click Got it to start using Docker CE.
|
|||
|
||||
![](_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).
|
||||
|
||||
### Links
|
||||
|
||||
* [Docs](https://docs.docker.com/docker-for-windows/install/)
|
||||
|
|
|
@ -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 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.
|
||||
|
||||
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-soft]:https://en.wikipedia.org/wiki/Docker_(software)
|
||||
|
|
|
@ -4,13 +4,13 @@ Docker Machine 可以在多种操作系统平台上安装,包括 Linux、macOS
|
|||
|
||||
### macOS、Windows
|
||||
|
||||
Docker for Mac、Docker for Windows 自带 `docker-machine` 二进制包,安装之后即可使用。
|
||||
`Docker Desktop for Mac/Windows` 自带 `docker-machine` 二进制包,安装之后即可使用。
|
||||
|
||||
查看版本信息。
|
||||
|
||||
```bash
|
||||
$ docker-machine -v
|
||||
docker-machine version 0.13.0, build 9ba6da9
|
||||
docker-machine version 0.16.1, build cce350d7
|
||||
```
|
||||
|
||||
### Linux
|
||||
|
@ -20,7 +20,8 @@ docker-machine version 0.13.0, build 9ba6da9
|
|||
例如,在 Linux 64 位系统上直接下载对应的二进制包。
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
|
@ -28,5 +29,5 @@ $ sudo chmod +x /usr/local/bin/docker-machine
|
|||
|
||||
```bash
|
||||
$ docker-machine -v
|
||||
docker-machine version 0.13.0, build 9ba6da9
|
||||
docker-machine version 0.16.1, build cce350d7
|
||||
```
|
||||
|
|
|
@ -50,7 +50,7 @@ $ docker-machine create \
|
|||
|
||||
#### 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` 指定虚拟交换机名称
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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` 增加和上边一样的字符串即可。
|
||||
|
|
Loading…
Reference in New Issue