60、Docker 學習筆記(CentOS 7.1)


    
    
    
    

#基本概念

##Docker 包括三個基本概念
- 鏡像(Image)
- 容器(Container)
- 倉庫(Repository)
理解了這三個概念,就理解了 Docker 的整個生命週期。
- - -
##Docker 鏡像
>Docker 鏡像就是一個只讀的模板。
例如:一個鏡像能夠包含一個完整的 ubuntu 操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器。
Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。
容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。
能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
**注:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層**
##Do cker 容器
Docker 利用容器來運行應用。 它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。
能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
*注:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。
##Do cker 倉庫

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 
Docker Hub ,存放了數量龐大的鏡像供用戶下載。 國內的公開倉庫包括  Docker Pool 等,能夠提供大陸用戶更穩定快速的訪問。
固然,用戶也能夠在本地網絡內建立一個私有倉庫。當用戶建立了本身的鏡像以後就可使用 
 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上   下來就能夠了。
**注:Docker 倉庫的概念跟 
Git  相似,註冊服務器能夠理解爲 GitHub 這樣的託管服務。**

#安裝方式

##安裝EPEL

 >EPEL 是yum的一個軟件源,裏面包含了許多基本源裏沒有的軟件。(安裝須要鏈接網絡)
 安裝了這個源後,就可使用yum來安裝 docker了。
``` yum install epel - release -7 ```
安裝過程須要交互,輸入「y」按回車就能夠了。
驗證是否安裝成功:
``` yum repolist ```

- - -

##安裝Docker-io

>``` yum - y install docker - io ```
配置開機自啓動:
``` chkconfig docker on ```
完成後,啓動服務:
``` service docker start ```
- - -

##應用Docker

>經過下面命令來驗證doecker是否安裝成功:
``` docker info ```
出現下面相似內容,則表示安裝成功:

使用下面命令網絡倉庫下載須要鏡像:
  1. ```docker pull centos:latest ``` #下載centos
  2. ```docker pull ubutun:latest``` #下載ubutun
使用下面命令查看當前鏡像:
``` docker images ```

在列出信息中,能夠看到幾個字段信息html

- 來自於哪一個倉庫,好比 docker.io/ubuntu
- 鏡像的標記,好比latest
- 它的  ID 號(惟一)07f8e8c5e660
- 建立時間 
- 鏡像大小
__使用docker完成「hello world":__
  1. ```docker run ubuntu:07f8e8c5e660 /bin/echo 'hello world'```
  2. ```docker run centos:fd44297e2ddb /bin/echo 'hello docker'```



>>**進入交互式容器:**
``` sudo docker run - t - i ubuntu : 07f8e8c5e660 / bin / bash```
 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上
 則讓容器的標準輸入保持打開。

修改已有鏡像:
使用交互模式在已有的centos鏡像中安裝 gem 應用,exit退出後,使用 docker commit來提交更新後的副本
``` docker commit - m "add gem" - a "Ray" 032c501e000f docker . io / centos : v2```
* -m  來指定提交的說明信息,跟咱們使用的版本控制工具同樣;
* -a  能夠指定更新的用戶信息;
* 以後是用來建立鏡像的容器的 ID;
* 最後指定目標鏡像的倉庫名和 tag 信息,建立成功後會返回這個鏡像的 ID 信息。
__能夠經過 docker images 查看新建立的鏡像:__

能夠再經過 docker run 打開新建立的鏡像:
``` docker run - t - i centos : v2 / bin / bash```

#利用dockerfile來建立鏡像

使用  docker commit   來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。
咱們可使用   docker build 來建立一個新的鏡像。
爲此,首先須要建立一個 Dockerfile,包含一些如何建立鏡像的指令,新建一個目錄和一個 Dockerfile
  1. ```[root@localhost ~]# cd /opt/```
  2. ```[root@localhost opt]# ```
  3. ```[root@localhost opt]# mkdir ubuntu```
  4. ```[root@localhost opt]# cd ubuntu/```
  5. ```[root@localhost ubuntu]# touch Dockerfile```
**Dockerfile 中每一條指令都建立鏡像的一層,例如:**
>```sh
# This is a comment
MAINTAINER Ray <tsbc@docker.com>
FROM ubuntu:latest
RUN apt-get -qqy install ruby ruby-dev
RUN apt-get -qq update ```
* * *
***Dockerfile 基本的語法是***
使用 #來註釋
*FROM 指令告訴 Docker 使用哪一個鏡像做爲基礎
*RUN開頭的指令會在建立中運行,好比安裝一個軟件包,在這裏使用 apt-get 來安裝了一些軟件 編寫完成 Dockerfile 後可使用  docker build 來生成鏡像。
``` docker build - t = "ubuntu:latest" . ```
其中   標記來添加 tag,指定新的鏡像的用戶信息。
. 」 是 Dockerfile 所在的路徑(當前目錄),也能夠替換爲一個具體的 Dockerfile 的路徑。
能夠看到 build 進程在執行操做。
>*注意一個鏡像不能超過 127 層
它要作的第一件事情就是上傳這個 Dockerfile 內容,由於全部的操做都要依據 Dockerfile 來進行。 
而後,Dockerfile 中的指令被一條一條的執行,每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟以前介紹過的   同樣)。
當全部的指令都執行完畢以後,返回了最終的鏡像 id。全部的中間步驟所產生的容器都被刪除和清理了。
** 此外,還能夠利用   命令複製本地文件到鏡像;  (須要再作嘗試)**
** 用   命令來向外部開放端口;**
** 用   命令來描述容器啓動後運行的程序等。**

#從本地文件系統導入
 
            
要從本地文件系統導入一個鏡像,可使用 openvz(容器虛擬化的先鋒技術)的模板來建立: openvz 的模板下載地址爲 templates 
好比,先下載了一個 centos-7-x86_64-minimal.tar.gz 的鏡像,以後使用如下命令導入:
```
cat centos - 7 - x86_64 - minimal . tar . gz | docker import - centos : v7 . mini ```
而後查看導入的鏡像:

##上傳鏡像
>用戶能夠經過 docker push 命令,把本身建立的鏡像上傳到倉庫中來共享。
``` docker push docker . io / ubuntu```

##存出鏡像
>若是要導出鏡像到本地文件,可使用  docker save  命令。
``` docker save - o ubuntu . 14.0 . 4.tar docker . io / ubuntu : latest```

##載入鏡像
>可使用  docker load 從導出的本地文件中再導入到本地鏡像庫,例如
``` docker load -- input ubuntu . 14.0 . 4.tar```
或者
``` docker load < ubuntu . 14.0 . 4.tar```

##移除本地鏡像
>能夠用 docker rmi 移除, 注意 docker rm 是移除容器
  1. ```docker rmi docker.io/ubuntu```
  2. ```docker rmi 07f8e8c5e660 ```

#Docker 容器
容器是 Docker 又一核心概念。
簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機能夠理解爲模擬運行的一整套操做系統(提供了運行態環境和其餘系統環境)和跑在上面的應用。
守護態運行
```docker run -d ubuntu:ruby /bin/sh -c "while true; do echo hello world; sleep 1; done"```
容器啓動後會返回一個惟一的 id,也能夠經過  docker ps  命令來查看容器信息。
```docker ps```

要獲取容器的輸出信息,能夠經過  docker logs  命令。
``` docker logs goofy_cori```
##終止容器
>可使用   來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。  用戶經過     命令或     來退出終端時,所建立的容器馬上終止。
終止狀態的容器能夠用   命令看到。例如
``` docker ps - a```

處於終止狀態的容器,能夠經過   命令來從新啓動。
``` docker start 6fb00e62cfe9 #id ```
此外,  命令會將一個運行態的容器終止,而後再從新啓動它.
```docker restart 6fb00e62cfe9 #id```

##進入容器
>在使用  參數時,容器啓動後會進入後臺。 某些時候須要進入容器進行操做,有不少種方法,包括使用 命令或  工具等。
attach 命令
 是Docker自帶的命令。
nsenter 命令
可是使用  命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,全部窗口都會同步顯示。
當某個窗口因命令阻塞時,其餘窗口也沒法執行操做了。
>>##安裝 nsenter 

 工具在 util-linux 包2.23版本後包含,能夠先使用 nsenter -version 進行查看。 若是系統中 util-linux 包沒有該命令,能夠按照下面的方法從源碼安裝。node

  1. ```make nsenter && sudo cp nsenter /usr/local/bin```
  1. ```wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;```
  1. ```echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc```

- - -

>同時建議你們下載  .bashrc_docker ,並將內容放到 .bashrc 中。
這個文件中定義了不少方便使用 Docker 的命令,例如  docker-pid  能夠獲取某個容器的 PID;
而  docker-enter  能夠進入容器或直接在容器內執行命令。
下面給出一個完整的例子:

``` docker ps```
##導入和導出容器
>若是要導出本地某個容器,可使用 
docker export 命令,導入某個容器快照使用 docker import命令:
```注:用戶既可使用  docker load  來導入鏡像存儲文件到本地鏡像庫,也可使用  docker import 來導入一個容器快照到本地鏡像庫。
這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。
此外,從容器快照文件導入時能夠從新指定標籤等元數據信息。```

##刪除容器
>可使用  docker rm 來刪除一個處於終止狀態的容器。 例如
```docker rm trusting_newton```
若是要刪除一個運行中的容器,能夠添加   參數。Docker 會發送   信號給容器。

#倉庫
倉庫(Repository)是集中存放鏡像的地方。
一個容易混淆的概念是註冊服務器(Registry)。實際上註冊服務器是管理倉庫的具體服務器,每一個服務器上能夠有多個倉庫,而每一個倉庫下面有多個鏡像。
從這方面來講,倉庫能夠被認爲是一個具體的項目或目錄。
例如對於倉庫地址   來講,  是註冊服務器地址,  是倉庫名。
大部分時候,並不須要嚴格區分這二者的概念。
##Docker Hub

>###基本操做
目前 Docker 官方維護了一個公共倉庫  Docker Hub ,其中已經包括了超過 15,000 的鏡像。
大部分需求,均可以經過在 Docker Hub 中直接下載鏡像來實現。
用戶無需登陸便可經過  docker search 命令來查找官方倉庫中的鏡像,並利用 docker pull 命令來將它下載到本地。
例如以 centos 爲關鍵詞進行搜索:
  1. ```docker search centos```


能夠看到返回了不少包含關鍵字的鏡像,其中包括鏡像名字、描述、星級(表示該鏡像的受歡迎程度)、是否官方建立、是否自動建立。 
官方的鏡像說明是官方項目組建立和維護的,automated 資源容許用戶驗證鏡像的來源和內容。
根據是不是官方提供,可將鏡像資源分爲兩類。 
一種是相似 centos 這樣的基礎鏡像,被稱爲基礎或根鏡像。這些基礎鏡像是由 Docker 公司建立、驗證、支持、提供。這樣的鏡像每每使用單個單詞做爲名字。 
還有一種類型,好比  tianon/centos 鏡像,它是由 Docker 的用戶建立並維護的,每每帶有用戶名稱前綴。
能夠經過前綴 user_name/ 來指定使用某個用戶提供的鏡像,好比 tianon 用戶。
另外,在查找的時候經過 -s N 參數能夠指定僅顯示評價爲 N 星以上的鏡像。
下載官方 centos 鏡像到本地:
``` centos : latest ```
##私有倉庫
>本節介紹如何使用本地倉庫。 docker-registry 是官方提供的工具,能夠用於構建私有的鏡像倉庫。
>>###安裝運行 docker-registry
有時候使用 Docker Hub 這樣的公共倉庫可能不方便,用戶能夠建立一個本地倉庫供私人使用。
###容器運行
在安裝了 Docker 後,能夠經過獲取官方 registry 鏡像來運行。
  1. ```docker run -d -p 5000:5000 registry```

這將使用官方的 registry 鏡像來啓動本地的私有倉庫。 用戶能夠經過指定參數來配置私有倉庫位置,例如配置鏡像存儲到 Amazon S3 服務。
``` docker run \```
此外,還能夠指定本地路徑(如  )下的配置文件。
                        
                        
                        
                        
默認狀況下,倉庫會被建立在容器的  下。能夠經過  參數來將鏡像文件存放在本地的指定路徑。 例以下面的例子將上傳的鏡像放到  目錄。
                        
                        
                        
                        
##本地安裝
>對於 Ubuntu 或 CentOS 等發行版,能夠直接經過源安裝。
* Ubuntu
```sudo apt - get install - y build - essential python - dev libevent - dev python - pip liblzma - dev```
```sudo pip install docker - registry```
* CentOS
```yum install - y python - devel libevent - devel python - pip gcc xz - devel```
```python - pip install docker - registry```
也能夠從 docker-registry 項目下載源碼進行安裝。
而後修改配置文件,主要修改 dev 模板段的  到本地的存儲倉庫的路徑。
以後啓動 Web 服務。
或者
此時使用 curl 訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明運行成功。
**注: 文件是示例配置文件。**

#在私有倉庫上傳、下載、搜索鏡像

>建立好私有倉庫以後,就可使用  來標記一個鏡像,而後推送它到倉庫,別的機器上就能夠下載下來了。例如私有倉庫地址爲 python

先在本機查看已有的鏡像。

>使用  將   這個鏡像標記爲  (格式爲  )。

>###使用   上傳標記的鏡像。
#Docker 數據管理
如何在 Docker 內部以及容器之間管理數據,在容器中管理數據主要有兩種方式: 
* 數據卷(Data volumes)
* 數據卷容器(Data volume containers  

##數據卷
>數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:
* 數據卷能夠在容器之間共享和重用
* 對數據卷的修改會立馬生效
* 對數據卷的更新,不會影響鏡像
* 卷會一直存在,直到沒有容器使用
** 數據卷的使用,相似於 Linux 下對目錄或文件進行 mount。**

###建立一個數據卷
>>在用 docker run 命令的時候,使用 -v 標記來建立一個數據卷並掛載到容器裏。在一次 run 中屢次使用能夠掛載多個數據卷。
下面建立一個 web 容器,並加載一個數據捲到容器的 /webapp 目錄
  1. ```docker run -d -P --name web -v /webapp training/webapp python app.py```
*注意:也能夠在 Dockerfile 中使用 VOLUME 來添加一個或者多個新的捲到由該鏡像建立的任意容器。

###掛載一個主機目錄做爲數據卷
>> 使用  標記也能夠指定掛載一個本地主機的目錄到容器中去。
上面的命令加載主機的  目錄到容器的  目錄。
這個功能在進行測試的時候十分方便,好比用戶能夠放置一些程序到本地目錄中,來查看容器是否正常工做。
本地目錄的路徑必須是絕對路徑,若是目錄不存在 Docker 會自動爲你建立它。
*注意:Dockerfile 中不支持這種用法,這是由於 Dockerfile 是爲了移植和分享用的。然而,不一樣操做系統的路徑格式不同,因此目前還不能支持。
Docker 掛載數據卷的默認權限是讀寫,用戶也能夠經過  指定爲只讀。

                        
                        
                        
                        

加了  以後,就掛載爲只讀了。

###掛載一個本地主機文件做爲數據卷
>>  標記也能夠從主機掛載單個文件到容器中
這樣就能夠記錄在容器輸入過的命令了。
*注意:若是直接掛載一個文件,不少文件編輯工具,包括  或者 ,可能會形成文件 inode 的改變,從 Docker 1.1 .0起,這會致使報錯誤信息。
因此最簡單的辦法就直接掛載文件的父目錄。
- - -

##數據卷容器
> 若是你有一些持續更新的數據須要在容器之間共享,最好建立數據卷容器。
數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
首先,建立一個命名的數據卷容器 dbdata:
而後,在其餘容器中使用   來掛載 dbdata 容器中的數據卷。
``` docker run -d --name db3 --volumes-from db1 docker.io/centos```
** 注意:使用   參數所掛載數據卷的容器本身並不須要保持在運行狀態。**
     若是刪除了掛載的容器(包括 dbdata、db1 和 db2),數據卷並不會被自動刪除。
    若是要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時使用   命令來指定同時刪除關聯的容器。 這可讓用戶在容器之間升級和移動數據卷。   

##利用數據卷容器來備份、恢復、遷移數據卷
>>能夠利用數據卷對其中的數據進行進行備份、恢復和遷移。
>>>###備份
首先使用   標記來建立一個加載 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目錄。命令以下:
 ``` docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar dbdata```
容器啓動後,使用了  命令來將 dbdata 卷備份爲本地的 

>>>###恢復
若是要恢復數據到一個容器,首先建立一個帶有數據卷的容器 dbdata2。
``` docker run -v /dbdata --name dbdata2 ubuntu /bin/bash ```
而後建立另外一個容器,掛載 dbdata2 的容器,並使用   解壓備份文件到掛載的容器卷中。
#使用網絡
Docker 容許經過外部訪問容器或容器互聯的方式來提供網絡服務。
>##外部訪問容器
容器中能夠運行一些網絡應用,要讓外部也能夠訪問這些應用,能夠經過  或  參數來指定端口映射。
當使用 -P 標記時,Docker 會隨機映射一個  的端口到內部容器開放的網絡端口。
使用 
 能夠看到,本地主機的 49155 被映射到了容器的 5000 端口。此時訪問本機的 49155 端口便可訪問容器內 web 應用提供的界面。
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5   docker.io/ubuntu :latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
```
一樣的,能夠經過   命令來查看應用的信息。
``` docker logs -f nostalgic_morse```
```* Running on http://0.0.0.0:5000/```
```10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -```
```10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -```
-p(小寫的)則能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器。
支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
>>###映射全部接口地址
使用   格式本地的 5000 端口映射到容器的 5000 端口,能夠執行
此時默認會綁定本地全部接口上的全部地址。

>>###映射到指定地址的指定端口
可使用   格式指定映射使用一個特定地址,好比 localhost 地址 127.0.0.1

>>###映射到指定地址的任意端口
使用   綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
docker.io/ubuntu python app.py```
還可使用 udp 標記來指定 udp 端口
docker.io/ubuntu python app.py```

>>###查看映射端口配置
使用   來查看當前映射的端口配置,也能夠查看到綁定的地址
注意:
* 自定義的命名,比較好記,好比一個web應用容器咱們能夠給它起名叫web* 當要鏈接其餘容器時候,能夠做爲一個有用的參考點,好比鏈接web容器到db容器
docker.io/ubuntu python app.py```
使用   來驗證設定的命名。
能夠看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。
這表示 web 容器連接到 db 容器,web 容器將被容許訪問 db 容器的信息。
Docker 在兩個互聯的容器之間建立了一個安全隧道,並且不用映射它們的端口到宿主主機上。
在啓動 db 容器的時候並無使用   和   標記,從而避免了暴露數據庫端口到外部網絡上。
Docker 經過 2 種方式爲容器公開鏈接信息:
  * 環境變量
  * 更新     文件
使用   命令來查看 web 容器的環境變量
docker.io/ubuntu env```
其中 DB_ 開頭的環境變量是供 web 容器鏈接 db 容器使用,前綴採用大寫的鏈接別名。
除了環境變量,Docker 還添加 host 信息到父容器的   的文件。下面是父容器 web 的 hosts 文件
docker.io/ubuntu /bin/bash```
這裏有 2 個 hosts,第一個是 web 容器,web 容器用 id 做爲他的主機名,第二個是 db 容器的 ip 和主機名。
能夠在 web 容器中安裝 ping 命令來測試跟db容器的連通。
用 ping 來測試db容器,它會解析成  。 * 注意:官方的 ubuntu 鏡像默認沒有安裝 ping,須要自行安裝。
用戶能夠連接多個父容器到子容器,好比能夠連接多個 web 到 db 容器上。

#高級網絡配置
當 Docker 啓動時,會自動在主機上建立一個  虛擬網橋,其實是 Linux 的一個 bridge,能夠理解爲一個軟件交換機。
它會在掛載到它的網口之間進行轉發。同時,Docker 隨機分配一個本地未佔用的私有網段(在 RFC1918 中定義)中的一個地址給  接口。
好比典型的 ,掩碼爲 。此後啓動的容器內的網口也會自動分配一個同一網段()的地址。
當建立一個 Docker 容器的時候,同時會建立了一對  接口(當數據包發送到一個接口時,另一個接口也能夠收到相同的數據包)。
這對接口一端在容器內,即 ;另外一端在本地並被掛載到  網橋,名稱以  開頭(例如 )。
經過這種方式,主機能夠跟容器通訊,容器之間也能夠相互通訊。Docker 就建立了在主機和全部容器之間一個虛擬共享網絡。


##快速配置指南

>下面是一個跟 Docker 網絡相關的命令列表。
其中有些命令選項只有在 Docker 服務啓動的時候才能配置,並且不能立刻生效。

 --定製 docker0 的掩碼
 --Docker 服務端接收命令的通道
 --是否支持容器之間進行通訊
 --請看下文容器之間的通訊
 --禁止 Docker 添加 iptables 規則
 --容器網絡中的 MTU
 --指定容器掛載的網橋

>下面2個命令選項既能夠在啓動服務時指定,也能夠 Docker 容器啓動()時候指定。在 Docker 服務啓動的時候指定則會成爲默認值,後面執行  時能夠覆蓋設置的默認值。
 * --dns=IP_ADDRESS...  --使用指定的DNS服務器
 * --dns-search=DOMAIN...   --指定DNS搜索域
最後這些選項只有在 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  --映射容器全部端口到宿主主機

##配置 DNS
 >Docker 沒有爲每一個容器專門定製鏡像,那麼怎麼自定義配置容器的主機名和 DNS 配置呢? 祕訣就是它利用虛擬文件來掛載到來容器的 3 個相關配置文件。
在容器中使用 mount 命令能夠看到掛載信息:
```sh
$ 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 ...
...
```
##容器訪問控制 >容器的訪問控制,主要經過 Linux 上的 iptables 防火牆來進行管理和實現。iptables 是 Linux 上默認的防火牆軟件,在大部分發行版中都自帶。 ###容器訪問外部網絡 >>容器要想訪問外部網絡,須要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。
```sh
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
#若是爲 0,說明沒有開啓轉發,則須要手動打開。
$sysctl -w net.ipv4.ip_forward=1 ```
>>若是在啓動 Docker 服務的時候設定 --ip-forward=true, Docker 就會自動設定系統的 ip_forward 參數爲 1。
###容器之間訪問 >>容器之間相互訪問,須要兩方面的支持。 * 容器的網絡拓撲是否已經互聯。默認狀況下,全部容器都會被鏈接到 docker0 網橋上。 * 本地系統的防火牆軟件 -- iptables 是否容許經過。 ###訪問全部端口 >>當啓動 Docker 服務時候,默認會添加一條轉發策略到 iptables 的 FORWARD 鏈上。 策略爲經過(ACCEPT)仍是禁止(DROP)取決於配置--icc=true(缺省值)仍是 --icc=false。 固然,若是手動指定 --iptables=false 則不會添加 iptables 規則。 可見,默認狀況下,不一樣容器之間是容許網絡互通的。 若是爲了安全考慮,能夠在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 來禁止它。 ###訪問指定端口 >>在經過 -icc=false 關閉網絡訪問後,還能夠經過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口。 例如,在啓動 Docker 服務時,能夠同時使用 icc=false --iptables=true 參數來關閉容許相互的網絡訪問,並讓 Docker 能夠修改系統中的 iptables 規則。 此時,系統中的 iptables 規則多是相似
```sh $ sudo iptables -nL ... Chain FORWARD (policy ACCEPT) target prot opt source destination DROP all -- 0.0.0.0/0 0.0.0.0/0 ... ```

>>以後,啓動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。 Docker 會在 iptable 中爲 兩個容器分別添加一條 ACCEPT 規則,容許相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE 行)。 當添加了 --link=CONTAINER_NAME:ALIAS 選項後,添加了 iptables 規則。
```sh $ sudo iptables -nL ... Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80 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參數指定的名字。主機名則不會被識別。


##映射容器端口到宿主主機的實現 >默認狀況下,容器能夠主動訪問到外部網絡的鏈接,可是外部網絡沒法訪問到容器。 ###容器訪問外部實現 >>容器全部到外部網絡的鏈接,源地址都會被NAT成本地系統的IP地址。這是使用 iptables 的源地址假裝操做實現的。 查看主機的 NAT 規則。
```sh $ sudo iptables -t nat -nL ... Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 ... ```

>>其中,上述規則將全部源地址在 172.17.0.0/16 網段,目標地址爲其餘網段(外部網絡)的流量動態假裝爲從系統網卡發出。 MASQUERADE 跟傳統 SNAT 的好處是它能動態從網卡獲取地址。 >###外部訪問容器實現 >>容器容許外部訪問,能夠在 docker run 時候經過 -p 或 -P 參數來啓用。 無論用那種辦法,其實也是在本地的 iptable 的 nat 表中添加相應的規則。 使用 -P 時:
```sh $ 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:49153 to:172.17.0.2:80 ```

>>使用 -p 80:80 時:
```sh $ 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/default/docker 中指定DOCKER_OPTS="--ip=IP_ADDRESS",
以後重啓 Docker 服務便可生效。

##配置dokcer0網橋
>Docker 服務默認會建立一個 docker0 網橋(其上有一個 docker0 內部接口),
它在內核層連通了其餘的物理或虛擬網卡,這就將全部容器和本地主機都放到同一個物理網絡。
Docker 默認指定了 docker0 接口 的 IP 地址和子網掩碼,讓主機和容器之間能夠經過網橋相互通訊,它還給出了 MTU(接口容許接收的最大傳輸單元),
一般是 1500 Bytes,或宿主主機網絡路由上支持的默認值。這些值均可以在服務啓動的時候進行配置。
* --bip=CIDR  -- IP 地址加掩碼格式,例如 192.168.1.5/24
* --mtu=BYTES -- 覆蓋默認的 Docker mtu 配置
也能夠在配置文件中配置 DOCKER_OPTS,而後重啓服務。 因爲目前 Docker 網橋是 Linux 網橋,用戶可使用 brctl show 來查看網橋和端口鏈接信息。
```sh
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
```

*注: brctl  命令在 Debian、Ubuntu 中可使用  sudo apt-get install bridge-utils  來安裝。
每次建立一個新容器的時候,Docker 從可用的地址段中選擇一個空閒的 IP 地址分配給容器的 eth0 端口。
使用本地主機上  docker0  接口的 IP 做爲全部容器的默認網關。
```sh
$ 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
link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::306f:e0ff:fe35:5791/64 scope link
valid_lft forever preferred_lft forever
$ 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
```

##自定義網橋
>除了默認的 docker0 網橋,用戶也能夠指定網橋來鏈接各個容器。
在啓動 Docker 服務的時候,使用 -b BRIDGE--bridge=BRIDGE 來指定使用的網橋。
若是服務已經運行,那須要先中止服務,並刪除舊的網橋。
```sh
$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
```
查看確認網橋建立並啓動。
```sh

```
配置 Docker 服務,默認橋接到建立的網橋上。
```sh
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start
```
啓動 Docker 服務。 新建一個容器,能夠看到它已經橋接到了  bridge0  上。
能夠繼續用  brctl show  命令查看橋接的信息。
另外,在容器中可使用  ip addr  和  ip route  命令來查看 IP 地址配置和路由信息。

##工具和示例
>###pipework
Jérôme Petazzoni 編寫了一個叫  pipework  的 shell 腳本,能夠幫助用戶在比較複雜的場景中完成容器的鏈接。
###playground
Brandon Rhodes 建立了一個提供完整的 Docker 容器網絡拓撲管理的  Python庫 ,包括路由、NAT 防火牆;
以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服務器。

##編輯網絡配置文件
>Docker 1.2.0 開始支持在運行中的容器裏編輯   和   文件。
可是這些修改是臨時的,只在運行的容器中保留,容器終止或重啓後並不會被保存下來。也不會被   提交。

##實例:建立一個點到點的鏈接
>默認狀況下,Docker 會將全部容器鏈接到由   提供的虛擬子網中。
用戶有時候須要兩個容器之間能夠直連通訊,而不用經過主機網橋進行橋接。
解決辦法很簡單:建立一對   接口,分別放到兩個容器中,配置成點到點鏈路類型便可。
首先啓動 2 個容器:
```sh
```

>找到進程號,而後建立網絡名字空間的跟蹤文件。
```sh
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
$ 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 接口,而後配置路由
```sh
$ sudo ip link add A type veth peer name B $ sudo ip link set A netns 2989
$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
$ sudo ip netns exec 2989 ip link set A up
$ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A$ sudo ip link set B netns 3004
$ 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 通,併成功創建鏈接。點到點鏈路不須要子網和子網掩碼。
此外,也能夠不指定  --net=none  來建立點到點鏈路。這樣容器還能夠經過原先的網絡來通訊。
利用相似的辦法,能夠建立一個只跟主機通訊的容器。可是通常狀況下,更推薦使用  --icc=false 來關閉容器之間的通訊。

#實戰案例
##使用Supervisor來管理進程
>[詳解](http://dockerpool.com/static/books/docker_practice/cases/supervisor.html)

##建立tomcat/weblogic集羣
>[詳解](http://dockerpool.com/static/books/docker_practice/cases/tomcat.html )

##多臺物理主機之間的容器互聯
>[詳解](http://dockerpool.com/static/books/docker_practice/cases/container_connect.html)

##標準化開發測試和生產環境

Docker  是個偉大的項目,它完全釋放了虛擬化的威力,極大下降了雲計算資源供應的成本,同時讓應用的分發、
測試、部署和分發都變得史無前例的高效和輕鬆!本書既適用於具有基礎 Linux 知識的 Docker 初學者,也但願可供理解原理和實現的高級用戶參考。同時,書中給出的實踐案例,可供在進行實際部署時借鑑。前六章爲基礎內容,供用戶理解 Docker 的基本概念和操做;7 ~ 9 章介紹一些高級操做;第 10 章給出典型的應用場景和實踐案例;11 ~ 13 章介紹關於 Docker 實現的相關技術。14 ~ 17章介紹相關的一些開源項目。
pushpull*-t*-i-tdocker commitADDEXPOSECMDdocker stopexitCtrl+ddocker ps -adocker startdocker restart-ddocker attachnsenterdocker attach```docker run -idt ubuntu #後臺啓動容器``````docker ps #查看容器進程NAMES``````docker attach stoic_newton #經過 NAMES(stoic_newton)進入容器```attachnsenter```cd /tmp``````curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz``````tar -zxf util-linux-2.24.tar.gz``````cd util-linux-2.24;``````./configure --without-ncurses``````echo $(docker-pid 10f839063336) #經過容器ID查看,容器中的首進程ID``````docker-enter 10f839063336 ls #能夠docker-enter [容器id] 直接操做容器``````nsenter --target 838 --mount --uts --ipc --net --pid #經過首進程ID(838)進入容器```
```docker export 7691a814370e > ubuntu.tar #導出容器到本地``````cat ubuntu.tar | docker import - test/ubuntu:v1.0 #導入容器快照到鏡像``````docker import http://example.com/exampleimage.tgz example/imagerepo #從URL導入容器快照```-fSIGKILLdl.dockerpool.com/ubuntudl.dockerpool.comubuntudocker pull ```-e SETTINGS_FLAVOR=s3 \``````-e AWS_BUCKET=acme-docker \``````-e STORAGE_PATH=/registry \``````-e AWS_KEY=AKIAHSHB43HS3J92MXZ \``````-e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \``````-e SEARCH_BACKEND=sqlalchemy \``````-p 5000:5000 \``````registry```/home/user/registry-confdocker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry/tmp/registry-v/opt/data/registrydocker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
                            
                            
                            
   
      
  1. ```apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev```
  2. ```git clone https://github.com/docker/docker-registry.git```
  3. ```cd docker-registry```
  4. ```sudo python setup.py install```
```apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev``````git clone https://github.com/docker/docker-registry.git``````cd docker-registry``````sudo python setup.py install```storage_path
                            
                            
                            
   
      
  1. ```cp config/config_sample.yml config/config.yml```
```cp config/config_sample.yml config/config.yml```
                            
                            
                            
   
      
  1. ```gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application```
```gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application```
                            
                            
                            
   
      
  1. ```gunicorn --access-logfile --error-logfile --k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application```
```gunicorn --access-logfile --error-logfile --k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application```config/config_sample.ymldocker tag192.168.7.26:5000>>$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
docker tagba58192.168.7.26:5000/testdocker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]>>$ sudo docker tag ba58 192.168.7.26:5000/test
root ~ # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 Mdocker push>>docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list
Pushing repository 192.168.7.26:5000/test (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 9bad880da3d2 already pushed, skipping
Image 25f11f5fb0cb already pushed, skipping
Image ebc34468f71d already pushed, skipping
Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
-v```docker run -it -P --name webapp -v /webapp:/opt/webapp docker.io/ubuntu```/webapp/opt/webapp:ro```docker run -it -P --name webapp -v /webapp:/opt/webapp:ro docker.io/ubuntu```:ro-v
                          
                          
                          
   
      
  1. ```docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash```
```docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash```vised --in-place```docker run -d -v /dbdata --name dbdata docker.io/centos echo Data-only container for postgres```--volumes-from```docker run -d --volumes-from dbdata --name db1 docker/centos```
```docker run -d --volumes-from dbdata --name db2 docker/centos```還可使用多個 --volumes-from 參數來從多個容器掛載多個數據卷。 也能夠從其餘已經掛載了數據卷的容器來掛載數據卷。--volumes-from--volumes-fromdocker rm -v--volumes-fromtar/backup/backup.taruntar```docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar```
-P-p49000~49900docker ps```shdocker run -d -P docker.io/ubuntu python app.pydocker logshostPort:containerPort```docker run -d -p 5000:5000 docker.io/ubuntu python app.py```
ip:hostPort:containerPort```sudo docker run -d -p 127.0.0.1:5000:5000 docker.io/ubuntu python app.py```
ip::containerPort```docker run -d -p 127.0.0.1::5000 ```docker run -d -p 127.0.0.1:5000:5000/udp docker port```docker port nostalgic_morse 5000```
```127.0.0.1:49155```
* 容器有本身的內部網絡和 ip 地址(使用   docker inspect   能夠獲取全部的變量,Docker 還能夠有一個可變的網絡配置。)
* -p 標記能夠屢次使用來綁定多個端口
例如:
docker run -d -p 5000:5000 -p 3000:80  docker.io/ubuntu python app.py```

>##容器互聯
容器的鏈接(linking)系統是除了端口映射外,另外一種跟容器中應用交互的方式。
該系統會在源和接收容器之間建立一個隧道,接收容器能夠看到源容器指定的信息。

>>###自定義容器名
docker inspect鏈接系統依據容器的名稱來執行。所以,首先須要自定義一個好記的容器命名。
雖然當建立容器的時候,系統默認會分配一個名字。自定義命名容器有2個好處:
** 使用 --name 標記能夠爲容器自定義命名。**
```docker run -d -P --name web 
--name```docker run -d -P --name web docker ps```sudo docker ps -l```
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- aed84ee21bde docker.io/ubuntu:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
也可使用  docker inspect  來查看容器的名字
```ocker inspect -f "{{ .Name }}" aed84ee21bde```
/web
在執行  docker run 的時候若是添加  --rm 標記,則容器在終止後會馬上刪除。注意, --rm 和  -d 參數不能同時使用。
注意:容器的名稱是惟一的。若是已經命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,須要先用 docker rm 來刪除以前建立的同名容器。
>>###容器互聯
使用  --link 參數可讓容器之間安全的進行交互。
下面先建立一個新的數據庫容器。
```docker run -d --name db  docker.io/ubuntu ```
刪除以前建立的 web 容器
```docker rm -f web```
而後建立一個新的 web 容器,並將它鏈接到 db 容器
```docker run -d -P --name web --link db:db  docker.io/ubuntu python app.py```
此時,db 容器和 web 容器創建互聯關係。
--link 參數的格式爲  --link name:alias,其中  name 是要連接的容器的名稱, alias 是這個鏈接的別名。
使用  docker ps 來查看容器的鏈接
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- aed84ee21bde docker.io/ubuntu:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
也可使用  docker inspect  來查看容器的名字
```ocker inspect -f "{{ .Name }}" aed84ee21bde```
/web
在執行  docker run 的時候若是添加  --rm 標記,則容器在終止後會馬上刪除。注意, --rm 和  -d 參數不能同時使用。
注意:容器的名稱是惟一的。若是已經命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,須要先用 docker rm 來刪除以前建立的同名容器。
>>###容器互聯
使用  --link 參數可讓容器之間安全的進行交互。
下面先建立一個新的數據庫容器。
```docker run -d --name db  docker.io/ubuntu ```
刪除以前建立的 web 容器
```docker rm -f web```
而後建立一個新的 web 容器,並將它鏈接到 db 容器
```docker run -d -P --name web --link db:db  docker.io/ubuntu python app.py```
此時,db 容器和 web 容器創建互聯關係。
--link 參數的格式爲  --link name:alias,其中  name 是要連接的容器的名稱, alias 是這個鏈接的別名。
使用  docker ps 來查看容器的鏈接
docker inspect```ocker inspect -f "{{ .Name }}" aed84ee21bde```
/webdocker run--rm--rm-ddocker rm--link```docker run -d --name db ```docker rm -f web```
```docker run -d -P --name web --link db:db --link--link name:aliasnamealiasdocker ps-p-P/etc/hostsenv```docker run --rm --name web2 --link db:db . . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . ./etc/hosts```docker run -t -i --rm --link db:db root@aed84ee21bde:/opt/webapp# ```cat /etc/hosts```
172.17.0.7 aed84ee21bde
. . .
172.17.0.5 db
root@aed84ee21bde:/opt/webapp# ```apt-get install -yqq inetutils-ping```
root@aed84ee21bde:/opt/webapp# ```ping db```
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
172.17.0.5docker0docker0172.17.42.1255.255.0.0172.17.0.0/16veth paireth0docker0vethvethAQI2QT* --bip=CIDR* -H SOCKET... or --host=SOCKET...* --icc=true|false* --ip-forward=true|false* --iptables=true|false* --mtu=BYTES* -b BRIDGE or --bridge=BRIDGEdocker rundocker run
>這種機制可讓宿主主機 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 來配置容器。

/etc/resolv.conf* -h HOSTNAME or --hostname=HOSTNAME/etc/hostname/etc/hostsdocker ps/etc/hosts* --link=CONTAINER_NAME:ALIAS/etc/hosts* --dns=IP_ADDRESS/etc/resolv.conf/etc/hosts* --dns-search=DOMAIN.example.comhost.example.com/etc/resolv.conf$ 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/etc/hosts/etc/hostname/etc/resolve.confdocker commitdocker0peer$ sudo docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/#
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/#
相關文章
相關標籤/搜索