1. 程式人生 > >分布式進階 二 Ubuntu 14 04下安裝Dockr圖文教程 二

分布式進階 二 Ubuntu 14 04下安裝Dockr圖文教程 二

ima ont 公司 定制 ear 4.4 drive pull mark

4.1 構建我們自己的映像

構建Docker映像有兩種方法:

?通過docker commit(提交)命令

?通過docker build(構建)命令以及Docker文件(Dockerfile

目前並不推薦docker提交方法,因為借助Docker文件進行構建要靈活得多、強大得多,但為了力求完整起見,我會向你演示提交方法。

之後,我將重點介紹推薦的Docker映像構建方法:編寫Docker文件,然後使用docker構建命令。

4.1.1 使用Docker提交命令來創建映像

我將創建一個容器,並對該容器進行更改――就像更改代碼那樣,然後將那些變更內容提交給新的映像。

不妨先通過我們在過去使用的ubuntu映像來創建一個容器。

docker run -i -t ubuntu /bin/bash

root@73527b8b4261:/#

註意:請註意上面的root顯示了主機名稱73527b8b4261,它是所創建的容器名稱;它與你的情況會不一樣。

此外,我會將apache安裝在容器裏面:

sudo apt-get install apache2

我已啟動了容器,然後將Apache安裝在裏面。現在,我準備將該容器用作Web服務器,所以我將它保存在當前狀態。

這樣一來,我每次創建一個新的容器時,就沒必要用Apache來重新構建它。為此,我將退出容器,使用

exit命令,然後使用docker提交命令。

exit

docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528

註意:這裏的73527b8b4261是我的容器名稱;我為容器使用8ce0ea7a1528標記,你可以賦予任何標記名稱,也可以使用同一個名稱。

假設你忘了上一個創建的容器的編號,可以使用這個命令:

docker ps -l -q

它會得出73527b8b4261

註意:73527b8b4261是你上一個創建的容器名稱,它與你的情況可能不一樣。

不妨看一下我們的新映像。它可以這樣獲得,如下所示:

srijan@vboxtest:~$ docker images srijan/apache2

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

srijan/apache2 8ce0ea7a1528 741155868ac8 6 minutes ago 207.2 MB

srijan@vboxtest:~$

註意:這裏的8ce0ea7a1528是我在保存容器時所使用的標記名稱;

註意:741155868ac8是該容器的映像編號;

註意:所有這些值與你的情況可能不一樣,因為在保存容器時,docker會創建相應的隨機名稱。

現在,我將保存定制的映像,如下所示:

sudo docker commit -m="A new custom image" --author="Srijan Kishore" 73527b8b4261 srijan/apache2:webserver

它會給出結果:

f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec

想從我們的新映像運行容器,我們只要使用docker run(運行)命令。

docker run -t -i srijan/apache2:webserver /bin/bash

我們可以反復核對已提交的映像,如下所示:

srijan@vboxtest:~$ docker inspect srijan/apache2:webserver

[{

"Architecture": "amd64",

"Author": "Srijan Kishore",

"Comment": "A new custom image",

"Config": {

"AttachStderr": false,

......................................................................

"Parent": "ef83896b7fb99b00b9e0e6ac943826386e7edcef11a3a2f58b42011ab4a4e683",

"Size": 14463026

}

]srijan@vboxtest:~$

想從我們的新映像運行容器,我們可以使用docker運行命令。

4.1.2 Docker文件構建映像

Docker文件使用基本的特定領域語言(DSL),以及用於構建Docker映像的指令。然後,我們使用docker構建命令,通過Docker文件裏面的指令來構建新的映像。

Docker公司的開發團隊還在此發布了Docker文件教程(http://www.docker.io/learn/dockerfile/),可以幫助大家學會如何構建Docker文件。

現在,我將創建一個簡單的docker文件,它可以按照用戶的需求,進一步改進和完善。首先,讓一個目錄假設為dir=kishore

mkdir kishore

cd kishore

現在創建一個Docker文件,如下所示:

vi Dockerfile

並輸入內容,如下所示:

FROM ubuntu:12.04

MAINTAINER Srijan Kishore <[email protected]>

RUN apt-get -qq update

RUN apt-get -qqy install apache2

現在打開定制的容器,請使用這個命令:

sudo docker build -t="srijan/custom1" .

它會得出如下結果:

[sudo] password for srijan:

Sending build context to Docker daemon 2.56 kB

Sending build context to Docker daemon

Step 0 : FROM ubuntu:12.04

Pulling repository ubuntu

ea7d6801c538: Download complete

511136ea3c5a: Download complete

65b7e9ccb809: Download complete

f8dd6bd14f58: Download complete

a343823119db: Download complete

---> ea7d6801c538

Step 1 : MAINTAINER Srijan Kishore <[email protected]>

---> Running in a6135f405eb4

---> be97c22efa82

Removing intermediate container a6135f405eb4

..................................................................................

Removing intermediate container 5765c09b530f

Successfully built 634855a43331

srijan@vboxtest:~/kishore$

現在不妨看一下我們的新映像。為此,我們可以使用docker映像命令來實現。

sudo docker images srijan/custom1

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

srijan/custom1 latest 634855a43331 About a minute ago 277.4 MB

srijan@vboxtest:~/kishore$

這裏,你會發現映像在默認情況下會安裝apache2。不妨反復核對一下:

docker run -t -i srijan/apache2:webserver /bin/bash

現在,你可以進入新容器,而apache212.04ubuntu已預裝。

主機名稱的更改

假設你想更改主機名稱,或者你想有一個定制的主機名稱,比如我這裏的server1.example.com

我會使用:

sudo docker run -h ‘server1.example.com‘ -t -i srijan/custom1 /bin/bash

它會得出映像容器,如下所示:

root@server1:/# hostname -f

server1.example.com

root@server1:/#

Docker其它的實用命令集錦

?pullpull用於從註冊中心拉取映像或軟件庫)

docker pull ubuntu

?commitcommit用於保存容器)

docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528

?cp(將文件/文件夾從容器的文件系統拷貝到主機路徑。路徑相對於文件系統的根目錄。)

docker cp CONTAINER:PATH HOSTPATH

其中的CONTAINER是容器,將文件/文件夾從PATH拷貝到HOSTPATH

?startstop容器:

docker start 4386fb97867d

docker stop 4386fb97867d

其中的4386fb97867d是你的容器編號

?export(將文件系統的內容作為tar存檔文件導出到STDOUT

docker export 4386fb97867d > latest.tar

?import(創建一個空的文件系統映像,將打包文件[.tar.tar.gz.tgz.bzip.tar.xz.txz]的內容導入到裏面,然後以可選方式標記它。)

docker import http://example.com/exampleimage.tgz

從本地文件導入:

通過pipestdin導入到docker

cat exampleimage.tgz | sudo docker import - exampleimagelocal:new

從本地目錄導入:

sudo tar -c . | sudo docker import - exampleimagedir

?history(顯示映像的歷史記錄)

docker history [OPTIONS] IMAGE

sudo docker history ea7d6801c538

?images(它會顯示映像)

docker images [OPTIONS] [NAME]

它後面跟一些選項,如下所示:

-a, --all=false 顯示所有映像(默認情況下,過濾掉中間映像層)

-f, --filter=[]: 提供過濾器值(即“dangling=true”)

--no-trunc=false 不截短輸出

-q, --quiet=false 只顯示數字編號

?info(顯示整個系統的信息)

srijan@vboxtest:~$ sudo docker info

Containers: 20

Images: 65

Storage Driver: aufs

Root Dir: /var/lib/docker/aufs

Dirs: 105

Execution Driver: native-0.2

Kernel Version: 3.13.0-30-generic

WARNING: No swap limit support

?inspect(返回關於容器/映像的低級信息)

docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

?kill(終止運行中的容器/發送SIGKILL,即指定信號)

docker kill [OPTIONS] CONTAINER [CONTAINER...]

?login(註冊或登錄docker註冊中心服務器,如果未指定任何服務器,https://index.docker.io/v1/為默認值。)

docker login localhost:8080

它會登錄到自托管註冊中心。

?logs(讀取容器的日誌)

docker logs CONTAINER

?ps(列出容器)

docker ps [OPTIONS]

它有下列選項:

-a, --all=false 顯示所有容器。默認情況下只顯示運行中的容器。

--before="" 只顯示編號或名稱之前創建的容器,包括非運行中的容器。

-l, --latest=false 只顯示最近創建的容器,包括非運行中的容器。

-n=-1 顯示n個最近創建的容器,包括非運行中的容器。

--no-trunc=false 不截短輸出。

-q, --quiet=false 只顯示數字編號。

-s, --size=false 顯示大小。

--since="" 只顯示自編號或名稱以來創建的容器,包括非運行中的容器。

?push(將映像或軟件庫推送到註冊中心)

docker push NAME[:TAG]

?restart(它將重啟運行中的容器)

docker restart [OPTIONS] CONTAINER [CONTAINER...]

?rm(它將刪除一個或多個容器)

docker rm [OPTIONS] CONTAINER [CONTAINER...]

?rmi(它將刪除一個或多個映像)

docker rmi IMAGE [IMAGE...]

?run(在新容器中運行命令)

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

它有下列選項:

-a, --attach=[] 連接到stdinstdoutstderr

-c, --cpu-shares=0 處理器共享(相對權重)

--cidfile="" 將容器編號寫入到文件

-d, --detach=false 分離模式:在後臺運行容器,輸出新的容器編號

--dns=[] 設置自定義DNS服務器

--dns-search=[] 設置自定義DNS搜索域

-e, --env=[] 設置環境變量

--entrypoint="" 覆蓋映像的默認入口點

--env-file=[] 在行分隔的文件中讀取ENV變量

--expose=[] 暴露來自容器的端口,又不將端口發布到你的主機

-h, --hostname="" 容器主機名稱

-i, --interactive=false stdin保持開放,即便沒有連接

--link=[] 將鏈接添加到另一個容器(名稱:別名)

--lxc-conf=[] lxc exec-driver only)添加自定義lxc選項--lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"

-m, --memory="" 內存限制(格式:<number><optional unit>,其中unit = b, k, m or g

--name="" 為容器賦予名稱

--net="bridge" 為容器設置網絡模式

‘bridge‘:為docker網橋上的容器創建新的網絡堆棧

‘none‘:不為該容器創建任何網絡機制

‘container:<name|id>‘:重復使用另一個容器的網絡堆棧

‘host‘:使用容器裏面的主機網絡堆棧

-p, --publish=[] 將容器的端口發布到主機

格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

(使用“docker port”即可看到實際映射)

-P, --publish-all=false  將所有暴露的端口發布到主機接口

--privileged=false 為該容器賦予擴展後的權限

--rm=false 容器退出後,自動刪除容器(與-d不兼容)

--sig-proxy=true 將所有收到的信號代理輸出到進程(即便處於非-tty模式下)

-t, --tty=false 分配偽終端

-u, --user="" 用戶名稱或UID

-v, --volume=[] 綁定掛載卷(比如來自host:-v /host:/container,來自docker: -v /container

--volumes-from=[] 從指定的一個或多個容器掛載卷

-w, --workdir="" 容器裏面的工作目錄

?save(將映像保存到tar存檔文件,默認情況下流式傳輸到stdout

docker save IMAGE

?search(搜索docker索引,尋找映像)

docker search TERM

?tag(將映像標記到軟件庫)

docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]

?top(查詢容器的運行中進程)

docker top CONTAINER [ps OPTIONS]

?version(顯示docker版本信息)

srijan@vboxtest:~$ sudo docker version

[sudo] password for srijan:

Client version: 1.0.1

Client API version: 1.12

Go version (client): go1.2.1

Git commit (client): 990021a

Server version: 1.0.1

Server API version: 1.12

Go version (server): go1.2.1

Git commit (server): 990021a

如果系統中還不存在 Fedora Docker 鏡像,這個命令會自動下載它,然後啟動這個 Fedora Docker 容器。

技術分享圖片

技術分享圖片

上面的命令會立即啟動 Ubuntu container 容器(這是一個完美的容器!),然後它會提供一個 shell 提示符運行環境給你。現在開始你可以通過這個沙箱環境訪問一個完整的 Ubuntu 系統了。

輸入“exit”命令退出 Docker 容器。

導出鏡像

sudo docker save IMAGENAME | bzip2 -9 -c>img.tar.bz2

導入鏡像

sudo bzip2 -d -c <img.tar.bz2 | docker load

在主機節點上部署了Docker容器中,接著就需要虛擬出多個客戶端容器。

3.Container 容器網絡設置

Docker 使用 Linux 橋接技術與其他容器通信,以及連通外網。安裝完 Docker 後你應該可以看到 docker0 這個網橋,這是 Docker 默認創建的。你創建的每個容器都會通過這個網橋連接到網絡。

技術分享圖片

4.自定義 Linux 網橋

如果你想自定義網橋,你可以執行以下步驟。你可以在這個網橋後面分配一個子網,並為這個子網分配地址。下面的命令會為 Docker 子網分配 10.0.0.0/24 地址段:

sudo apt-get install bridge-utils

sudo brctl addbr br0

sudo ifconfig br0 10.0.0.1 netmask 255.255.255.0

然後在 /etc/default/docker.io 文件的 DOCKER_OPTS 變量裏添加“-b=br0”選項,並重啟 Docker 服務:

sudo service docker.io restart

到目前為止,任何創建的容器都會連上 br0 網橋,它們的 IP 地址會從 10.0.0.0/24 中自動分配(譯註:在10.0.0.210.0.0.254之間隨機分配)。

其他自定義設置

你可以通過 /etc/default/docker.io 文件的 DOCKER_OPTS 變量設置其他一些屬性:

"-dns 8.8.8.8 -dns 8.8.4.4": 為容器指定 DNS 服務器。

"-icc=false": 將容器與其他容器隔離出來

我試著讓大家更加熟悉docker,但願本文會幫助各位進一步了解docker,並在自己的測試/生產環境中充分利用docker

想了解更多信息,請參閱

http://www.docker.com/

http://www.howtoforge.com/manage-linux-containers-with-docker-on-ubuntu

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed

分布式進階 二 Ubuntu 14 04下安裝Dockr圖文教程 二