Docker入門基礎

1、離線環境安裝dockerpython

本實驗安裝環境以下:linux

l  Centos Linux release 7.5.1804web

blob.png

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

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

       安裝步驟:json

1.         掛載系統安裝鏡像,製做本地yumbootstrap

mount /dev/sr0 /mnt/vim

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

[base]centos

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

2、使用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

3、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導入容器實現容器遷移

4、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  掛載一個空目錄到容器的非空目錄,容器非空目錄中的內容將被隱藏

5、端口映射與容器互聯

容器中運行服務,須要向外提供服務的場景下,須要將容器的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是這個鏈接的別名

6、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

 

7、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

 

8、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    ##配置容器主機名

9、docker-compose使用方法

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

docker-compose經過一個單獨的docker-compose.yml模板文件來定義一組相互關聯的應用容器做爲一個項目,其中包含2個概念:

n  服務service:一個應用的容器,能夠包含爲若干運行相同鏡像的容器實例

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

 

10、常見問題

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」]

相關文章
相關標籤/搜索