1. 程式人生 > >Docker入門基礎

Docker入門基礎

一、離線環境安裝docker

本實驗安裝環境如下:

l  Centos Linux release 7.5.1804

blob.png

l  docker-ce-18.06.1.ce-3.el7.x86_64

可用下載地址:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

       安裝步驟:

1.         掛載系統安裝映象,製作本地yum

mount /dev/sr0 /mnt/

vim /etc/yum.repos.d/localiso.repo

[base]

name=CentOS-$releasever - Base

baseurl=file:///mnt

gpgcheck=0

2.         安裝docker

yum localinstall -y docker-ce-18.06.1.ce-3.el7.x86_64.rpm

3.         驗證docker安裝成功

l  docker version

              ####檢查docker版本

blob.png

docker info                     ###檢查docker系統資訊

blob.png

systemctl status docker                        ###檢查

docker服務狀態

blob.png

二、使用febootstrap製作作業系統的docker映象

Centos7的系統映象中沒有febootstrap安裝包,可以掛載centos6的系統映象,使用yum安裝febootstrap,使用如下命令可以製作作業系統的docker映象所需的檔案(假如作業系統映象檔案在本地檔案系統上)

febootstrap -i bash -i openssh-server -i openssh-clients centos75 centos75-installDir file:///mnt

###-i    要在映象中安裝的軟體,本例中安裝了bashssh-server

####centos75     映象的名稱

####centos75-installDir          生成的映象檔案的存放目錄

####file:///mnt             作業系統映象的連結,如果是基於網際網路的映象源,可以指定為類似http://iso.repo/iso格式

此命令執行成功後,會在指定的目錄centos75-installDir中生成類似於linux作業系統檔案的目錄

blob.png

執行以下命令,將生成的作業系統映象檔案匯入到docker中成為image

tar -c . | docker import - centos75

匯入為映象之後,執行docker images命令檢視已有的映象資訊

blob.png

執行以下命令執行剛才生成的映象,-t指定docker生成互動的偽終端,i指定和docker容器互動:

docker run -ti centos75:7.5 bash

blob.png

三、Docker常用命令

l  docker pull centos:latest            ####拉取映象,預設從docker hup拉取

l  docker images                     ###列出本地已經存在的image

l  docker tag centos75:7.5 centos-tagtest:7.5          ##給映象centos75:7.5新增新的倉庫標籤,之後可以使用原來的標籤和新的標籤同時訪問映象,映象名稱只能小寫字母

    blob.png

l  docker inspect centos75:7.5          ###檢視映象的詳細資訊,返回的結果為json格式,可以使用-f獲取指定的項

blob.png

l  docker rmi centos75-tagtest:7.5           ###使用映象標籤刪除映象,當同一個映象(同一個映象id)有多個標籤時,如果不是最後一個標籤,通過標籤刪除映象,只是刪除了映象對應的映象標籤,不會影響映象檔案。當映象只有一個標籤是=時,刪除最後一個標籤會刪除整個映象。

l  docker rmi 03f8a5cba27d              ##使用映象id刪除映象,此時會先嚐試刪除此映象指向的所有標籤,然後刪除該映象檔案本身。如果映象有執行中的容器,預設不允許刪除。可以使用-f強制刪除,但是不建議使用此引數

blob.png

l  docker commit -p -m "add a new file:/testCreateImage" 9dc62934a4b1 new-test-image:1            ####基於一個執行中的容器生成新的映象

l  docker save –o imgae.tar centos75:7.5           #####將映象儲存為本地檔案

l  docker load  --input imgae.tar   || docker load < image.tar           ####通過本地檔案匯入映象到本地映象庫

l  cat image.tar | docker import  –  image:latest           ###從本地模板匯入映象

l  docker tag image:lastest image:7.5             ##為映象更改標籤

l  docker create –it centos:7.5           ###建立docker容器,create命令建立的容器處於停止狀態,可以使用docker start啟動,建立容器支援很多選項,具體可以檢視help

l  docker run –it –d centos:7.5 bash         ###等價於create然後start,使用run建立並啟動容器包含以下過程:

Ø  檢查本地是否存在指定的映象,如果不存在,從預設的公共映象源下載映象

Ø  利用映象建立一個容器,並啟動該容器

Ø  分配一個檔案系統給容器,並在只讀的映象層外面掛載一個可讀寫層

Ø  從宿主主機中配置的網橋介面中分配一個虛擬介面到容器

Ø  從網橋的地址池中分配一個ip給容器

Ø  執行使用者指定的應用程式

Ø  執行完畢後容器被自動終止

-t選項讓docker分配到一個偽終端並繫結到容器的標準輸入,使用者可以通過此終端和容器互動

-i選項讓容器的標準輸入保持開啟

-d選項讓容器以守護態執行。

docker容器中指定的應用終結時,容器也會自動終止,容器會立刻處於stopped狀態,可以使用start命令來重新啟動。

l  docker stop  [–t|--time=10] centos:7.5          ###終止一個容器。首先向容器傳送sigterm訊號,等待一段超時時間(10s)後再發送sigkill訊號強制終止;docker kill直接傳送sigkill訊號

blob.png

l  使用-d選項後,容器會進入後臺,使用者無法看到容器中的資訊,也無法操作容器,此時,可通過以下方式進入容器進行操作:

Ø  docker attach –detach-keys=CTRL-P –no-stdin CONTAINER ID         

--detach-keys          ##指定退出attach模式的快捷鍵,預設先ctrl+p然後ctrl+q

--no-stdin         ###是否關閉標準輸入,預設保持開啟

此方法,多個視窗同時連線到一個容器時,所有視窗同步顯示,一個視窗被阻塞,會導致其他視窗也被阻塞

blob.png

Ø  docker exec [-d|--detach] [--detach-keys=[]] [-i] [-t] [-u|--user=[USER]] [--privileged=true|false] CONTAINER ID COMMAND ARGS

blob.png

l  docker rm CONTAINER ID       ##刪除容器

l  docker export [-o|--output=FILE] CONTAINERID  || docker export CONTAINERID > FILE             ##匯出容器到一個檔案,無論容器是否執行都可以匯出,實現容器遷移,通過docker loaddocker import匯入容器實現容器遷移

四、Docker資料管理

Docker容器中資料管理主要有2種方式:

l  資料卷Data Volume

l  資料卷容器Data volume Container

1.         資料卷Data Volume

Data volume是宿主機上的一個可供容器使用的特殊的目錄,它將宿州os上的系統目錄直接對映到容器中,掛載給容器系統使用,可以提供如下特性:

n  資料卷可以在容器之間共享和重用,容器間傳遞資料將變得高效方便

n  對資料卷內容的修改會立馬生效,無論是本地操作還是容器操作

n  對資料卷的修改不會影響映象,解耦了應用和資料

n  卷會一直存在,直到沒有容器使用,可以安全的解除安裝

建立包含資料卷的容器:

docker create -t -i  -v /webdir centos75:7.5 bash

建立包含資料卷的容器之後,通過docker inspect檢視容器詳細資訊,可以看到掛載的資料卷對應的本地地址:blob.png

blob.png

指定容器資料卷對應的本地位置:

docker create -t -i -v /docker:/webapp --name t1 -P centos75:7.5 bash

通過docker inspect檢視掛載的資料卷得資訊,將本地os目錄/docker掛載給了容器的/webapp目錄,許可權為RW

blob.png

使用如下命令可將本地目錄掛載為只讀的資料卷:

docker create -t -i -v /docker:/webapp:ro --name  t1 -P centos75:7.5 bash

一個容器可以將一個本地目錄掛載給容器的多個目錄,不同的容器也可以掛載同一個目錄,此情況下,無論是在容器中還是在本地,對目錄的更改都會立即體現到所有容器或本地檔案系統

2.         資料卷容器Data Volume Container

資料卷容器是一個容器,是專門用來提供資料卷供其他容器掛載。在一個容器A中使用資料卷,在其他容器中可使用--volumes-from引數掛載容器A中的所有資料卷。

使用如下命令建立資料卷容器,掛載本地目錄/docker分別到容器的/webroot/webapp目錄:

docker run -ti -d -v /docker/:/webroot -v /docker/:/webapp centos75:7.5 bash

blob.png

建立一個新的容器,使用引數--volumes-from掛載資料卷容器中的資料卷:

docker run -i -t -d --volumes-from bd7 centos75:7.5 bash

blob.png

可以看到,掛載了資料卷容器中的資料卷的容器,只是掛載了和資料卷容器中一樣的目錄,資料卷容器自身不需要一直處於執行狀態:

blob.png

最新的資料卷(容器)管理docker提供了docker volume命令,通過docker create –mount選項,docker提供了更多的高階掛載選項:

blob.png

docker資料卷掛載原則:

n  掛載一個空目錄到容器的非空目錄,容器非空目錄中的內容將被隱藏

五、埠對映與容器互聯

容器中執行服務,需要向外提供服務的場景下,需要將容器的ip和相關埠曝露在外讓外部地址訪問。docker提供了2種方式來滿足外部訪問容器應用的方式:

l  對映容器內埠到宿主主機的埠

l  容器互聯機制實現多個容器間通過容器名來互相訪問

1.         對映容器內埠到宿主主機的埠

容器啟動之後,系統會自動分配IP地址給容器。從宿主機的docker0的橋接網絡卡上可以訪問容器的IP地址。宿主機之外的系統無法訪問容器的ip和埠,只能通過訪問宿主機NAT之後的IP和埠。docker rundocker create-P/p選項可以將容器曝露的埠對映為宿主機上的埠,在宿主機之外的系統上可以通過訪問宿主機的IP和相關埠(NAT後)訪問容器提供的服務。

以下命令將docker容器的8022埠分別對映到宿主機的802222埠,在容器中啟動httpd,訪問宿主機的80埠可以訪問容器提供的web服務,訪問宿主主機的2222埠可以訪問到容器的22埠:

docker run -d -p 2222:22 -p 80:80 -v /mnt:/mnt centos75-httpd-sshd /usr/sbin/sshd –D

blob.png

blob.png

blob.png

以下格式可以對映指定IP地址而不是宿主機的所有IP地址:

-p 127.0.0.1:80:80

-p 127.0.0.1:123:123/udp

-p 127.0.0.1::80

以下命令可以檢視容器對映的埠詳情,或者使用docker inspect也可以檢視對映情況:

docker port 2c

blob.png

blob.png

2.         容器互聯機制實現多個容器間通過容器名來互相訪問

建立一個數據庫容器:

docker run –d --name db postgres

建立新的容器,將它連線到db容器:

docker run -d -P --name web --link db:db image python web.py

--link引數格式為--link name:aliasname表示要連線的容器名稱,alias是這個連線的別名

六、Docker網路管理

Docker容器網路利用了Linux虛擬網路技術,目前支援5中網路模式(libnetwork5種內建網路驅動)

l  bridge驅動,預設驅動。此驅動為Docker的預設設定驅動,使用這個驅動的時候,libnetwork將創建出來的Docker容器連線到Docker網橋上。作為最常規的模式,bridge模式已經可以滿足Docker容器最基本的使用需求了。然而其與外界通訊使用NAT,增加了通訊的複雜性,在複雜場景下使用會有諸多限制。

l  host驅動,libnetwork將不為Docker容器建立網路協議棧,即不會建立獨立的network namespaceDocker容器中的程序處於宿主機的網路環境中,相當於Docker容器和宿主機共同用一個network namespace,使用宿主機的網絡卡、IP和埠等資訊。但是,容器其他方面,如檔案系統、程序列表等還是和宿主機隔離的。host模式很好地解決了容器與外界通訊的地址轉換問題,可以直接使用宿主機的IP進行通訊,不存在虛擬化網路帶來的額外效能負擔。但是host驅動也降低了容器與容器之間、容器與宿主機之間網路層面的隔離性,引起網路資源的競爭與衝突。

l  overlay驅動。此驅動採用IETE標準的VXLAN方式,並且是VXLAN中被普遍認為最適合大規模的雲端計算虛擬化環境的SDN controller模式。在使用過程中,需要一個額外的配置儲存服務,例如Consuletcdzookeeper。還需要在啟動Docker daemon的時候額外新增引數來指定所使用的配置儲存服務地址。

l  remote驅動。這個驅動實際上並未做真正的網路服務實現,而是呼叫了使用者自行實現的網路驅動外掛,使libnetwork實現了驅動的可外掛化,更好地滿足了使用者的多種需求。使用者只需要根據libnetwork提供的協議標準,實現其所要求的各個介面並向Docker daemon進行註冊。

l  null驅動。使用這種驅動的時候,Docker容器擁有自己的network namespace,但是並不為Docker容器進行任何網路配置。也就是說,這個Docker容器除了network namespace自帶的loopback網絡卡名,沒有其他任何網絡卡、IP、路由等資訊,需要使用者為Docker容器新增網絡卡、配置IP等。這種模式如果不進行特定的配置是無法正常使用的,但是優點也非常明顯,它給了使用者最大的自由度來自定義容器的網路環境。

Ø  預設情況下,docker安裝成功之後,docker daemon會建立在3個網路,分別是bridge,hostnone,分別使用bridge,hostnull驅動,這3種內建的預設網路是無法使用docker network rm進行刪除的:

blob.png

Ø  使用如下命令建立和刪除network,預設驅動為bridge,可通過-d host指定驅動型別為host,或通過-d指定其他網路型別(host,overlay,null,remote)

docker network create frontend

docker network rm frontend

blob.png

建立bridge型別的network後,會在host上生產對應的bridgebridge名稱為br-networkID

blob.png

blob.png

Ø  使用如下命令執行一個容器,沒有指定連線哪個network,預設連線到名為bridgenetwork上,會在host上生成veth的網絡卡,檢視bridge資訊,可以看到此veth介面連線在預設的docker bridge上面,如果容器未執行,主機上不會存在容器對應的網絡卡:

docker run -it -d 35b925abf710 bash

blob.png

Ø  使用如下命令執行一個容器,指定容器的網絡卡連線到backend這個network上,可以看到容器的後端網絡卡連線到了新的bridge

docker run -it -d --network backend 35b925abf710 bash

blob.png

blob.png

登陸到容器中檢視容器的IP地址,可以看到連線到不同bridge的容器網絡卡,分配了不同網段的IP地址,彼此無法通訊

blob.png

Ø  通過以下命令可以為容器新增網絡卡,並指定連線到特定的network

docker network connect bridge 19226ae822cf

blob.png

Ø  建立或執行容器時指定IP地址--ip

此場景只有在使用者自定義網路的情況下支援

blob.png

 

七、docker私有映象倉庫管理

centos7系統中可通過安裝docker-registry包構建私有映象倉庫,docker-registry安裝之後會生成/etc/docker-distribution/registry/config.yml配置檔案,通過以下命令啟用私有映象倉庫服務:

registry serve /etc/docker-distribution/registry/config.yml >> /var/log/docker-registry.log 2>&1 &

服務啟動之後會預設監聽5000埠提供服務:

blob.png

執行以下命令檢查registry服務是否正常:

curl http://9.38.91.200:5000/v2/_catalog

blob.png

 

八、Dockerd相關引數

l  dockerd預設配置檔案:/etc/systemd/system/docker.service.d/docker.conf

l  dockerd服務端預設監聽本地的unix:///var/run/docker.sock套接字,要指定監聽的TCP/IP協議棧上,可以使用dockerd的啟動選項: -H, --host=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or unix://[/path/to/socket] to use.

l  docker客戶端預設通過本地unix:///var/run/docker.sock套接字向服務端傳送命令

l  新版本的docker daemon程序為/usr/bin/dockerd,只負責提供對客戶端API的支援;容器生命週期管理單獨放到docker-containerd中進行管理,防止dockerd程序異常時對容器的影響。

沒有執行任何容器時,系統執行dockerd程序:

blob.png

啟動容器之後,系統會啟一個新的docker-containerd-shim程序管理維護容器生命週期:

blob.png

l  docker daemon預設允許同一個bridge內的容器及主機互相通訊,可以通過dockerd選項禁止容器間通訊:--icc=true|false.

容器之間需要通訊,可以通過link的方式進行通訊

blob.png

l  設定容器內MTU,預設為0,在容器內為1500--mtu=0

l  dockerd的啟動選項--dns=IPADDR指定使用指定的預設DNS伺服器,此引數也可以在容器執行時指定。預設配置如下:

blob.png

l  dockerd的啟動選項--dns-search=DOMAIN指定容器的預設搜尋域,也可以在容器建立或執行時指定

容器執行或建立時的選項:

-h OR --hostname=HOSTNAME    ##配置容器主機名

九、docker-compose使用方法

docker官方推出的複雜系統編排工具,可以靈活的對各種容器資源實現定義和管理,快速建立和管理基於docker容器的應用叢集。

docker-compose通過一個單獨的docker-compose.yml模板檔案來定義一組相互關聯的應用容器作為一個專案,其中包含2個概念:

n  服務service:一個應用的容器,可以包含為若干執行相同映象的容器例項

n  專案project:一組相互關聯的應用容器組成的一個完整業務單元。

 

十、常見問題

1.       docker容器中的服務使用systemctl命令時報錯:Failed to get D-Bus connection: Operation not permitted

【問題原因】:容器不支援完整的service management system,管理服務的時候建議直接使用service daemo操作

2.         使用如下CMD通過dockerfile build httpd映象

CMD ["/usr/sbin/httpd",”-D”,” FOREGROUND”]