mirror of
https://github.com/yeasy/docker_practice.git
synced 2024-12-26 15:06:18 +00:00
replace '運行' as '執行'
This commit is contained in:
parent
0f699adab0
commit
45acb9c3c3
12
README.md
12
README.md
@ -77,12 +77,12 @@ v0.2.9
|
||||
|
||||
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` 將我的更新合並到你的分支
|
||||
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 分支進行修改。
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
* [實現原理](image/internal.md)
|
||||
* [容器](container/README.md)
|
||||
* [啟動](container/run.md)
|
||||
* [守護態運行](container/daemon.md)
|
||||
* [守護態執行](container/daemon.md)
|
||||
* [終止](container/stop.md)
|
||||
* [進入容器](container/enter.md)
|
||||
* [導出與導入](container/import_export.md)
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
在啟動 Docker 服務的時候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 來指定使用的網橋。
|
||||
|
||||
如果服務已經運行,那需要先停止服務,並刪除舊的網橋。
|
||||
如果服務已經執行,那需要先停止服務,並刪除舊的網橋。
|
||||
```
|
||||
$ sudo service docker stop
|
||||
$ sudo ip link set dev docker0 down
|
||||
|
@ -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` 提交。
|
||||
|
@ -28,7 +28,7 @@
|
||||
讓 Docker 使用給定的 DNS 服務器。
|
||||
|
||||
-g=""
|
||||
指定 Docker 運行時的 root 路徑。缺省為 /var/lib/docker。
|
||||
指定 Docker 執行時的 root 路徑。缺省為 /var/lib/docker。
|
||||
|
||||
--icc=true|false
|
||||
啟用容器間通信。默認為 true。
|
||||
@ -46,7 +46,7 @@
|
||||
指定 daemon 的 PID 文件路徑。缺省為 /var/run/docker.pid。
|
||||
|
||||
-s=""
|
||||
強制 Docker 運行時使用給定的存儲驅動。
|
||||
強制 Docker 執行時使用給定的存儲驅動。
|
||||
|
||||
-v=true|false
|
||||
輸出版本信息並退出。缺省值為 false。
|
||||
@ -59,7 +59,7 @@
|
||||
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。兩者一致。
|
||||
|
||||
docker-attach(1)
|
||||
依附到一個正在運行的容器中。
|
||||
依附到一個正在執行的容器中。
|
||||
|
||||
docker-build(1)
|
||||
從一個 Dockerfile 創建一個鏡像
|
||||
@ -95,7 +95,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
|
||||
顯示一個容器的底層具體信息。
|
||||
|
||||
docker-kill(1)
|
||||
關閉一個運行中的容器 (包括進程和所有資源)
|
||||
關閉一個執行中的容器 (包括進程和所有資源)
|
||||
|
||||
docker-load(1)
|
||||
從一個 tar 包中加載一個鏡像
|
||||
@ -125,7 +125,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
|
||||
將一個鏡像或者倉庫推送到一個 Docker 的註冊服務器
|
||||
|
||||
docker-restart(1)
|
||||
重啟一個運行中的容器
|
||||
重啟一個執行中的容器
|
||||
|
||||
docker-rm(1)
|
||||
刪除給定的若幹個容器
|
||||
@ -134,7 +134,7 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
|
||||
刪除給定的若幹個鏡像
|
||||
|
||||
docker-run(1)
|
||||
創建一個新容器,並在其中運行給定命令
|
||||
創建一個新容器,並在其中執行給定命令
|
||||
|
||||
docker-save(1)
|
||||
保存一個鏡像為 tar 包文件
|
||||
@ -146,13 +146,13 @@ Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式執行。
|
||||
啟動一個容器
|
||||
|
||||
docker-stop(1)
|
||||
終止一個運行中的容器
|
||||
終止一個執行中的容器
|
||||
|
||||
docker-tag(1)
|
||||
為一個鏡像打標簽
|
||||
|
||||
docker-top(1)
|
||||
查看一個容器中的正在運行的進程信息
|
||||
查看一個容器中的正在執行的進程信息
|
||||
|
||||
docker-unpause(1)
|
||||
將一個容器內所有的進程從暫停狀態中恢復
|
||||
|
@ -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
|
||||
```
|
||||
使用配置文件時,為了在容器中正常運行,需要保持 `daemon off;`。
|
||||
使用配置文件時,為了在容器中正常執行,需要保持 `daemon off;`。
|
||||
|
||||
### Dockerfile
|
||||
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)
|
||||
|
@ -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-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
|
||||
```
|
||||
|
@ -1,7 +1,7 @@
|
||||
## 使用 Supervisor 來管理進程
|
||||
Docker 容器在啟動的時候開啟單個進程,比如,一個 ssh 或者 apache 的 daemon 服務。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裏面,啟動的時候直接啟動這個腳本,另外就是安裝進程管理工具。
|
||||
|
||||
本小節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望運行的進程。在這裏我們演示一下如何同時使用 ssh 和 apache 服務。
|
||||
本小節將使用進程管理工具 supervisor 來管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望執行的進程。在這裏我們演示一下如何同時使用 ssh 和 apache 服務。
|
||||
|
||||
### 配置
|
||||
首先創建一個 Dockerfile,內容和各部分的解釋如下。
|
||||
@ -21,7 +21,7 @@ RUN mkdir -p /var/run/sshd
|
||||
RUN mkdir -p /var/log/supervisor
|
||||
```
|
||||
|
||||
這裏安裝 3 個軟件,還創建了 2 個 ssh 和 supervisor 服務正常運行所需要的目錄。
|
||||
這裏安裝 3 個軟件,還創建了 2 個 ssh 和 supervisor 服務正常執行所需要的目錄。
|
||||
```
|
||||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
```
|
||||
@ -44,7 +44,7 @@ command=/usr/sbin/sshd -D
|
||||
[program:apache2]
|
||||
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
|
||||
```
|
||||
配置文件包含目錄和進程,第一段 supervsord 配置軟件本身,使用 nodaemon 參數來運行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
|
||||
配置文件包含目錄和進程,第一段 supervsord 配置軟件本身,使用 nodaemon 參數來執行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
|
||||
|
||||
### 使用方法
|
||||
創建鏡像。
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Docker 容器
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套作業系統(提供了運行態環境和其他系統環境)和跑在上面的應用。
|
||||
簡單的說,容器是獨立執行的一個或一組應用,以及它們的執行態環境。對應的,虛擬機可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他系統環境)和跑在上面的應用。
|
||||
|
||||
本章將具體介紹如何來管理一個容器,包括創建、啟動和停止等。
|
||||
|
@ -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"
|
||||
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
|
||||
|
@ -5,5 +5,5 @@
|
||||
$sudo docker rm trusting_newton
|
||||
trusting_newton
|
||||
```
|
||||
如果要刪除一個運行中的容器,可以添加 `-f` 參數。Docker 會發送 `SIGKILL` 信號給容器。
|
||||
如果要刪除一個執行中的容器,可以添加 `-f` 參數。Docker 會發送 `SIGKILL` 信號給容器。
|
||||
|
||||
|
@ -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
|
||||
```
|
||||
|
||||
當利用 `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
|
||||
PID TTY TIME CMD
|
||||
1 ? 00:00:00 bash
|
||||
11 ? 00:00:00 ps
|
||||
```
|
||||
可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
|
||||
可見,容器中僅執行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。
|
||||
|
@ -1,5 +1,5 @@
|
||||
##終止容器
|
||||
可以使用 `docker stop` 來終止一個運行中的容器。
|
||||
可以使用 `docker stop` 來終止一個執行中的容器。
|
||||
|
||||
此外,當Docker容器中指定的應用終結時,容器也自動終止。
|
||||
例如對於上一章節中只啟動了一個終端的容器,用戶通過 `exit` 命令或 `Ctrl+d` 來退出終端時,所創建的容器立刻終止。
|
||||
@ -14,4 +14,4 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
|
||||
|
||||
處於終止狀態的容器,可以通過 `docker start` 命令來重新啟動。
|
||||
|
||||
此外,`docker restart` 命令會將一個運行態的容器終止,然後再重新啟動它。
|
||||
此外,`docker restart` 命令會將一個執行態的容器終止,然後再重新啟動它。
|
||||
|
@ -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
|
||||
```
|
||||
*註意:使用 `--volumes-from` 參數所掛載數據卷的容器自己並不需要保持在運行狀態。
|
||||
*註意:使用 `--volumes-from` 參數所掛載數據卷的容器自己並不需要保持在執行狀態。
|
||||
|
||||
如果刪除了掛載的容器(包括 dbdata、db1 和 db2),數據卷並不會被自動刪除。如果要刪除一個數據卷,必須在刪除最後一個還掛載著它的容器時使用 `docker rm -v` 命令來指定同時刪除關聯的容器。
|
||||
這可以讓用戶在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。
|
||||
|
@ -27,7 +27,7 @@ CMD /usr/sbin/nginx
|
||||
|
||||
其中,一開始必須指明作為基底的鏡像名稱,接下來說明維護者資訊(建議)。
|
||||
|
||||
後面則是鏡像操作指令,例如 `RUN` 指令,`RUN` 指令將對鏡像執行相對應的命令。每運行一條 `RUN` 指令,鏡像添加新的一層,並提交。
|
||||
後面則是鏡像操作指令,例如 `RUN` 指令,`RUN` 指令將對鏡像執行相對應的命令。每執行一條 `RUN` 指令,鏡像添加新的一層,並提交。
|
||||
|
||||
最後是 `CMD` 指令,來指定執行容器時的操作命令。
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
### RUN
|
||||
格式為 `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` 指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 `\` 來換行。
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 `CMD` 命令。如果指定了多條命令,只有最後一條會被執行。
|
||||
|
||||
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 `CMD` 指定的命令。
|
||||
如果用戶啟動容器時候指定了執行的命令,則會覆蓋掉 `CMD` 指定的命令。
|
||||
|
||||
### EXPOSE
|
||||
格式為 `EXPOSE <port> [<port>...]`。
|
||||
@ -34,7 +34,7 @@
|
||||
|
||||
### ENV
|
||||
格式為 `ENV <key> <value>`。
|
||||
指定一個環境變量,會被後續 `RUN` 指令使用,並在容器運行時保持。
|
||||
指定一個環境變量,會被後續 `RUN` 指令使用,並在容器執行時保持。
|
||||
|
||||
例如
|
||||
```
|
||||
@ -74,9 +74,9 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
||||
### USER
|
||||
格式為 `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 /path/to/workdir`。
|
||||
|
@ -58,7 +58,7 @@ Dockerfile 基本的語法是
|
||||
* 使用`#`來註釋
|
||||
* `FROM` 指令告訴 Docker 使用哪個鏡像作為基礎
|
||||
* 接著是維護者的信息
|
||||
* `RUN`開頭的指令會在創建中運行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件
|
||||
* `RUN`開頭的指令會在創建中執行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件
|
||||
|
||||
編寫完成 Dockerfile 後可以使用 `docker build` 來生成鏡像。
|
||||
|
||||
@ -104,7 +104,7 @@ Successfully built 324104cde6ad
|
||||
|
||||
*註意一個鏡像不能超過 127 層
|
||||
|
||||
此外,還可以利用 `ADD` 命令復制本地文件到鏡像;用 `EXPOSE` 命令來向外部開放端口;用 `CMD` 命令來描述容器啟動後運行的程序等。例如
|
||||
此外,還可以利用 `ADD` 命令復制本地文件到鏡像;用 `EXPOSE` 命令來向外部開放端口;用 `CMD` 命令來描述容器啟動後執行的程序等。例如
|
||||
```
|
||||
# put my local web site in myApp folder to /var/www
|
||||
ADD myApp /var/www
|
||||
|
@ -2,25 +2,25 @@
|
||||
作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。
|
||||
|
||||
首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。
|
||||
其次,Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。
|
||||
其次,Docker 對系統資源的利用率很高,一台主機上可以同時執行數千個 Docker 容器。
|
||||
|
||||
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。
|
||||
容器除了執行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式執行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。
|
||||
|
||||
具體說來,Docker 在如下幾個方面具有較大的優勢。
|
||||
|
||||
### 更快速的交付和部署
|
||||
對開發和維運(develop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常運行。
|
||||
對開發和維運(develop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。
|
||||
|
||||
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,維運人員可以直接使用這個容器來部署代碼。
|
||||
Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。
|
||||
Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
|
||||
|
||||
### 更高效的虛擬化
|
||||
Docker 容器的運行不需要額外的虛擬化支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
|
||||
Docker 容器的執行不需要額外的虛擬化支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
|
||||
|
||||
### 更輕鬆的遷移和擴展
|
||||
|
||||
Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。
|
||||
Docker 容器幾乎可以在任意的平台上執行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。
|
||||
這種兼容性可以讓用戶把一個應用程序從一個平台直接遷移到另外一個。
|
||||
|
||||
### 更簡單的管理
|
||||
|
@ -1,5 +1,5 @@
|
||||
## 外部訪問容器
|
||||
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 `-P` 或 `-p` 參數來指定端口映射。
|
||||
容器中可以執行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 `-P` 或 `-p` 參數來指定端口映射。
|
||||
|
||||
當使用 -P 標記時,Docker 會隨機映射一個 `49000~49900` 的端口到內部容器開放的網絡端口。
|
||||
|
||||
|
@ -5,9 +5,9 @@
|
||||
本節介紹如何使用本地倉庫。
|
||||
|
||||
`docker-registry` 是官方提供的工具,可以用於構建私有的鏡像倉庫。
|
||||
### 安裝運行 docker-registry
|
||||
#### 容器運行
|
||||
在安裝了 Docker 後,可以通過獲取官方 registry 鏡像來運行。
|
||||
### 安裝執行 docker-registry
|
||||
#### 容器執行
|
||||
在安裝了 Docker 後,可以通過獲取官方 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
|
||||
```
|
||||
此時使用訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明運行成功。
|
||||
此時使用訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明執行成功。
|
||||
|
||||
*註:`config/config_sample.yml` 文件是示例配置文件。
|
||||
|
||||
|
@ -3,6 +3,6 @@
|
||||
|
||||
它提供了很多有用的特性;以及確保各個容器可以公平地分享主機的內存、CPU、磁盤 IO 等資源;當然,更重要的是,控制組確保了當容器內的資源使用產生壓力時不會連累主機系統。
|
||||
|
||||
盡管控制組不負責隔離容器之間相互訪問、處理數據和進程,它在防止拒絕服務(DDOS)攻擊方面是必不可少的。尤其是在多用戶的平臺(比如公有或私有的 PaaS)上,控制組十分重要。例如,當某些應用程序表現異常的時候,可以保證一致地正常運行和性能。
|
||||
盡管控制組不負責隔離容器之間相互訪問、處理數據和進程,它在防止拒絕服務(DDOS)攻擊方面是必不可少的。尤其是在多用戶的平臺(比如公有或私有的 PaaS)上,控制組十分重要。例如,當某些應用程序表現異常的時候,可以保證一致地正常執行和性能。
|
||||
|
||||
控制組機制始於 2006 年,內核從 2.6.24 版本開始被引入。
|
||||
|
@ -1,5 +1,5 @@
|
||||
## Docker服務端的防護
|
||||
運行一個容器或應用程序的核心是通過 Docker 服務端。Docker 服務的運行目前需要 root 權限,因此其安全性十分關鍵。
|
||||
執行一個容器或應用程序的核心是通過 Docker 服務端。Docker 服務的執行目前需要 root 權限,因此其安全性十分關鍵。
|
||||
|
||||
首先,確保只有可信的用戶才可以訪問 Docker 服務。Docker 允許用戶在主機和容器間共享文件夾,同時不需要限制容器的訪問權限,這就容易讓容器突破資源限制。例如,惡意用戶啟動容器的時候將主機的根目錄`/`映射到容器的 `/host` 目錄中,那麽容器理論上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系統都允許類似的資源共享,而沒法禁止用戶共享主機根文件系統到虛擬機系統。
|
||||
|
||||
@ -9,10 +9,10 @@
|
||||
|
||||
用戶仍可以利用 HTTP 提供 REST API 訪問。建議使用安全機制,確保只有可信的網絡或 VPN,或證書保護機制(例如受保護的 stunnel 和 ssl 認證)下的訪問可以進行。此外,還可以使用 HTTPS 和證書來加強保護。
|
||||
|
||||
最近改進的 Linux 名字空間機制將可以實現使用非 root 用戶來運行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統而引起的安全問題。
|
||||
最近改進的 Linux 名字空間機制將可以實現使用非 root 用戶來執行全功能的容器。這將從根本上解決了容器和主機之間共享文件系統而引起的安全問題。
|
||||
|
||||
終極目標是改進 2 個重要的安全特性:
|
||||
* 將容器的 root 用戶映射到本地主機上的非 root 用戶,減輕容器和主機之間因權限提升而引起的安全問題;
|
||||
* 允許 Docker 服務端在非 root 權限下運行,利用安全可靠的子進程來代理執行需要特權權限的操作。這些子進程將只允許在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系統管理、配置操作等。
|
||||
* 允許 Docker 服務端在非 root 權限下執行,利用安全可靠的子進程來代理執行需要特權權限的操作。這些子進程將只允許在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系統管理、配置操作等。
|
||||
|
||||
最後,建議采用專用的服務器來運行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去運行。
|
||||
最後,建議采用專用的服務器來執行 Docker 和相關的管理服務(例如管理服務比如 ssh 監控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去執行。
|
||||
|
@ -7,7 +7,7 @@ Linux 內核自 2.2 版本起就支持能力機制,它將權限劃分為更加
|
||||
|
||||
默認情況下,Docker 啟動的容器被嚴格限制只允許使用內核的一部分能力。
|
||||
|
||||
使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會運行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊(例如負載模塊)、網絡配置工具等等。容器跟這些進程是不同的,因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。
|
||||
使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會執行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊(例如負載模塊)、網絡配置工具等等。容器跟這些進程是不同的,因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。
|
||||
* ssh 訪問被主機上ssh服務來管理;
|
||||
* cron 通常應該作為用戶進程執行,權限交給使用它服務的應用來處理;
|
||||
* 日誌系統可由 Docker 或第三方服務管理;
|
||||
|
@ -1,7 +1,7 @@
|
||||
## 內核名字空間
|
||||
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。當用 `docker run` 啟動一個容器時,在後臺 Docker 為容器創建了一個獨立的名字空間和控制組集合。
|
||||
|
||||
名字空間提供了最基礎也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發現和作用。
|
||||
名字空間提供了最基礎也是最直接的隔離,在容器中執行的進程不會被執行在主機上的進程和其它容器發現和作用。
|
||||
|
||||
每個容器都有自己獨有的網絡棧,意味著它們不能訪問其他容器的 sockets 或接口。不過,如果主機系統上做了相應的設置,容器可以像跟主機交互一樣的和其他容器交互。當指定公共端口或使用 links 來連接 2 個容器時,容器就可以相互通信了(可以根據配置來限制通信的策略)。
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
除了能力機制之外,還可以利用一些現有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
|
||||
|
||||
Docker 當前默認只啟用了能力機制。用戶可以采用多種方案來加強 Docker 主機的安全,例如:
|
||||
* 在內核中啟用 GRSEC 和 PAX,這將增加很多編譯和運行時的安全檢查;通過地址隨機化避免惡意探測等。並且,啟用該特性不需要 Docker 進行任何配置。
|
||||
* 在內核中啟用 GRSEC 和 PAX,這將增加很多編譯和執行時的安全檢查;通過地址隨機化避免惡意探測等。並且,啟用該特性不需要 Docker 進行任何配置。
|
||||
* 使用一些有增強安全特性的容器模板,比如帶 AppArmor 的模板和 Redhat 帶 SELinux 策略的模板。這些模板提供了額外的安全特性。
|
||||
* 用戶可以自定義訪問控制機制來定制安全策略。
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
## 總結
|
||||
總體來看,Docker 容器還是十分安全的,特別是在容器內不使用 root 權限來運行進程的話。
|
||||
總體來看,Docker 容器還是十分安全的,特別是在容器內不使用 root 權限來執行進程的話。
|
||||
|
||||
另外,用戶可以使用現有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在內核中實現更復雜的安全機制。
|
||||
|
@ -2,12 +2,12 @@
|
||||
|
||||
Docker 底層的核心技術包括 Linux 上的名字空間(Namespaces)、控制組(Control groups)、Union 文件系統(Union file systems)和容器格式(Container format)。
|
||||
|
||||
我們知道,傳統的虛擬機通過在宿主主機中運行 hypervisor 來模擬一整套完整的硬件環境提供給虛擬機的作業系統。虛擬機系統看到的環境是可限制的,也是彼此隔離的。
|
||||
我們知道,傳統的虛擬機通過在宿主主機中執行 hypervisor 來模擬一整套完整的硬件環境提供給虛擬機的作業系統。虛擬機系統看到的環境是可限制的,也是彼此隔離的。
|
||||
這種直接的做法實現了對資源最完整的封裝,但很多時候往往意味著系統資源的浪費。
|
||||
例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中運行的應用其實可以利用宿主機系統中的運行環境。
|
||||
例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中執行的應用其實可以利用宿主機系統中的執行環境。
|
||||
|
||||
我們知道,在作業系統中,包括內核、文件系統、網絡、PID、UID、IPC、內存、硬盤、CPU 等等,所有的資源都是應用進程直接共享的。
|
||||
要想實現虛擬化,除了要實現對內存、CPU、網絡IO、硬盤IO、存儲空間等的限制外,還要實現文件系統、網絡、PID、UID、IPC等等的相互隔離。
|
||||
前者相對容易實現一些,後者則需要宿主機系統的深入支持。
|
||||
|
||||
隨著 Linux 系統對於名字空間功能的完善實現,程序員已經可以實現上面的所有需求,讓某些進程在彼此隔離的名字空間中運行。大家雖然都共用一個內核和某些運行時環境(例如一些系統命令和系統庫),但是彼此卻看不到,都以為系統中只有自己的存在。這種機制就是容器(Container),利用名字空間來做權限的隔離控制,利用 cgroups 來做資源分配。
|
||||
隨著 Linux 系統對於名字空間功能的完善實現,程序員已經可以實現上面的所有需求,讓某些進程在彼此隔離的名字空間中執行。大家雖然都共用一個內核和某些執行時環境(例如一些系統命令和系統庫),但是彼此卻看不到,都以為系統中只有自己的存在。這種機制就是容器(Container),利用名字空間來做權限的隔離控制,利用 cgroups 來做資源分配。
|
||||
|
@ -1,10 +1,10 @@
|
||||
## 基本架構
|
||||
Docker 采用了 C/S架構,包括客戶端和服務端。
|
||||
Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(創建、運行、分發容器)。
|
||||
客戶端和服務端既可以運行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。
|
||||
Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(創建、執行、分發容器)。
|
||||
客戶端和服務端既可以執行在一個機器上,也可通過 socket 或者 RESTful API 來進行通信。
|
||||
|
||||
![Docker 基本架構](../_images/docker_arch.png)
|
||||
|
||||
|
||||
Docker daemon 一般在宿主主機後臺運行,等待接收來自客戶端的消息。
|
||||
Docker daemon 一般在宿主主機後臺執行,等待接收來自客戶端的消息。
|
||||
Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。
|
||||
|
@ -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 開始支持。
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
## 名字空間
|
||||
名字空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的名字空間,運行在其中的應用都像是在獨立的作業系統中運行一樣。名字空間保證了容器之間彼此互不影響。
|
||||
名字空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的名字空間,執行在其中的應用都像是在獨立的作業系統中執行一樣。名字空間保證了容器之間彼此互不影響。
|
||||
|
||||
### pid 名字空間
|
||||
不同用戶的進程就是通過 pid 名字空間隔離開的,且不同名字空間中可以有相同 pid。所有的 LXC 進程在 Docker 中的父進程為Docker進程,每個 LXC 進程具有不同的名字空間。同時由於允許嵌套,因此可以很方便的實現嵌套的 Docker 容器。
|
||||
|
Loading…
Reference in New Issue
Block a user