1. 程式人生 > >Docker管理

Docker管理

【Docker映象管理】

docker pull centos//可以下載centos映象,速度很慢

所以下面提供一個阿里雲的映象加速方案

vim /etc/docker/daemon.json//加入如下內容

{

"registry-mirrors": ["https://cj3j46sn.mirror.aliyuncs.com"]

}

說明:這個url為加速器地址,是我自己申請的

加好了之後

systemctl daemon-reload

systemctl restart docker

配置完加速器,重啟docker服務,再次docker pull centos會快很多

docker images

檢視本地的映象

docker search xxx //搜尋映象,其中xxx是關鍵詞

docker tag centos aming123 //給映象打標籤(等於拷貝了一個新的映象,然後重新命名了)

docker tag centos aming123:123456 //這裡是針對TAG列修改的

docker run -itd centos //把映象啟動為容器,-i表示讓容器的標準輸入開啟,-t表示分配一個偽終端,-d表示後臺啟動,要把-i -t -d 放到映象名字前面

docker stop 容器id 或者 docker rm 容器id  //這兩種方式停止容器

docker ps //檢視執行的容器,加上-a選項後可以檢視所有容器,包括未執行的

docker rmi centos:latest //用來刪除指定映象, 其中後面的引數可以是tag,如果是tag時,實際上是刪除該tag。

                                       //當後面的引數為映象ID時,則會徹底刪除整個映象,所有標籤也會一同刪除

【Docker通過容器建立映象】

docker run啟動容器後,可以通過下面命令進入容器

docker exec -it xxxxx  bash//其中xxxxx為容器id,這個id可以用docker ps檢視,最後面的bash為進入容器後我們要執行的命令,這樣就可以開啟一個終端

進入到該容器中,我們做一些變更,比如安裝一些東西,然後針對這個容器進行建立新的映象

在容器中執行 yum install -y net-tools,然後ctrl d退出容器

docker commit -m "一些改動資訊"  -a "作者相關資訊可以不加" 容器id(container_id) 最後新映象的名字 //container_id通過docker ps -a獲取

例如:  docker commit -m "install net-tools" -a "Aming" 2c74d574293f centos_with_nettool 這個命令有點像svn的提交,-m 加一些改動資訊,-a 指定作者相關資訊  2c74d這一串為容器id,再後面為新映象的名字

【Docker使用模板建立映象】

首先去下載一個模板

匯入該映象的命令為:

cat centos-6-x86-minimal.tar.gz|docker import - centos6

docker images檢視匯入的映象

把現有映象,匯出為一個檔案:

docker save -o aming-centos.tar aming

我們還可以用該檔案恢復本地映象:

docker load --input aming-centos.tar  或者

docker load < aming-centos.tar

docker push image_name  //可以把自己的映象傳到dockerhub官方網站上去,但前提是需要先註冊一個使用者,後續如果有需求再研究吧

【Docker容器管理】

docker create  -it  centos6   bash //這樣可以建立一個容器,但該容器並沒有啟動

docker start   container_id   //啟動容器後,可以使用 docker ps  檢視到,有start 就有stop,和restart

之前我們使用的docker run 相當於先create再start

docker run -it centos bash  

這樣進入了一個虛擬終端裡面,我們可以執行一些命令,使用命令exit或者ctrl d 退出該bash,當退出後這個容器也會停止。

docker run -d  可以讓容器在後臺執行

比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

docker run --name web -itd centos bash // --name 給容器自定義名字

docker run --rm -it centos bash -c "sleep 30" //--rm 可以讓容器退出後直接刪除,在這裡命令執行完容器就會退出

docker logs 可以獲取到容器的執行歷史資訊,用法如下

docker logs  container_id  

docker attach 可以進入一個後臺執行的容器,比如

docker attach  container_id    //但是attach命令不算好用,比如我們想要退出終端,就得exit了,這樣容器也就退出了,還有一種方法

docker exec -it container_id  bash  //可以臨時開啟一個虛擬終端,並且exit後,容器依然執行著

docker rm  container_id  //container_id是ps的時候檢視到的,這樣就可以把container刪除,如果是執行的容器,可以加-f

docker  export  container_id  > file.tar  // 匯出容器,可以遷移到其他機器上,需要匯入

cat file.tar |docker import - aming_test   //這樣會生成aming_test的映象

【Docker搭建私有倉庫管理】

搭建前先做:

更改配置檔案,vi /etc/docker/daemon.json//更改為

{ "insecure-registries":["192.168.2.30:5000"] }    

原因是預設傳輸是需要https的,但測試環境不需要,加這條,就會忽略掉https,裡面ip是宿主機ip

systemctl restart docker

這裡要注意,如果有多條內容,如還有加速器,要像下面這麼加,別忘了除了最後一行都要逗號

{

  "registry-mirrors": ["https://cj3j46sn.mirror.aliyuncs.com"],

  "insecure-registries":["192.168.2.30:5000"]

}

接下來開始搭建

docker pull registry   //下載registry 映象,registy為docker官方提供的一個映象,我們可以用它來建立本地的docker私有倉庫。

docker run -d -p 5000:5000 registry   //以registry映象啟動容器,-p會把容器的埠對映到宿主機上,:左邊為宿主機監聽埠,:右邊為容器監聽埠

curl 127.0.0.1:5000/v2/_catalog //可以訪問它

下面我們來把其中一個映象上傳到私有倉庫

docker tag aming_test  192.168.2.30:5000/centos //標記一下tag,必須要帶有私有倉庫的ip:port

docker push 192.168.2.30:5000/centos //把標記的映象給推送到私有倉庫

curl 127.0.0.1:5000/v2/_catalog //可以檢視到推送上來的映象

docker pull 192.168.2.30:5000/centos //指定從私有地址獲取映象

【Docker資料管理】

1. 掛載本地的目錄到容器裡

docker run -tid -v /data/:/data 映象 bash //-v 用來指定掛載目錄,:前面的/data/為宿主機本地目錄,:後面的/data/為容器裡的目錄,會在容器中自動建立

2. 掛載資料卷

其實我們掛載目錄的時候,可以指定容器name,如果不指定就隨機定義了。比如上面我們沒有指定,它就生成了一個名字為relaxed_franklin,這個名字可以使用命令 docker ps  看最右側一列

docker run -itd --volumes-from 容器name  映象 bash

這樣,我們使用aming123映象建立了新的容器,並且使用了 relaxed_franklin  容器的資料卷

3. 定義資料卷容器

有時候,我們需要多個容器之間相互共享資料,類似於linux裡面的NFS,所以就可以搭建一個專門的資料卷容器,然後其他容器直接掛載該資料卷。

首先建立資料卷容器

docker run -itd -v /data/ --name testvol centos  bash  //注意這裡的/data/是容器的/data目錄,並非本地的/data/目錄。 

然後讓其他容器掛載該資料卷

docker run -itd  --volumes-from testvol aming123 bash

總結:

資料管理-------------------

docker run -tid -v /data/:/data 映象 bash //建立容器時定義掛載的本地目錄對應容器內的目錄(左宿主機:右容器)

docker run -itd --volumes-from 容器name  映象 bash //我的理解:通過上一條命令產生的容器,也弄一個跟他一樣掛載本地目錄的容器

docker run -itd -v /data/ --name 自定義名字  映象 bash //我的理解:建立一個容器,這個容器的/data/目錄是用來存放資料的,後續如果建立其他容器時--volumes-from 加這個容器的名字,那麼資料實際就是在這臺容器上,而不是其他容器上。

【Docker資料卷的備份與恢復】(囉嗦不常用,理解即可)

備份------

mkdir /data/backup

docker run --volumes-from testvol -v  /data/backup/:/backup centos tar cvf  /backup/data.tar /data/

說明:首先我們需要使用testvol資料卷新開一個容器,同時我們還需要把本地的/vol_data_backup/目錄掛載到該容器的/backup下,這樣在容器中/backup目錄裡面新建的檔案,我們就可以直接在/data/backup/目錄中看到了。 然後再把/data/目錄下面的檔案打包到成data.tar檔案放到/backup目錄下面。

恢復------

思路: 先新建一個數據卷容器,再建一個新的容器並掛載該資料卷容器,然後再把tar包解包。

新建資料卷容器:docker run -itd -v /data/ --name testvol2 centos bash

掛載資料卷新建容器,並解包:docker run --volumes-from testvol2  -v /data/backup/:/backup centos tar xf /backup/data.tar

【Docker網路模式】

host模式,使用docker run時使用--net=host指定

docker使用的網路實際上和宿主機一樣,在容器內看到的網絡卡ip是宿主機ip

container模式,使用--net=container:container_id/container_name

多個容器使用共同的網路,看到的ip是一樣的

none模式,使用--net=none指定

這種模式下,不會配置任何網路

bridge模式,使用--net=bridge指定預設模式,不用指定預設就是這種網路模式。這種模式會為每個容器分配一個獨立的Network Namespace。類似於vmware的nat網路模式。同一個宿主機上的所有容器會在同一個網段下,相互之間是可以通訊的。

【Docker網路管理-外部訪問容器】

首先使用centos映象新建一個容器,然後在該容器中安裝httpd服務,並啟動

再把該容器導成一個新的映象(centos-httpd),然後再使用新映象建立容器,並指定埠對映

docker run -itd -p 5123:80 centos-httpd bash  //-p 可以指定埠對映,本例中將容器的80埠對映為本地的5123埠

docker exec -it container_id  bash 

啟動httpd: httpd -k start 

編輯1.html: vi /var/www/html/1.html 隨便寫點東西

退出該容器:exit

測試: curl 127.0.0.1:5123/1.html 

-p後面也支援IP:port:ip:port 的格式,比如

-p 127.0.0.1:8080:80 

也可以不寫本地的埠,只寫ip,這樣會隨意分配一個埠

-p 127.0.0.1::80 //注意這裡是兩個冒號

【Operation not permitted】

新建的容器,啟動nginx或者httpd服務的時候會報錯

Failed to get D-Bus connection: Operation not permitted

這是因為dbus-daemon沒有啟動,解決該問題可以這樣做

啟動容器時,要加上--privileged -e "container=docker" ,並且最後面的命令改為/usr/sbin/init

docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init

【Docker網路管理-配置橋接網路】(git上的第三方工具)

為了使本地網路中的機器和Docker容器更方便的通訊,我們經常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,我們只要將Docker容器和宿主機的網絡卡橋接起來,再給Docker容器配上IP就可以了。

cd /etc/sysconfig/network-scripts/; cp ifcfg-ens33  ifcfg-br0  #拷貝一個br0的配置

vi ifcfg-ens33:

增加BRIDGE=br0,

刪除(註釋)IPADDR,NETMASK,GATEWAY,DNS1,UUID,PREFIX

vi ifcfg-br0:

刪除(註釋)UUID

修改DEVICE為br0,

Type為Bridge

NAME=br0

DEVICE=br0

ens33的網路設定設定到這裡來

要注意如果ens33之前做過虛擬網絡卡的要刪掉,不然會影響

正常情況ens33是沒ip,而br0則代替了之前ens33的ip

systemctl restart network

安裝pipwork

cp pipework/pipework /usr/local/bin/

開啟一個容器

docker run -itd --net=none --name 自定義名   映象  bash

pipework br0  自定義名 192.168.2.40/[email protected]  #201為容器的ip,@後面的ip為閘道器ip

docker exec -it 自定義名 bash #進去後ifconfig檢視就可以看到新新增的ip