88 Commits

Author SHA1 Message Date
yeasy
59da0ff5ad Merge pull request #25 from philipz/master
From 台灣繁體版
2014-11-25 11:49:31 +08:00
philipz
51c7819ce1 Merge pull request #19 from ensky/fix-cntw
修正多個用詞
2014-11-24 23:06:32 +08:00
Ensky Lin
a795bf863a 修正多個用詞
"s/程序/程式/g" "s/性能/效能/g" "s/如下/以下/g" "s/加載/載入/g" "s/獲取/取得/g" "s/服務器/伺服器/g" "s/信息/訊息/g" "s/註釋/註解/g" "s/裏/裡/g" "s/構建/建立/g" "s/配置/設定/g"
2014-11-24 22:54:30 +08:00
Ensky Lin
9d0330915d 修正多個用詞 2014-11-24 22:37:20 +08:00
philipz
4789287f30 Merge pull request #17 from pcedison/master
修改第三、第五章用詞
2014-11-24 08:16:22 +08:00
philipz
8b9dbd74c5 Merge pull request #18 from suensummit/develop
replace terms (with R)
2014-11-24 08:15:19 +08:00
Marcus
44b5532042 修正多個用詞 2014-11-24 02:49:38 +08:00
Marcus
291217dd58 修改名詞 2014-11-24 02:39:47 +08:00
Marcus
fe155633ec 模塊->模組,存儲->儲存,默認->預設,變量->變數 2014-11-24 02:38:56 +08:00
Marcus
2b44ab2f6b 鏡像->映像檔,服務器->伺服器,批量->批次,訪問->連結,源碼->原始碼 2014-11-24 02:27:10 +08:00
Marcus
b3bcdf7166 鏡像-> 映像檔, 服務器->伺服器 2014-11-24 02:14:50 +08:00
Marcus
bf8719d551 修飾用詞 2014-11-24 01:39:07 +08:00
Marcus
05cfded4e1 修飾用詞 2014-11-24 01:35:54 +08:00
Summit Suen
ba64651d59 replace terms 2014-11-23 02:13:46 +08:00
Marcus
2c4ede2b99 修飾用詞 2014-11-22 15:36:09 +08:00
Marcus
b14f5217f1 修飾用詞 2014-11-22 15:32:36 +08:00
Marcus
73dd27f79e 修飾用詞 2014-11-22 15:25:43 +08:00
Marcus
237130150b 潤飾一些用詞 2014-11-22 15:13:30 +08:00
Marcus
17d03df446 對應的->換句話說 2014-11-22 14:59:47 +08:00
Marcus
8aa09dd966 源->套件庫, 自帶->內建 2014-11-22 14:55:29 +08:00
Marcus
dbfa8c8b82 源->套件庫 2014-11-22 14:52:37 +08:00
philipz
b19309a9c2 replace '鏡像' as '映像檔' 2014-11-22 01:01:45 +08:00
philipz
8723a52ebc replace '鏡像' as '映像檔' 2014-11-22 01:00:43 +08:00
philipz
ac2661cbd5 Merge pull request #15 from pcedison/master
第一、二章名詞修正
2014-11-22 00:52:32 +08:00
Marcus
686b3427a6 鏡像 -> 映像檔 2014-11-21 16:28:36 +08:00
Marcus
6215bd5b02 鏡像 -> 映像檔 2014-11-21 16:25:41 +08:00
Marcus
d25a602382 鏡像 -> 映像檔 2014-11-21 16:24:39 +08:00
Marcus
3d485d0432 鏡像 -> 映像檔 2014-11-21 16:22:28 +08:00
Marcus
86438891e0 鏡像->映像檔 2014-11-21 16:20:04 +08:00
Marcus
6dc91f4153 修改用詞、潤飾 2014-11-21 16:16:25 +08:00
philipz
4e1f82eee6 Fix word 2014-11-20 14:12:07 +08:00
philipz
6f4669c26c Merge pull request #14 from suensummit/develop
fix README.md
2014-11-20 14:10:20 +08:00
Summit Suen
9651db6a34 fix README.md 2014-11-20 13:18:03 +08:00
philipz
439d569c8b Merge pull request #12 from jasteralan/develop
Translate Dockerfile Chapter
2014-11-20 12:57:55 +08:00
jaster.chung@hwtrek.com
d090630f7f Translate Dockerfile chapter 2014-11-20 10:30:45 +08:00
philipz
939e98b040 Merge pull request #10 from a504082002/master
replace some words
2014-11-20 08:58:53 +08:00
a504082002
893e0f8bb7 replace '網絡' as '網路' 2014-11-20 01:06:47 +08:00
a504082002
d24b44076b replace '進程' as '程序' 2014-11-20 01:05:42 +08:00
a504082002
45acb9c3c3 replace '運行' as '執行' 2014-11-20 01:04:25 +08:00
a504082002
0f699adab0 replace '只讀' as '唯讀' 2014-11-20 01:03:05 +08:00
a504082002
d4ba34df99 merge master and develop 2014-11-20 00:59:41 +08:00
a504082002
3741994aef replace '操作系統' as '作業系統' 2014-11-20 00:09:22 +08:00
philipz
4a288084e1 Merge pull request #9 from laneser/master
translate readme, list, pull of image chapter.
2014-11-19 22:49:25 +08:00
lane
7a3b6fe171 translate readme, list, pull of image chapter. 2014-11-19 17:58:04 +08:00
lane
20289b49fc fix terms in container chapter. 2014-11-19 11:23:42 +08:00
philipz
5799061793 Merge pull request #7 from laneser/master
translate basic concept to traditional chinese
2014-11-19 11:16:51 +08:00
philipz
88950a428c Fix Github URL 2014-11-19 10:44:48 +08:00
lane
c21fd41952 translate basic concept to traditional chinese 2014-11-19 10:42:21 +08:00
philipz
1b900e1281 Fix contributors of README 2014-11-19 10:05:04 +08:00
philipz
fb1a111705 Update README.md 2014-11-19 09:55:29 +08:00
philipz
0fab5a33c8 Merge pull request #5 from laneser/master
translate install to traditional chinese
2014-11-19 09:16:34 +08:00
philipz
82845dbfb2 Merge pull request #4 from ChihChengLiang/master
summary translated
2014-11-19 09:16:26 +08:00
philipz
acdd28a5c6 Merge pull request #3 from suensummit/develop
update: /dockerfile/build_image.md
2014-11-19 09:16:06 +08:00
a504082002
6b168bced1 translate underly into traditional chinese 2014-11-19 01:03:13 +08:00
a504082002
cb4963b8fa translate security into traditional chinese 2014-11-19 01:01:35 +08:00
a504082002
47d4f30697 translate repository into traditional chinese 2014-11-19 01:00:04 +08:00
a504082002
2c7762fecc translate network into traditional chinese 2014-11-19 00:59:10 +08:00
a504082002
96c9b574dd translate introduction into traditional chinese 2014-11-19 00:58:33 +08:00
a504082002
0bd4106ed4 translate install into traditional chinese 2014-11-19 00:56:12 +08:00
a504082002
423781aec5 translate image into traditional chinese 2014-11-19 00:55:23 +08:00
a504082002
1d0a49ca31 translate dockerfile into traditional chinese 2014-11-19 00:53:01 +08:00
a504082002
e3085090b4 translate data_management into traditional chinese 2014-11-18 23:07:04 +08:00
Summit Suen
37dbe623bd fix update: /dockerfile/build_image.md again 2014-11-18 22:40:50 +08:00
Summit Suen
6850986efb fix update: /dockerfile/build_image.md & basic_structure.md 2014-11-18 22:37:05 +08:00
a504082002
b16ff0610b translate container into traditional chinese 2014-11-18 21:06:39 +08:00
a504082002
54ad70f9fd translate cases into traditional chinese 2014-11-18 21:05:06 +08:00
a504082002
f6073d41af translate basic_concept into traditional chinese 2014-11-18 21:03:58 +08:00
a504082002
c56ccb9c8a translate appendix_repo and appendix_resources into traditional chinese 2014-11-18 21:01:27 +08:00
a504082002
0a084995ce translate appendix_command into traditional chinese 2014-11-18 20:57:26 +08:00
a504082002
4926d0c337 translate advanced_network into traditional chinese 2014-11-18 20:54:05 +08:00
lane
bd9010f28d Merge remote-tracking branch 'baseremote/master' 2014-11-18 18:04:46 +08:00
lane
cb374089ba install translate to traditional chinese 2014-11-18 17:56:15 +08:00
Summit Suen
f6542a2fcb fix update: /dockerfile/build_image.md & basic_structure.md 2014-11-18 17:53:10 +08:00
Summit Suen
484340326b fix update: /dockerfile/build_image.md 2014-11-18 17:38:00 +08:00
SatoshiLiang
f4ba04c1c0 summary translated 2014-11-18 17:00:05 +08:00
Summit Suen
20c3941826 update: /dockerfile/build_image.md 2014-11-18 16:10:26 +08:00
Summit Suen
216059f835 update: /dockerfile/build_image.md 2014-11-18 16:05:07 +08:00
philipz
665e06c473 fix reference 2014-11-18 15:57:05 +08:00
philipz
4eee9fe9f5 Merge pull request #2 from suensummit/develop
test commit: /dockerfile/README.md & basic_structure.md
2014-11-18 15:53:35 +08:00
Summit Suen
fd748e30e0 test commit: /dockerfile/README.md & basic_structure.md 2014-11-18 15:46:57 +08:00
philipz
93f3edd62b Merge pull request #1 from laneser/master
introduction 正體化
2014-11-18 15:19:26 +08:00
lane
84e5cf1f58 fix table again. 2014-11-18 15:14:40 +08:00
lane
1655c2458d fix why table. 2014-11-18 15:11:19 +08:00
lane
01ba8b47a6 introduction 正體化 2014-11-18 15:05:50 +08:00
philipz
2d0b4da76e Update README.md 2014-11-18 14:58:26 +08:00
philipz
2ee6b1edfe Update README.md 2014-11-18 14:55:28 +08:00
philipz
a933cd5423 Update README.md 2014-11-18 13:40:49 +08:00
philipz
9ecb1194ca Update README.md 2014-11-18 13:32:24 +08:00
311 changed files with 2376 additions and 11153 deletions

View File

@@ -1,17 +0,0 @@
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

View File

@@ -1,29 +0,0 @@
* [ ] Have u googled the problem? If no, pls do that first!
### Environment
<!--请提供环境信息,包括操作系统版本等-->
<!--Provides env info like OS version-->
* [x] Linux
* [x] CentOS 7
* [ ] Ubuntu 16.04
* [ ] Ubuntu 17.10
* [ ] Debian 9
* [ ] Debian 8
* [ ] CoreOS
* [ ] macOS
* [ ] Windows 10
* [ ] Raspberry Pi (ARM)
* [ ] Others (Pls describe below)
### Docker Version
<!--如果你的 Docker 版本低于 17.09 请尽可能升级到该版本-->
<!--if Docker version under 17.09, please upgrade Docker to 17.09-->
* [x] 17.11 Edge
* [ ] 17.09 Stable
* [ ] 1.13.0 or Before
### Problem Description
<!--描述你的问题,请贴出操作步骤,终端报错日志-->
<!--describe problem with detailed steps and logs-->

View File

@@ -1,20 +0,0 @@
<!--
Thanks for your contribution.
See [CONTRIBUTING](CONTRIBUTING.md) for contribution guidelines.
-->
### Proposed changes (Mandatory)
<!--
Tell us what you did and why:
One line short description
And details in other paragraphs.
-->
### Fix issues (Optional)
<!--
Tell us what issues you fixed, e.g., fix #123
-->

2
.gitignore vendored
View File

@@ -5,5 +5,3 @@
_book/
*.swp
*.edx
.DS_Store
node_modules/

View File

@@ -1,36 +0,0 @@
language: bash
sudo: required
services:
- docker
before_install:
- openssl aes-256-cbc -K $encrypted_6cc8cff04075_key -iv $encrypted_6cc8cff04075_iv
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- export TZ='Asia/Shanghai'
- date
- git config --global user.name "khs1994"
- git config --global user.email "khs1994@khs1994.com"
script:
- docker run -it --rm -v $PWD:/srv/gitbook-src yeasy/docker_practice build
after_success:
- sudo chmod -R 777 _book
- cd _book
- git init
- git remote add origin "$REPO"
- git add .
- COMMIT=`date "+%F %T"`
- git commit -m "Travis CI Site updated $COMMIT"
- git push -f origin master:"$DEPLOY_BRANCH"
env:
global:
- DEPLOY_BRANCH: pages
# - DEPLOY_BRANCH: legacy-pages
- REPO: git@github.com:yeasy/docker_practice.git
addons:
ssh_known_hosts:
- github.com
branches:
only:
- master
- dev
# - docker-legacy

View File

@@ -1,26 +0,0 @@
FROM node:9-alpine
ENV TZ=Asia/Shanghai
WORKDIR /srv/gitbook
COPY book.json book.json
COPY docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache \
tzdata \
&& npm install -g gitbook-cli \
&& gitbook install \
&& ln -s /usr/local/bin/docker-entrypoint.sh / \
&& rm -rf /root/.npm /tmp/*
EXPOSE 4000
VOLUME /srv/gitbook-src
WORKDIR /srv/gitbook-src
ENTRYPOINT ["docker-entrypoint.sh"]
CMD server

View File

@@ -1,37 +0,0 @@
{
"title": "Docker -- 从入门到实践",
"author": "yeasy",
"language": "zh-hans",
"links": {
"sidebar": {
"GitHub": "https://github.com/yeasy/docker_practice"
}
},
"plugins": [
"-livereload",
"image-captions",
"github",
"page-treeview",
"editlink"
],
"pluginsConfig": {
"image-captions": {
"attributes": {
"width": "600"
},
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
},
"github": {
"url": "https://github.com/yeasy/docker_practice"
},
"editlink": {
"base": "https://github.com/yeasy/docker_practice/blob/master/",
"label": "编辑本页"
},
"page-treeview": {
"copyright": "Copyright &#169; yeasy",
"minHeaderCount": "2",
"minHeaderDeep": "2"
}
}
}

View File

@@ -1,43 +0,0 @@
user root;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
index index.html index.php;
server {
server_name localhost;
listen 4000;
root /srv/www/;
index index.html;
}
}

View File

@@ -1,5 +0,0 @@
sut:
build: .
volumes:
- ../:/srv/gitbook-src
command: build

View File

@@ -1,19 +0,0 @@
#!/bin/sh
START=`date "+%F %T"`
if [ $1 = "sh" ];then sh ; exit 0; fi
rm -rf node_modules _book
cp -a . ../gitbook
cd ../gitbook
main(){
if [ "$1" = build ];then gitbook build; cp -a _book ../gitbook-src; echo $START; date "+%F %T"; exit 0; fi
exec gitbook serve
exit 0
}
main $1 $2 $3

Binary file not shown.

View File

@@ -1,8 +0,0 @@
#!/usr/bin/env bash
# cd .travis
# ./update.sh
if [ ! -f Dockerfile ];then exit 1; fi
cp -a ../book.json book.json

View File

@@ -1,108 +0,0 @@
## 主要修订记录
* 0.9.0: 2017-12-31
* 0.9.0-rc2: 2017-12-10
* 增加 Docker 中文资源链接
* 增加介绍基于 Docker 的 CI/CD 工具 `Drone`
* 增加 `docker secret` 相关内容
* 增加 `docker config` 相关内容
* 增加 `LinuxKit` 相关内容
* 更新 `CoreOS` 章节
* 更新 `etcd` 章节,基于 3.x 版本
* 删除 `Docker Compose` 中的 `links`指令
* 替换 `docker daemon` 命令为 `dockerd`
* 替换 `docker ps` 命令为 `docker container ls`
* 替换 `docker images` 命令为 `docker image ls`
* 修改 `安装 Docker` 一节中部分文字表述
* 移除历史遗留文件和错误的文件
* 优化文字排版
* 调整目录结构
* 修复内容逻辑错误
* 修复`404` 链接
* 0.9.0-rc1: 2017-11-29
* 根据最新版本v17.09)修订内容
* 增加 `Dockerfile` 多阶段构建( `multistage builds` ) `Docker 17.05` 新增特性
* 增加 `docker exec` 子命令介绍
* 增加 `docker` 管理子命令 `container` `image` `network` `volume` 介绍
* 增加 `树莓派单片电脑` 安装 Docker
* 增加 Docker 存储驱动 `OverlayFS` 相关内容
* 更新 `Docker CE` `v17.x` 安装说明
* 更新 `Docker 网络` 一节
* 更新 `Docker Machine` 基于 0.13.0 版本
* 更新 `Docker Compose` 基于 3 文件格式
* 删除 `Docker Swarm` 相关内容,替换为 `Swarm mode` `Docker 1.12.0` 新增特性
* 删除 `docker run` `--link` 参数
* 精简 `Docker Registry` 一节
* 替换 `docker run` `-v` 参数为 `--mount`
* 修复 `404` 链接
* 优化文字排版
* 增加离线阅读功能
* 0.8.0: 2017-01-08
* 修正文字内容
* 根据最新版本1.12)修订安装使用
* 补充附录章节
* 0.7.0: 2016-06-12
* 根据最新版本进行命令调整
* 修正若干文字描述
* 0.6.0: 2015-12-24
* 补充 Machine 项目
* 修正若干 bug
* 0.5.0: 2015-06-29
* 添加 Compose 项目
* 添加 Machine 项目
* 添加 Swarm 项目
* 完善 Kubernetes 项目内容
* 添加 Mesos 项目内容
* 0.4.0: 2015-05-08
* 添加 Etcd 项目
* 添加 Fig 项目
* 添加 CoreOS 项目
* 添加 Kubernetes 项目
* 0.3.0: 2014-11-25
* 完成仓库章节
* 重写安全章节
* 修正底层实现章节的架构、命名空间、控制组、文件系统、容器格式等内容
* 添加对常见仓库和镜像的介绍
* 添加 Dockerfile 的介绍
* 重新校订中英文混排格式
* 修订文字表达
* 发布繁体版本分支zh-Hant
* 0.2.0: 2014-09-18
* 对照官方文档重写介绍、基本概念、安装、镜像、容器、仓库、数据管理、网络等章节
* 添加底层实现章节
* 添加命令查询和资源链接章节
* 其它修正
* 0.1.0: 2014-09-05
* 添加基本内容
* 修正错别字和表达不通顺的地方

View File

@@ -1,41 +0,0 @@
## 如何贡献项目
领取或创建新的 [Issue](https://github.com/yeasy/docker_practice/issues),如 [issue 235](https://github.com/yeasy/docker_practice/issues/235),添加自己为 `Assignee`
在 [GitHub](https://github.com/yeasy/docker_practice/fork) 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```bash
$ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice
```
修改代码后提交,并推送到自己的仓库,注意修改提交消息为对应 Issue 号和描述。
```bash
# Update the content
$ git commit -a -s
# In commit msg dialog, add content like "Fix issue #235: describe ur change"
$ git push
```
在 [GitHub](https://github.com/yeasy/docker_practice/pulls) 上提交 `Pull Request`,添加标签,并邀请维护者进行 `Review`
定期使用项目仓库内容更新自己仓库内容。
```bash
$ git remote add upstream https://github.com/yeasy/docker_practice
$ git fetch upstream
$ git rebase upstream/master
$ git push -f origin master
```
## 排版规范
本开源书籍遵循 [中文排版指南](https://github.com/mzlogin/chinese-copywriting-guidelines) 规范。

111
README.md
View File

@@ -1,50 +1,95 @@
# Docker — 从入门到实践
Docker —— 從入門到實踐
===============
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/docker/pulls/yeasy/docker_practice.svg)](https://store.docker.com/community/images/yeasy/docker_practice) [![](https://travis-ci.org/yeasy/docker_practice.svg?branch=master)](https://travis-ci.org/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://badges.gitter.im/docker_practice/Lobby.svg)](https://gitter.im/docker_practice/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
v0.2.9
0.9.0(2017-12-31)
[Docker](docker.com) 是個偉大的項目,它徹底釋放了虛擬化的,讓應用程式的分派、部署和管理都變得前所未有的有效率和輕鬆!
*修订说明:本书内容已基于 Docker CE v17.MM 进行了重新修订2017 年底发布了 0.9.0 版本。旧版本Docker 1.13-)内容,请阅读 [docker-legacy](https://github.com/yeasy/docker_practice/tree/docker-legacy) 分支的内容。*
本書既適用於具備基礎 Linux 知識的 Docker 初學者,也可供希望理解原理和實做的進階使用者參考。同時,書中給出的實踐案例,可供在進行實際部署時借鑒。
[Docker](http://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
本書源於 [WaitFish](github.com/qcpm1983) 的《[Docker 學習手冊 v1.0](https://github.com/yeasy/docker_practice/raw/master/_local/docker_manual_waitfish.pdf)》內容。後來,[yeasy](github.com/yeasy)
根據最新 Docker 版本對內容進行了修訂和重寫,並增加內容;經協商將所有內容開源,採用網路合作的方式進行維護。
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker节约有限的时间
前六章為基礎內容,供使用者理解 Docker 的基本概念和操作7 ~ 9 章介紹一些進階操作;第 10 章給出典型的應用場景和實踐案例11 ~ 13 章介紹關於 Docker 實做的相關技術
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 13 章介绍了容器生态中的几个核心项目14、15 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、CoreOS、Kubernetes、Mesos、容器云等热门开源项目。最后展示了使用容器技术的典型的应用场景和实践案例
最新版本線上閱讀:[正體版](https://www.gitbook.io/book/philipzheng/docker_practice)、[簡體版](https://www.gitbook.io/book/yeasy/docker_practice) 或 [DockerPool](http://dockerpool.com/static/books/docker_practice/index.html)
* 在线阅读:[GitBook](https://www.gitbook.io/book/yeasy/docker_practice)[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://www.gitbook.com/download/pdf/book/yeasy/docker_practice)[epub](https://www.gitbook.com/download/epub/book/yeasy/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)
另外,歡迎加入 [Docker.Taipei](https://www.facebook.com/groups/docker.taipei/) 和 [Meetup](http://www.meetup.com/Docker-Taipei/) ,分享 Docker 資源,交流 Docker 技術。
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新版的 Docker (v17.MM) 进行学习实践。欢迎 [参与维护项目](CONTRIBUTING.md)。
* [修订记录](CHANGELOG.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
本書原始碼在 Github 上維護,歡迎參與: [https://github.com/philipz/docker_practice](https://github.com/philipz/docker_practice)
## 技术交流
欢迎加入 Docker 技术交流 QQ 群,分享 Docker 资源,交流 Docker 技术。
感謝所有的 [貢獻者](https://github.com/philipz/docker_practice/graphs/contributors)。
* QQ 群 I 已满341410255
* QQ 群 II 已满419042067
* QQ 群 III 已满210028779
* QQ 群 IV 已满483702734
* QQ 群 V 已满460598761
* QQ 群 VI 已满581983671
* QQ 群 VII 已满252403484
* QQ 群 VIII已满544818750
* QQ 群 IX 已满571502246
* QQ 群 X 可加145983035
## 主要版本歷史
* 0.3: 2014-10-TODO
* 完成倉庫章節;
* 重寫安全章節;
* 修正底層實做章節的架構、名字空間、控制組、檔案系統、容器格式等內容;
* 新增對常見倉庫和鏡像的介紹;
* 新增 Dockerfile 的介紹;
* 重新校訂中英文混排格式。
* 0.2: 2014-09-18
* 對照官方文檔重寫介紹、基本概念、安裝、鏡像、容器、倉庫、資料管理、網路等章節;
* 新增底層實做章節;
* 新增命令查詢和資源連結章節;
* 其它修正。
* 0.1: 2014-09-05
* 新增基本內容;
* 修正錯別字和表達不通順的地方。
## 进阶学习
![](https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer2.png)
## 貢獻力量
《[Docker 技术入门与实战](http://item.jd.com/12121728.html)》第二版已经正式出版,针对初版进行内容升级,欢迎大家阅读使用并反馈建议。
如果想做出貢獻的話,你可以:
* [京东图书](https://item.jd.com/12121728.html)
* [China-Pub](http://product.china-pub.com/5089907)
- 幫忙校對,挑錯別字、語病等等
- 提出修改建議
- 提出術語翻譯建議
## 鼓励项目
## 翻譯建議
欢迎鼓励项目一杯 coffee~
如果你願意一起校對的話,請仔細閱讀:
![](https://github.com/yeasy/docker_practice/raw/master/_images/donate.jpeg)
- 使用 markdown 進行翻譯,文件名必須使用英文,因為中文的話 gitbook 編譯的時候會出問題
- 引號請使用「」和『』
- fork 過去之後新建一個分支進行翻譯,完成後 pull request 這個分支,沒問題的話我會合併到 master 分支中
- 有其他任何問題都歡迎發 issue我看到了會盡快回覆
謝謝!
## 關於術語
翻譯術語的時候請參考這個流程:
- 盡量保證與台灣習慣術語和已翻譯的內容一致
- 盡量先搜尋,一般來說程式語言的大部分術語是一樣的,可以參考[這個網站](http://jjhou.boolan.com/terms.htm)
- 如果以上兩條都沒有找到合適的結果,請自己決定一個合適的翻譯或者直接使用英文原文,後期校對的時候會進行統一
- 校稿時,若有發現沒有被翻譯成台灣術語的大陸術語,可以將它新增到 translation.json 中
- 可以主動提交替換過的文本給我,或是僅提交新增過的 translation.json 也可,我會再進行文本的替換
- 請務必確定提交的翻譯對照組不會造成字串循環替代ex: 因為「類」->「類別」,造成下次再執行自動翻譯時「類別」又變成「類別別」)
對翻譯有任何意見都歡迎發 issue我看到了會盡快回覆
## 參加步驟
參考 [Swift 說明](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/),欲翻譯章節就直接在 github 上發 Issue 中註明或直接發Pull Request 修改。m(_ _)m
有些朋友可能不太清楚如何幫忙翻譯,我這裡寫一個簡單的流程,大家可以參考一下:
1. 首先 fork 我的項目
2. 把 fork 過去的項目也就是你的項目 clone 到你的本地
3. 在命令行執行 `git branch develop` 來建立一個新分支
4. 執行 `git checkout develop` 來切換到新分支
5. 執行 `git remote add upstream https://github.com/philipz/docker_practice` 把我的庫新增為遠端庫
6. 執行 `git remote update`更新
7. 執行 `git fetch upstream master` 拉取我的庫的更新到本地
8. 執行 `git rebase upstream/master` 將我的更新合並到你的分支
這是一個初始化流程,只需要做一遍就行,之後請一直在 develop 分支進行修改。
如果修改過程中我的庫有了更新,請重復 6、7、8 步。
修改之後,首先 push 到你的庫,然後登錄 GitHub在你的 repo 的首頁可以看到一個 `pull request` 按鈕,點擊它,填寫一些說明資訊,然後提交即可。
## 原出處及參考資料
1. [Docker —— 从入门到实践](https://github.com/yeasy/docker_practice/)
2. [《The Swift Programming Language­》正體中文版](https://github.com/tommy60703/the-swift-programming-language-in-traditional-chinese/)

View File

@@ -1,158 +1,83 @@
# [Docker — 从入门到实践](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
# Summary
* [前言](README.md)
* [修订记录](CHANGELOG.md)
* [如何贡献](CONTRIBUTING.md)
* [Docker 简介](introduction/README.md)
* [什么是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md)
* [Docker 簡介](introduction/README.md)
* [什麼是 Docker](introduction/what.md)
* [為什麼要用 Docker](introduction/why.md)
* [基本概念](basic_concept/README.md)
* [镜像](basic_concept/image.md)
* [容器](basic_concept/container.md)
* [仓库](basic_concept/repository.md)
* [装 Docker](install/README.md)
* [Ubuntu](install/ubuntu.md)
* [Debian](install/debian.md)
* [CentOS](install/centos.md)
* [Raspberry Pi](install/raspberry-pi.md)
* [macOS](install/mac.md)
* [Windows PC](install/windows.md)
* [镜像加速器](install/mirror.md)
* [使用镜像](image/README.md)
* [获取镜像](image/pull.md)
* [列出镜像](image/list.md)
* [删除本地镜像](image/rm.md)
* [利用 commit 理解镜像构成](image/commit.md)
* [使用 Dockerfile 定制镜像](image/build.md)
* [Dockerfile 指令详解](image/dockerfile/README.md)
* [COPY 复制文件](image/dockerfile/copy.md)
* [ADD 更高级的复制文件](image/dockerfile/add.md)
* [CMD 容器启动命令](image/dockerfile/cmd.md)
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
* [ENV 设置环境变量](image/dockerfile/env.md)
* [ARG 构建参数](image/dockerfile/arg.md)
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
* [USER 指定当前用户](image/dockerfile/user.md)
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
* [参考文档](image/dockerfile/references.md)
* [Dockerfile 多阶段构建](image/multistage-builds.md)
* [其它制作镜像的方式](image/other.md)
* [实现原理](image/internal.md)
* [操作容器](container/README.md)
* [启动](container/run.md)
* [守护态运行](container/daemon.md)
* [终止](container/stop.md)
* [进入容器](container/attach_exec.md)
* [导出和导入](container/import_export.md)
* [删除](container/rm.md)
* [访问仓库](repository/README.md)
* [Docker Hub](repository/dockerhub.md)
* [私有仓库](repository/registry.md)
* [私有仓库高级配置](repository/registry_auth.md)
* [数据管理](data_management/README.md)
* [数据卷](data_management/volume.md)
* [监听主机目录](data_management/bind-mounts.md)
* [使用网络](network/README.md)
* [外部访问容器](network/port_mapping.md)
* [容器互联](network/linking.md)
* [配置 DNS](network/dns.md)
* [高级网络配置](advanced_network/README.md)
* [快速配置指南](advanced_network/quick_guide.md)
* [容器访问控制](advanced_network/access_control.md)
* [端口映射实现](advanced_network/port_mapping.md)
* [配置 docker0 网桥](advanced_network/docker0.md)
* [自定义网桥](advanced_network/bridge.md)
* [工具和示例](advanced_network/example.md)
* [编辑网络配置文件](advanced_network/config_file.md)
* [实例:创建一个点到点连接](advanced_network/ptp.md)
* [Docker 三剑客之 Compose 项目](compose/README.md)
* [简介](compose/introduction.md)
* [安装与卸载](compose/install.md)
* [使用](compose/usage.md)
* [命令说明](compose/commands.md)
* [Compose 模板文件](compose/compose_file.md)
* [实战 Django](compose/django.md)
* [实战 Rails](compose/rails.md)
* [实战 WordPress](compose/wordpress.md)
* [Docker 三剑客之 Machine 项目](machine/README.md)
* [安装](machine/install.md)
* [使用](machine/usage.md)
* [Docker 三剑客之 Docker Swarm](swarm/README.md)
* [Swarm mode](swarm_mode/README.md)
* [基本概念](swarm_mode/overview.md)
* [创建 Swarm 集群](swarm_mode/create.md)
* [部署服务](swarm_mode/deploy.md)
* [使用 compose 文件](swarm_mode/stack.md)
* [管理敏感数据](swarm_mode/secret.md)
* [管理配置信息](swarm_mode/config.md)
* [映像檔](basic_concept/image.md)
* [容器](basic_concept/container.md)
* [倉庫](basic_concept/repository.md)
* [](install/README.md)
* [Ubuntu](install/ubuntu.md)
* [CentOS](install/centos.md)
* [映像檔](image/README.md)
* [取得映像檔](image/pull.md)
* [列出](image/list.md)
* [建立](image/create.md)
* [存出和載入](image/save_load.md)
* [移除](image/rmi.md)
* [實做原理](image/internal.md)
* [容器](container/README.md)
* [啟動](container/run.md)
* [守護態執行](container/daemon.md)
* [終止](container/stop.md)
* [進入容器](container/enter.md)
* [導出與導入](container/import_export.md)
* [刪除](container/rm.md)
* [倉庫](repository/README.md)
* [Docker Hub](repository/dockerhub.md)
* [私有倉庫](repository/local_repo.md)
* [設定文件](repository/config.md)
* [數據管理](data_management/README.md)
* [數據卷](data_management/volume.md)
* [數據卷容器](data_management/container.md)
* [備份、恢復、遷移數據卷](data_management/management.md)
* [使用網路](network/README.md)
* [外部訪問容器](network/port_mapping.md)
* [容器互連](network/linking.md)
* [進階網路設定](advanced_network/README.md)
* [快速設定指南](advanced_network/quick_guide.md)
* [設定 DNS](advanced_network/dns.md)
* [容器訪問控制](advanced_network/access_control.md)
* [端口映射實做](advanced_network/port_mapping.md)
* [設定 docker0 網橋](advanced_network/docker0.md)
* [自定義網橋](advanced_network/bridge.md)
* [工具與範例](advanced_network/example.md)
* [編輯網路設定文件](advanced_network/config_file.md)
* [實例:創造一個點對點連接](advanced_network/ptp.md)
* [實戰案例](cases/README.md)
* [使用 Supervisor 來管理程式](cases/supervisor.md)
* [建立 tomcat/weblogic 集群](cases/tomcat.md)
* [多台實體主機之間的容器互連](cases/container_connect.md)
* [標準化開發測試和生產環境](cases/environment.md)
* [安全](security/README.md)
* [核命名空](security/kernel_ns.md)
* [控制](security/control_group.md)
* [端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [总结](security/summary.md)
* [底层实现](underly/README.md)
* [基本架构](underly/arch.md)
* [命名空间](underly/namespace.md)
* [控制组](underly/cgroups.md)
* [联合文件系统](underly/ufs.md)
* [容器格式](underly/container_format.md)
* [网络](underly/network.md)
* [Etcd 项目](etcd/README.md)
* [简介](etcd/intro.md)
* [安装](etcd/install.md)
* [集群](etcd/cluster.md)
* [使用 etcdctl](etcd/etcdctl.md)
* [CoreOS 项目](coreos/README.md)
* [简介](coreos/intro.md)
* [工具](coreos/intro_tools.md)
* [快速搭建 CoreOS 集群](coreos/quickstart.md)
* [Kubernetes 项目](kubernetes/README.md)
* [简介](kubernetes/intro.md)
* [快速上手](kubernetes/quickstart.md)
* [基本概念](kubernetes/concepts.md)
* [kubectl 使用](kubernetes/kubectl.md)
* [架构设计](kubernetes/design.md)
* [Mesos - 优秀的集群资源调度平台](mesos/README.md)
* [Mesos 简介](mesos/intro.md)
* [安装与使用](mesos/installation.md)
* [原理与架构](mesos/architecture.md)
* [Mesos 配置项解析](mesos/configuration.md)
* [日志与监控](mesos/monitor.md)
* [常见应用框架](mesos/framework.md)
* [本章小结](mesos/summary.md)
* [容器与云计算](cloud/README.md)
* [简介](cloud/intro.md)
* [亚马逊云](cloud/aws.md)
* [腾讯云](cloud/qcloud.md)
* [阿里云](cloud/alicloud.md)
* [小结](cloud/summary.md)
* [实战案例-操作系统](cases/os/README.md)
* [Busybox](cases/os/busybox.md)
* [Alpine](cases/os/alpine.md)
* [Debian Ubuntu](cases/os/debian.md)
* [CentOS Fedora](cases/os/centos.md)
* [本章小结](cases/os/summary.md)
* [实战案例-CI/CD](cases/ci/README.md)
* [Drone](cases/ci/drone.md)
* [Docker 开源项目](opensource/README.md)
* [LinuxKit](opensource/linuxkit.md)
* [附录](appendix/README.md)
* [附录一:常见问题总结](appendix/faq/README.md)
* [附录二:热门镜像介绍](appendix/repo/README.md)
* [Ubuntu](appendix/repo/ubuntu.md)
* [CentOS](appendix/repo/centos.md)
* [MySQL](appendix/repo/mysql.md)
* [MongoDB](appendix/repo/mongodb.md)
* [Redis](appendix/repo/redis.md)
* [Nginx](appendix/repo/nginx.md)
* [WordPress](appendix/repo/wordpress.md)
* [Node.js](appendix/repo/nodejs.md)
* [附录三Docker 命令查询](appendix/command/README.md)
* [附录四Dockerfile 最佳实践](appendix/best_practices.md)
* [附录五:资源链接](appendix/resources/README.md)
* [附录六Docker 中文资源](appendix/resources/cn.md)
* [核命名空](security/kernel_ns.md)
* [控制](security/control_group.md)
* [服端防](security/daemon_sec.md)
* [核能力](security/kernel_capability.md)
* [安全特性](security/other_feature.md)
* [總結](security/summary.md)
* [Dockerfile](dockerfile/README.md)
* [基本結構](dockerfile/basic_structure.md)
* [指令](dockerfile/instructions.md)
* [建立映像檔](dockerfile/build_image.md)
* [底層實做](underly/README.md)
* [基本架構](underly/arch.md)
* [命名空間](underly/namespace.md)
* [控制組](underly/cgroups.md)
* [Union 文件系統](underly/ufs.md)
* [容器格式](underly/container_format.md)
* [網路](underly/network.md)
* [附錄一:命令查詢](appendix_command/README.md)
* [附錄二:常見倉庫介紹](appendix_repo/README.md)
* [Ubuntu](appendix_repo/ubuntu.md)
* [CentOS](appendix_repo/centos.md)
* [MySQL](appendix_repo/mysql.md)
* [MongoDB](appendix_repo/mongodb.md)
* [Redis](appendix_repo/redis.md)
* [Nginx](appendix_repo/nginx.md)
* [WordPress](appendix_repo/wordpress.md)
* [Node.js](appendix_repo/nodejs.md)
* [附錄三:資源連結](appendix_resources/README.md)

View File

@@ -1,2 +0,0 @@
theme: jekyll-theme-slate
include: [_images]

View File

@@ -1,56 +1,56 @@
//dot -Tpng xx.dot -o xx.png
digraph G {
rankdir=TB;
fontname = "Microsoft YaHei";
fontsize = 14;
penwidth = 3;
compound=true;
rankdir=LR;
node [shape = record];
edge [fontname = "Arial", fontsize = 12, color="darkgreen" ];
image[label="Image",color=blue];
registry[label="Registry",color=blue];
tar[label="Tar files",color=blue];
subgraph cluster_container {
label = "Container";
style = "bold";
color = blue;
edge [fontname = "Arial", fontsize = 11, color="skyblue" ];
//node [style=filled];
run[label="Running",shape=circle, style=filled, fillcolor=green];
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
run->pause[label="pause"];
pause->run[label="unpause"];
run->run[label="restart"];
run->stop[label="kill"];
stop->run[label="start"];
}
run->image[label="commit",ltail=cluster_container];
image->run[label="start"];
image->tar[label="export|save"];
tar->image[label="import"];
image->registry[label="push"];
registry->image[label="pull"];
//heat[label="heat commands",color=blue];
//heatshell[label="heatclient.shell.HeatShell",color=blue];
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
//heatclient[label="heatclient.client.Client",color=blue];
//client[label="heatclient.v1.client.Client",color=blue];
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
//{rank=same; image cluster_container}
//{rank=same; rpcproxy apimixin}
}
//dot -Tpng xx.dot -o xx.png
digraph G {
rankdir=TB;
fontname = "Microsoft YaHei";
fontsize = 14;
penwidth = 3;
compound=true;
rankdir=LR;
node [shape = record];
edge [fontname = "Arial", fontsize = 12, color="darkgreen" ];
image[label="Image",color=blue];
registry[label="Registry",color=blue];
tar[label="Tar files",color=blue];
subgraph cluster_container {
label = "Container";
style = "bold";
color = blue;
edge [fontname = "Arial", fontsize = 11, color="skyblue" ];
//node [style=filled];
run[label="Running",shape=circle, style=filled, fillcolor=green];
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
run->pause[label="pause"];
pause->run[label="unpause"];
run->run[label="restart"];
run->stop[label="kill"];
stop->run[label="start"];
}
run->image[label="commit",ltail=cluster_container];
image->run[label="start"];
image->tar[label="export|save"];
tar->image[label="import"];
image->registry[label="push"];
registry->image[label="pull"];
//heat[label="heat commands",color=blue];
//heatshell[label="heatclient.shell.HeatShell",color=blue];
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
//heatclient[label="heatclient.client.Client",color=blue];
//client[label="heatclient.v1.client.Client",color=blue];
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
//{rank=same; image cluster_container}
//{rank=same; rpcproxy apimixin}
}

BIN
_images/cmd_logic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

45
_local/.bashrc_docker Normal file
View File

@@ -0,0 +1,45 @@
# Some useful commands to use docker.
# Author: yeasy@github
# Created:2014-09-25
alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'"
alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
if [ -e $(dirname "$0")/nsenter ]; then
# with boot2docker, nsenter is not in the PATH but it is in the same folder
NSENTER=$(dirname "$0")/nsenter
else
NSENTER=nsenter
fi
[ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return
if [ -z "$1" ]; then
echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
echo ""
echo "Enters the Docker CONTAINER and executes the specified COMMAND."
echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
if [ -z "$PID" ]; then
echo "WARN Cannot find the given container"
return
fi
shift
OPTS="--target $PID --mount --uts --ipc --net --pid"
if [ -z "$1" ]; then
# No command given.
# Use su to clear all host environment variables except for TERM,
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
# and start a login shell.
#sudo $NSENTER "$OPTS" su - root
sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
else
# Use env to clear all host environment variables.
sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i $@
fi
fi
}

Binary file not shown.

13
_local/pull_all.sh Normal file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
# This script will update all local images
# See: https://github.com/yeasy/docker_practice/blob/master/_local/pull_all.sh
# Usage: pull_all
# Author: yeasy@github
# Create: 2014-09-23
for image in `sudo docker images|grep -v "REPOSITORY"|grep -v "<none>"|awk '{print $1":"$2}'`
do
sudo docker pull $image
done

12
_local/push_all.sh Normal file
View File

@@ -0,0 +1,12 @@
#!/bin/sh
# This script will upload all local images to a registry server ($registry is the default value).
# This script requires the push_images, which can be found at https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
# Usage: push_all
# Author: yeasy@github
# Create: 2014-09-23
for image in `sudo docker images|grep -v "REPOSITORY"|grep -v "<none>"|awk '{print $1":"$2}'`
do
push_images $image
done

47
_local/push_images.sh Normal file
View File

@@ -0,0 +1,47 @@
#!/bin/sh
# This script will upload the given local images to a registry server ($registry is the default value).
# See: https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
# Usage: push_images image1 [image2...]
# Author: yeasy@github
# Create: 2014-09-23
#The registry server address where you want push the images into
registry=127.0.0.1:5000
### DO NOT MODIFY THE FOLLOWING PART, UNLESS YOU KNOW WHAT IT MEANS ###
echo_r () {
[ $# -ne 1 ] && return 0
echo -e "\033[31m$1\033[0m"
}
echo_g () {
[ $# -ne 1 ] && return 0
echo -e "\033[32m$1\033[0m"
}
echo_y () {
[ $# -ne 1 ] && return 0
echo -e "\033[33m$1\033[0m"
}
echo_b () {
[ $# -ne 1 ] && return 0
echo -e "\033[34m$1\033[0m"
}
usage() {
sudo docker images
echo "Usage: $0 registry1:tag1 [registry2:tag2...]"
}
[ $# -lt 1 ] && usage && exit
echo_b "The registry server is $registry"
for image in "$@"
do
echo_b "Uploading $image..."
sudo docker tag $image $registry/$image
sudo docker push $registry/$image
sudo docker rmi $registry/$image
echo_g "Done"
done

View File

@@ -1,15 +1,12 @@
# 高级网络配置
# 進階網路設定
本章將介紹 Docker 的一些進階網路設定和選項。
>注意:本章属于 `Docker` 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习 [Docker Compose](../compose) 一节
當 Docker 啟動時,會自動在主機上建立一個 `docker0` 虛擬橋接器,實際上是 Linux 的一個 bridge可以理解為一個軟體交換機。它會在掛載到它的網卡之間進行轉發
本章将介绍 Docker 的一些高级网络配置和选项
同時,Docker 隨機分配一個本地未占用的私有網段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定義)中的一個地址給 `docker0` 接口。比如典型的 `172.17.42.1`,網路遮罩為 `255.255.0.0`。此後啟動的容器內的網卡也會自動分配一個同一網段(`172.17.0.0/16`)的網址
Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一个 bridge可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发
當建立一個 Docker 容器的時候,同時會建立了一對 `veth pair` 接口(當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。這對接口一端在容器內,即 `eth0`;另一端在本地並被掛載到 `docker0` 網橋,名稱以 `veth` 開頭(例如 `vethAQI2QT`。透過這種方式主機可以跟容器通信容器之間也可以相互通信。Docker 就建立了在主機和所有容器之間一個虛擬共享網路
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
![Docker 網路](../_images/network.png)
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`。通过这种方式主机可以跟容器通信容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络
![Docker 网络](_images/network.png)
接下来的部分将介绍在一些场景中Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
接下來的部分將介紹在一些場景中Docker 所有的網路自訂設定。以及透過 Linux 命令來調整、補充、甚至替換 Docker 預設的網路設定

View File

@@ -1,36 +1,36 @@
## 容器访问控制
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现`iptables` 是 Linux 上默的防火墙软件,在大部分行版中都自
## 容器訪問控制
容器的訪問控制,主要透過 Linux 上的 `iptables` 防火墻來進行管理和實做`iptables` 是 Linux 上默的防火墻軟件,在大部分行版中都自
### 容器访问外部网络
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系中,检查转发是否打
### 容器訪問外部網路
容器要想訪問外部網路,需要本地系統的轉發支持。在Linux 系中,檢查轉發是否打
```bash
```
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
如果 0说明没有开启转发,则需要手动打开
```bash
如果 0說明沒有開啟轉發,則需要手動打開
```
$sysctl -w net.ipv4.ip_forward=1
```
如果在启动 Docker 服务的时候设`--ip-forward=true`, Docker 就会自动设定系`ip_forward` 参数为 1。
如果在啟動 Docker 服務的時候設`--ip-forward=true`, Docker 就會自動設定系`ip_forward` 參數為 1。
### 容器之间访问
容器之相互访问,需要方面的支持。
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
* 本地系的防火墙软件 -- `iptables` 是否允许通过
### 容器之間訪問
容器之相互訪問,需要方面的支持。
* 容器的網路拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
* 本地系的防火墻軟件 -- `iptables` 是否允許透過
#### 访问所有端口
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 上。策略为通过`ACCEPT`是禁止(`DROP`)取决于配置`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 则不会添加 `iptables` 规则
#### 訪問所有端口
當啟動 Docker 服務時候,默認會新增一條轉發策略到 iptables 的 FORWARD 上。策略為透過`ACCEPT`是禁止(`DROP`)取決於設定`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 則不會新增 `iptables` 規則
,默认情况下,不同容器之是允许网络互通的。如果了安全考,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 禁止它。
,默認情況下,不同容器之是允許網路互通的。如果了安全考,可以在 `/etc/default/docker` 文件中設定 `DOCKER_OPTS=--icc=false` 禁止它。
#### 访问指定端口
通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的放端口。
#### 訪問指定端口
透過 `-icc=false` 關閉網路訪問後,還可以透過 `--link=CONTAINER_NAME:ALIAS` 選項來訪問容器的放端口。
例如,在启动 Docker 服务时,可以同使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系中的 `iptables` 规则
例如,在啟動 Docker 服務時,可以同使用 `icc=false --iptables=true` 參數來關閉允許相互的網路訪問,並讓 Docker 可以修改系中的 `iptables` 規則
,系中的 `iptables` 规则可能是
```bash
,系中的 `iptables` 規則可能是
```
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
@@ -39,10 +39,10 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0
...
```
后,启动容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker `iptable`为 两个容器分别添加一条 `ACCEPT` 规则,允相互访问开放的端口(取决于 `Dockerfile` 中的 `EXPOSE` 指令)。
後,啟動容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 選項。Docker `iptable`為 兩個容器分別新增一條 `ACCEPT` 規則,允相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE)。
当添加`--link=CONTAINER_NAME:ALIAS` 选项后,添加`iptables` 规则
```bash
當新增`--link=CONTAINER_NAME:ALIAS` 選項後,新增`iptables` 規則
```
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
@@ -52,4 +52,4 @@ ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
```
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 参数指定的名字。主机名则不会被识别
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 參數指定的名字。主機名則不會被識別

View File

@@ -1,45 +1,34 @@
## 自定义网桥
## 自定義網橋
除了默認的 `docker0` 網橋,使用者也可以指定網橋來連接各個容器。
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器
在啟動 Docker 服務的時候,使用 `-b BRIDGE``--bridge=BRIDGE` 來指定使用的網橋
在启动 Docker 服务的时候,使用 `-b BRIDGE``--bridge=BRIDGE` 来指定使用的网桥
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
```bash
$ sudo systemctl stop docker
如果服務已經執行,那需要先停止服務,並刪除舊的網橋
```
$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
```
然后创建一个网桥 `bridge0`
```bash
然後建立一個網橋 `bridge0`
```
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
```
查看确认网桥创建并启动。
```bash
查看確認網橋建立並啟動。
```
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
```
在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。
```json
{
"bridge": "bridge0",
}
設定 Docker 服務,默認橋接到建立的網橋上。
```
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start
```
啟動 Docker 服務。
新建一個容器,可以看到它已經橋接到了 `bridge0` 上。
启动 Docker 服务
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr``ip route` 命令来查看 IP 地址配置和路由信息。
可以繼續用 `brctl show` 命令查看橋接的訊息。另外,在容器中可以使用 `ip addr``ip route` 命令來查看 IP 地址設定和路由訊息

View File

@@ -1,5 +1,5 @@
## 编辑网络配置文件
## 編輯網路設定文件
Docker 1.2.0 始支持在行中的容器里编辑 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
Docker 1.2.0 始支持在行中的容器裡編輯 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
但是些修改是临时的,只在行的容器中保留,容器止或重启后并不会被保存下。也不`docker commit` 提交。
但是些修改是臨時的,只在行的容器中保留,容器止或重啟後並不會被保存下。也不`docker commit` 提交。

29
advanced_network/dns.md Normal file
View File

@@ -0,0 +1,29 @@
## 設定 DNS
Docker 沒有為每個容器專門定制鏡像,那麽怎麽自定義設定容器的主機名和 DNS 設定呢?
秘訣就是它利用虛擬文件來掛載到來容器的 3 個相關設定文件。
在容器中使用 mount 命令可以看到掛載訊息:
```
$ mount
...
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
tmpfs on /etc/resolv.conf type tmpfs ...
...
```
這種機制可以讓宿主主機 DNS 訊息發生更新後,所有 Docker 容器的 dns 設定透過 `/etc/resolv.conf` 文件立刻得到更新。
如果使用者想要手動指定容器的設定,可以利用下面的選項。
`-h HOSTNAME or --hostname=HOSTNAME`
設定容器的主機名,它會被寫到容器內的 `/etc/hostname``/etc/hosts`。但它在容器外部看不到,既不會在 `docker ps` 中顯示,也不會在其他的容器的 `/etc/hosts` 看到。
`--link=CONTAINER_NAME:ALIAS`
選項會在建立容器的時候,新增一個其他容器的主機名到 `/etc/hosts` 文件中,讓新容器的程式可以使用主機名 ALIAS 就可以連接它。
`--dns=IP_ADDRESS`
新增 DNS 伺服器到容器的 `/etc/resolv.conf` 中,讓容器用這個伺服器來解析所有不在 `/etc/hosts` 中的主機名。
`--dns-search=DOMAIN`
設定容器的搜索域,當設定搜索域為 `.example.com` 時,在搜索一個名為 host 的主機時DNS 不僅搜索host還會搜索 `host.example.com`
註意:如果沒有上述最後 2 個選項Docker 會默認用主機上的 `/etc/resolv.conf` 來設定容器。

View File

@@ -1,28 +1,23 @@
## 配置 docker0 网桥
## 設定 docker0 網橋
Docker 服務默認會建立一個 `docker0` 網橋(其上有一個 `docker0` 內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網路。
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络
Docker 默認指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以透過網橋相互通信,它還給出了 MTU接口允許接收的最大傳輸單元通常是 1500 Bytes或宿主主機網路路由上支持的默認值。這些值都可以在服務啟動的時候進行設定
* `--bip=CIDR` -- IP 地址加掩碼格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆蓋默認的 Docker mtu 設定
Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU接口允许接收的最大传输单元通常是 1500 Bytes或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置
* `--bip=CIDR` IP 地址加掩码格式,例如 192.168.1.5/24
* `--mtu=BYTES` 覆盖默认的 Docker mtu 配置
也可以在配置文件中配置 DOCKER_OPTS然后重启服务。
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
```bash
也可以在設定文件中設定 DOCKER_OPTS然後重啟服務
由於目前 Docker 網橋是 Linux 網橋,使用者可以使用 `brctl show` 來查看網橋和端口連接訊息。
```
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
vethdda6
```
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 来安装
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 來安裝
每次创建一个新容器的Docker 可用的地址段中选择一个空闲的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默认网关
```bash
每次建立一個新容器的Docker 可用的地址段中選擇一個空閑的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默認網關
```
$ sudo docker run -i -t --rm base /bin/bash
$ ip addr show eth0
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
@@ -34,4 +29,5 @@ $ ip addr show eth0
$ ip route
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
$ exit
```

View File

@@ -1,8 +1,8 @@
## 工具和示例
在介自定义网络拓扑之前,你可能会对一些外部工具和例子感趣:
在介自定義網路拓撲之前,你可能會對一些外部工具和例子感趣:
### pipework
Jérôme Petazzoni 编写了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以帮助用户在比较复杂的场景中完成容器的接。
Jérôme Petazzoni 編寫了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以幫助使用者在比較復雜的場景中完成容器的接。
### playground
Brandon Rhodes 建了一提供完整的 Docker 容器网络拓扑管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。
Brandon Rhodes 建了一提供完整的 Docker 容器網路拓撲管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。

View File

@@ -1,14 +1,11 @@
## 映射容器端口到宿主主机的实现
## 映射容器端口到宿主主機的實做
认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
認情況下,容器可以主動訪問到外部網路的連接,但是外部網路無法訪問到容器。
### 容器訪問外部實做
容器所有到外部網路的連接源地址都會被NAT成本地系統的IP地址。這是使用 `iptables` 的源地址偽裝操作實做的。
### 容器访问外部实现
容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 `iptables` 的源地址伪装操作实现的。
查看主机的 NAT 规则。
```bash
查看主機的 NAT 規則。
```
$ sudo iptables -t nat -nL
...
Chain POSTROUTING (policy ACCEPT)
@@ -16,18 +13,16 @@ target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
...
```
其中,上述規則將所有源地址在 `172.17.0.0/16` 網段目標地址為其他網段外部網路的流量動態偽裝為從系統網卡發出。MASQUERADE 跟傳統 SNAT 的好處是它能動態從網卡取得地址。
其中,上述规则将所有源地址在 `172.17.0.0/16` 网段目标地址为其他网段外部网络的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
### 外部訪問容器實做
### 外部访问容器实现
容器允許外部訪問,可以在 `docker run` 時候透過 `-p``-P` 參數來啟用。
容器允许外部访问,可以在 `docker run` 时候通过 `-p``-P` 参数来启用
不管用那種辦法,其實也是在本地的 `iptable` 的 nat 表中新增相應的規則
不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。
使用 `-P` 时:
```bash
使用 `-P` 時:
```
$ iptables -t nat -nL
...
Chain DOCKER (2 references)
@@ -35,23 +30,14 @@ target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
```
使用 `-p 80:80`
```bash
使用 `-p 80:80`
```
$ iptables -t nat -nL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
```
注意:
* 这里的规则映射了 `0.0.0.0`,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port``-p IP::port` 来指定允许访问容器的主机上的 IP、接口等以制定更严格的规则
* 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容。
```json
{
"ip": "0.0.0.0"
}
```
註意:
* 這裡的規則映射了 0.0.0.0,意味著將接受主機來自所有接口的流量。使用者可以透過 `-p IP:host_port:container_port` 或 `-p
IP::port` 來指定允許訪問容器的主機上的 IP、接口等以制定更嚴格的規則。
* 如果希望永久綁定到某個固定的 IP 地址,可以在 Docker 設定文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之後重啟 Docker 服務即可生效。

View File

@@ -1,31 +1,31 @@
## 示例:创建一个点到点连
认情况Docker 会将所有容器接到由 `docker0` 提供的虚拟子网中。
## 示例:建立一個點到點連
認情況Docker 會將所有容器接到由 `docker0` 提供的虛擬子網中。
用户有时候需要两个容器之可以直通信,而不用通过主机网桥进行桥接。
使用者有時候需要兩個容器之可以直通信,而不用透過主機網橋進行橋接。
决办法很简单:创建一对 `peer` 接口,分放到两个容器中,配置成点到点链路类型即可。
決辦法很簡單:建立一對 `peer` 接口,分放到兩個容器中,設定成點到點鏈路類型即可。
首先启动 2 容器:
```bash
$ docker run -i -t --rm --net=none base /bin/bash
首先啟動 2 容器:
```
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/#
$ docker run -i -t --rm --net=none base /bin/bash
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/#
```
找到进程号,然后创建网络命名空间的跟文件。
```bash
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
找到程式號,然後建立網路名字空間的跟文件。
```
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
$ sudo docker inspect -f '{{.State.Pid}}' 12e343489d2f
3004
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
```
创建一对 `peer` 接口,然后配置路由
```bash
建立一對 `peer` 接口,然後設定路由
```
$ sudo ip link add A type veth peer name B
$ sudo ip link set A netns 2989
@@ -38,8 +38,8 @@ $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
$ sudo ip netns exec 3004 ip link set B up
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
```
现在这 2 容器就可以相互 ping 通,成功建立接。点到点链路不需要子和子网掩码
現在這 2 容器就可以相互 ping 通,成功建立接。點到點鏈路不需要子和子網掩碼
此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器可以通过原先的网络来通信。
此外,也可以不指定 `--net=none` 來建立點到點鏈路。這樣容器可以透過原先的網路來通信。
利用似的法,可以创建一个只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 来关闭容器之的通信。
利用似的法,可以建立一個只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 來關閉容器之的通信。

View File

@@ -1,26 +1,23 @@
## 快速配置指南
## 快速設定指南
下面是一跟 Docker 网络相关的命令列表。
下面是一跟 Docker 網路相關的命令列表。
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能上生效。
其中有些命令選項只有在 Docker 服務啟動的時候才能設定,而且不能上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
* `--bip=CIDR` --定制 docker0 的掩碼
* `-H SOCKET... or --host=SOCKET...` --Docker 服務端接收命令的通道
* `--icc=true|false` --是否支持容器之間進行通信
* `--ip-forward=true|false` --請看下文容器之間的通信
* `--iptables=true|false` --禁止 Docker 新增 iptables 規則
* `--mtu=BYTES` --容器網路中的 MTU
* `-b BRIDGE``--bridge=BRIDGE` 指定容器挂载的网桥
* `--bip=CIDR` 定制 docker0 的掩码
* `-H SOCKET...``--host=SOCKET...` Docker 服务端接收命令的通道
* `--icc=true|false` 是否支持容器之间进行通信
* `--ip-forward=true|false` 请看下文容器之间的通信
* `--iptables=true|false` 是否允许 Docker 添加 iptables 规则
* `--mtu=BYTES` 容器网络中的 MTU
下面2個命令選項既可以在啟動服務時指定也可以 Docker 容器啟動(`docker run`)時候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 `docker run` 時可以覆蓋設置的默認值。
* `--dns=IP_ADDRESS...` --使用指定的DNS伺服器
* `--dns-search=DOMAIN...` --指定DNS搜索域
下面2个命令选项既可以在启动服务时指定也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值
* `--dns=IP_ADDRESS...` 使用指定的DNS服务器
* `--dns-search=DOMAIN...` 指定DNS搜索域
最后这些选项只有在 `docker run` 执行时使用,因为它是针对容器的特性内容。
* `-h HOSTNAME``--hostname=HOSTNAME` 配置容器主机名
* `--link=CONTAINER_NAME:ALIAS` 添加到另一个容器的连接
* `--net=bridge|none|container:NAME_or_ID|host` 配置容器的桥接模式
* `-p SPEC``--publish=SPEC` 映射容器端口到宿主主机
* `-P or --publish-all=true|false` 映射容器所有端口到宿主主机
最後這些選項只有在 `docker run` 執行時使用,因為它是針對容器的特性內容
* `-h HOSTNAME or --hostname=HOSTNAME` --設定容器主機名
* `--link=CONTAINER_NAME:ALIAS` --新增到另一個容器的連接
* `--net=bridge|none|container:NAME_or_ID|host` --設定容器的橋接模式
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主機
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主機

View File

@@ -1 +0,0 @@
# 附录

View File

@@ -1,93 +0,0 @@
//dot -Tpng cmd_logic.dot -o cmd_logic.png
digraph G {
rankdir=TB;
rankdir=LR;
nodesep=1;
//ranksep=1
fontname = "Microsoft YaHei";
fontsize = 28;
penwidth = 4;
compound=true;
node [shape = record];
edge [fontname = "Arial", fontsize = 20, color="darkgreen" ];
user[label="User",color=blue,shape=ellipse, style=filled, fillcolor=green];
dockerfile[label="Dockerfile",color=blue];
daemon[label="Daemon",color=blue];
image[label="Image",color=blue];
registry[label="Registry",color=blue];
tar[label="Tar files",color=blue];
network[label="Network",color=blue]
service[label="Service",color=blue]
swarm[label="Swarm",color=blue]
volume[label="Volume",color=blue]
subgraph cluster_container {
label = "Container";
labelloc = "c";
nodesep=.5;
style = "bold";
color = blue;
edge [fontname = "Arial", fontsize = 20, color="skyblue" ];
//node [style=filled];
create[label="Created",shape=circle, style=filled, fillcolor=lightblue];
run[label="Running",shape=circle, style=filled, fillcolor=green];
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
exit[label="Exited",shape=circle, style=filled, fillcolor=gray];
create->run[label=<<i>start</i>>];
run->pause[label="pause"];
pause->run[label="unpause"];
run->run[label="restart"];
run->stop[label="stop"];
run->exit[label="kill"];
stop->run[label="start"];
}
//dockerfile
dockerfile->image[label="build"];
//container
run->image[headlabel="commit", labeldistance=7.5, ltail=cluster_container];
run->tar[label="export",ltail=cluster_container];
run->network[label="connect | disconnect",ltail=cluster_container];
//image
image->create[label="create"];
image->run[label="run"];
image->tar[label="save"];
image->registry[label="push"];
//tar
tar->image[label="import | load"];
image->registry[label="push"];
//registry
registry->image[label="pull"];
//network
network->network[label="create | rm | ls | inspect"]
//user
user->run[label="attach | cp | diff | exec | inspect | logs | ps | rename | rm | stats | top | update | wait",lhead=cluster_container]
user->image[label="history | images | rmi | tag"]
user->daemon[label="event | info | version"]
user->registry[label="login | logout | search"]
//heat[label="heat commands",color=blue];
//heatshell[label="heatclient.shell.HeatShell",color=blue];
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
//heatclient[label="heatclient.client.Client",color=blue];
//client[label="heatclient.v1.client.Client",color=blue];
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
//{rank=same; image registry dockerfile tar}
//{rank=same; container}
//{rank=same; user}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 KiB

View File

@@ -1,51 +0,0 @@
//dot -Tpng container_status.dot -o container_status.png
digraph G {
rankdir=TB;
rankdir=LR;
nodesep=1;
//ranksep=1
fontname = "Microsoft YaHei";
fontsize = 28;
penwidth = 4;
compound=true;
style = "bold";
color = blue;
node [shape = record];
edge [fontname = "Arial", fontsize = 20, color="darkgreen" ];
image[label="Image",color=blue];
image->create[label="create"];
image->run[label="run"];
edge [fontname = "Arial", fontsize = 20, color="skyblue" ];
//node [style=filled];
create[label="Created",shape=circle, style=filled, fillcolor=lightblue];
run[label="Running",shape=circle, style=filled, fillcolor=green];
pause[label="Paused",shape=circle, style=filled, fillcolor=blue];
stop[label="Stopped",shape=circle, style=filled, fillcolor=red];
exit[label="Exited",shape=circle, style=filled, fillcolor=gray];
create->run[label=<<i>start</i>>];
run->pause[label="pause"];
pause->run[label="unpause"];
run->run[label="restart"];
run->stop[label="stop"];
run->exit[label="kill"];
stop->run[label="start"];
//heat[label="heat commands",color=blue];
//heatshell[label="heatclient.shell.HeatShell",color=blue];
//shell[label="{heatclient.v1.shell|+do_stack_create\l+do_stack_show\l+do_stack_update\l...\l+do_event_list\l...\l+do_resource_list\l...\l+do_resource_type_show\l...\l+do_template_show\l...\l}",color=blue];
//heatclient[label="heatclient.client.Client",color=blue];
//client[label="heatclient.v1.client.Client",color=blue];
//httpclient[label="heatclient.common.http.HTTPClient",color=blue];
//openstackservices[label="{OpenStack Services|+Nova\l+Neutron\l+Keystone\l...}",color=blue];
//{rank=same; image registry dockerfile tar}
//{rank=same; container}
//{rank=same; user}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

View File

@@ -1,344 +0,0 @@
# Dockerfile 最佳实践
本附录是笔者对 Docker 官方文档中 [Best practices for writing Dockerfiles](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) 的理解与翻译。
## 一般性的指南和建议
### 容器应该是短暂的
通过 `Dockerfile` 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。
### 使用 `.dockerignore` 文件
使用 `Dockerfile` 构建镜像时最好是将 `Dockerfile` 放置在一个新建的空目录下。然后将构建镜像所需要的文件添加到该目录中。为了提高构建镜像的效率,你可以在目录下新建一个 `.dockerignore` 文件来指定要忽略的文件和目录。`.dockerignore` 文件的排除模式语法和 Git 的 `.gitignore` 文件相似。
### 使用多阶段构建
`Docker 17.05` 以上版本中,你可以使用 [多阶段构建](../image/multistage-builds.md) 来减少所构建镜像的大小。
### 避免安装不必要的包
为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。
### 一个容器只运行一个进程
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器web应用、数据库、缓存。
如果容器互相依赖,你可以使用 [Docker 自定义网络](../network/linking.md) 来把这些容器连接起来。
### 镜像层数尽可能少
你需要在 `Dockerfile` 可读性(也包括长期的可维护性)和减少层数之间做一个平衡。
### 将多行参数排序
将多行参数按字母顺序排序(比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 `PRs` 阅读和审查。建议在反斜杠符号 `\` 之前添加一个空格,以增加可读性。
下面是来自 `buildpack-deps` 镜像的例子:
```docker
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
```
### 构建缓存
在镜像的构建过程中Docker 会遍历 `Dockerfile` 文件中的指令然后按顺序执行。在执行每条指令之前Docker 都会在缓存中查找是否已经存在可重用的镜像,如果有就使用现存的镜像,不再重复创建。如果你不想在构建过程中使用缓存,你可以在 `docker build` 命令中使用 `--no-cache=true` 选项。
但是,如果你想在构建的过程中使用缓存,你得明白什么时候会,什么时候不会找到匹配的镜像,遵循的基本规则如下:
* 从一个基础镜像开始(`FROM` 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。
* 在大多数情况下,只需要简单地对比 `Dockerfile` 中的指令和子镜像。然而,有些指令需要更多的检查和解释。
* 对于 `ADD``COPY` 指令,镜像中对应文件的内容也会被检查,每个文件都会计算出一个校验和。文件的最后修改时间和最后访问时间不会纳入校验。在缓存的查找过程中,会将这些校验和和已存在镜像中的文件校验和进行对比。如果文件有任何改变,比如内容和元数据,则缓存失效。
* 除了 `ADD``COPY` 指令,缓存匹配过程不会查看临时容器中的文件来决定缓存是否匹配。例如,当执行完 `RUN apt-get -y update` 指令后,容器中一些文件被更新,但 Docker 不会检查这些文件。这种情况下,只有指令字符串本身被用来匹配缓存。
一旦缓存失效,所有后续的 `Dockerfile` 指令都将产生新的镜像,缓存不会被使用。
## Dockerfile 指令
下面针对 `Dockerfile` 中各种指令的最佳编写方式给出建议。
### FROM
尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 [Alpine](https://hub.docker.com/_/alpine/) 镜像,因为它被严格控制并保持最小尺寸(目前小于 5 MB但它仍然是一个完整的发行版。
### LABEL
你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 `LABEL` 开头加上一个或多个标签对。下面的示例展示了各种不同的可能格式。`#` 开头的行是注释内容。
>注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。
```docker
# Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
```
一个镜像可以包含多个标签,但建议将多个标签放入到一个 `LABEL` 指令中。
```docker
# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
com.example.is-beta= \
com.example.is-production="" \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
```
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/engine/userguide/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/engine/userguide/labels-custom-metadata/#managing-labels-on-objects)。
### RUN
为了保持 `Dockerfile` 文件的可读性,可理解性,以及可维护性,建议将长的或复杂的 `RUN` 指令用反斜杠 `\` 分割成多行。
#### apt-get
`RUN` 指令最常见的用法是安装包用的 `apt-get`。因为 `RUN apt-get` 指令会安装包,所以有几个问题需要注意。
不要使用 `RUN apt-get upgrade``dist-upgrade`,因为许多基础镜像中的「必须」包不会在一个非特权容器中升级。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 `foo`,需要升级,使用 `apt-get install -y foo` 就行,该指令会自动升级 `foo` 包。
永远将 `RUN apt-get update``apt-get install` 组合成一条 `RUN` 声明,例如:
```docker
RUN apt-get update && apt-get install -y \
package-bar \
package-baz \
package-foo
```
`apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件:
```docker
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl
```
构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包:
```docker
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl nginx
```
Docker 发现修改后的 `RUN apt-get update` 指令和之前的完全一样。所以,`apt-get update` 不会执行,而是使用之前的缓存镜像。因为 `apt-get update` 没有运行,后面的 `apt-get install` 可能安装的是过时的 `curl``nginx` 版本。
使用 `RUN apt-get update && apt-get install -y` 可以确保你的 Dockerfiles 每次安装的都是包的最新的版本,而且这个过程不需要进一步的编码或额外干预。这项技术叫作 `cache busting`。你也可以显示指定一个包的版本号来达到 `cache-busting`,这就是所谓的固定版本,例如:
```docker
RUN apt-get update && apt-get install -y \
package-bar \
package-baz \
package-foo=1.3.*
```
固定版本会迫使构建过程检索特定的版本,而不管缓存中有什么。这项技术也可以减少因所需包中未预料到的变化而导致的失败。
下面是一个 `RUN` 指令的示例模板,展示了所有关于 `apt-get` 的建议。
```docker
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*
```
其中 `s3cmd` 指令指定了一个版本号 `1.1.*`。如果之前的镜像使用的是更旧的版本,指定新的版本会导致 `apt-get udpate` 缓存失效并确保安装的是新版本。
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get udpate`,包缓存总是会在 `apt-get install` 之前刷新。
> 注意:官方的 Debian 和 Ubuntu 镜像会自动运行 apt-get clean所以不需要显式的调用 apt-get clean。
### CMD
`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务(比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。
多数情况下,`CMD` 都需要一个交互式的 `shell` (bash, Python, perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。
### EXPOSE
`EXPOSE` 指令用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。例如,提供 `Apache` web 服务的镜像应该使用 `EXPOSE 80`,而提供 `MongoDB` 服务的镜像使用 `EXPOSE 27017`
对于外部访问,用户可以在执行 `docker run` 时使用一个标志来指示如何将指定的端口映射到所选择的端口。
### ENV
为了方便新程序运行,你可以使用 `ENV` 来为容器中安装的程序更新 `PATH` 环境变量。例如使用 `ENV PATH /usr/local/nginx/bin:$PATH` 来确保 `CMD ["nginx"]` 能正确运行。
`ENV` 指令也可用于为你想要容器化的服务提供必要的环境变量,比如 Postgres 需要的 `PGDATA`
最后,`ENV` 也能用于设置常见的版本号,比如下面的示例:
```docker
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress &&
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
```
类似于程序中的常量,这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本。
### ADD 和 COPY
虽然 `ADD``COPY` 功能类似,但一般优先使用 `COPY`。因为它比 `ADD` 更透明。`COPY` 只支持简单将本地文件拷贝到容器中,而 `ADD` 有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)。因此,`ADD` 的最佳用例是将本地 tar 文件自动提取到镜像中,例如 `ADD rootfs.tar.xz`
如果你的 `Dockerfile` 有多个步骤需要使用上下文中不同的文件。单独 `COPY` 每个文件,而不是一次性的 `COPY` 所有文件,这将保证每个步骤的构建缓存只在特定的文件变化时失效。例如:
```docker
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
```
如果将 `COPY . /tmp/` 放置在 `RUN` 指令之前,只要 `.` 目录中任何一个文件变化,都会导致后续指令的缓存失效。
为了让镜像尽量小,最好不要使用 `ADD` 指令从远程 URL 获取包,而是使用 `curl``wget`。这样你可以在文件提取完之后删掉不再需要的文件来避免在镜像中额外添加一层。比如尽量避免下面的用法:
```docker
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
```
而是应该使用下面这种方法:
```docker
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
```
上面使用的管道操作,所以没有中间文件需要删除。
对于其他不需要 `ADD` 的自动提取功能的文件或目录,你应该使用 `COPY`
### ENTRYPOINT
`ENTRYPOINT` 的最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行(用 `CMD` 提供默认选项)。
例如,下面的示例镜像提供了命令行工具 `s3cmd`:
```docker
ENTRYPOINT ["s3cmd"]
CMD ["--help"]
```
现在直接运行该镜像创建的容器会显示命令帮助:
```bash
$ docker run s3cmd
```
或者提供正确的参数来执行某个命令:
```bash
$ docker run s3cmd ls s3://mybucket
```
这样镜像名可以当成命令行的参考。
`ENTRYPOINT` 指令也可以结合一个辅助脚本使用,和前面命令行风格类似,即使启动工具需要不止一个步骤。
例如,`Postgres` 官方镜像使用下面的脚本作为 `ENTRYPOINT`
```bash
#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
```
>注意:该脚本使用了 Bash 的内置命令 exec所以最后运行的进程就是容器的 PID 为 1 的进程。这样,进程就可以接收到任何发送给容器的 Unix 信号了。
该辅助脚本被拷贝到容器,并在容器启动时通过 `ENTRYPOINT` 执行:
```docker
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
```
该脚本可以让用户用几种不同的方式和 `Postgres` 交互。
你可以很简单地启动 `Postgres`
```bash
$ docker run postgres
```
也可以执行 `Postgres` 并传递参数:
```bash
$ docker run postgres postgres --help
```
最后,你还可以启动另外一个完全不同的工具,比如 `Bash`
```bash
$ docker run --rm -it postgres bash
```
### VOLUME
`VOLUME` 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 `VOLUME` 来管理镜像中的可变部分和用户可以改变的部分。
### USER
如果某个服务不需要特权执行,建议使用 `USER` 指令切换到非 root 用户。先在 `Dockerfile` 中使用类似 `RUN groupadd -r postgres && useradd -r -g postgres postgres` 的指令创建用户和用户组。
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID你应该显示的指定一个 UID/GID。
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
最后,为了减少层数和复杂度,避免频繁地使用 `USER` 来回切换用户。
### WORKDIR
为了清晰性和可靠性,你应该总是在 `WORKDIR` 中使用绝对路径。另外,你应该使用 `WORKDIR` 来替代类似于 `RUN cd ... && do-something` 的指令,后者难以阅读、排错和维护。
## 官方仓库示例
这些官方仓库的 Dockerfile 都是参考典范https://github.com/docker-library/docs

View File

@@ -1,129 +0,0 @@
# Docker 命令查询
## 基本语法
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。
* 客户端命令:基本命令格式为 `docker [OPTIONS] COMMAND [arg...]`
* 服务端命令:基本命令格式为 `dockerd [OPTIONS]`
可以通过 `man docker``docker help` 来查看这些命令。
## 客户端命令选项
* --config="":指定客户端配置文件,默认为 `/.docker`
* -D=true|false是否使用 debug 模式。默认不开启;
* -H, --host=[]:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字unix:///path/to/socket文件句柄fd://socketfd或 tcp 套接字tcp://[host[:port]]),默认为 unix:///var/run/docker.sock
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
* --tls=true|false是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
* --tlscacert= /.docker/ca.pemTLS CA 签名的可信证书文件路径;
* --tlscert= /.docker/cert.pemTLS 可信证书文件路径;
* --tlscert= /.docker/key.pemTLS 密钥文件路径;
* --tlsverify=true|false启用 TLS 校验,默认为否。
## dockerd 命令选项
* --api-cors-header=""CORS 头部域,默认不允许 CORS要允许任意的跨域访问可以指定为 “*”;
* --authorization-plugin="":载入认证的插件;
* -b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥;
* --bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
* --cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`systemd cgroup 驱动为 `system.slice`
* --cluster-store="":构成集群(如 Swarm集群键值数据库服务地址
* --cluster-advertise="":构成集群时,自身的被访问地址,可以为 `host:port``interface:port`
* --cluster-store-opt="":构成集群时,键值数据库的配置选项;
* --config-file="/etc/docker/daemon.json"daemon 配置文件路径;
* --containerd=""containerd 文件的路径;
* -D, --debug=true|false是否使用 Debug 模式。缺省为 false
* --default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
* --default-gateway-v6="":容器的 IPv6 网关地址;
* --default-ulimit=[]:默认的 ulimit 值;
* --disable-legacy-registry=true|false是否允许访问旧版本的镜像仓库服务器
* --dns="":指定容器使用的 DNS 服务器地址;
* --dns-opt=""DNS 选项;
* --dns-search=[]DNS 搜索域;
* --exec-opt=[]:运行时的执行选项;
* --exec-root="":容器执行状态文件的根路径,默认为 `/var/run/docker`
* --fixed-cidr="":限定分配 IPv4 地址范围;
* --fixed-cidr-v6="":限定分配 IPv6 地址范围;
* -G, --group="":分配给 unix 套接字的组,默认为 `docker`
* -g, --graph=""Docker 运行时的根路径,默认为 `/var/lib/docker`
* -H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字unix:///path/to/socket文件句柄fd://socketfd或 tcp 套接字tcp://[host[:port]]),默认为 unix:///var/run/docker.sock
* --icc=true|false是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
* --insecure-registry=[]:允许访问给定的非安全仓库服务;
* --ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0
* --ip-forward=true|false是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
* --ip-masq=true|false是否进行地址伪装用于容器访问外部网络默认开启
* --iptables=true|false是否允许 Docker 添加 iptables 规则。缺省为 true
* --ipv6=true|false是否启用 IPv6 支持,默认关闭;
* -l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
* --label="[]":添加指定的键值对标注;
* --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file
* --log-opt=[]:日志后端的选项;
* --mtu=VALUE指定容器网络的 mtu
* -p="":指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`
* --raw-logs输出原始未加色彩的日志信息
* --registry-mirror=<scheme>://<host>:指定 `docker pull` 时使用的注册服务器镜像地址;
* -s, --storage-driver="":指定使用给定的存储后端;
* --selinux-enabled=true|false是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
* --storage-opt=[]:驱动后端选项;
* --tls=true|false是否对 Docker daemon 启用 TLS 安全机制,默认为否;
* --tlscacert= /.docker/ca.pemTLS CA 签名的可信证书文件路径;
* --tlscert= /.docker/cert.pemTLS 可信证书文件路径;
* --tlscert= /.docker/key.pemTLS 密钥文件路径;
* --tlsverify=true|false启用 TLS 校验,默认为否;
* --userland-proxy=true|false是否使用用户态代理来实现容器间和出容器的回环通信默认为 true
* --userns-remap=default|uid:gid|user:group|user|uid指定容器的用户命名空间默认是创建新的 UID 和 GID 映射到容器内进程。
## 客户端命令
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
* attach依附到一个正在运行的容器中
* build从一个 Dockerfile 创建一个镜像;
* commit从一个容器的修改中创建一个新的镜像
* cp在容器和本地宿主系统之间复制文件中
* create创建一个新容器但并不运行它
* diff检查一个容器内文件系统的修改包括修改和增加
* events从服务端获取实时的事件
* exec在运行的容器内执行命令
* export导出容器内容为一个 tar 包;
* history显示一个镜像的历史信息
* images列出存在的镜像
* import导入一个文件典型为 tar 包)路径或目录来创建一个本地镜像;
* info显示一些相关的系统信息
* inspect显示一个容器的具体配置信息
* kill关闭一个运行中的容器 (包括进程和所有相关资源)
* load从一个 tar 包中加载一个镜像;
* login注册或登录到一个 Docker 的仓库服务器;
* logout从 Docker 的仓库服务器登出;
* logs获取容器的 log 信息;
* network管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
* node管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
* pause暂停一个容器中的所有进程
* port查找一个 nat 到一个私有网口的公共口;
* ps列出主机上的容器
* pull从一个Docker的仓库服务器下拉一个镜像或仓库
* push将一个镜像或者仓库推送到一个 Docker 的注册服务器;
* rename重命名一个容器
* restart重启一个运行中的容器
* rm删除给定的若干个容器
* rmi删除给定的若干个镜像
* run创建一个新容器并在其中运行给定命令
* save保存一个镜像为 tar 包文件;
* search在 Docker index 中搜索一个镜像;
* service管理 Docker 所启动的应用服务,包括创建、更新、删除等;
* start启动一个容器
* stats输出一个或多个容器的资源使用统计信息
* stop终止一个运行中的容器
* swarm管理 Docker swarm 集群,包括创建、加入、退出、更新等;
* tag为一个镜像打标签
* top查看一个容器中的正在运行的进程信息
* unpause将一个容器内所有的进程从暂停状态中恢复
* update更新指定的若干容器的配置信息
* version输出 Docker 的版本信息;
* volume管理 Docker volume包括查看、创建、删除等
* wait阻塞直到一个容器终止然后输出它的退出符。
## 一张图总结 Docker 的命令
![Docker 命令总结](../_images/cmd_logic.png)

View File

@@ -1,214 +0,0 @@
# 常见问题总结
## 镜像相关
### 如何批量清理临时镜像文件?
答:可以使用 `docker image prune` 命令。
### 如何查看镜像支持的环境变量?
答:可以使用 `docker run IMAGE env` 命令。
### 本地的镜像文件都存放在哪里?
答:与 Docker 相关的本地资源都存放在 `/var/lib/docker/` 目录下,以 `aufs` 文件系统为例,其中 `container` 目录存放容器信息,`graph` 目录存放镜像信息,`aufs` 目录下存放具体的镜像层文件。
### 构建 Docker 镜像应该遵循哪些原则?
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:jessie 镜像,仅有不足百兆大小;
* 清理编译生成文件、安装包的缓存等临时文件;
* 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
* 从安全角度考虑,应用要尽量使用系统的库和依赖;
* 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录。
更多内容请查看 [Dockerfile 最佳实践](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/)
### 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?
答:在 Docker 配置文件中添加 `export http_proxy="http://<PROXY_HOST>:<PROXY_PORT>"`,之后重启 Docker 服务即可。
## 容器相关
### 容器退出后,通过 docker ps 命令查看不到,数据会丢失么?
容器退出后会处于终止exited状态此时可以通过 `docker ps -a` 查看。其中的数据也不会丢失,还可以通过 `docker start` 命令来启动它。只有删除掉容器才会清除所有数据。
### 如何停止所有正在运行的容器?
答:可以使用 `docker kill $(docker ps -q)` 命令。
### 如何批量清理已经停止的容器?
答:可以使用 `docker container prune` 命令。
### 如何获取某个容器的 PID 信息?
答:可以使用 `docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>` 命令。
### 如何获取某个容器的 IP 地址?
答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>` 命令
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
答:使用以下命令启动容器可以使容器 IP 固定不变
```bash
$ docker network create -d bridge --subnet 172.25.0.0/16 my-net
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
```
### 如何临时退出一个正在交互的容器的终端,而不终止它?
答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。
### 使用 `docker port` 命令映射容器的端口时系统报错“Error: No public port '80' published for xxx”
答:
* 创建镜像时 `Dockerfile` 要通过 `EXPOSE` 指定正确的开放端口;
* 容器启动时指定 `PublishAllPort = true`
### 可以在一个容器中同时运行多个应用进程么?
答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 `supervisord` 来管理所运行的进程。可以参考 https://docs.docker.com/engine/admin/multi-service_container/ 。
### 如何控制容器占用系统资源CPU、内存的份额
答:在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候,可以使用 -c|--cpu-shares[=0] 参数来调整容器使用 CPU 的权重;使用 -m|--memory[=MEMORY] 参数来调整容器使用内存的大小。
## 仓库相关
### 仓库Repository、注册服务器Registry、注册索引Index 有何关系?
首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。
注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。
## 配置相关
### Docker 的配置文件放在哪里,如何修改配置?
答:使用 `upstart` 的系统(如 Ubuntu 14.04)的配置文件在 `/etc/default/docker`,使用 `systemd` 的系统(如 Ubuntu 16.04、Centos 等)的配置文件在 `/etc/docker/daemon.json`
### 如何更改 Docker 的默认存储位置?
Docker 的默认存储位置是 `/var/lib/docker`,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过 `-g` 参数指定。
例如,如下操作将默认存储位置迁移到 /storage/docker。
```sh
[root@s26 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 50G 5.3G 42G 12% /
tmpfs 48G 228K 48G 1% /dev/shm
/dev/sda1 485M 40M 420M 9% /boot
/dev/mapper/VolGroup-lv_home 222G 188M 210G 1% /home
/dev/sdb2 2.7T 323G 2.3T 13% /storage
[root@s26 ~]# service docker stop
[root@s26 ~]# cd /var/lib/
[root@s26 lib]# mv docker /storage/
[root@s26 lib]# ln -s /storage/docker/ docker
[root@s26 lib]# ls -la docker
lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
[root@s26 lib]# service docker start
```
### 使用内存和 swap 限制启动容器时候报警告“WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
* 编辑 `/etc/default/grub` 文件Ubuntu 系统为例),配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
* 更新 grub`$ sudo update-grub`
* 重启系统,即可。
## Docker 与虚拟化
### Docker 与 LXCLinux Container有何不同
LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
* 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
* 版本管理类似于Git的版本管理理念用户可以更方便的创建、管理镜像文件
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
### Docker 与 Vagrant 有何不同?
答:两者的定位完全不同。
* Vagrant 类似 Boot2Docker一款运行 Docker 的最小内核是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 WindowsMac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
* 原生的 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
简单说Vagrant 适合用来管理虚拟机,而 Docker 适合用来管理应用环境。
### 开发环境中 Docker 和 Vagrant 该如何选择?
Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant 是虚拟机上做的封装,虚拟机本身会消耗资源。
如果本地使用的 Linux 环境,推荐都使用 Docker。
如果本地使用的是 macOS 或者 Windows 环境,那就需要开虚拟机,单一开发环境下 Vagrant 更简单;多环境开发下推荐在 Vagrant 里面再使用 Docker 进行环境隔离。
## 其它
### Docker 能在非 Linux 平台(比如 Windows 或 macOS )上运行么?
答:完全可以。安装方法请查看 [安装 Docker](../../install/) 一节
### 如何将一台宿主主机的 Docker 环境迁移到另外一台宿主主机?
答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。
### 如何进入 Docker 容器的网络命名空间?
Docker 在创建容器后,删除了宿主主机上 `/var/run/netns` 目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。
用户可以通过如下方法来手动恢复它。
首先,使用下面的命令查看容器进程信息,比如这里的 1234。
```bash
$ docker inspect --format='{{. State.Pid}} ' $container_id
1234
```
接下来,在 `/proc` 目录下,把对应的网络命名空间文件链接到 `/var/run/netns` 目录。
```bash
$ sudo ln -s /proc/1234/ns/net /var/run/netns/
```
然后,在宿主主机上就可以看到容器的网络命名空间信息。例如
```bash
$ sudo ip netns show
1234
```
此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为 `172.17.0.100/16`
```bash
$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16
```
### 如何获取容器绑定到本地那个 veth 接口上?
Docker 容器启动后,会通过 veth 接口对连接到本地网桥veth 接口命名跟容器命名毫无关系,十分难以找到对应关系。
最简单的一种方式是通过查看接口的索引号,在容器中执行 `ip a` 命令,查看到本地接口最前面的接口索引号,如 `205`,将此值加上 1`206`,然后在本地主机执行 `ip a` 命令,查找接口索引号为 `206` 的接口,两者即为连接的 veth 接口对。

View File

@@ -1,3 +0,0 @@
# 热门镜像介绍
本章将介绍一些热门镜像的功能,使用方法等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。

View File

@@ -1,20 +0,0 @@
## [CentOS](https://store.docker.com/images/centos/)
### 基本信息
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
该仓库位于 https://store.docker.com/images/centos/ ,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
### 使用方法
默认会启动一个最小化的 CentOS 环境。
```bash
$ docker run --name centos -it centos bash
bash-4.2#
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/centos 查看。

View File

@@ -1,34 +0,0 @@
## [MongoDB](https://store.docker.com/images/mongo/)
### 基本信息
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
该仓库位于 https://store.docker.com/images/mongo/ ,提供了 MongoDB 2.x ~ 3.x 各个版本的镜像。
### 使用方法
默认会在 `27017` 端口启动数据库。
```bash
$ docker run --name mongo -d mongo
```
使用其他应用连接到容器,可以用
```bash
$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
```
或者通过 `mongo`
```bash
$ docker run -it --rm \
--link some-mongo:mongo \
mongo \
sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/mongo 查看。

View File

@@ -1,34 +0,0 @@
## [MySQL](https://store.docker.com/images/mysql/)
### 基本信息
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
该仓库位于 https://store.docker.com/images/mysql/ ,提供了 MySQL 5.5 ~ 8.x 各个版本的镜像。
### 使用方法
默认会在 `3306` 端口启动数据库。
```bash
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
```
之后就可以使用其它应用来连接到该容器。
```bash
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
```
或者通过 `mysql`
```bash
$ docker run -it --rm \
--link some-mysql:mysql \
mysql \
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/mysql 查看

View File

@@ -1,48 +0,0 @@
## [Nginx](https://store.docker.com/images/nginx/)
### 基本信息
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
该仓库位于 https://store.docker.com/images/nginx/ ,提供了 Nginx 1.0 ~ 1.13.x 各个版本的镜像。
### 使用方法
下面的命令将作为一个静态页面服务器启动。
```bash
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
```bash
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```
之后生成新的镜像,并启动一个容器。
```bash
$ docker build -t some-content-nginx .
$ docker run --name some-nginx -d some-content-nginx
```
开放端口,并映射到本地的 `8080` 端口。
```bash
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
```bash
$ docker run -d \
--name some-nginx \
-v /some/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/nginx 查看。

View File

@@ -1,40 +0,0 @@
## [Node.js](https://store.docker.com/images/node/)
### 基本信息
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
该仓库位于 https://store.docker.com/images/node/ ,提供了 Node.js 0.10 ~ 9.x 各个版本的镜像。
### 使用方法
在项目中创建一个 Dockerfile。
```bash
FROM node:9
# replace this with your application's default port
EXPOSE 8888
```
然后创建镜像,并启动容器。
```bash
$ docker build -t my-nodejs-app
$ docker run -it --rm --name my-running-app my-nodejs-app
```
也可以直接运行一个简单容器。
```bash
$ docker run -it --rm \
--name my-running-script \
# -v "$(pwd)":/usr/src/myapp \
--mount type=bind,src=`$(pwd)`,target=/usr/src/myapp \
-w /usr/src/myapp \
node:9-alpine \
node your-daemon-or-script.js
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/node 查看。

View File

@@ -1,42 +0,0 @@
## [Redis](https://store.docker.com/images/redis/)
### 基本信息
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
该仓库位于 https://store.docker.com/images/redis/ ,提供了 Redis 3.x ~ 4.x 各个版本的镜像。
### 使用方法
默认会在 `6379` 端口启动数据库。
```bash
$ docker run --name some-redis -d redis
```
另外还可以启用 [持久存储](http://redis.io/topics/persistence)。
```bash
$ docker run --name some-redis -d redis redis-server --appendonly yes
```
默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 将数据存放到本地。
使用其他应用连接到容器,可以用
```bash
$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis
```
或者通过 `redis-cli`
```bash
$ docker run -it --rm \
--link some-redis:redis \
redis \
sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/redis 查看。

View File

@@ -1,20 +0,0 @@
## [Ubuntu](https://store.docker.com/images/ubuntu/)
### 基本信息
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
该仓库位于 https://store.docker.com/images/ubuntu/ ,提供了 Ubuntu 从 12.04 ~ 18.04 各个版本的镜像。
### 使用方法
默认会启动一个最小化的 Ubuntu 环境。
```bash
$ docker run --name some-ubuntu -it ubuntu:17.10
root@523c70904d54:/#
```
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/ubuntu 查看。

View File

@@ -1,25 +0,0 @@
## [WordPress](https://store.docker.com/images/wordpress/)
### 基本信息
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PHP 和 MySQL。
该仓库位于 https://store.docker.com/images/wordpress/ ,提供了 WordPress 4.x 版本的镜像。
### 使用方法
启动容器需要 MySQL 的支持,默认端口为 `80`
```bash
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
启动 WordPress 容器时可以指定的一些环境变量包括:
* `WORDPRESS_DB_USER` 缺省为 `root`
* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
* `WORDPRESS_DB_NAME` 缺省为 `wordpress`
### Dockerfile
请到 https://github.com/docker-library/docs/tree/master/wordpress 查看。

View File

@@ -1,29 +0,0 @@
# 资源链接
## 官方网站
* Docker 官方主页https://www.docker.com
* Docker 官方博客https://blog.docker.com/
* Docker 官方文档https://docs.docker.com/
* Docker Storehttps://store.docker.com
* Docker Cloudhttps://cloud.docker.com
* Docker Hubhttps://hub.docker.com
* Docker 的源代码仓库https://github.com/moby/moby
* Docker 发布版本历史https://docs.docker.com/release-notes/
* Docker 常见问题https://docs.docker.com/engine/faq/
* Docker 远端应用 APIhttps://docs.docker.com/develop/sdk/
## 实践参考
* Dockerfile 参考https://docs.docker.com/engine/reference/builder/
* Dockerfile 最佳实践https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
## 技术交流
* Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user
* Docker 的 IRC 频道https://chat.freenode.net#docker
* Docker 的 Twitter 主页https://twitter.com/docker
## 其它
* Docker 的 StackOverflow 问答主页https://stackoverflow.com/search?q=docker

View File

@@ -1,5 +0,0 @@
# Docker 中文资源
* [Docker 问答录100 问)](https://blog.lab99.org/post/docker-2016-07-14-faq.html)
* [Docker CE 变更日志中文翻译](https://github.com/allencloud/docker-changelog-chinese)

168
appendix_command/README.md Normal file
View File

@@ -0,0 +1,168 @@
# Docker命令查詢
##基本語法
docker [OPTIONS] COMMAND [arg...]
一般來說Docker 命令可以用來管理 daemon或者透過 CLI 命令管理映像檔和容器。可以透過 `man docker` 來查看這些命令。
##選項
-D=true|false
使用 debug 模式。預設為 false。
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]來綁定或者 unix://[/path/to/socket] 來使用。
在 daemon 模式下綁定的 socket透過一個或多個 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 來指定。
--api-enable-cors=true|false
在遠端 API 中啟用 CORS 頭。預設為 false。
-b=""
將容器掛載到一個已存在的網橋上。指定為 'none' 時則禁用容器的網路。
--bip=""
讓動態建立的 docker0 采用指定的 CIDR 地址; 與 -b 選項互斥。
-d=true|false
使用 daemon 模式。預設為 false。
--dns=""
讓 Docker 使用指定的 DNS 伺服器。
-g=""
指定 Docker 執行時的 root 路徑。預設為 /var/lib/docker。
--icc=true|false
啟用容器間通信。預設為 true。
--ip=""
綁定端口時候的預設 IP 地址。預設為 0.0.0.0。
--iptables=true|false
禁止 Docker 新增 iptables 規則。預設為 true。
--mtu=VALUE
指定容器網路的 mtu。預設為 1500。
-p=""
指定 daemon 的 PID 文件路徑。預設為 /var/run/docker.pid。
-s=""
強制 Docker 執行時使用指定的存儲驅動。
-v=true|false
輸出版本資訊並退出。預設值為 false。
--selinux-enabled=true|false
啟用 SELinux 支持。預設值為 false。SELinux 目前不支持 BTRFS 存儲驅動。
##命令
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。兩者一致。
docker-attach(1)
依附到一個正在執行的容器中。
docker-build(1)
從一個 Dockerfile 建立一個映像檔
docker-commit(1)
從一個容器的修改中建立一個新的映像檔
docker-cp(1)
從容器中複製文件到宿主系統中
docker-diff(1)
檢查一個容器文件系統的修改
docker-events(1)
從服務端取得實時的事件
docker-export(1)
匯出容器內容為一個 tar 包
docker-history(1)
顯示一個映像檔的歷史
docker-images(1)
列出存在的映像檔
docker-import(1)
匯入一個文件(典型為 tar 包)路徑或目錄來建立一個映像檔
docker-info(1)
顯示一些相關的系統資訊
docker-inspect(1)
顯示一個容器的底層具體資訊。
docker-kill(1)
關閉一個執行中的容器 (包括程式和所有資源)
docker-load(1)
從一個 tar 包中載入一個映像檔
docker-login(1)
註冊或登錄到一個 Docker 的倉庫伺服器
docker-logout(1)
從 Docker 的倉庫伺服器登出
docker-logs(1)
取得容器的 log 資訊
docker-pause(1)
暫停一個容器中的所有程式
docker-port(1)
查找一個 nat 到一個私有網口的公共口
docker-ps(1)
列出容器
docker-pull(1)
從一個Docker的倉庫伺服器下拉一個映像檔或倉庫
docker-push(1)
將一個映像檔或者倉庫推送到一個 Docker 的註冊伺服器
docker-restart(1)
重新啟動一個執行中的容器
docker-rm(1)
刪除指定的數個容器
docker-rmi(1)
刪除指定的數個映像檔
docker-run(1)
建立一個新容器,並在其中執行指定命令
docker-save(1)
保存一個映像檔為 tar 包文件
docker-search(1)
在 Docker index 中搜索一個映像檔
docker-start(1)
啟動一個容器
docker-stop(1)
終止一個執行中的容器
docker-tag(1)
為一個映像檔打標簽
docker-top(1)
查看一個容器中的正在執行的程式資訊
docker-unpause(1)
將一個容器內所有的程式從暫停狀態中恢復
docker-version(1)
輸出 Docker 的版本資訊
docker-wait(1)
阻塞直到一個容器終止,然後輸出它的退出符
##一張圖總結 Docker 的命令
![命令周期](../_images/cmd_logic.png)

2
appendix_repo/README.md Normal file
View File

@@ -0,0 +1,2 @@
# 常見倉庫介紹
本章將介紹常見的一些倉庫和鏡像的功能,使用方法和生成它們的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。

17
appendix_repo/centos.md Normal file
View File

@@ -0,0 +1,17 @@
## [CentOS](https://registry.hub.docker.com/_/centos/)
### 基本訊息
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 發行版,其軟件包大多跟 RedHat 系列保持一致。
該倉庫提供了 CentOS 從 5 ~ 7 各個版本的鏡像。
### 使用方法
默認會啟動一個最小化的 CentOS 環境。
```
$ sudo docker run --name some-centos -i -t centos bash
bash-4.2#
```
### Dockerfile
* [CentOS 5 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/2e5a9c4e8b7191b393822e4b9e98820db5638a77/docker/Dockerfile)
* [CentOS 6 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/8717e33ea5432ecb33d7ecefe8452a973715d037/docker/Dockerfile)
* [CentOS 7 版本](https://github.com/CentOS/sig-cloud-instance-images/blob/af7a1b9f8f30744360a10fe44c53a1591bef26f9/docker/Dockerfile)

26
appendix_repo/mongodb.md Normal file
View File

@@ -0,0 +1,26 @@
## [MongoDB](https://registry.hub.docker.com/_/mongo/)
### 基本訊息
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是開源的 NoSQL 數據庫實做。
該倉庫提供了 MongoDB 2.2 ~ 2.7 各個版本的鏡像。
### 使用方法
默認會在 `27017` 端口啟動數據庫。
```
$ sudo docker run --name some-mongo -d mongo
```
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
```
或者透過 `mongo`
```
$ sudo docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
```
### Dockerfile
* [2.2 版本](https://github.com/docker-library/mongo/blob/77c841472ccb6cc87fea1218269d097405edc6cb/2.2/Dockerfile)
* [2.4 版本](https://github.com/docker-library/mongo/blob/807078cb7b5f0289f6dabf9f6875d5318122bc30/2.4/Dockerfile)
* [2.6 版本](https://github.com/docker-library/mongo/blob/77c841472ccb6cc87fea1218269d097405edc6cb/2.6/Dockerfile)
* [2.7 版本](https://github.com/docker-library/mongo/blob/807078cb7b5f0289f6dabf9f6875d5318122bc30/2.7/Dockerfile)

23
appendix_repo/mysql.md Normal file
View File

@@ -0,0 +1,23 @@
## [MySQL](https://registry.hub.docker.com/_/mysql/)
### 基本訊息
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是開源的關系數據庫實做。
該倉庫提供了 MySQL 各個版本的鏡像,包括 5.6 系列、5.7 系列等。
### 使用方法
默認會在 `3306` 端口啟動數據庫。
```
$ sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
```
之後就可以使用其它應用來連接到該容器。
```
$ sudo docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
```
或者透過 `mysql`
```
$ sudo docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```
### Dockerfile
* [5.6 版本](https://github.com/docker-library/mysql/blob/7461a52b43f06839a4d8723ae8841f4cb616b3d0/5.6/Dockerfile)
* [5.7 版本](https://github.com/docker-library/mysql/blob/7461a52b43f06839a4d8723ae8841f4cb616b3d0/5.7/Dockerfile)

34
appendix_repo/nginx.md Normal file
View File

@@ -0,0 +1,34 @@
## [Nginx](https://registry.hub.docker.com/_/nginx/)
### 基本訊息
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是開源的有效率的 Web 伺服器實做,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等協議。
該倉庫提供了 Nginx 1.0 ~ 1.7 各個版本的鏡像。
### 使用方法
下面的命令將作為一個靜態頁面伺服器啟動。
```
$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
使用者也可以不使用這種映射方式,透過利用 Dockerfile 來直接將靜態頁面內容放到鏡像中,內容為
```
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```
之後生成新的鏡像,並啟動一個容器。
```
$ sudo docker build -t some-content-nginx .
$ sudo docker run --name some-nginx -d some-content-nginx
```
開放端口,並映射到本地的 `8080` 端口。
```
sudo docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
Nginx的默認設定文件路徑為 `/etc/nginx/nginx.conf`,可以透過映射它來使用本地的設定文件,例如
```
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
```
使用設定文件時,為了在容器中正常執行,需要保持 `daemon off;`
### Dockerfile
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)

28
appendix_repo/nodejs.md Normal file
View File

@@ -0,0 +1,28 @@
## [Node.js](https://registry.hub.docker.com/_/node/)
### 基本訊息
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基於 JavaScript 的可擴展服務端和網路軟件開發平臺。
該倉庫提供了 Node.js 0.8 ~ 0.11 各個版本的鏡像。
### 使用方法
在項目中建立一個 Dockerfile。
```
FROM node:0.10-onbuild
# replace this with your application's default port
EXPOSE 8888
```
然後建立鏡像,並啟動容器
```
$ sudo docker build -t my-nodejs-app
$ sudo docker run -it --rm --name my-running-app my-nodejs-app
```
也可以直接執行一個簡單容器。
```
$ sudo docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
```
### Dockerfile
* [0.8 版本](https://github.com/docker-library/node/blob/d017d679e92e84a810c580cdb29fcdbba23c2bb9/0.8/Dockerfile)
* [0.10 版本](https://github.com/docker-library/node/blob/913a225f2fda34d6a811fac1466e4f09f075fcf6/0.10/Dockerfile)
* [0.11 版本](https://github.com/docker-library/node/blob/d017d679e92e84a810c580cdb29fcdbba23c2bb9/0.11/Dockerfile)

29
appendix_repo/redis.md Normal file
View File

@@ -0,0 +1,29 @@
## [Redis](https://registry.hub.docker.com/_/redis/)
### 基本訊息
[Redis](https://en.wikipedia.org/wiki/Redis) 是開源的內存 Key-Value 數據庫實做。
該倉庫提供了 Redis 2.6 ~ 2.8.9 各個版本的鏡像。
### 使用方法
默認會在 `6379` 端口啟動數據庫。
```
$ sudo docker run --name some-redis -d redis
```
另外還可以啟用 [持久存儲](http://redis.io/topics/persistence)。
```
$ sudo docker run --name some-redis -d redis redis-server --appendonly yes
```
默認數據存儲位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 將數據存放到本地。
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-redis:redis -d application-that-uses-redis
```
或者透過 `redis-cli`
```
$ sudo docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
```
### Dockerfile
* [2.6 版本](https://github.com/docker-library/redis/blob/02d9cd887a4e0d50db4bb085eab7235115a6fe4a/2.6.17/Dockerfile)
* [最新 2.8 版本](https://github.com/docker-library/redis/blob/d0665bb1bbddd4cc035dbc1fc774695fa534d648/2.8.13/Dockerfile)

17
appendix_repo/ubuntu.md Normal file
View File

@@ -0,0 +1,17 @@
## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/)
### 基本訊息
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 發行版,其自帶軟件版本往往較新一些。
該倉庫提供了 Ubuntu從12.04 ~ 14.10 各個版本的鏡像。
### 使用方法
默認會啟動一個最小化的 Ubuntu 環境。
```
$ sudo docker run --name some-ubuntu -i -t ubuntu
root@523c70904d54:/#
```
### Dockerfile
* [12.04 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/precise/Dockerfile)
* [14.04 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/trusty/Dockerfile)
* [14.10 版本](https://github.com/tianon/docker-brew-ubuntu-core/blob/2b105575647a7e2030ff344d427c3920b89e17a9/utopic/Dockerfile)

View File

@@ -0,0 +1,19 @@
## [WordPress](https://registry.hub.docker.com/_/wordpress/)
### 基本訊息
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是開源的 Blog 和內容管理系統框架,它基於 PhP 和 MySQL。
該倉庫提供了 WordPress 4.0 版本的鏡像。
### 使用方法
啟動容器需要 MySQL 的支持,默認端口為 `80`
```
$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
啟動 WordPress 容器時可以指定的一些環境參數包括
* `-e WORDPRESS_DB_USER=...` 缺省為 “root”
* `-e WORDPRESS_DB_PASSWORD=...` 缺省為連接 mysql 容器的環境變量 `MYSQL_ROOT_PASSWORD` 的值
* `-e WORDPRESS_DB_NAME=...` 缺省為 “wordpress”
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省為隨機 sha1 串
### Dockerfile
* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile)

View File

@@ -0,0 +1,7 @@
# 資源鏈接
* Docker 主站點: https://www.docker.io
* Docker 註冊中心API: http://docs.docker.com/reference/api/registry_api/
* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
* Docker 遠端應用API: http://docs.docker.com/reference/api/docker_remote_api/
* Dockerfile 參考https://docs.docker.com/reference/builder/
* Dockerfile 最佳實踐https://docs.docker.com/articles/dockerfile_best-practices/

View File

@@ -1,7 +1,9 @@
# 基本概念
Docker 包括三基本概念
* 镜像(`Image`
* 容器(`Container`
* 仓库(`Repository`
Docker 包括三基本概念
* 映像檔Image
* 容器Container
* 倉庫Repository
理解了這三個概念,就理解了 Docker 的整個生命週期。
理解了这三个概念,就理解了 Docker 的整个生命周期。

View File

@@ -1,13 +1,8 @@
## Docker 容器
Docker 利用容器來執行應用。
镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类``实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机
可以把容器看做是一個簡易版的 Linux 環境包括root使用者權限、程式空間、使用者空間和網路空間等和在其中執行的應用程式
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷Volume](../data_management/volume.md)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
*註:映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層

View File

@@ -1,15 +1,8 @@
## Docker 镜像
## Docker 映像檔
Docker 映像檔就是一個唯讀的模板。
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 Docker 镜像Image就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:16.04` 就包含了完整的一套 Ubuntu 16.04 最小系统的 `root` 文件系统
例如:一個映像檔可以包含一個完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它應用程式
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
映像檔可以用來建立 Docker 容器
### 分层存储
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
关于镜像构建,将会在后续相关章节中做进一步的讲解。
Docker 提供了一個很簡單的機制來建立映像檔或者更新現有的映像檔,使用者甚至可以直接從其他人那裡下載一個已經做好的映像檔來直接使用。

View File

@@ -1,29 +1,14 @@
## Docker Registry
## Docker 倉庫
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](../repository/registry.md) 就是这样的服务
倉庫是集中存放映像檔文件的場所。有時候會把倉庫和倉庫註冊伺服器Registry混為一談並不嚴格區分。實際上倉庫註冊伺服器上往往存放著多個倉庫每個倉庫中又包含了多個映像檔每個鏡像有不同的標籤tag
一个 **Docker Registry** 中可以包含多个**仓库**`Repository`);每个仓库可以包含多个**标签**`Tag`);每个标签对应一个镜像
倉庫分為公開倉庫Public和私有倉庫Private兩種形式
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签
最大的公開倉庫是 [Docker Hub](https://hub.docker.com),存放了數量龐大的映像檔供使用者下載
大陸的公開倉庫包括 [Docker Pool](http://www.dockerpool.com) 等,可以提供大陸使用者更穩定快速的訪問。
以 [Ubuntu 镜像](https://store.docker.com/images/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`
當然,使用者也可以在本地網路內建立一個私有倉庫
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务
當使用者建立了自己的映像檔之後就可以使用 `push` 命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個映像檔時候,只需要從倉庫上 `pull` 下來就可以了
### Docker Registry 公开服务
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry并拥有大量的高质量的官方镜像。除此以外还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/)CoreOS 相关的镜像存储在这里Google 的 [Google Container Registry](https://cloud.google.com/container-registry/)[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Docker](../install/mirror.md) 一节中有详细的配置方法。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com) 等。
### 私有 Docker Registry
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://store.docker.com/images/registry/) 镜像,可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API甚至提供了用户界面以及一些高级功能。比如[VMWare Harbor](https://github.com/vmware/harbor) 和 [Sonatype Nexus](https://www.sonatype.com/docker)。
*註:Docker 倉庫的概念跟 [Git](http://git-scm.com) 類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。

View File

@@ -1,20 +0,0 @@
#!/bin/bash
if [ -f offline ];then echo "请在项目根目录执行 $0"; exit 1; fi
command -v docker-compose > /dev/null 2>&1
if [ $? != 0 ];then echo "请安装 docker-compose"; exit 1; fi
if [ "$1" = update ];then
status=`git status -s`
if [ -z "$status" ];then
git fetch --depth=1 origin master
git reset --hard origin/master
else
echo "您已修改项目,请提交或恢复原状!"
exit 1
fi
fi
docker-compose up server

View File

@@ -1,37 +1 @@
{
"title": "Docker -- 从入门到实践",
"author": "yeasy",
"language": "zh-hans",
"links": {
"sidebar": {
"GitHub": "https://github.com/yeasy/docker_practice"
}
},
"plugins": [
"-livereload",
"image-captions",
"github",
"page-treeview",
"editlink"
],
"pluginsConfig": {
"image-captions": {
"attributes": {
"width": "600"
},
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
},
"github": {
"url": "https://github.com/yeasy/docker_practice"
},
"editlink": {
"base": "https://github.com/yeasy/docker_practice/blob/master/",
"label": "编辑本页"
},
"page-treeview": {
"copyright": "Copyright &#169; yeasy",
"minHeaderCount": "2",
"minHeaderDeep": "2"
}
}
}
{}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

2
cases/README.md Normal file
View File

@@ -0,0 +1,2 @@
#實戰案例
介紹一些典型的應用場景和案例。

View File

@@ -1,7 +0,0 @@
# CI/CD
持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续部署continuous deployment是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
`Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 镜像中,所以理论上支持所有的编程语言。

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,7 +0,0 @@
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}

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,78 @@
## 多臺物理主機之間的容器互聯(暴露容器到真實網路中)
Docker 默認的橋接網卡是 docker0。它只會在本機橋接所有的容器網卡舉例來說容器的虛擬網卡在主機上看一般叫做 veth*** 而 Docker 只是把所有這些網卡橋接在一起,以下:
```
[root@opnvz ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.56847afe9799 no veth0889
veth3c7b
veth4061
```
在容器中看到的地址一般是像下面這樣的地址:
```
root@ac6474aeb31d:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
11: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 4a:7d:68:da:09:cf brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::487d:68ff:feda:9cf/64 scope link
valid_lft forever preferred_lft forever
```
這樣就可以把這個網路看成是一個私有的網路,透過 nat 連接外網,如果要讓外網連接到容器中,就需要做端口映射,即 -p 參數。
如果在企業內部應用,或者做多個物理主機的集群,可能需要將多個物理主機的容器組到一個物理網路中來,那麽就需要將這個網橋橋接到我們指定的網卡上。
### 拓撲圖
主機 A 和主機 B 的網卡一都連著物理交換機的同一個 vlan 101,這樣網橋一和網橋三就相當於在同一個物理網路中了,而容器一、容器三、容器四也在同一物理網路中了,他們之間可以相互通信,而且可以跟同一 vlan 中的其他物理機器互聯。
![物理拓撲圖](../_images/container_connect_topology.png)
### ubuntu 示例
下面以 ubuntu 為例建立多個主機的容器聯網:
建立自己的網橋,編輯 /etc/network/interface 文件
```
auto br0
iface br0 inet static
address 192.168.7.31
netmask 255.255.240.0
gateway 192.168.7.254
bridge_ports em1
bridge_stp off
dns-nameservers 8.8.8.8 192.168.6.1
```
將 Docker 的默認網橋綁定到這個新建的 br0 上面,這樣就將這臺機器上容器綁定到 em1 這個網卡所對應的物理網路上了。
ubuntu 修改 /etc/default/docker 文件,新增最後一行內容
```
# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
DOCKER_OPTS="-b=br0"
```
在啟動 Docker 的時候 使用 -b 參數 將容器綁定到物理網路上。重啟 Docker 服務後,再進入容器可以看到它已經綁定到你的物理網路上了。
```
root@ubuntudocker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58b043aa05eb desk_hz:v1 "/startup.sh" 5 days ago Up 2 seconds 5900/tcp, 6080/tcp, 22/tcp yanlx
root@ubuntudocker:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.7e6e617c8d53 no em1
vethe6e5
```
這樣就直接把容器暴露到物理網路上了,多臺物理主機的容器也可以相網路了。需要註意的是,這樣就需要自己來保證容器的網路安全了。

Some files were not shown because too many files have changed in this diff Show More