Docker管理之碎片知識整理小結(jié)
一、概述
本文旨在匯總整理Docker日常管理之知識碎片,以便日后回顧查看參考。
二、應(yīng)用示例
2.1、Docker容器隔離之Namespace
Namespace:是容器虛擬化依賴的Linux 主要核心技術(shù),用于各容器之間的隔離。主要通過以下六項(xiàng)隔離技術(shù)來實(shí)現(xiàn):有兩個偽文件系統(tǒng):/proc和/sys/
● UTS: 允許每個container擁有獨(dú)立的hostname(主機(jī)名)和domainname(域名),使其在網(wǎng)絡(luò)上可以被視作一個獨(dú)立的節(jié)點(diǎn)而非Host上的一個進(jìn)程。
● IPC:contaner中進(jìn)程交互還是采用linux常見的進(jìn)程間交互方法,包括常見的信號量,消息隊(duì)列和共享內(nèi)存。container的進(jìn)程間交互實(shí)際上還是host上具有相同pid中的進(jìn)程交互。
● PID:不同用戶的進(jìn)程就是通過pid namesapce隔離開的,且不同namespace中可以有相同pid。所有的LXC(linux containers)進(jìn)程在docker中的父進(jìn)程為docker進(jìn)程,每個LXC進(jìn)程具有不同的namespace。
● NET:
● MNT:文件系統(tǒng)的掛載點(diǎn)。
● USRE:每個container可以有不同的user和groupid,也就是說可以在container內(nèi)部用container內(nèi)部的用戶執(zhí)行程序而非Host上的用戶。
2.2、Docker之自由限制cgroup
eg1:docker run -it -m 200M --memory-swap 300M centos //-m或–memory:設(shè)置內(nèi)存的使用限額,–memory-swap:設(shè)置swap(交換分區(qū))的使用限額
eg2: docker run -it --name containerB -c 512 centos //containerB,cpu權(quán)重限制為512;-c或者–cpu-shares設(shè)置容器實(shí)驗(yàn)cpu的權(quán)重。如果不設(shè)置默認(rèn)是1024
eg3: docker run -it --name testA --device-write-bps /dev/sda:30MB centos //容器testA限制該磁盤每秒寫入的數(shù)量為為30MB;
其他參數(shù):
-bps:每秒讀寫的數(shù)據(jù)量。byte per second
-iops:每秒io的次數(shù)。 io per second--device-read-bps:設(shè)置讀取設(shè)備的bps
--device-write-bps:設(shè)置寫入設(shè)備的bps--device-read-iops:設(shè)置讀取設(shè)備的iops
--device-write-iops:設(shè)置寫入設(shè)備的iops
2.3、給運(yùn)行中的容器設(shè)置端口映射
有時我們想不停止容器的情況下,調(diào)整容器映射端口,那怎樣在容器使用中,映射容器內(nèi)應(yīng)用的服務(wù)端口到本機(jī)宿主機(jī)器呢?
當(dāng)容器中運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部訪問這些應(yīng)用時,可以通過 -P 或 -p 參數(shù)兩種方式來指定端口映射。使用 -P(大) 參數(shù)時,Docker 會隨機(jī)映射一個宿主本地端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口上;使用 -p(?。?參數(shù)時,可以指定要映射的端口,并且在一個指定的端口上只可以綁定一個容器。支持的格式有:
IP:HostPort:ContainerPort
IP:ContainerPort
HostPort:ContainerPort
下面我們來分別舉例說明:
eg1:docker run -d -P nginx //docker ps查看會發(fā)現(xiàn),宿主機(jī)本地的隨機(jī)分配了一個 3**** 端口被映射到了容器的 80 端口上,在本機(jī)瀏覽器訪問 http://localhost:3**** 就會出現(xiàn) nginx 歡迎頁面
eg2:docker run -d -p 8080:80 nginx //使用 docker ps 可看到,本地主機(jī)的 8080 端口被映射到了容器的 80 端口
驗(yàn)證:命令格式:docker port CONTAINER [PRIVATE_PORT[/PROTO]]
使用 docker inspect + 容器ID 獲取容器的具體信息:
eg3:給運(yùn)行中的容器添加映射端口
docker inspect \`container_name` | grep IPAddress //將container_name 換成實(shí)際環(huán)境中的容器名,獲得容器的IP地址 iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 //將容器的8000端口映射到docker主機(jī)的8001端口 或: docker commit container_id foo/live //提交一個運(yùn)行中的容器為鏡像 docker run -d -p 8000:80 foo/live /bin/bash //運(yùn)行鏡像并添加端口映射,宿主8000到容器80,
2.4、修改運(yùn)行中docker容器中的內(nèi)容
docker中宿主機(jī)與容器(container)互相拷貝傳遞文件
docker cp mycontainer:/opt/testnew/file.txt /opt/test/ //從容器拷貝文件到宿主機(jī) docker cp /opt/test/file.txt mycontainer:/opt/testnew/ //從宿主機(jī)拷貝文件到容器 sudo docker commit -m "描述內(nèi)容" -a "author name" 32555789dd00 aipaper/devinz83:v2 //-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a 可以指定更新的用戶信息;之后是用來創(chuàng)建鏡像的容器的 ID;最后指定目標(biāo)鏡像的倉庫名和 tag 信息。創(chuàng)建成功后會返回這個鏡像的 ID 信息 docker images //驗(yàn)證 REPOSITORY TAG aipaper/devinz83 v2 #修改容器配置文件yaml vi /opt/docker/yml/docker-compose-resty-redis.yml docker stack deploy --compose-file=/opt/docker/yml/docker-compose-resty-redis.yml resty_redis //使用新修改后的鏡像部署了docker應(yīng)用
注:不管容器有沒有啟動,docker cp都會生效;完成后,使用 docker commit 命令來提交更新后的副本。
之后更新容器的yml文件,更新image為新的對象:
2.5、Docker容器遷移到其他服務(wù)器
有時我們會由于各種原因,比如硬件升級、數(shù)據(jù)中心變化,資源限制等因素,需要將當(dāng)前docker容器所在遷移到其他資源池或主機(jī)。
1)導(dǎo)出和導(dǎo)入容器:
導(dǎo)出容器:即從容器的文件系統(tǒng)創(chuàng)建壓縮文件,導(dǎo)出的文件保存為“gzip”文件;之后通過文件傳輸工具(如scp或rsync)將壓縮文件復(fù)制到新服務(wù)器。再在新服務(wù)器中,將這個gzip文件導(dǎo)入到一個新容器中。
docker export container-name | gzip > container-name.gz zcat container-name.gz | docker import - container-name docker run -d container-name /bin/bash //使用“docker run”命令訪問在新服務(wù)器中創(chuàng)建的新容器
注:導(dǎo)出容器工具的一個缺點(diǎn)是,它不導(dǎo)出容器的端口和變量,也不導(dǎo)出包含容器的底層數(shù)據(jù)。當(dāng)嘗試在另一臺服務(wù)器中加載容器時,這可能會導(dǎo)致錯誤。對此,我們可另考慮使用Docker鏡像遷移來將容器從一臺服務(wù)器遷移到另一臺服務(wù)器。
2)容器鏡像遷移:
即我們遷移容器關(guān)聯(lián)到的鏡像到新的資源池,這也是將Docker容器遷移到另一臺服務(wù)器的最常用方法。對于要遷移的容器,首先使用“Docker commit”命令將其Docker鏡像保存到壓縮文件中。
docker commit container-id image-name //生成的鏡像將被壓縮
之后將上述鏡像上傳到新服務(wù)器上,在新服務(wù)器中,將使用“docker run”創(chuàng)建一個新容器。
使用此方法,數(shù)據(jù)卷不會被遷移,但它會保留,在容器內(nèi)創(chuàng)建的應(yīng)用程序的數(shù)據(jù)。
3)先保存,再加載鏡像
docker鏡像是應(yīng)用程序的代碼、庫、配置文件等的包。Docker容器是由這些鏡像創(chuàng)建的。
可以使用“docker save”壓縮鏡像并將其遷移到新服務(wù)器。之后在新服務(wù)器中,使用“docker load”將壓縮鏡像文件用于創(chuàng)建新鏡像。
docker save image-name > image-name.tar cat image-name.tar | docker load
4)遷移數(shù)據(jù)卷:
Docker容器中的數(shù)據(jù)卷是共享目錄,其中包含特定于容器的數(shù)據(jù)。卷中的數(shù)據(jù)是持久的,在容器重新創(chuàng)建期間不會丟失。
使用導(dǎo)出或提交工具將Docker容器或鏡像從一臺服務(wù)器遷移到另一臺服務(wù)器時,不會遷移基礎(chǔ)數(shù)據(jù)卷。在這種情況下,包含數(shù)據(jù)的目錄將手動遷移到新服務(wù)器。然后在新服務(wù)器創(chuàng)建容器,引用該目錄作為其數(shù)據(jù)卷。
另一個簡單的方法是通過在“docker run”命令中傳遞“-volumes from”參數(shù)來備份和恢復(fù)數(shù)據(jù)卷。
docker run --rm --volumes-from datavolume-name -v $(pwd):/backup image-name tar cvf backup.tar /path-to-datavolume docker run --rm --volumes-from datavolume-name -v $(pwd):/backup image-name bash -c "cd /path-to-datavolume && tar xvf /backup/backup.tar --strip 1"
上述命令中:datavolume-name是/path/to/volume,此命令提供數(shù)據(jù)卷的備份。要指定工作目錄,還可以指定-w/backup。在/backup文件夾中生成的備份可以通過scp或ftp工具復(fù)制到新服務(wù)器。然后提取復(fù)制的備份并將其還原到新容器中的數(shù)據(jù)卷中。
5)遷移整個Docker容器:
以上方法僅適用于單個容器。但是將所有容器都要從一臺服務(wù)器遷移到另一臺服務(wù)器的情況下,我們采用另一種方法。此方法包括將整個docker目錄(“/var/lib/docker”)復(fù)制到新服務(wù)器。為了使這種方法成功,需要確定幾個關(guān)鍵點(diǎn)。
1、保留文件夾的權(quán)限和所有權(quán)。
2、遷移前停止Docker服務(wù)。
3、驗(yàn)證兩臺服務(wù)器中的Docker版本是否兼容。
4、遷移前后驗(yàn)證容器列表和功能。
5、環(huán)境變量和其他配置文件的路徑。
6、如果此方法由于任何故障而無法工作,我們將配置自定義腳本以將容器和鏡像從一臺服務(wù)器遷移到另一臺服務(wù)器。
2.6、查看docker鏡像中文件
docker attach ContainerID //需要對應(yīng)的container是運(yùn)行中的,不處于stop狀態(tài) ##對于未運(yùn)行的,可以把Docker鏡像中的文件復(fù)制到宿主來看,示例如下 sudo docker cp nginx-ubuntu-container:/etc/apt/sources.list ~/Documents/
2.7、運(yùn)行容器:docker run常用選項(xiàng)
語法:docker run [option] 鏡像名 [向啟動容器中傳入的命令]
常用可選參數(shù)說明:
- -i 表示以“交互模式”運(yùn)行容器
- -t 表示容器啟動后會進(jìn)入其命令行。加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進(jìn)去。即 分配一個偽終端。
- --name 為創(chuàng)建的容器命名
- -v 表示目錄映射關(guān)系(前者是宿主機(jī)目錄,后者是映射到宿主機(jī)上的目錄,即 宿主機(jī)目錄:容器中目錄),可以使 用多個-v 做多個目錄或文件映射。注意:最好做目錄映射,在宿主機(jī)上做修改,然后 共享到容器上。
- -d 在run后面加上-d參數(shù),則會創(chuàng)建一個守護(hù)式容器在后臺運(yùn)行(這樣創(chuàng)建容器后不 會自動登錄容器,如果只加-i -t 兩個參數(shù),創(chuàng)建后就會自動進(jìn)去容器)。
- -p 表示端口映射,前者是宿主機(jī)端口,后者是容器內(nèi)的映射端口??梢允褂枚鄠€-p 做多個端口映射
- -e 為容器設(shè)置環(huán)境變量
- --network=host 表示將主機(jī)的網(wǎng)絡(luò)環(huán)境映射到容器中,容器的網(wǎng)絡(luò)與主機(jī)相同
到此這篇關(guān)于Docker管理之碎片知識整理小結(jié)的文章就介紹到這了,更多相關(guān)Docker管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Docker部署Tomcat的實(shí)現(xiàn)示例
在本地編寫好了Spring項(xiàng)目,為了實(shí)現(xiàn)能夠隨時地訪問,所以需要將項(xiàng)目部署到服務(wù)器,本文主要介紹了使用Docker部署Tomcat的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Ubuntu Docker 的安裝部署及簡單應(yīng)用
這篇文章主要介紹了Ubuntu Docker 的安裝部署的相關(guān)資料,這里說明介紹了詳細(xì)的步驟,需要的朋友可以參考下2016-10-10Docker部署Django+Mysql+Redis+Gunicorn+Nginx的實(shí)現(xiàn)
這篇文章主要介紹了Docker 部署 Django+Mysql+Redis+Gunicorn+Nginx,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Docker安裝并使用Mysql的詳細(xì)教程(實(shí)測可用!)
在日常的工作中經(jīng)常會需要將數(shù)據(jù)存在服務(wù)器,經(jīng)常用到的數(shù)據(jù)庫是mysql,下面這篇文章主要給大家介紹了關(guān)于Docker安裝并使用Mysql的詳細(xì)教程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Docker多平臺安裝與配置指南的實(shí)現(xiàn)
這篇文章主要介紹了Docker多平臺安裝與配置指南的實(shí)現(xiàn),深入研究了Docker在Linux、Windows、和macOS等不同平臺上的安裝過程及Docker鏡像管理、容器運(yùn)維、使用Docker Compose進(jìn)行多容器管理,以及網(wǎng)絡(luò)與數(shù)據(jù)管理等,感興趣的可以了解一下2024-01-01Docker內(nèi)如何訪問本機(jī)(宿主機(jī))的具體方法
這篇文章主要介紹了Docker內(nèi)如何訪問本機(jī)(宿主機(jī))的具體方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10