replace '運行' as '執行'

pull/25/head
a504082002 2014-11-20 01:04:25 +08:00
parent 0f699adab0
commit 45acb9c3c3
30 changed files with 70 additions and 70 deletions

View File

@ -77,12 +77,12 @@ v0.2.9
1. 首先 fork 我的項目 1. 首先 fork 我的項目
2. 把 fork 過去的項目也就是你的項目 clone 到你的本地 2. 把 fork 過去的項目也就是你的項目 clone 到你的本地
3. 在命令行`git branch develop` 來創建一個新分支 3. 在命令行`git branch develop` 來創建一個新分支
4. `git checkout develop` 來切換到新分支 4. `git checkout develop` 來切換到新分支
5. `git remote add upstream https://github.com/philipz/docker_practice` 把我的庫添加為遠端庫 5. `git remote add upstream https://github.com/philipz/docker_practice` 把我的庫添加為遠端庫
6. `git remote update`更新 6. `git remote update`更新
7. `git fetch upstream master` 拉取我的庫的更新到本地 7. `git fetch upstream master` 拉取我的庫的更新到本地
8. `git rebase upstream/master` 將我的更新合並到你的分支 8. `git rebase upstream/master` 將我的更新合並到你的分支
這是一個初始化流程,只需要做一遍就行,之後請一直在 develop 分支進行修改。 這是一個初始化流程,只需要做一遍就行,之後請一直在 develop 分支進行修改。

View File

@ -20,7 +20,7 @@
* [實現原理](image/internal.md) * [實現原理](image/internal.md)
* [容器](container/README.md) * [容器](container/README.md)
* [啟動](container/run.md) * [啟動](container/run.md)
* [守護態行](container/daemon.md) * [守護態行](container/daemon.md)
* [終止](container/stop.md) * [終止](container/stop.md)
* [進入容器](container/enter.md) * [進入容器](container/enter.md)
* [導出與導入](container/import_export.md) * [導出與導入](container/import_export.md)

View File

@ -3,7 +3,7 @@
在啟動 Docker 服務的時候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 來指定使用的網橋。 在啟動 Docker 服務的時候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 來指定使用的網橋。
如果服務已經行,那需要先停止服務,並刪除舊的網橋。 如果服務已經行,那需要先停止服務,並刪除舊的網橋。
``` ```
$ sudo service docker stop $ sudo service docker stop
$ sudo ip link set dev docker0 down $ sudo ip link set dev docker0 down

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` 提交。

View File

@ -28,7 +28,7 @@
讓 Docker 使用給定的 DNS 服務器。 讓 Docker 使用給定的 DNS 服務器。
-g="" -g=""
指定 Docker 行時的 root 路徑。缺省為 /var/lib/docker。 指定 Docker 行時的 root 路徑。缺省為 /var/lib/docker。
--icc=true|false --icc=true|false
啟用容器間通信。默認為 true。 啟用容器間通信。默認為 true。
@ -46,7 +46,7 @@
指定 daemon 的 PID 文件路徑。缺省為 /var/run/docker.pid。 指定 daemon 的 PID 文件路徑。缺省為 /var/run/docker.pid。
-s="" -s=""
強制 Docker 行時使用給定的存儲驅動。 強制 Docker 行時使用給定的存儲驅動。
-v=true|false -v=true|false
輸出版本信息並退出。缺省值為 false。 輸出版本信息並退出。缺省值為 false。
@ -59,7 +59,7 @@
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。兩者一致。 Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。兩者一致。
docker-attach(1) docker-attach(1)
依附到一個正在行的容器中。 依附到一個正在行的容器中。
docker-build(1) docker-build(1)
從一個 Dockerfile 創建一個鏡像 從一個 Dockerfile 創建一個鏡像
@ -95,7 +95,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
顯示一個容器的底層具體信息。 顯示一個容器的底層具體信息。
docker-kill(1) docker-kill(1)
關閉一個行中的容器 (包括進程和所有資源) 關閉一個行中的容器 (包括進程和所有資源)
docker-load(1) docker-load(1)
從一個 tar 包中加載一個鏡像 從一個 tar 包中加載一個鏡像
@ -125,7 +125,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
將一個鏡像或者倉庫推送到一個 Docker 的註冊服務器 將一個鏡像或者倉庫推送到一個 Docker 的註冊服務器
docker-restart(1) docker-restart(1)
重啟一個行中的容器 重啟一個行中的容器
docker-rm(1) docker-rm(1)
刪除給定的若幹個容器 刪除給定的若幹個容器
@ -134,7 +134,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
刪除給定的若幹個鏡像 刪除給定的若幹個鏡像
docker-run(1) docker-run(1)
創建一個新容器,並在其中行給定命令 創建一個新容器,並在其中行給定命令
docker-save(1) docker-save(1)
保存一個鏡像為 tar 包文件 保存一個鏡像為 tar 包文件
@ -146,13 +146,13 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
啟動一個容器 啟動一個容器
docker-stop(1) docker-stop(1)
終止一個行中的容器 終止一個行中的容器
docker-tag(1) docker-tag(1)
為一個鏡像打標簽 為一個鏡像打標簽
docker-top(1) docker-top(1)
查看一個容器中的正在行的進程信息 查看一個容器中的正在行的進程信息
docker-unpause(1) docker-unpause(1)
將一個容器內所有的進程從暫停狀態中恢復 將一個容器內所有的進程從暫停狀態中恢復

View File

@ -28,7 +28,7 @@ Nginx的默認配置文件路徑為 `/etc/nginx/nginx.conf`,可以通過映射
``` ```
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
``` ```
使用配置文件時,為了在容器中正常行,需要保持 `daemon off;` 使用配置文件時,為了在容器中正常行,需要保持 `daemon off;`
### Dockerfile ### Dockerfile
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile) * [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)

View File

@ -17,7 +17,7 @@ $ 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-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 $ 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
``` ```

View File

@ -1,7 +1,7 @@
## 使用 Supervisor 來管理進程 ## 使用 Supervisor 來管理進程
Docker 容器在啟動的時候開啟單個進程,比如,一個 ssh 或者 apache 的 daemon 服務。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裏面,啟動的時候直接啟動這個腳本,另外就是安裝進程管理工具。 Docker 容器在啟動的時候開啟單個進程,比如,一個 ssh 或者 apache 的 daemon 服務。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裏面,啟動的時候直接啟動這個腳本,另外就是安裝進程管理工具。
本小節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望行的進程。在這裏我們演示一下如何同時使用 ssh 和 apache 服務。 本小節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望行的進程。在這裏我們演示一下如何同時使用 ssh 和 apache 服務。
### 配置 ### 配置
首先創建一個 Dockerfile內容和各部分的解釋如下。 首先創建一個 Dockerfile內容和各部分的解釋如下。
@ -21,7 +21,7 @@ RUN mkdir -p /var/run/sshd
RUN mkdir -p /var/log/supervisor RUN mkdir -p /var/log/supervisor
``` ```
這裏安裝 3 個軟件,還創建了 2 個 ssh 和 supervisor 服務正常行所需要的目錄。 這裏安裝 3 個軟件,還創建了 2 個 ssh 和 supervisor 服務正常行所需要的目錄。
``` ```
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
``` ```
@ -44,7 +44,7 @@ command=/usr/sbin/sshd -D
[program:apache2] [program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
``` ```
配置文件包含目錄和進程,第一段 supervsord 配置軟件本身,使用 nodaemon 參數來行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。 配置文件包含目錄和進程,第一段 supervsord 配置軟件本身,使用 nodaemon 參數來行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
### 使用方法 ### 使用方法
創建鏡像。 創建鏡像。

View File

@ -1,6 +1,6 @@
# Docker 容器 # Docker 容器
容器是 Docker 又一核心概念。 容器是 Docker 又一核心概念。
簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套作業系統(提供了運行態環境和其他系統環境)和跑在上面的應用。 簡單的說,容器是獨立執行的一個或一組應用,以及它們的執行態環境。對應的,虛擬機可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他系統環境)和跑在上面的應用。
本章將具體介紹如何來管理一個容器,包括創建、啟動和停止等。 本章將具體介紹如何來管理一個容器,包括創建、啟動和停止等。

View File

@ -1,8 +1,8 @@
##守護態 ##守護態
更多的時候,需要讓 Docker 容器在後臺以守護態Daemonized形式行。此時,可以通過添加 `-d` 參數來實現。 更多的時候,需要讓 Docker 容器在後臺以守護態Daemonized形式行。此時,可以通過添加 `-d` 參數來實現。
例如下面的命令會在後臺行容器。 例如下面的命令會在後臺行容器。
``` ```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

View File

@ -5,5 +5,5 @@
$sudo docker rm trusting_newton $sudo docker rm trusting_newton
trusting_newton trusting_newton
``` ```
如果要刪除一個行中的容器,可以添加 `-f` 參數。Docker 會發送 `SIGKILL` 信號給容器。 如果要刪除一個行中的容器,可以添加 `-f` 參數。Docker 會發送 `SIGKILL` 信號給容器。

View File

@ -28,7 +28,7 @@ root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
``` ```
當利用 `docker run` 來創建容器時Docker 在後臺行的標準操作包括: 當利用 `docker run` 來創建容器時Docker 在後臺行的標準操作包括:
* 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載 * 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
* 利用鏡像創建並啟動一個容器 * 利用鏡像創建並啟動一個容器
@ -39,13 +39,13 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
* 執行完畢後容器被終止 * 執行完畢後容器被終止
###啟動已終止容器 ###啟動已終止容器
可以利用 `docker start` 命令,直接將一個已經終止的容器啟動行。 可以利用 `docker start` 命令,直接將一個已經終止的容器啟動行。
容器的核心為所執行的應用程序,所需要的資源都是應用程序行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 `ps``top` 來查看進程信息。 容器的核心為所執行的應用程序,所需要的資源都是應用程序行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 `ps``top` 來查看進程信息。
``` ```
root@ba267838cc1b:/# ps root@ba267838cc1b:/# ps
PID TTY TIME CMD PID TTY TIME CMD
1 ? 00:00:00 bash 1 ? 00:00:00 bash
11 ? 00:00:00 ps 11 ? 00:00:00 ps
``` ```
可見,容器中僅行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。 可見,容器中僅行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。

View File

@ -1,5 +1,5 @@
##終止容器 ##終止容器
可以使用 `docker stop` 來終止一個行中的容器。 可以使用 `docker stop` 來終止一個行中的容器。
此外當Docker容器中指定的應用終結時容器也自動終止。 此外當Docker容器中指定的應用終結時容器也自動終止。
例如對於上一章節中只啟動了一個終端的容器,用戶通過 `exit` 命令或 `Ctrl+d` 來退出終端時,所創建的容器立刻終止。 例如對於上一章節中只啟動了一個終端的容器,用戶通過 `exit` 命令或 `Ctrl+d` 來退出終端時,所創建的容器立刻終止。
@ -14,4 +14,4 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
處於終止狀態的容器,可以通過 `docker start` 命令來重新啟動。 處於終止狀態的容器,可以通過 `docker start` 命令來重新啟動。
此外,`docker restart` 命令會將一個行態的容器終止,然後再重新啟動它。 此外,`docker restart` 命令會將一個行態的容器終止,然後再重新啟動它。

View File

@ -17,7 +17,7 @@ $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
``` ```
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres $ sudo docker run -d --name db3 --volumes-from db1 training/postgres
``` ```
*註意:使用 `--volumes-from` 參數所掛載數據卷的容器自己並不需要保持在行狀態。 *註意:使用 `--volumes-from` 參數所掛載數據卷的容器自己並不需要保持在行狀態。
如果刪除了掛載的容器(包括 dbdata、db1 和 db2數據卷並不會被自動刪除。如果要刪除一個數據卷必須在刪除最後一個還掛載著它的容器時使用 `docker rm -v` 命令來指定同時刪除關聯的容器。 如果刪除了掛載的容器(包括 dbdata、db1 和 db2數據卷並不會被自動刪除。如果要刪除一個數據卷必須在刪除最後一個還掛載著它的容器時使用 `docker rm -v` 命令來指定同時刪除關聯的容器。
這可以讓用戶在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。 這可以讓用戶在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。

View File

@ -27,7 +27,7 @@ CMD /usr/sbin/nginx
其中,一開始必須指明作為基底的鏡像名稱,接下來說明維護者資訊(建議)。 其中,一開始必須指明作為基底的鏡像名稱,接下來說明維護者資訊(建議)。
後面則是鏡像操作指令,例如 `RUN` 指令,`RUN` 指令將對鏡像執行相對應的命令。每行一條 `RUN` 指令,鏡像添加新的一層,並提交。 後面則是鏡像操作指令,例如 `RUN` 指令,`RUN` 指令將對鏡像執行相對應的命令。每行一條 `RUN` 指令,鏡像添加新的一層,並提交。
最後是 `CMD` 指令,來指定執行容器時的操作命令。 最後是 `CMD` 指令,來指定執行容器時的操作命令。

View File

@ -12,7 +12,7 @@
### RUN ### RUN
格式為 `RUN <command>``RUN ["executable", "param1", "param2"]` 格式為 `RUN <command>``RUN ["executable", "param1", "param2"]`
前者將在 shell 終端中行命令,即 `/bin/sh -c`;後者則使用 `exec` 執行。指定使用其它終端可以通過第二種方式實現,例如 `RUN ["/bin/bash", "-c", "echo hello"]` 前者將在 shell 終端中行命令,即 `/bin/sh -c`;後者則使用 `exec` 執行。指定使用其它終端可以通過第二種方式實現,例如 `RUN ["/bin/bash", "-c", "echo hello"]`
每條 `RUN` 指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 `\` 來換行。 每條 `RUN` 指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 `\` 來換行。
@ -25,7 +25,7 @@
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 `CMD` 命令。如果指定了多條命令,只有最後一條會被執行。 指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 `CMD` 命令。如果指定了多條命令,只有最後一條會被執行。
如果用戶啟動容器時候指定了行的命令,則會覆蓋掉 `CMD` 指定的命令。 如果用戶啟動容器時候指定了行的命令,則會覆蓋掉 `CMD` 指定的命令。
### EXPOSE ### EXPOSE
格式為 `EXPOSE <port> [<port>...]` 格式為 `EXPOSE <port> [<port>...]`
@ -34,7 +34,7 @@
### ENV ### ENV
格式為 `ENV <key> <value>` 格式為 `ENV <key> <value>`
指定一個環境變量,會被後續 `RUN` 指令使用,並在容器行時保持。 指定一個環境變量,會被後續 `RUN` 指令使用,並在容器行時保持。
例如 例如
``` ```
@ -74,9 +74,9 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
### USER ### USER
格式為 `USER daemon` 格式為 `USER daemon`
指定行容器時的用戶名或 UID後續的 `RUN` 也會使用指定用戶。 指定行容器時的用戶名或 UID後續的 `RUN` 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定行用戶。並且可以在之前創建所需要的用戶,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要臨時獲取管理員權限可以使用 `gosu`,而不推薦 `sudo` 當服務不需要管理員權限時,可以通過該命令指定行用戶。並且可以在之前創建所需要的用戶,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要臨時獲取管理員權限可以使用 `gosu`,而不推薦 `sudo`
### WORKDIR ### WORKDIR
格式為 `WORKDIR /path/to/workdir` 格式為 `WORKDIR /path/to/workdir`

View File

@ -58,7 +58,7 @@ Dockerfile 基本的語法是
* 使用`#`來註釋 * 使用`#`來註釋
* `FROM` 指令告訴 Docker 使用哪個鏡像作為基礎 * `FROM` 指令告訴 Docker 使用哪個鏡像作為基礎
* 接著是維護者的信息 * 接著是維護者的信息
* `RUN`開頭的指令會在創建中行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件 * `RUN`開頭的指令會在創建中行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件
編寫完成 Dockerfile 後可以使用 `docker build` 來生成鏡像。 編寫完成 Dockerfile 後可以使用 `docker build` 來生成鏡像。
@ -104,7 +104,7 @@ Successfully built 324104cde6ad
*註意一個鏡像不能超過 127 層 *註意一個鏡像不能超過 127 層
此外,還可以利用 `ADD` 命令復制本地文件到鏡像;用 `EXPOSE` 命令來向外部開放端口;用 `CMD` 命令來描述容器啟動後行的程序等。例如 此外,還可以利用 `ADD` 命令復制本地文件到鏡像;用 `EXPOSE` 命令來向外部開放端口;用 `CMD` 命令來描述容器啟動後行的程序等。例如
``` ```
# put my local web site in myApp folder to /var/www # put my local web site in myApp folder to /var/www
ADD myApp /var/www ADD myApp /var/www

View File

@ -2,25 +2,25 @@
作為一種新興的虛擬化方式Docker 跟傳統的虛擬化方式相比具有眾多的優勢。 作為一種新興的虛擬化方式Docker 跟傳統的虛擬化方式相比具有眾多的優勢。
首先Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 首先Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。
其次Docker 對系統資源的利用率很高,一台主機上可以同時行數千個 Docker 容器。 其次Docker 對系統資源的利用率很高,一台主機上可以同時行數千個 Docker 容器。
容器除了行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。 容器除了行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。
具體說來Docker 在如下幾個方面具有較大的優勢。 具體說來Docker 在如下幾個方面具有較大的優勢。
### 更快速的交付和部署 ### 更快速的交付和部署
對開發和維運develop人員來說最希望的就是一次建立或配置可以在任意地方正常行。 對開發和維運develop人員來說最希望的就是一次建立或配置可以在任意地方正常行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,維運人員可以直接使用這個容器來部署代碼。 開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,維運人員可以直接使用這個容器來部署代碼。
Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。
Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
### 更高效的虛擬化 ### 更高效的虛擬化
Docker 容器的行不需要額外的虛擬化支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。 Docker 容器的行不需要額外的虛擬化支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
### 更輕鬆的遷移和擴展 ### 更輕鬆的遷移和擴展
Docker 容器幾乎可以在任意的平台上行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。 Docker 容器幾乎可以在任意的平台上行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。
這種兼容性可以讓用戶把一個應用程序從一個平台直接遷移到另外一個。 這種兼容性可以讓用戶把一個應用程序從一個平台直接遷移到另外一個。
### 更簡單的管理 ### 更簡單的管理

View File

@ -1,5 +1,5 @@
## 外部訪問容器 ## 外部訪問容器
容器中可以行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 `-P``-p` 參數來指定端口映射。 容器中可以行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 `-P``-p` 參數來指定端口映射。
當使用 -P 標記時Docker 會隨機映射一個 `49000~49900` 的端口到內部容器開放的網絡端口。 當使用 -P 標記時Docker 會隨機映射一個 `49000~49900` 的端口到內部容器開放的網絡端口。

View File

@ -5,9 +5,9 @@
本節介紹如何使用本地倉庫。 本節介紹如何使用本地倉庫。
`docker-registry` 是官方提供的工具,可以用於構建私有的鏡像倉庫。 `docker-registry` 是官方提供的工具,可以用於構建私有的鏡像倉庫。
### 安裝行 docker-registry ### 安裝行 docker-registry
#### 容器 #### 容器
在安裝了 Docker 後,可以通過獲取官方 registry 鏡像來行。 在安裝了 Docker 後,可以通過獲取官方 registry 鏡像來行。
``` ```
$ sudo docker run -d -p 5000:5000 registry $ sudo docker run -d -p 5000:5000 registry
``` ```
@ -66,7 +66,7 @@ $ sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
``` ```
$ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application $ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
``` ```
此時使用訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明行成功。 此時使用訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明行成功。
*註:`config/config_sample.yml` 文件是示例配置文件。 *註:`config/config_sample.yml` 文件是示例配置文件。

View File

@ -3,6 +3,6 @@
它提供了很多有用的特性以及確保各個容器可以公平地分享主機的內存、CPU、磁盤 IO 等資源;當然,更重要的是,控制組確保了當容器內的資源使用產生壓力時不會連累主機系統。 它提供了很多有用的特性以及確保各個容器可以公平地分享主機的內存、CPU、磁盤 IO 等資源;當然,更重要的是,控制組確保了當容器內的資源使用產生壓力時不會連累主機系統。
盡管控制組不負責隔離容器之間相互訪問、處理數據和進程它在防止拒絕服務DDOS攻擊方面是必不可少的。尤其是在多用戶的平臺比如公有或私有的 PaaS控制組十分重要。例如當某些應用程序表現異常的時候可以保證一致地正常行和性能。 盡管控制組不負責隔離容器之間相互訪問、處理數據和進程它在防止拒絕服務DDOS攻擊方面是必不可少的。尤其是在多用戶的平臺比如公有或私有的 PaaS控制組十分重要。例如當某些應用程序表現異常的時候可以保證一致地正常行和性能。
控制組機制始於 2006 年,內核從 2.6.24 版本開始被引入。 控制組機制始於 2006 年,內核從 2.6.24 版本開始被引入。

View File

@ -1,5 +1,5 @@
## Docker服務端的防護 ## Docker服務端的防護
運行一個容器或應用程序的核心是通過 Docker 服務端。Docker 服務的運行目前需要 root 權限,因此其安全性十分關鍵。 執行一個容器或應用程序的核心是通過 Docker 服務端。Docker 服務的執行目前需要 root 權限,因此其安全性十分關鍵。
首先,確保只有可信的用戶才可以訪問 Docker 服務。Docker 允許用戶在主機和容器間共享文件夾,同時不需要限制容器的訪問權限,這就容易讓容器突破資源限制。例如,惡意用戶啟動容器的時候將主機的根目錄`/`映射到容器的 `/host` 目錄中,那麽容器理論上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統都允許類似的資源共享,而沒法禁止用戶共享主機根文件系統到虛擬機系統。 首先,確保只有可信的用戶才可以訪問 Docker 服務。Docker 允許用戶在主機和容器間共享文件夾,同時不需要限制容器的訪問權限,這就容易讓容器突破資源限制。例如,惡意用戶啟動容器的時候將主機的根目錄`/`映射到容器的 `/host` 目錄中,那麽容器理論上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統都允許類似的資源共享,而沒法禁止用戶共享主機根文件系統到虛擬機系統。
@ -9,10 +9,10 @@
用戶仍可以利用 HTTP 提供 REST API 訪問。建議使用安全機制,確保只有可信的網絡或 VPN或證書保護機制例如受保護的 stunnel 和 ssl 認證)下的訪問可以進行。此外,還可以使用 HTTPS 和證書來加強保護。 用戶仍可以利用 HTTP 提供 REST API 訪問。建議使用安全機制,確保只有可信的網絡或 VPN或證書保護機制例如受保護的 stunnel 和 ssl 認證)下的訪問可以進行。此外,還可以使用 HTTPS 和證書來加強保護。
最近改進的 Linux 名字空間機制將可以實現使用非 root 用戶來行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統而引起的安全問題。 最近改進的 Linux 名字空間機制將可以實現使用非 root 用戶來行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統而引起的安全問題。
終極目標是改進 2 個重要的安全特性: 終極目標是改進 2 個重要的安全特性:
* 將容器的 root 用戶映射到本地主機上的非 root 用戶,減輕容器和主機之間因權限提升而引起的安全問題; * 將容器的 root 用戶映射到本地主機上的非 root 用戶,減輕容器和主機之間因權限提升而引起的安全問題;
* 允許 Docker 服務端在非 root 權限下行,利用安全可靠的子進程來代理執行需要特權權限的操作。這些子進程將只允許在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系統管理、配置操作等。 * 允許 Docker 服務端在非 root 權限下行,利用安全可靠的子進程來代理執行需要特權權限的操作。這些子進程將只允許在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系統管理、配置操作等。
最後,建議采用專用的服務器來行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去行。 最後,建議采用專用的服務器來行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去行。

View File

@ -7,7 +7,7 @@ Linux 內核自 2.2 版本起就支持能力機制,它將權限劃分為更加
默認情況下Docker 啟動的容器被嚴格限制只允許使用內核的一部分能力。 默認情況下Docker 啟動的容器被嚴格限制只允許使用內核的一部分能力。
使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊例如負載模塊、網絡配置工具等等。容器跟這些進程是不同的因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。 使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊例如負載模塊、網絡配置工具等等。容器跟這些進程是不同的因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。
* ssh 訪問被主機上ssh服務來管理 * ssh 訪問被主機上ssh服務來管理
* cron 通常應該作為用戶進程執行,權限交給使用它服務的應用來處理; * cron 通常應該作為用戶進程執行,權限交給使用它服務的應用來處理;
* 日誌系統可由 Docker 或第三方服務管理; * 日誌系統可由 Docker 或第三方服務管理;

View File

@ -1,7 +1,7 @@
## 內核名字空間 ## 內核名字空間
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。當用 `docker run` 啟動一個容器時,在後臺 Docker 為容器創建了一個獨立的名字空間和控制組集合。 Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。當用 `docker run` 啟動一個容器時,在後臺 Docker 為容器創建了一個獨立的名字空間和控制組集合。
名字空間提供了最基礎也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發現和作用。 名字空間提供了最基礎也是最直接的隔離,在容器中執行的進程不會被執行在主機上的進程和其它容器發現和作用。
每個容器都有自己獨有的網絡棧,意味著它們不能訪問其他容器的 sockets 或接口。不過,如果主機系統上做了相應的設置,容器可以像跟主機交互一樣的和其他容器交互。當指定公共端口或使用 links 來連接 2 個容器時,容器就可以相互通信了(可以根據配置來限制通信的策略)。 每個容器都有自己獨有的網絡棧,意味著它們不能訪問其他容器的 sockets 或接口。不過,如果主機系統上做了相應的設置,容器可以像跟主機交互一樣的和其他容器交互。當指定公共端口或使用 links 來連接 2 個容器時,容器就可以相互通信了(可以根據配置來限制通信的策略)。

View File

@ -2,7 +2,7 @@
除了能力機制之外,還可以利用一些現有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。 除了能力機制之外,還可以利用一些現有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
Docker 當前默認只啟用了能力機制。用戶可以采用多種方案來加強 Docker 主機的安全,例如: Docker 當前默認只啟用了能力機制。用戶可以采用多種方案來加強 Docker 主機的安全,例如:
* 在內核中啟用 GRSEC 和 PAX這將增加很多編譯和行時的安全檢查;通過地址隨機化避免惡意探測等。並且,啟用該特性不需要 Docker 進行任何配置。 * 在內核中啟用 GRSEC 和 PAX這將增加很多編譯和行時的安全檢查;通過地址隨機化避免惡意探測等。並且,啟用該特性不需要 Docker 進行任何配置。
* 使用一些有增強安全特性的容器模板,比如帶 AppArmor 的模板和 Redhat 帶 SELinux 策略的模板。這些模板提供了額外的安全特性。 * 使用一些有增強安全特性的容器模板,比如帶 AppArmor 的模板和 Redhat 帶 SELinux 策略的模板。這些模板提供了額外的安全特性。
* 用戶可以自定義訪問控制機制來定制安全策略。 * 用戶可以自定義訪問控制機制來定制安全策略。

View File

@ -1,4 +1,4 @@
## 總結 ## 總結
總體來看Docker 容器還是十分安全的,特別是在容器內不使用 root 權限來行進程的話。 總體來看Docker 容器還是十分安全的,特別是在容器內不使用 root 權限來行進程的話。
另外,用戶可以使用現有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在內核中實現更復雜的安全機制。 另外,用戶可以使用現有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在內核中實現更復雜的安全機制。

View File

@ -2,12 +2,12 @@
Docker 底層的核心技術包括 Linux 上的名字空間Namespaces、控制組Control groups、Union 文件系統Union file systems和容器格式Container format Docker 底層的核心技術包括 Linux 上的名字空間Namespaces、控制組Control groups、Union 文件系統Union file systems和容器格式Container format
我們知道,傳統的虛擬機通過在宿主主機中行 hypervisor 來模擬一整套完整的硬件環境提供給虛擬機的作業系統。虛擬機系統看到的環境是可限制的,也是彼此隔離的。 我們知道,傳統的虛擬機通過在宿主主機中行 hypervisor 來模擬一整套完整的硬件環境提供給虛擬機的作業系統。虛擬機系統看到的環境是可限制的,也是彼此隔離的。
這種直接的做法實現了對資源最完整的封裝,但很多時候往往意味著系統資源的浪費。 這種直接的做法實現了對資源最完整的封裝,但很多時候往往意味著系統資源的浪費。
例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中運行的應用其實可以利用宿主機系統中的運行環境。 例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中執行的應用其實可以利用宿主機系統中的執行環境。
我們知道在作業系統中包括內核、文件系統、網絡、PID、UID、IPC、內存、硬盤、CPU 等等,所有的資源都是應用進程直接共享的。 我們知道在作業系統中包括內核、文件系統、網絡、PID、UID、IPC、內存、硬盤、CPU 等等,所有的資源都是應用進程直接共享的。
要想實現虛擬化除了要實現對內存、CPU、網絡IO、硬盤IO、存儲空間等的限制外還要實現文件系統、網絡、PID、UID、IPC等等的相互隔離。 要想實現虛擬化除了要實現對內存、CPU、網絡IO、硬盤IO、存儲空間等的限制外還要實現文件系統、網絡、PID、UID、IPC等等的相互隔離。
前者相對容易實現一些,後者則需要宿主機系統的深入支持。 前者相對容易實現一些,後者則需要宿主機系統的深入支持。
隨著 Linux 系統對於名字空間功能的完善實現,程序員已經可以實現上面的所有需求,讓某些進程在彼此隔離的名字空間中運行。大家雖然都共用一個內核和某些運行時環境例如一些系統命令和系統庫但是彼此卻看不到都以為系統中只有自己的存在。這種機制就是容器Container利用名字空間來做權限的隔離控制利用 cgroups 來做資源分配。 隨著 Linux 系統對於名字空間功能的完善實現,程序員已經可以實現上面的所有需求,讓某些進程在彼此隔離的名字空間中執行。大家雖然都共用一個內核和某些執行時環境例如一些系統命令和系統庫但是彼此卻看不到都以為系統中只有自己的存在。這種機制就是容器Container利用名字空間來做權限的隔離控制利用 cgroups 來做資源分配。

View File

@ -1,10 +1,10 @@
## 基本架構 ## 基本架構
Docker 采用了 C/S架構包括客戶端和服務端。 Docker 采用了 C/S架構包括客戶端和服務端。
Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(創建、行、分發容器)。 Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(創建、行、分發容器)。
客戶端和服務端既可以行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。 客戶端和服務端既可以行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。
![Docker 基本架構](../_images/docker_arch.png) ![Docker 基本架構](../_images/docker_arch.png)
Docker daemon 一般在宿主主機後臺行,等待接收來自客戶端的消息。 Docker daemon 一般在宿主主機後臺行,等待接收來自客戶端的消息。
Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。 Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。

View File

@ -1,6 +1,6 @@
## 控制組 ## 控制組
控制組([cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時行時的對系統資源的競爭。 控制組([cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時行時的對系統資源的競爭。
控制組技術最早是由 Google 的程序員 2006 年起提出Linux 內核自 2.6.24 開始支持。 控制組技術最早是由 Google 的程序員 2006 年起提出Linux 內核自 2.6.24 開始支持。

View File

@ -1,5 +1,5 @@
## 名字空間 ## 名字空間
名字空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的名字空間,運行在其中的應用都像是在獨立的作業系統中運行一樣。名字空間保證了容器之間彼此互不影響。 名字空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的名字空間,執行在其中的應用都像是在獨立的作業系統中執行一樣。名字空間保證了容器之間彼此互不影響。
### pid 名字空間 ### pid 名字空間
不同用戶的進程就是通過 pid 名字空間隔離開的,且不同名字空間中可以有相同 pid。所有的 LXC 進程在 Docker 中的父進程為Docker進程每個 LXC 進程具有不同的名字空間。同時由於允許嵌套,因此可以很方便的實現嵌套的 Docker 容器。 不同用戶的進程就是通過 pid 名字空間隔離開的,且不同名字空間中可以有相同 pid。所有的 LXC 進程在 Docker 中的父進程為Docker進程每個 LXC 進程具有不同的名字空間。同時由於允許嵌套,因此可以很方便的實現嵌套的 Docker 容器。