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