Docker管理之碎片知識整理小結

一、概述

本文旨在匯總整理Docker日常管理之知識碎片,以便日後回顧查看參考。

二、應用示例

2.1、Docker容器隔離之Namespace

Namespace:是容器虛擬化依賴的Linux 主要核心技術,用於各容器之間的隔離。主要通過以下六項隔離技術來實現:有兩個偽文件系統:/proc和/sys/

UTS: 允許每個container擁有獨立的hostname(主機名)和domainname(域名),使其在網絡上可以被視作一個獨立的節點而非Host上的一個進程。

IPC:contaner中進程交互還是采用linux常見的進程間交互方法,包括常見的信號量,消息隊列和共享內存。container的進程間交互實際上還是host上具有相同pid中的進程交互。

● PID:不同用戶的進程就是通過pid namesapce隔離開的,且不同namespace中可以有相同pid。所有的LXC(linux containers)進程在docker中的父進程為docker進程,每個LXC進程具有不同的namespace。

● NET:

● MNT:文件系統的掛載點。

● USRE:每個container可以有不同的user和groupid,也就是說可以在container內部用container內部的用戶執行程序而非Host上的用戶。

2.2、Docker之自由限制cgroup

eg1:docker run -it -m 200M –memory-swap 300M centos //-m或–memory:設置內存的使用限額,–memory-swap:設置swap(交換分區)的使用限額

eg2: docker run -it –name containerB -c 512 centos //containerB,cpu權重限制為512;-c或者–cpu-shares設置容器實驗cpu的權重。如果不設置默認是1024

eg3: docker run -it –name testA –device-write-bps /dev/sda:30MB centos //容器testA限制該磁盤每秒寫入的數量為為30MB;

其他參數:

-bps:每秒讀寫的數據量。byte per second
-iops:每秒io的次數。 io per second

–device-read-bps:設置讀取設備的bps
–device-write-bps:設置寫入設備的bps

–device-read-iops:設置讀取設備的iops
–device-write-iops:設置寫入設備的iops

2.3、給運行中的容器設置端口映射

有時我們想不停止容器的情況下,調整容器映射端口,那怎樣在容器使用中,映射容器內應用的服務端口到本機宿主機器呢?

當容器中運行一些網絡應用,要讓外部訪問這些應用時,可以通過 -P 或 -p 參數兩種方式來指定端口映射。使用 -P(大) 參數時,Docker 會隨機映射一個宿主本地端口到內部容器開放的網絡端口上;使用 -p(小) 參數時,可以指定要映射的端口,並且在一個指定的端口上隻可以綁定一個容器。支持的格式有:

IP:HostPort:ContainerPort
IP:ContainerPort
HostPort:ContainerPort

下面我們來分別舉例說明:

eg1:docker run -d -P nginx //docker ps查看會發現,宿主機本地的隨機分配瞭一個 3**** 端口被映射到瞭容器的 80 端口上,在本機瀏覽器訪問 http://localhost:3**** 就會出現 nginx 歡迎頁面

eg2:docker run -d -p 8080:80 nginx //使用 docker ps 可看到,本地主機的 8080 端口被映射到瞭容器的 80 端口

驗證:命令格式:docker port CONTAINER [PRIVATE_PORT[/PROTO]]

使用 docker inspect + 容器ID 獲取容器的具體信息:

eg3:給運行中的容器添加映射端口

docker inspect \`container_name` | grep IPAddress   //將container_name 換成實際環境中的容器名,獲得容器的IP地址

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 //將容器的8000端口映射到docker主機的8001端口

或:
docker commit container_id foo/live  //提交一個運行中的容器為鏡像

docker run -d -p 8000:80 foo/live /bin/bash  //運行鏡像並添加端口映射,宿主8000到容器80,

2.4、修改運行中docker容器中的內容

docker中宿主機與容器(container)互相拷貝傳遞文件

docker cp mycontainer:/opt/testnew/file.txt /opt/test/  //從容器拷貝文件到宿主機

docker cp /opt/test/file.txt mycontainer:/opt/testnew/   //從宿主機拷貝文件到容器

sudo docker commit -m "描述內容" -a "author name" 32555789dd00 aipaper/devinz83:v2  //-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a 可以指定更新的用戶信息;之後是用來創建鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。創建成功後會返回這個鏡像的 ID 信息

docker images  //驗證
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應用

註:不管容器有沒有啟動,docker cp都會生效;完成後,使用 docker commit 命令來提交更新後的副本。

之後更新容器的yml文件,更新image為新的對象:

在這裡插入圖片描述

2.5、Docker容器遷移到其他服務器

有時我們會由於各種原因,比如硬件升級、數據中心變化,資源限制等因素,需要將當前docker容器所在遷移到其他資源池或主機。

1)導出和導入容器:

導出容器:即從容器的文件系統創建壓縮文件,導出的文件保存為“gzip”文件;之後通過文件傳輸工具(如scp或rsync)將壓縮文件復制到新服務器。再在新服務器中,將這個gzip文件導入到一個新容器中。

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”命令訪問在新服務器中創建的新容器

:導出容器工具的一個缺點是,它不導出容器的端口和變量,也不導出包含容器的底層數據。當嘗試在另一臺服務器中加載容器時,這可能會導致錯誤。對此,我們可另考慮使用Docker鏡像遷移來將容器從一臺服務器遷移到另一臺服務器。

2)容器鏡像遷移:

即我們遷移容器關聯到的鏡像到新的資源池,這也是將Docker容器遷移到另一臺服務器的最常用方法。對於要遷移的容器,首先使用“Docker commit”命令將其Docker鏡像保存到壓縮文件中。

docker commit container-id image-name  //生成的鏡像將被壓縮

之後將上述鏡像上傳到新服務器上,在新服務器中,將使用“docker run”創建一個新容器。
使用此方法,數據卷不會被遷移,但它會保留,在容器內創建的應用程序的數據。

3)先保存,再加載鏡像

docker鏡像是應用程序的代碼、庫、配置文件等的包。Docker容器是由這些鏡像創建的。

可以使用“docker save”壓縮鏡像並將其遷移到新服務器。之後在新服務器中,使用“docker load”將壓縮鏡像文件用於創建新鏡像。

docker save image-name > image-name.tar

cat image-name.tar | docker load

4)遷移數據卷:

Docker容器中的數據卷是共享目錄,其中包含特定於容器的數據。卷中的數據是持久的,在容器重新創建期間不會丟失。

使用導出或提交工具將Docker容器或鏡像從一臺服務器遷移到另一臺服務器時,不會遷移基礎數據卷。在這種情況下,包含數據的目錄將手動遷移到新服務器。然後在新服務器創建容器,引用該目錄作為其數據卷。

另一個簡單的方法是通過在“docker run”命令中傳遞“-volumes from”參數來備份和恢復數據卷。

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,此命令提供數據卷的備份。要指定工作目錄,還可以指定-w/backup。在/backup文件夾中生成的備份可以通過scp或ftp工具復制到新服務器。然後提取復制的備份並將其還原到新容器中的數據卷中。

5)遷移整個Docker容器:

以上方法僅適用於單個容器。但是將所有容器都要從一臺服務器遷移到另一臺服務器的情況下,我們采用另一種方法。此方法包括將整個docker目錄(“/var/lib/docker”)復制到新服務器。為瞭使這種方法成功,需要確定幾個關鍵點。

1、保留文件夾的權限和所有權。
2、遷移前停止Docker服務。
3、驗證兩臺服務器中的Docker版本是否兼容。
4、遷移前後驗證容器列表和功能。
5、環境變量和其他配置文件的路徑。
6、如果此方法由於任何故障而無法工作,我們將配置自定義腳本以將容器和鏡像從一臺服務器遷移到另一臺服務器。

2.6、查看docker鏡像中文件

docker attach ContainerID  //需要對應的container是運行中的,不處於stop狀態

##對於未運行的,可以把Docker鏡像中的文件復制到宿主來看,示例如下
sudo docker cp nginx-ubuntu-container:/etc/apt/sources.list ~/Documents/  

2.7、運行容器:docker run常用選項

語法:docker run [option] 鏡像名 [向啟動容器中傳入的命令]

常用可選參數說明:

  • -i 表示以“交互模式”運行容器
  • -t 表示容器啟動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即 分配一個偽終端。
  • –name 為創建的容器命名
  • -v 表示目錄映射關系(前者是宿主機目錄,後者是映射到宿主機上的目錄,即 宿主機目錄:容器中目錄),可以使 用多個-v 做多個目錄或文件映射。註意:最好做目錄映射,在宿主機上做修改,然後 共享到容器上。
  • -d 在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不 會自動登錄容器,如果隻加-i -t 兩個參數,創建後就會自動進去容器)。
  • -p 表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多個-p 做多個端口映射
  • -e 為容器設置環境變量
  • –network=host 表示將主機的網絡環境映射到容器中,容器的網絡與主機相同

到此這篇關於Docker管理之碎片知識整理小結的文章就介紹到這瞭,更多相關Docker管理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: