久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

60,、Docker 學習筆記(CentOS 7.1)

 mediatv 2015-11-21

Docker 包括三個基本概念

  • 鏡像(Image)
  • 容器(Container)
  • 倉庫(Repository)
    理解了這三個概念,,就理解了 Docker 的整個生命周期。

Docker 鏡像

Docker 鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的 ubuntu 操作系統(tǒng)環(huán)境,里面僅安裝了 Apache 或用戶需要的其它應用程序,。鏡像可以用來創(chuàng)建 Docker 容器。
Docker 提供了一個很簡單的機制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里下載一個已經(jīng)做好的鏡像來直接使用,。
容器是從鏡像創(chuàng)建的運行實例,。它可以被啟動、開始,、停止、刪除。每個容器都是相互隔離的,、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環(huán)境(包括root用戶權(quán)限、進程空間,、用戶空間和網(wǎng)絡(luò)空間等)和運行在其中的應用程序。
注:鏡像是只讀的,,容器在啟動的時候創(chuàng)建一層可寫層作為最上層

Docker 容器

Docker 利用容器來運行應用,。它可以被啟動、開始,、停止,、刪除,。每個容器都是相互隔離的、保證安全的平臺,。
可以把容器看做是一個簡易版的 Linux 環(huán)境(包括root用戶權(quán)限,、進程空間、用戶空間和網(wǎng)絡(luò)空間等)和運行在其中的應用程序。
*注:鏡像是只讀的,,容器在啟動的時候創(chuàng)建一層可寫層作為最上層,。

Docker 倉庫

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務(wù)器(Registry)混為一談,,并不嚴格區(qū)分。實際上,,倉庫注冊服務(wù)器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,,每個鏡像有不同的標簽(tag),。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式,。最大的公開倉庫是 Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載,。 國內(nèi)的公開倉庫包括 Docker Pool等,,可以提供大陸用戶更穩(wěn)定快速的訪問。
當然,,用戶也可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個私有倉庫,。當用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了,。
注:Docker 倉庫的概念跟 Git 類似,,注冊服務(wù)器可以理解為 GitHub 這樣的托管服務(wù)。

安裝方式

安裝EPEL

EPEL 是yum的一個軟件源,,里面包含了許多基本源里沒有的軟件,。(安裝需要連接網(wǎng)絡(luò))
安裝了這個源后,,就可以使用yum來安裝 docker了,。
yum install epel-release-7
安裝過程需要交互,輸入“y”按回車就可以了,。
驗證是否安裝成功:
yum repolist
技術(shù)分享


安裝Docker-io

yum -y install docker-io
配置開機自啟動:
chkconfig docker on
完成后,,啟動服務(wù):
service docker start


應用Docker

通過下面命令來驗證doecker是否安裝成功:
docker info
出現(xiàn)下面類似內(nèi)容,則表示安裝成功:
技術(shù)分享
使用下面命令網(wǎng)絡(luò)倉庫下載需要鏡像:
docker pull centos:latest #下載centos
docker pull ubutun:latest #下載ubutun
使用下面命令查看當前鏡像:
docker images
技術(shù)分享
在列出信息中,,可以看到幾個字段信息

  • 來自于哪個倉庫,,比如 docker.io/ubuntu
  • 鏡像的標記,比如latest
  • 它的 ID 號(唯一)07f8e8c5e660
  • 創(chuàng)建時間
  • 鏡像大小
    使用docker完成“hello world":
    docker run ubuntu:07f8e8c5e660 /bin/echo ‘hello world‘
    docker run centos:fd44297e2ddb /bin/echo ‘hello docker‘
    技術(shù)分享

進入交互式容器:
sudo docker run -t -i ubuntu:07f8e8c5e660 /bin/bash
-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上 -i 則讓容器的標準輸入保持打開,。
技術(shù)分享
修改已有鏡像:
使用交互模式在已有的centos鏡像中安裝 gem 應用,,exit退出后,使用 docker commit來提交更新后的副本
docker commit -m "add gem" -a "Ray" 032c501e000f docker.io/centos:v2

  • -m 來指定提交的說明信息,,跟我們使用的版本控制工具一樣,;
  • -a 可以指定更新的用戶信息;
  • 之后是用來創(chuàng)建鏡像的容器的 ID,;
  • 最后指定目標鏡像的倉庫名和 tag 信息,,創(chuàng)建成功后會返回這個鏡像的 ID 信息。
    可以通過 docker images 查看新創(chuàng)建的鏡像:
    技術(shù)分享
    可以再通過 docker run 打開新創(chuàng)建的鏡像:
    docker run -t -i centos:v2 /bin/bash

利用dockerfile來創(chuàng)建鏡像

使用 docker commit 來擴展一個鏡像比較簡單,,但是不方便在一個團隊中分享,。
我們可以使用 docker build來創(chuàng)建一個新的鏡像。
為此,,首先需要創(chuàng)建一個 Dockerfile,,包含一些如何創(chuàng)建鏡像的指令,新建一個目錄和一個 Dockerfile
[root@localhost ~]# cd /opt/
[root@localhost opt]#
[root@localhost opt]# mkdir ubuntu
[root@localhost opt]# cd ubuntu/
[root@localhost ubuntu]# touch Dockerfile
Dockerfile 中每一條指令都創(chuàng)建鏡像的一層,,例如:

    1. # This is a comment
    2. MAINTAINER Ray <tsbc@docker.com>
    3. FROM ubuntu:latest
    4. RUN apt-get -qqy install ruby ruby-dev
    5. RUN apt-get -qq update

Dockerfile 基本的語法是
使用#來注釋
FROM 指令告訴 Docker 使用哪個鏡像作為基礎(chǔ) RUN開頭的指令會在創(chuàng)建中運行,,比如安裝一個軟件包,在這里使用 apt-get 來安裝了一些軟件編寫完成 Dockerfile 后可以使用 docker build 來生成鏡像,。
docker build -t="ubuntu:latest" .
技術(shù)分享
其中 -t 標記來添加 tag,,指定新的鏡像的用戶信息。
“.” 是 Dockerfile 所在的路徑(當前目錄),,也可以替換為一個具體的 Dockerfile 的路徑,。
可以看到 build 進程在執(zhí)行操作,。
注意一個鏡像不能超過 127 層
它要做的第一件事情就是上傳這個 Dockerfile 內(nèi)容,因為所有的操作都要依據(jù) Dockerfile 來進行,。
然后,,Dockerfile 中的指令被一條一條的執(zhí)行,每一步都創(chuàng)建了一個新的容器,在容器中執(zhí)行指令并提交修改(就跟之前介紹過的 docker commit 一樣),。
當所有的指令都執(zhí)行完畢之后,,返回了最終的鏡像 id。所有的中間步驟所產(chǎn)生的容器都被刪除和清理了,。
此外,,還可以利用 ADD 命令復制本地文件到鏡像; (需要再做嘗試)
用 EXPOSE 命令來向外部開放端口,;
* 用 CMD 命令來描述容器啟動后運行的程序等,。

從本地文件系統(tǒng)導入

要從本地文件系統(tǒng)導入一個鏡像,可以使用 openvz(容器虛擬化的先鋒技術(shù))的模板來創(chuàng)建: openvz 的模板下載地址為 templates ,。
比如,,先下載了一個 centos-7-x86_64-minimal.tar.gz 的鏡像,之后使用以下命令導入:
cat centos-7-x86_64-minimal.tar.gz | docker import - centos:v7.mini
然后查看導入的鏡像:
技術(shù)分享

上傳鏡像

用戶可以通過 docker push 命令,,把自己創(chuàng)建的鏡像上傳到倉庫中來共享,。
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 是移除容器
docker rmi docker.io/ubuntu
docker rmi 07f8e8c5e660

Docker 容器

容器是 Docker 又一核心概念,。
簡單的說,,容器是獨立運行的一個或一組應用,以及它們的運行態(tài)環(huán)境,。對應的,,虛擬機可以理解為模擬運行的一整套操作系統(tǒng)(提供了運行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應用。
守護態(tài)運行
docker run -d ubuntu:ruby /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器啟動后會返回一個唯一的 id,,也可以通過 docker ps 命令來查看容器信息,。
docker ps
技術(shù)分享
要獲取容器的輸出信息,可以通過 docker logs 命令,。
docker logs goofy_cori

終止容器

可以使用 docker stop 來終止一個運行中的容器,。
此外,當Docker容器中指定的應用終結(jié)時,,容器也自動終止,。 用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創(chuàng)建的容器立刻終止,。
終止狀態(tài)的容器可以用 docker ps -a 命令看到,。例如
docker ps -a
技術(shù)分享
處于終止狀態(tài)的容器,,可以通過 docker start 命令來重新啟動。
docker start 6fb00e62cfe9 #id
此外,,docker restart 命令會將一個運行態(tài)的容器終止,,然后再重新啟動它.
docker restart 6fb00e62cfe9 #id

進入容器

在使用 -d 參數(shù)時,容器啟動后會進入后臺,。 某些時候需要進入容器進行操作,,有很多種方法,包括使用docker attach 命令或 nsenter 工具等,。
attach 命令
docker attach 是Docker自帶的命令,。
docker run -idt ubuntu #后臺啟動容器
docker ps #查看容器進程NAMES
docker attach stoic_newton #通過 NAMES(stoic_newton)進入容器
nsenter 命令
但是使用 attach 命令有時候并不方便。當多個窗口同時 attach 到同一個容器的時候,,所有窗口都會同步顯示,。
當某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了。

安裝nsenter

nsenter 工具在 util-linux 包2.23版本后包含,,可以先使用 nsenter -version 進行查看。 如果系統(tǒng)中 util-linux 包沒有該命令,,可以按照下面的方法從源碼安裝,。
cd /tmp
curl https://www./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
make nsenter && sudo cp nsenter /usr/local/bin
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc


同時建議大家下載 .bashrc_docker,并將內(nèi)容放到 .bashrc 中,。
這個文件中定義了很多方便使用 Docker 的命令,,例如 docker-pid 可以獲取某個容器的 PID;
而 docker-enter 可以進入容器或直接在容器內(nèi)執(zhí)行命令,。
下面給出一個完整的例子:
技術(shù)分享
docker ps
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 命令,,導入某個容器快照使用 docker import命令:
docker export 7691a814370e > ubuntu.tar #導出容器到本地
cat ubuntu.tar | docker import - test/ubuntu:v1.0 #導入容器快照到鏡像
docker import http:///exampleimage.tgz example/imagerepo #從URL導入容器快照
注:用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。 這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當時的快照狀態(tài)),,而鏡像存儲文件將保存完整記錄,,體積也要大。 此外,,從容器快照文件導入時可以重新指定標簽等元數(shù)據(jù)信息,。

刪除容器

可以使用 docker rm 來刪除一個處于終止狀態(tài)的容器。 例如
docker rm trusting_newton
如果要刪除一個運行中的容器,,可以添加 -f 參數(shù),。Docker 會發(fā)送 SIGKILL 信號給容器。

倉庫

倉庫(Repository)是集中存放鏡像的地方,。
一個容易混淆的概念是注冊服務(wù)器(Registry),。實際上注冊服務(wù)器是管理倉庫的具體服務(wù)器,,每個服務(wù)器上可以有多個倉庫,而每個倉庫下面有多個鏡像,。
從這方面來說,,倉庫可以被認為是一個具體的項目或目錄。
例如對于倉庫地址 dl./ubuntu 來說,,dl. 是注冊服務(wù)器地址,,ubuntu 是倉庫名。
大部分時候,,并不需要嚴格區(qū)分這兩者的概念,。

Docker Hub

基本操作

目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經(jīng)包括了超過 15,000 的鏡像,。
大部分需求,,都可以通過在 Docker Hub 中直接下載鏡像來實現(xiàn)。
用戶無需登錄即可通過 docker search 命令來查找官方倉庫中的鏡像,,并利用 docker pull 命令來將它下載到本地,。
例如以 centos 為關(guān)鍵詞進行搜索:
docker search centos
技術(shù)分享
可以看到返回了很多包含關(guān)鍵字的鏡像,其中包括鏡像名字,、描述,、星級(表示該鏡像的受歡迎程度)、是否官方創(chuàng)建,、是否自動創(chuàng)建,。
官方的鏡像說明是官方項目組創(chuàng)建和維護的,automated 資源允許用戶驗證鏡像的來源和內(nèi)容,。
根據(jù)是否是官方提供,,可將鏡像資源分為兩類。
一種是類似 centos 這樣的基礎(chǔ)鏡像,,被稱為基礎(chǔ)或根鏡像,。這些基礎(chǔ)鏡像是由 Docker 公司創(chuàng)建、驗證,、支持,、提供。這樣的鏡像往往使用單個單詞作為名字,。
還有一種類型,,比如 tianon/centos 鏡像,它是由 Docker 的用戶創(chuàng)建并維護的,,往往帶有用戶名稱前綴,。
可以通過前綴 user_name/ 來指定使用某個用戶提供的鏡像,比如 tianon 用戶。
另外,,在查找的時候通過 -s N 參數(shù)可以指定僅顯示評價為 N 星以上的鏡像,。
下載官方 centos 鏡像到本地:
docker pull centos:latest

私有倉庫

本節(jié)介紹如何使用本地倉庫。docker-registry 是官方提供的工具,,可以用于構(gòu)建私有的鏡像倉庫,。

安裝運行 docker-registry

有時候使用 Docker Hub 這樣的公共倉庫可能不方便,用戶可以創(chuàng)建一個本地倉庫供私人使用,。

容器運行

在安裝了 Docker 后,,可以通過獲取官方 registry 鏡像來運行。
docker run -d -p 5000:5000 registry
這將使用官方的 registry 鏡像來啟動本地的私有倉庫,。 用戶可以通過指定參數(shù)來配置私有倉庫位置,,例如配置鏡像存儲到 Amazon S3 服務(wù)。
docker run \
-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-conf )下的配置文件,。
docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry
默認情況下,倉庫會被創(chuàng)建在容器的 /tmp/registry 下,??梢酝ㄟ^ -v 參數(shù)來將鏡像文件存放在本地的指定路徑。 例如下面的例子將上傳的鏡像放到 /opt/data/registry 目錄,。
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

本地安裝

對于 Ubuntu 或 CentOS 等發(fā)行版,,可以直接通過源安裝。
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 項目下載源碼進行安裝,。
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
然后修改配置文件,主要修改 dev 模板段的 storage_path 到本地的存儲倉庫的路徑,。
cp config/config_sample.yml config/config.yml
之后啟動 Web 服務(wù),。
gunicorn -c contrib/gunicorn.py 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
此時使用 curl 訪問本地的 5000 端口,看到輸出 docker-registry 的版本信息說明運行成功,。
注:config/config_sample.yml 文件是示例配置文件,。

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

創(chuàng)建好私有倉庫之后,,就可以使用 docker tag 來標記一個鏡像,然后推送它到倉庫,,別的機器上就可以下載下來了,。例如私有倉庫地址為 192.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 tag 將 ba58 這個鏡像標記為 192.168.7.26:5000/test(格式為 docker 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 M

使用 docker 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}

Docker 數(shù)據(jù)管理

如何在 Docker 內(nèi)部以及容器之間管理數(shù)據(jù),在容器中管理數(shù)據(jù)主要有兩種方式:

  • 數(shù)據(jù)卷(Data volumes)
  • 數(shù)據(jù)卷容器(Data volume containers

數(shù)據(jù)卷

數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄,,它繞過 UFS,,可以提供很多有用的特性:

  • 數(shù)據(jù)卷可以在容器之間共享和重用
  • 對數(shù)據(jù)卷的修改會立馬生效
  • 對數(shù)據(jù)卷的更新,不會影響鏡像
  • 卷會一直存在,,直到?jīng)]有容器使用
    數(shù)據(jù)卷的使用,,類似于 Linux 下對目錄或文件進行 mount。

創(chuàng)建一個數(shù)據(jù)卷

在用 docker run 命令的時候,,使用 -v 標記來創(chuàng)建一個數(shù)據(jù)卷并掛載到容器里,。在一次 run 中多次使用可以掛載多個數(shù)據(jù)卷。
下面創(chuàng)建一個 web 容器,,并加載一個數(shù)據(jù)卷到容器的 /webapp 目錄
docker run -d -P --name web -v /webapp training/webapp python app.py
*注意:也可以在 Dockerfile 中使用 VOLUME 來添加一個或者多個新的卷到由該鏡像創(chuàng)建的任意容器,。

掛載一個主機目錄作為數(shù)據(jù)卷

使用 -v 標記也可以指定掛載一個本地主機的目錄到容器中去。
docker run -it -P --name webapp -v /webapp:/opt/webapp docker.io/ubuntu
上面的命令加載主機的 /webapp 目錄到容器的 /opt/webapp 目錄,。
這個功能在進行測試的時候十分方便,,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作,。
本地目錄的路徑必須是絕對路徑,,如果目錄不存在 Docker 會自動為你創(chuàng)建它。
*注意:Dockerfile 中不支持這種用法,,這是因為 Dockerfile 是為了移植和分享用的,。然而,不同操作系統(tǒng)的路徑格式不一樣,,所以目前還不能支持,。
Docker 掛載數(shù)據(jù)卷的默認權(quán)限是讀寫,用戶也可以通過 :ro 指定為只讀,。
docker run -it -P --name webapp -v /webapp:/opt/webapp:ro docker.io/ubuntu
加了 :ro 之后,,就掛載為只讀了。

掛載一個本地主機文件作為數(shù)據(jù)卷

-v 標記也可以從主機掛載單個文件到容器中
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
這樣就可以記錄在容器輸入過的命令了,。
*注意:如果直接掛載一個文件,,很多文件編輯工具,包括 vi 或者 sed --in-place,,可能會造成文件 inode 的改變,,從 Docker 1.1 .0起,這會導致報錯誤信息,。
所以最簡單的辦法就直接掛載文件的父目錄,。


數(shù)據(jù)卷容器

如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享,最好創(chuàng)建數(shù)據(jù)卷容器,。
數(shù)據(jù)卷容器,,其實就是一個正常的容器,,專門用來提供數(shù)據(jù)卷供其它容器掛載的。
首先,,創(chuàng)建一個命名的數(shù)據(jù)卷容器 dbdata:
docker run -d -v /dbdata --name dbdata docker.io/centos echo Data-only container for postgres
然后,,在其他容器中使用 --volumes-from 來掛載 dbdata 容器中的數(shù)據(jù)卷。
docker run -d --volumes-from dbdata --name db1 docker/centos
docker run -d --volumes-from dbdata --name db2 docker/centos
還可以使用多個 --volumes-from 參數(shù)來從多個容器掛載多個數(shù)據(jù)卷,。 也可以從其他已經(jīng)掛載了數(shù)據(jù)卷的容器來掛載數(shù)據(jù)卷,。
docker run -d --name db3 --volumes-from db1 docker.io/centos
注意:使用 --volumes-from 參數(shù)所掛載數(shù)據(jù)卷的容器自己并不需要保持在運行狀態(tài)。
如果刪除了掛載的容器(包括 dbdata,、db1 和 db2),,數(shù)據(jù)卷并不會被自動刪除。
如果要刪除一個數(shù)據(jù)卷,,必須在刪除最后一個還掛載著它的容器時使用 docker rm -v 命令來指定同時刪除關(guān)聯(lián)的容器,。 這可以讓用戶在容器之間升級和移動數(shù)據(jù)卷。

利用數(shù)據(jù)卷容器來備份,、恢復,、遷移數(shù)據(jù)卷

可以利用數(shù)據(jù)卷對其中的數(shù)據(jù)進行進行備份、恢復和遷移,。

備份

首先使用 --volumes-from 標記來創(chuàng)建一個加載 dbdata 容器卷的容器,,并從本地主機掛載當前到容器的 /backup 目錄。命令如下:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar dbdata
容器啟動后,,使用了 tar 命令來將 dbdata 卷備份為本地的 /backup/backup.tar,。

恢復

如果要恢復數(shù)據(jù)到一個容器,首先創(chuàng)建一個帶有數(shù)據(jù)卷的容器 dbdata2,。
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后創(chuàng)建另一個容器,,掛載 dbdata2 的容器,并使用 untar 解壓備份文件到掛載的容器卷中,。
docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar

使用網(wǎng)絡(luò)

Docker 允許通過外部訪問容器或容器互聯(lián)的方式來提供網(wǎng)絡(luò)服務(wù),。

外部訪問容器

容器中可以運行一些網(wǎng)絡(luò)應用,要讓外部也可以訪問這些應用,,可以通過 -P 或 -p 參數(shù)來指定端口映射。
當使用 -P 標記時,,Docker 會隨機映射一個 49000~49900 的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口,。
使用 docker ps 可以看到,本地主機的 49155 被映射到了容器的 5000 端口,。此時訪問本機的 49155 端口即可訪問容器內(nèi) web 應用提供的界面,。

    1. docker run -d -P docker.io/ubuntu python app.py
    2. docker ps -l
    3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    4. 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 命令來查看應用的信息,。
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,。

映射所有接口地址

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,,可以執(zhí)行
docker run -d -p 5000:5000 docker.io/ubuntu python app.py
此時默認會綁定本地所有接口上的所有地址。

映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址,,比如 localhost 地址 127.0.0.1
sudo docker run -d -p 127.0.0.1:5000:5000 docker.io/ubuntu python app.py

映射到指定地址的任意端口

使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,,本地主機會自動分配一個端口。
docker run -d -p 127.0.0.1::5000 docker.io/ubuntu python app.py
還可以使用 udp 標記來指定 udp 端口
docker run -d -p 127.0.0.1:5000:5000/udp docker.io/ubuntu python app.py

查看映射端口配置

使用 docker port 來查看當前映射的端口配置,,也可以查看到綁定的地址
docker port nostalgic_morse 5000

    1. 注意:
    2. * 容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用 docker inspect 可以獲取所有的變量,,Docker 還可以有一個可變的網(wǎng)絡(luò)配置。)
    3. * -p 標記可以多次使用來綁定多個端口
    4. 例如:
    5. docker run -d -p 5000:5000 -p 3000:80 docker.io/ubuntu python app.py

容器互聯(lián)

容器的連接(linking)系統(tǒng)是除了端口映射外,,另一種跟容器中應用交互的方式,。
該系統(tǒng)會在源和接收容器之間創(chuàng)建一個隧道,接收容器可以看到源容器指定的信息,。

自定義容器名連接系統(tǒng)依據(jù)容器的名稱來執(zhí)行,。因此,首先需要自定義一個好記的容器命名,。

雖然當創(chuàng)建容器的時候,,系統(tǒng)默認會分配一個名字。自定義命名容器有2個好處:

  • 自定義的命名,,比較好記,,比如一個web應用容器我們可以給它起名叫web 當要連接其他容器時候,可以作為一個有用的參考點,,比如連接web容器到db容器
    * 使用 --name 標記可以為容器自定義命名,。

    docker run -d -P --name web docker.io/ubuntu python app.py
    使用 docker ps 來驗證設(shè)定的命名。
    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
    在執(zhí)行 docker run 的時候如果添加 --rm 標記,,則容器在終止后會立刻刪除,。注意,--rm 和 -d 參數(shù)不能同時使用,。
    注意:容器的名稱是唯一的,。如果已經(jīng)命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,,需要先用docker rm 來刪除之前創(chuàng)建的同名容器,。

    容器互聯(lián)

    使用 --link 參數(shù)可以讓容器之間安全的進行交互。
    下面先創(chuàng)建一個新的數(shù)據(jù)庫容器,。
    docker run -d --name db docker.io/ubuntu
    刪除之前創(chuàng)建的 web 容器
    docker rm -f web
    然后創(chuàng)建一個新的 web 容器,,并將它連接到 db 容器
    docker run -d -P --name web --link db:db docker.io/ubuntu python app.py
    此時,db 容器和 web 容器建立互聯(lián)關(guān)系,。
    --link 參數(shù)的格式為 --link name:alias,,其中 name 是要鏈接的容器的名稱,,alias 是這個連接的別名。
    使用 docker ps 來查看容器的連接
    可以看到自定義命名的容器,,db 和 web,,db 容器的 names 列有 db 也有 web/db。
    這表示 web 容器鏈接到 db 容器,,web 容器將被允許訪問 db 容器的信息,。
    Docker 在兩個互聯(lián)的容器之間創(chuàng)建了一個安全隧道,而且不用映射它們的端口到宿主主機上,。
    在啟動 db 容器的時候并沒有使用 -p 和 -P 標記,,從而避免了暴露數(shù)據(jù)庫端口到外部網(wǎng)絡(luò)上。
    Docker 通過 2 種方式為容器公開連接信息:
    • 環(huán)境變量
    • 更新 /etc/hosts 文件
      使用 env 命令來查看 web 容器的環(huán)境變量
      docker run --rm --name web2 --link db:db docker.io/ubuntu env
      . . .
      DBNAME=/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
      . . .
      其中 DB
      開頭的環(huán)境變量是供 web 容器連接 db 容器使用,,前綴采用大寫的連接別名,。
      除了環(huán)境變量,Docker 還添加 host 信息到父容器的 /etc/hosts 的文件,。下面是父容器 web 的 hosts 文件
      docker run -t -i --rm --link db:db docker.io/ubuntu /bin/bash
      root@aed84ee21bde:/opt/webapp# cat /etc/hosts
      172.17.0.7 aed84ee21bde
      . . .
      172.17.0.5 db
      這里有 2 個 hosts,,第一個是 web 容器,web 容器用 id 作為他的主機名,,第二個是 db 容器的 ip 和主機名,。
      可以在 web 容器中安裝 ping 命令來測試跟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
      用 ping 來測試db容器,,它會解析成 172.17.0.5,。 * 注意:官方的 ubuntu 鏡像默認沒有安裝 ping,需要自行安裝,。
      用戶可以鏈接多個父容器到子容器,,比如可以鏈接多個 web 到 db 容器上。

高級網(wǎng)絡(luò)配置

當 Docker 啟動時,,會自動在主機上創(chuàng)建一個 docker0 虛擬網(wǎng)橋,,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機,。
它會在掛載到它的網(wǎng)口之間進行轉(zhuǎn)發(fā),。同時,Docker 隨機分配一個本地未占用的私有網(wǎng)段(在 RFC1918 中定義)中的一個地址給 docker0 接口,。
比如典型的 172.17.42.1,,掩碼為 255.255.0.0。此后啟動的容器內(nèi)的網(wǎng)口也會自動分配一個同一網(wǎng)段(172.17.0.0/16)的地址,。
當創(chuàng)建一個 Docker 容器的時候,同時會創(chuàng)建了一對 veth pair 接口(當數(shù)據(jù)包發(fā)送到一個接口時,,另外一個接口也可以收到相同的數(shù)據(jù)包),。
這對接口一端在容器內(nèi),,即 eth0;另一端在本地并被掛載到 docker0 網(wǎng)橋,,名稱以 veth 開頭(例如 vethAQI2QT),。
通過這種方式,主機可以跟容器通信,,容器之間也可以相互通信,。Docker 就創(chuàng)建了在主機和所有容器之間一個虛擬共享網(wǎng)絡(luò)。
技術(shù)分享

快速配置指南

下面是一個跟 Docker 網(wǎng)絡(luò)相關(guān)的命令列表,。
其中有些命令選項只有在 Docker 服務(wù)啟動的時候才能配置,,而且不能馬上生效。

  • --bip=CIDR --定制 docker0 的掩碼
  • -H SOCKET... or --host=SOCKET... --Docker 服務(wù)端接收命令的通道
  • --icc=true|false --是否支持容器之間進行通信
  • --ip-forward=true|false --請看下文容器之間的通信
  • --iptables=true|false --禁止 Docker 添加 iptables 規(guī)則
  • --mtu=BYTES --容器網(wǎng)絡(luò)中的 MTU
  • -b BRIDGE or --bridge=BRIDGE --指定容器掛載的網(wǎng)橋

下面2個命令選項既可以在啟動服務(wù)時指定,,也可以 Docker 容器啟動(docker run)時候指定,。在 Docker 服務(wù)啟動的時候指定則會成為默認值,后面執(zhí)行 docker run 時可以覆蓋設(shè)置的默認值,。

  • --dns=IP_ADDRESS... --使用指定的DNS服務(wù)器
  • --dns-search=DOMAIN... --指定DNS搜索域
    最后這些選項只有在 docker run 執(zhí)行時使用,,因為它是針對容器的特性內(nèi)容。
    • -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 個相關(guān)配置文件。
在容器中使用 mount 命令可以看到掛載信息:

    1. $ mount
    2. ...
    3. /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
    4. /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
    5. tmpfs on /etc/resolv.conf type tmpfs ...
    6. ...

這種機制可以讓宿主主機 DNS 信息發(fā)生更新后,,所有 Docker 容器的 dns 配置通過 /etc/resolv.conf 文件立刻得到更新,。
如果用戶想要手動指定容器的配置,可以利用下面的選項,。

  • -h HOSTNAME or --hostname=HOSTNAME 設(shè)定容器的主機名,,它會被寫到容器內(nèi)的 /etc/hostname 和/etc/hosts。
    但它在容器外部看不到,,既不會在 docker ps 中顯示,,也不會在其他的容器的 /etc/hosts 看到。
  • --link=CONTAINER_NAME:ALIAS 選項會在創(chuàng)建容器的時候,,添加一個其他容器的主機名到 /etc/hosts 文件中,,
    讓新容器的進程可以使用主機名 ALIAS 就可以連接它。
  • --dns=IP_ADDRESS 添加 DNS 服務(wù)器到容器的 /etc/resolv.conf 中,,讓容器用這個服務(wù)器來解析所有不在/etc/hosts 中的主機名,。
  • --dns-search=DOMAIN 設(shè)定容器的搜索域,當設(shè)定搜索域為 . 時,,在搜索一個名為 host 的主機時,,
    DNS 不僅搜索host,還會搜索 host.,。
    注意:如果沒有上述最后 2 個選項,,Docker 會默認用主機上的 /etc/resolv.conf 來配置容器,。

容器訪問控制

容器的訪問控制,主要通過 Linux 上的 iptables 防火墻來進行管理和實現(xiàn),。iptables 是 Linux 上默認的防火墻軟件,,在大部分發(fā)行版中都自帶。

容器訪問外部網(wǎng)絡(luò)

容器要想訪問外部網(wǎng)絡(luò),,需要本地系統(tǒng)的轉(zhuǎn)發(fā)支持,。在Linux 系統(tǒng)中,檢查轉(zhuǎn)發(fā)是否打開,。

    1. $sysctl net.ipv4.ip_forward
    2. net.ipv4.ip_forward = 1
    3. #如果為 0,,說明沒有開啟轉(zhuǎn)發(fā),則需要手動打開,。
    4. $sysctl -w net.ipv4.ip_forward=1

如果在啟動 Docker 服務(wù)的時候設(shè)定 --ip-forward=true, Docker 就會自動設(shè)定系統(tǒng)的 ip_forward 參數(shù)為 1,。

容器之間訪問

容器之間相互訪問,需要兩方面的支持,。

  • 容器的網(wǎng)絡(luò)拓撲是否已經(jīng)互聯(lián),。默認情況下,所有容器都會被連接到 docker0 網(wǎng)橋上,。
  • 本地系統(tǒng)的防火墻軟件 -- iptables 是否允許通過,。

    訪問所有端口

    當啟動 Docker 服務(wù)時候,默認會添加一條轉(zhuǎn)發(fā)策略到 iptables 的 FORWARD 鏈上,。
    策略為通過(ACCEPT)還是禁止(DROP)取決于配置--icc=true(缺省值)還是 --icc=false,。
    當然,如果手動指定 --iptables=false 則不會添加 iptables 規(guī)則,。
    可見,,默認情況下,不同容器之間是允許網(wǎng)絡(luò)互通的,。
    如果為了安全考慮,,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 來禁止它。

    訪問指定端口

    在通過 -icc=false 關(guān)閉網(wǎng)絡(luò)訪問后,,還可以通過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口,。
    例如,在啟動 Docker 服務(wù)時,,可以同時使用 icc=false --iptables=true 參數(shù)來關(guān)閉允許相互的網(wǎng)絡(luò)訪問,,并讓 Docker 可以修改系統(tǒng)中的 iptables 規(guī)則。
    此時,,系統(tǒng)中的 iptables 規(guī)則可能是類似
      1. $ sudo iptables -nL
      2. ...
      3. Chain FORWARD (policy ACCEPT)
      4. target prot opt source destination
      5. DROP all -- 0.0.0.0/0 0.0.0.0/0
      6. ...

之后,,啟動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。
Docker 會在 iptable 中為 兩個容器分別添加一條 ACCEPT 規(guī)則,允許相互訪問開放的端口(取決于 Dockerfile 中的 EXPOSE 行),。
當添加了 --link=CONTAINER_NAME:ALIAS 選項后,,添加了 iptables 規(guī)則。

    1. $ sudo iptables -nL
    2. ...
    3. Chain FORWARD (policy ACCEPT)
    4. target prot opt source destination
    5. ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
    6. ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
    7. DROP all -- 0.0.0.0/0 0.0.0.0/0

注意:--link=CONTAINER_NAME:ALIAS 中的 CONTAINER_NAME 目前必須是 Docker 分配的名字,,或使用 --name參數(shù)指定的名字。主機名則不會被識別,。

映射容器端口到宿主主機的實現(xiàn)

默認情況下,,容器可以主動訪問到外部網(wǎng)絡(luò)的連接,但是外部網(wǎng)絡(luò)無法訪問到容器,。

容器訪問外部實現(xiàn)

容器所有到外部網(wǎng)絡(luò)的連接,,源地址都會被NAT成本地系統(tǒng)的IP地址。這是使用 iptables 的源地址偽裝操作實現(xiàn)的,。
查看主機的 NAT 規(guī)則,。

    1. $ sudo iptables -t nat -nL
    2. ...
    3. Chain POSTROUTING (policy ACCEPT)
    4. target prot opt source destination
    5. MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
    6. ...

其中,上述規(guī)則將所有源地址在 172.17.0.0/16 網(wǎng)段,,目標地址為其他網(wǎng)段(外部網(wǎng)絡(luò))的流量動態(tài)偽裝為從系統(tǒng)網(wǎng)卡發(fā)出,。
MASQUERADE 跟傳統(tǒng) SNAT 的好處是它能動態(tài)從網(wǎng)卡獲取地址。

外部訪問容器實現(xiàn)

容器允許外部訪問,,可以在 docker run 時候通過 -p 或 -P 參數(shù)來啟用,。
不管用那種辦法,其實也是在本地的 iptable 的 nat 表中添加相應的規(guī)則,。
使用 -P 時:

    1. $ iptables -t nat -nL
    2. ...
    3. Chain DOCKER (2 references)
    4. target prot opt source destination
    5. DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80

使用 -p 80:80 時:

    1. $ iptables -t nat -nL
    2. Chain DOCKER (2 references)
    3. target prot opt source destination
    4. DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80

注意:

  • 這里的規(guī)則映射了 0.0.0.0,,意味著將接受主機來自所有接口的流量。
    用戶可以通過 -p IP:host_port:container_port 或 -p IP::port 來指定允許訪問容器的主機上的 IP,、接口等,,以制定更嚴格的規(guī)則。
  • 如果希望永久綁定到某個固定的 IP 地址,,可以在 Docker 配置文件 /etc/default/docker 中指定DOCKER_OPTS="--ip=IP_ADDRESS",,
    之后重啟 Docker 服務(wù)即可生效。

配置dokcer0網(wǎng)橋

Docker 服務(wù)默認會創(chuàng)建一個 docker0 網(wǎng)橋(其上有一個 docker0 內(nèi)部接口),,
它在內(nèi)核層連通了其他的物理或虛擬網(wǎng)卡,,這就將所有容器和本地主機都放到同一個物理網(wǎng)絡(luò)。
Docker 默認指定了 docker0 接口 的 IP 地址和子網(wǎng)掩碼,,讓主機和容器之間可以通過網(wǎng)橋相互通信,,它還給出了 MTU(接口允許接收的最大傳輸單元),
通常是 1500 Bytes,,或宿主主機網(wǎng)絡(luò)路由上支持的默認值,。這些值都可以在服務(wù)啟動的時候進行配置。

  • --bip=CIDR -- IP 地址加掩碼格式,,例如 192.168.1.5/24
  • --mtu=BYTES -- 覆蓋默認的 Docker mtu 配置
    也可以在配置文件中配置 DOCKER_OPTS,,然后重啟服務(wù),。 由于目前 Docker 網(wǎng)橋是 Linux 網(wǎng)橋,用戶可以使用 brctl show 來查看網(wǎng)橋和端口連接信息,。
      1. $ sudo brctl show
      2. bridge name bridge id STP enabled interfaces
      3. docker0 8000.3a1d7362b4ee no veth65f9

*注:brctl 命令在 Debian,、Ubuntu 中可以使用 sudo apt-get install bridge-utils 來安裝。
每次創(chuàng)建一個新容器的時候,,Docker 從可用的地址段中選擇一個空閑的 IP 地址分配給容器的 eth0 端口,。
使用本地主機上 docker0 接口的 IP 作為所有容器的默認網(wǎng)關(guān)。

    1. $ sudo docker run -i -t --rm base /bin/bash
    2. $ ip addr show eth0
    3. 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    4. link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
    5. inet 172.17.0.3/16 scope global eth0
    6. valid_lft forever preferred_lft forever
    7. inet6 fe80::306f:e0ff:fe35:5791/64 scope link
    8. valid_lft forever preferred_lft forever
    9. $ ip route
    10. default via 172.17.42.1 dev eth0
    11. 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
    12. $ exit

自定義網(wǎng)橋

除了默認的 docker0 網(wǎng)橋,,用戶也可以指定網(wǎng)橋來連接各個容器,。
在啟動 Docker 服務(wù)的時候,使用 -b BRIDGE或--bridge=BRIDGE 來指定使用的網(wǎng)橋,。
如果服務(wù)已經(jīng)運行,,那需要先停止服務(wù),并刪除舊的網(wǎng)橋,。

    1. $ sudo service docker stop
    2. $ sudo ip link set dev docker0 down
    3. $ sudo brctl delbr docker0
    4. ```
    5. 查看確認網(wǎng)橋創(chuàng)建并啟動,。
    6. ```sh
    7. $ ip addr show bridge0
    8. 4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
    9. link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
    10. inet 192.168.5.1/24 scope global bridge0
    11. valid_lft forever preferred_lft forever

配置 Docker 服務(wù),默認橋接到創(chuàng)建的網(wǎng)橋上,。

    1. $ echo DOCKER_OPTS="-b=bridge0" >> /etc/default/docker
    2. $ sudo service docker start

啟動 Docker 服務(wù),。 新建一個容器,可以看到它已經(jīng)橋接到了 bridge0 上,。
可以繼續(xù)用 brctl show 命令查看橋接的信息,。
另外,在容器中可以使用 ip addr 和 ip route 命令來查看 IP 地址配置和路由信息,。

工具和示例

pipework

Jér?me Petazzoni 編寫了一個叫 pipework 的 shell 腳本,,可以幫助用戶在比較復雜的場景中完成容器的連接。

playground

Brandon Rhodes 創(chuàng)建了一個提供完整的 Docker 容器網(wǎng)絡(luò)拓撲管理的 Python庫,,包括路由,、NAT 防火墻;
以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服務(wù)器,。

編輯網(wǎng)絡(luò)配置文件

Docker 1.2.0 開始支持在運行中的容器里編輯 /etc/hosts, /etc/hostname 和 /etc/resolve.conf 文件,。
但是這些修改是臨時的,只在運行的容器中保留,,容器終止或重啟后并不會被保存下來,。也不會被 docker commit 提交。

實例:創(chuàng)建一個點到點的連接

默認情況下,,Docker 會將所有容器連接到由 docker0 提供的虛擬子網(wǎng)中,。
用戶有時候需要兩個容器之間可以直連通信,而不用通過主機網(wǎng)橋進行橋接。
解決辦法很簡單:創(chuàng)建一對 peer 接口,,分別放到兩個容器中,,配置成點到點鏈路類型即可。
首先啟動 2 個容器:

    1. $ sudo docker run -i -t --rm --net=none base /bin/bash
    2. root@1f1f4c1f931a:/#
    3. $ sudo docker run -i -t --rm --net=none base /bin/bash
    4. root@12e343489d2f:/#

找到進程號,,然后創(chuàng)建網(wǎng)絡(luò)名字空間的跟蹤文件,。

    1. $ sudo docker inspect -f ‘{{.State.Pid}}‘ 1f1f4c1f931a
    2. 2989
    3. $ sudo docker inspect -f ‘{{.State.Pid}}‘ 12e343489d2f
    4. 3004
    5. $ sudo mkdir -p /var/run/netns
    6. $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
    7. $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004

創(chuàng)建一對 peer 接口,然后配置路由

    1. $ sudo ip link add A type veth peer name B$ sudo ip link set A netns 2989
    2. $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
    3. $ sudo ip netns exec 2989 ip link set A up
    4. $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A$ sudo ip link set B netns 3004
    5. $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
    6. $ sudo ip netns exec 3004 ip link set B up
    7. $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B

現(xiàn)在這 2 個容器就可以相互 ping 通,,并成功建立連接,。點到點鏈路不需要子網(wǎng)和子網(wǎng)掩碼。
此外,,也可以不指定 --net=none 來創(chuàng)建點到點鏈路。這樣容器還可以通過原先的網(wǎng)絡(luò)來通信,。
利用類似的辦法,,可以創(chuàng)建一個只跟主機通信的容器。但是一般情況下,,更推薦使用 --icc=false 來關(guān)閉容器之間的通信,。

實戰(zhàn)案例

使用Supervisor來管理進程

詳解

創(chuàng)建tomcat/weblogic集群

詳解

多臺物理主機之間的容器互聯(lián)

詳解

標準化開發(fā)測試和生產(chǎn)環(huán)境

詳解

Docker 是個偉大的項目,它徹底釋放了虛擬化的威力,,極大降低了云計算資源供應的成本,,同時讓應用的分發(fā)、
測試,、部署和分發(fā)都變得前所未有的高效和輕松,!本書既適用于具備基礎(chǔ) Linux 知識的 Docker 初學者,也希望可供理解原理和實現(xiàn)的高級用戶參考,。同時,,書中給出的實踐案例,可供在進行實際部署時借鑒,。前六章為基礎(chǔ)內(nèi)容,,供用戶理解 Docker 的基本概念和操作;7 ~ 9 章介紹一些高級操作,;第 10 章給出典型的應用場景和實踐案例,;11 ~ 13 章介紹關(guān)于 Docker 實現(xiàn)的相關(guān)技術(shù)。14 ~ 17章介紹相關(guān)的一些開源項目,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多