Docker服務安裝和使用
Docker相關介紹
A)虛擬化
虛擬化我們可以簡單的理解為一種資源管理方式。有如下幾種虛擬化的方式: 完全虛擬化:對底層硬件實現完全虛擬。例如:Vmware Workstation 部分虛擬化:只對部分硬件資源的虛擬。 操作系統級虛擬化:內核通過創建多個虛擬操作系統實例來隔離各個進程。 docker就是屬於操作系統級的虛擬化。
B)Docker的理解
docker的思想來源於集裝箱,試問集裝箱解決了什么問題? 試想,在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標准化了,集裝箱和集裝箱之間不會相互影響。那么我就不需要專門運送水果的船和專門運送化學物品的船了。只要這些貨物在集裝箱里裝的好好的,那我就可以用一艘大船把它們都運走。 docker就是類似的理念。現在都流行雲計算了,雲計算就好比大貨輪,而docker就是集裝箱。
C)Docker的特點
docker 容器之間是相互隔離的。 docker 比較輕量,啟動非常快,秒級實現。資源利用率比較高,一台機器可以跑上千個docker容器,內核級別的虛擬化,不需要額外的hypevisor支持。 內核版本最低2.6.32-573.18.1.el6,centos至少在6.5或以上,容易遷移,平台依賴性不強,更快的交付和部署,一次創建配置,任意地方運行
D)Docker三板斧
1. 鏡像 Docker在英語當中的本意是“物件/碼頭工人”,docker容器的意思為物件的容器。關於鏡像,舉個簡單的例子,我們經常安裝的windows操作系統,先要從網上下載ISO鏡像文件,經解壓后才能安裝和使用。Docker也是一樣,我們要向創建docker容器,就需要創建容器的類似於ISO鏡像文件的docker鏡像文件。 2. 容器 關於容器,大家肯定並不陌生。沒錯,docker容器就是來管理不同架構的應用程序的。從本質上來說,容器是從鏡像創建的運行實例。容器與容器之間是相互隔離的,每個容器都是保證安全的平台。 3. 倉庫 倉庫是集中存放鏡像文件的場所,但是在這里要區分兩個概念:倉庫和倉庫服務注冊器。倉庫注冊服務器往往存放着多個倉庫,每個倉庫又包含着多個鏡像。 倉庫分為公開倉庫和私有倉庫,最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快速的訪問。 除此之外,用戶可以在本地網絡內創建一個私有倉庫。當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了。
容器、鏡像、倉庫三者轉換關系如下:
本人的docker純手工源碼編譯鏡像存儲:https://hub.docker.com/search?q=yangsir&type=image
一. docker 安裝方法
1. docker參考網址
Docker 官方網站 --------> https://www.docker.com/ Docker中文文檔 --------> http://www.dockerinfo.net/document
Docker安裝地址 --------> https://docs.docker.com/engine/install/centos Docker命令網址 --------> http://www.cnblogs.com/ivictor/archive/2015/09/08/4791274.html 注意:容器追求的是速度快,容器是用來跑服務的,提供計算能力,不是用來存儲大量文件的 Dockerhub : 是 docker 官方的鏡像存儲站點
2. Docker網絡分析
網絡幾種模式簡介如下: Host: 相當月VMware中的橋接模式網絡,與宿主機同一個網絡,使用宿主機的IP和端口,不會虛擬出自己的網卡,配置自己的IP,虛擬出自己的網卡。 Bridge(默認): 相當於Vmware中的Nat模式,容器使用獨立network Namespace,並連接到docker0虛擬網卡,通過docker0網橋以及Iptables nat表配置與宿主機通信。 None: 該模式將容器放置在它自己的網絡棧中,該模式關閉了容器的網絡功能,在個別情況下是有用的:容器並不需要網絡(例如只需要寫磁盤卷的批處理任務)。 Container: 新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。 自定義網絡: 一般為了避免和主機內網ip沖突,都會自定義bridge網絡或者其他網絡類型(由於生產環境用的阿里雲,所以基本上都采用自定義Bridge網絡)
3. centos7.X 安裝方法
方法一: yum remove docker docker-common docker-selinux docker-engine yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y yum-utils device-mapper-persistent-data lvm2 docker-ce systemctl start docker # 官方源 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo //擴展: //想安裝最新版本的 Docker CE 請使用以下命令: yum-config-manager --enable docker-ce-edge yum -y install docker-ce 方法二: //使用腳本安裝 curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun systemctl start docker -------------------------- 注:修改默認存儲路徑 //修改docker.services文件 cat /usr/lib/systemd/system/docker.service //在里面的EXECStart的后面增加后如下: ExecStart=/usr/bin/dockerd --graph /app/docker //若想對默認使用的網段進行修改,添加修改配置如下:(前提:IP盡量調整為不同於宿主機網段的ip地址,雖然網絡是隔離的,但是也有不可知的故障出現,有時會令你很崩潰)/ cat /etc/docker/daemon.json {"bip":"192.168.0.1/24"}
4. 修改docker安裝源
如果默認安裝的docker,下載鏡像比較慢時,可以進行修改docker源 Docker官方中國區 docker源 https://registry.docker-cn.com ustc docker源 https://docker.mirrors.ustc.edu.cn //推薦使用 json 配置文件的方式,默認為daemon.json
cat /etc/docker/daemon.json { "registry-mirrors":["https://registry.docker-cn.com"] }
//重新加載docker服務 ----------------------------------------------------------------------------------- 問題: 如果下載鏡像出現中斷,如下報錯 read tcp 50.17.62.194:443: connection reset by pee 解決辦法:(建議換上面提供的docker源后,並且添加強制解析IP) dig registry.docker-cn.com //找出對應解析ip cat /etc/hosts registry.docker-cn.com 106.14.52.175 //重新加載服務
二. docker 用法實戰
docker 常用參數
-i 以交互模式運行容器,通常與-t 同時使用;
-t 為容器重新分配一個偽輸入終端,通常與-i同時使用
--name 容器實例名 //容器命令語法(運行時,指定容器名字)
--h 自定義一個主機名(啟動時進行定義,這里的h,就是hostname)
-c 后面接待完成的命令
1. 下載centos鏡像方法
//下載 OS7.X系統鏡像,后面需要添加版本+日期,個別系統鏡像是沒有的 docker pull centos:7.2.1511 //下載OS6.X系統鏡像,后面只需要添加版本就行,還可以下載6.9版本,個別系統鏡像是沒有的 docker pull centos:6.8
2. 容器重命名
docker rename 舊容器名 新容器名 //隨時可以改名,但不要瞎改 docker run -it centos bash //這種方式,用exit退出,即停止容器運行
3. Docker 日志
docker log <container_ID | container_name>
4. 復制文件 將宿主機上的文件復制到容器內的目錄下(容器可以用ID或名字來表示)
docker cp a.sql web1:/root
5. 連接容器四種方法(不推薦第三種)
1) docker exec -it 這種是重新建立一個偽裝輸入終端,退出后,容器依然運行 2) docker exec web yum install apache 這種是可以在物理機上執行,容器里的安裝命令或其他的命令 3) docker attach <容器名> 這種連接一旦退出,容器意味着就停止了 note:如果這里連接上后,想要退出但不停止該容器,有一個快捷鍵“Ctrl + p + q” 4) ssh連接 需要在容器里 安裝 openssh-server a) //如果 還有出現自動閃退(退出)的現象,可以修改一下配置文件如下;如果沒有問題就不要修改了 cat /etc/ssh/sshd_config PermitRootLogin yes UsePAM no
b) //宿主機上控制容器內的命令使用 Eg:docker exec centos ls /
6. 刪除 container | image
docker rm <container_ID | container_name> docker rm -f <container_ID | container_name> 強制刪除,無論是否處於運行狀態 //若同一個鏡像ID具有多個不同的鏡像名字,有棄用的鏡像,可以刪除(棄用的鏡像名) 或 (棄用的鏡像名)+ (鏡像ID),不能單獨強制刪除鏡像ID,否則,所有的鏡像全部刪除了 //刪除方法如下: docker rmi <image_name> 刪除棄用的鏡像名 docker rmi -f <imange_id> 強制刪除此鏡像ID以及所依賴關聯的所有鏡像,切記謹慎操作,正常情況下,有容器在用鏡像,鏡像是刪除不掉的
7. 導出本地鏡像
語法: docker save -o <導出的鏡像名>.tar 本地鏡像名
docker save yangsir/centos > <image_name>.tar 或 docker save -o centos-httpd-docker-image.tar centos:httpd
8. 導入本地鏡像
docker load -i centos-httpd-docker-image.tar 或 docker load < centos-httpd-docker-image.tar
9. 修改鏡像標簽
docker tag <鏡像名 | 鏡像ID> <新的鏡像標簽名>
10. 端口映射
啟動container
docker run -d -p 9000:80 centos:httpd bash -c “/usr/local/bin/start.sh”
注意: -p 9000:80 把容器中的80端口映射到物理機上的9000端口
-c 主要是啟動添加進去的 httpd腳本
-c “while true; do httpd ; done” //也可以這樣來啟動
查看端口映射
docker port <container_ID | container_name>
映射完成后,用宿主機ip加映射端口就能訪問容器的網站頁面
容器里如果不能查看 ip 可以安裝一個軟件
yum install -y net-tools
11. docker容器默認存儲空間的修改
只能在運行容器時,指定;不指定,默認是10G
--storage-opt size=? 按Tab鍵,size就會出來
eg:如下進行啟動的時候,注意順序一定要把 這個“--storage-opt size=20G” 放到 前面,而且,這個存儲空間大小的配置也是有要求得,太小的話,會提示錯誤,容器啟動創建失敗
12. diff檢查發生變化的文件或目錄
docker diff container
這些變化包括添加(A-add),刪除(D-delete),修改(C-change)等
13. 查看容器運行的狀態
docker inspect --format {{.State.Running}} jenkins //已存在並且啟動中的容器狀態
true
docker inspect --format {{.State.Running}} jenkins //已存在並未啟動的容器狀態
false
docker inspect --format {{.State.Running}} nginx //不存在的容器狀態
Error: No such image, container or task: nginx
14. docker創建自定義網絡
創建網絡的方法: Usage: docker network COMMAND Commands: connect Connect a container to a network create Create a network disconnect Disconnect a container from a network inspect Display detailed information on one or more networks ls List networks rm Remove one or more networks 思路:容器無論是否在運行的狀態,均可以進行創建並配置使用自定義的網絡。 如果不指定網絡,默認用的是“bridge”,也就是172.17.0.0網段,建立連接后,里面會多一個新的網段,默認的網絡依然是存在的,但不影響使用,如果想撤銷自定義的網段使用,默認的網段(bridge)就可以用了 當然,在啟用新的自定義的網段后,原來的也可以去掉 默認啟動的容器是用bridge網段的,如果一旦取消僅用的bridge網段,重啟容器是有問題的,會報錯,需要添加網絡,進行重啟(至少有一個網絡) 查看現有的所有網絡。Docker默認用的是bridge,默認的網段是不允許創建固定ip的容器的,自定義的網路是可以配置 //docker network ls NETWORK ID NAME DRIVER SCOPE 1ebcc9d9be03 bridge bridge local 733756d48cff host host local 7ab8126c1468 my_test bridge local 29430ad2ad04 network_1 bridge local 12bd23dceb37 none null local 注意:若想要使用自定義的網絡,自己配置固定ip到容器里面,需要注意幾點: 1)在創建自定義網絡時,需要配置自定義subnet子網掩碼,啟動容器時方能用此網卡進行配置固定的指定的容器IP,否則是不允許創建 2)在創建自定義網絡時,也可以不配置subnet子網掩碼,但是用此網絡創建的容器ip,均是不固定的ip,也不能隨意指定 因此,如果不需要配置固定ip的網絡,可以參考如下: //創建自定義的 network_2 網絡 docker network create network_2 //如果,需要配置固定,指定的容器ip,可以參考如下,創建網絡 network_3,並且配置子網掩碼 docker network create network_3 --subnet 192.168.5.0/24 //配置容器使用自定義網絡,並配置固定的指定容器IP,附: --net 等同於 --network docker run -d --name web_test -p 90:80 --net network_3 --ip 192.168.5.10 docker.io/nginx:latest //配置 web2容器使用自定義的 network_2 網絡 docker network connect network_2 web2 //取消web2容器使用自定義的network_2 網絡 docker network disconnect network_2 web2 //顯示一個或多個網段的詳細信息 docker network inspect network_2 //刪除一個或多個網絡 docker network rm network_2 ================================================================= 維護docker虛擬網卡 eg:創建了類似於docker0的多余的虛擬網卡,需要刪除 //用ip命令使docker0網卡down掉,再執行刪除虛擬網卡 ip link set dev docker0 down brctl delbr docker0 linux-如何識別孤立的veth接口以及如何刪除它們 //查找所有的veth接口 //建議找對veth再進行刪除,或者先刪除veth接口,再刪除虛擬網卡 ifconfig | grep veth //刪除veth網絡設備的錯誤操作方法: ifconfig veth55d245e down brctl delbr veth55d245e can't delete bridge veth55d245e: Operation not permitted<br><br> //正確的操作刪除veth接口的方法,veth接口不是橋接器,所以當然你不能用brctl刪除它 ip link delete vetheb7a591
三. docker容器資源配額控制
1. 啟動docker容器時,指定cpu,內存,磁盤性能等的硬件資源使用份額
Docker 通過cgroup 來控制容器使用的資源,包括cpu,內存,磁盤三大方面,基本覆蓋了常見的資源和使用量控制。
為什么要進行硬件配額? 當多個容器運行時,防止某容器把所有的硬件都占用了。(比如一台被黑的容器)
例1:給容器實例分配512M 權重的cpu使用份額
docker run --help | grep cpu-shares -c,--cpu-shares int cpu shares (relative weight) cpu配額參數: -c,--cpu-shares int 在創建容器時指定容器所使用的cpu份額值。
cpu-shares 的值不能保證可以獲得1個vcpu或者多少GHz的cpu資源,僅僅只是一個彈性的加權值,不是絕對的,是相對的。
默認情況下,每個docker容器的cpu的份額都是1024.單獨一個容器的份額是沒有意義的,只有在同時運行多個容器時,容器的cpu加權的效果才能體現出來。
例如,:兩個容器A,B的cpu份額分別為1000和500,在cpu進行時間片分配的時候,容器A比容器B多一倍的機會獲得cpu的時間片,但分配的結果取決於當時主機和其他容器的運行狀態,實際上也無法保證容器A一定能獲得CPU時間片,
比如容器A的進程一直是空閑的,即使它的cpu份額是有50,它也可以獨占整個主機的cpu資源。
cgroups 只在容器分配的資源緊缺時, 也就是說 在需要對容器使用的資源進行限制時,才會生效。因此,無法單獨根據某個容器的cpu份額來確定有多少cpu資源分配給它,資源分配結果取決於同時運行的其他容器的cpu分配和容器中進程運行情況。
例2:給容器實例分配512權重的cpu使用份額
參數: --cpu-shares 512
docker run -dit --cpu-shares 512 centos bash //如果有別的參數,可以繼續添加
查看cpu分配結果
cat /sys/fs/cgroup/cpu/docker/<容器id>/cpu.shares 512
注意:稍后我們啟動多個容器,測試一下是不是只能使用512份額的cpu資源。單獨一個容器,看不出來
2. CPU core 核心控制
參數: --cpuset 可以綁定cpu
對多核數cpu的服務器,docker還可以控制容器運行限定使用哪些cpu內核和內存節點,即使用--cpuset-cpus 和--cpuset-mems參數。對具有NUMA拓撲(具有多cpu,多內存節點)的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置。如果服務器
只有一個內存節點,則--cpuset-mems 的配置基本上不會有明顯效果。
擴展: taskset命令
taskset 設定cpu親和力, taskset能將一個或多個進程綁定到一個或多個處理器上運行。
參數:
-c , --cpu-list 以列表各是顯示和指定cpu
-p, --pid 在已經存在的pid上操作
例3:設置只在1和2號cpu運行sshd進程程序
配置cpu
先查找對應的pid ,再進行設置
ps -aux | grep sshd taskset -cp 1,2 955 //注意: -cp 不能分開使用 pid 955's current affinity list: 0-3 pid 955's current affinity list: 1,2
查看進程使用的cpu
語法: taskset -cp <進程號>
taskset -cp 955pid 955's current affinity list: 1,2
正常情況下一般都是每個進程使用全部的cpu
top 命令參數
top進去后,按i,是去掉僵屍進程和閑置的進程 ; 按c,是顯示命令名的全路徑,全名
例4:物理機一共有16個核心,創建的容器只能用0,1,2這三個內核。
配置
docker run -dit --name apache --cpuset-cpus 0-2 centos:latest bash
查看是否配置成功(三種方法檢驗)
第一種: cat /sys/fs/cgroup/cpuset/docker/<容器ID>/cpuset.cpus
0-2
第二種: 進入容器內, 執行taskset -cp 1
第三種: 在物理機執行docker exec web taskset -cp 1
3. cpu配額控制參數的混合使用
當上面這些參數中時,cpu-shares控制只發生在容器競爭同一個內核的時間片時,如果通過
cpuset-cpus 指定容器A使用內核0,容器B只使用內核1,在主機上只有這兩個容器使用對應內核的情況,它們各自占用全部的內核資源,cpu-shares沒有明顯效果。
cpu-period,cpu-quota 這兩個參數一般聯合使用,在單核情況或者通過cpuset-cpus強制容器只用一個cpu內核的情況下,即使cpu-quota超過cpu-period,也不會使容器使用更多的cpu資源。
cpuset-cpus, cpuset-mems 只在多核,多內存節點上的服務器上有效,並且必須與實際的物理配置匹配,否則也無法達到資源控制的目的
cpuset-cpus 指定容器A使用內核0,容器B只使用內核1,在主機上只有這兩個容器使用對應內核的情況,它們各自占用全部的內核資源,cpu-shares沒有明顯效果。
cpu-period,cpu-quota 這兩個參數一般聯合使用,在單核情況或者通過cpuset-cpus強制容器只用一個cpu內核的情況下,即使cpu-quota超過cpu-period,也不會使容器使用更多的cpu資源。
cpuset-cpus, cpuset-mems 只在多核,多內存節點上的服務器上有效,並且必須與實際的物理配置匹配,否則也無法達到資源控制的目的
例5:測試cpuset-cpus 和cpu-shares 混合使用運行效果,就需要一個壓縮壓力測試工具stress來讓容器實例把cpu跑滿。(stress工具)
Linux 系統壓力測試軟件stress 。可以測試系統cpu/memory/IO/disk 的負載
安裝方式(yum安裝)
yum install -y epel-release yum install -y stress
安裝stress,進行壓力測試(源碼安裝)
cd stress-1.0.4 && ./configure && make && make install
物理機上的測試(如下):
例6:產生2個cpu進程,2個io進程,20秒后停止運行
stress -c 2 -i 2 --verbose -t 20
這個工具 能一下把cpu跑滿(針對的是2個cpu的物理機)
查看如下
接下來,在兩個容器實例里進行測試
例7:測試cpuset-cpus和cpu-shares混合使用運行效果,就需要一個壓力測試工具stress來讓容器實例cpu跑滿。當跑滿后,會不會去其他cpu上運行。如果沒有在其他cpu上運行,說明cgroup資源限制成功
例8:創建兩個容器實例docker10和docker20. 讓docker10和docker20只運行在cpu0和cpu1上,最終測試一下docker10和docker20使用cpu的百分比。
創建兩個容器實例
docker run -dit --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 docker.io/centos bash docker run -dit --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 docker.io/centos bash
有些命令 可以從 本機上 拷貝到 docker 容器里來使用,容器里沒有make命令
可以在物理機編譯好,然后,分別拷貝到容器里
docker cp /usr/local/bin/stress docker10:/ docker cp /usr/local/bin/stress docker20:/
測試1:進入docker10容器
容器里總共使用物理機2個cpu
./stress -c 2 --verbose -t 10m
在物理機上使用top命令按 1 快捷鍵查看,每個cpu使用情況:
能看到只在cpu0和cpu1上運行,說明成功了
測試2:進入docker20
使用stress測試進程是不是只在cpu0,1上運行,且docker20上運行的stress使用cpu百分比是docker10的2倍 (注:這樣的設置 ,沒有人競爭時,cpu可以用到100%,如果有人競爭,則會按照--cpu-shares配置的比例來分配cpu的使用情況)
./stress -c 2 --verbose -t 10m
(注:兩個容器只在cpu0,1上運行。且能看到如上2:1的份額比,說明--cpu-shares限制資源成功)
例9:動態修改,cpu1的cpu.shares 改為512
4. 當容器命令運行結束后,自動刪除容器
--rm 不能 和 -d 同時使用
應用場景:
在某些環境下,可能需要大量的新建docker虛擬機,然后僅僅運行幾秒鍾,然后就徹底刪除,如運行單元測試等,測試彈性雲計算,需要創建1萬台虛擬機,運行1個小時,模擬雙11的壓力,1小時候自動刪除
docker run -it --rm --name web centos sleep 5
在物理機查看:
watch -n 1 “docker ps | grep web”
結果是過了5秒后該容器自動刪除
5.內存
-m | --memory= #限制容器能使用的物理內存大小.單位:k, m, g; 若設置一個容器可用內存為4m,若容器使用超過,將被kill掉.
--memory-swap= #要使用它,必須先使用 -m 選項,否則它不生效.
若設置: -m 7G --memory-swap=10G,則表示Swap+Ram=10G, Swap=10-7=3G,即可使用3G的Swap內存.
若設置: -m 7G --memory-swap=7G, 則表示不使用Swap內存.即 若設置這兩個參數值相同,表示禁用SWAP.
若設置: -m 7G --memory-swap=0, 則表示SWAP未設置, 則若DockerHost啟用了SWAP,則表示容器可用的SWAP大小=2*RAM的大小.
若設置: -m 7G --memory-swap=-1, 則表示DockerHost上啟用了Swap,則容器可使用的全部的SWAP大小.
例10,允許容器使用的內存上限位10G:
docker run -dit -m 7G --memory-swap=10G centos bash
6. IO
此處的 sync 是同步到磁盤里(這個實驗不准確,再說)
四.數據卷和數據卷容器
參考網址
http://www.jb51.net/article/97826.htm
docker啟動nginx服務的時候,是不需要用到 /bin/bash ,centos鏡像需要用
docker run --name my-nginx -d -p 80:80 -v /yangsir:/usr/share/nginx/html:ro -v /yangsir/log:/var/log/nginx yangsir/nginx:1.11.1
具體的參考網址
https://www.lvtao.net/config/docker-nginx.html
具體思路:
首先,創建一個Nginx容器,拷貝其配置文件,記下日志,家目錄以及配置文件的路徑
其次,刪除剛創建的容器
再次,用最完整的命令將 配置文件,家目錄,日志的路徑映射到宿主機上來執行,如上
-v <宿主機目錄>:<容器內目錄> {note:這樣的 映射數據卷, 即使 把容器刪掉了,數據映射到宿主機的數據依然存在(詳細說明看“刪除volumes”)}
容器中管理數據主要有兩種方式:
1)數據卷
2)數據卷容器
數據卷是一個可供容器使用的特殊目錄,它繞過文件系統,可以提供很多有用的特性:
- 數據卷可以在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新,不會影響鏡像
- 卷會一直存在,直到沒有容器使用
如果刪除了掛載的容器(包括dbdata,db1 和 db2),數據卷並不會被自動刪除。如果要刪除一個數據卷,必須在刪除最后一個還掛載着它的容器時顯式使用Docker rm -v命令來指定同時刪除關聯的容器。
利用數據卷容器遷移數據
可以利用數據卷容器對其中的數據卷進行備份,回復,以實現數據的遷移
刪除volumes
針對這種刪除volume有效果的,本人只是針對第一種創建數據卷的方式做過實驗
第一種方法 第二種方法:這種指定目錄作為數據卷的,下面介紹的刪除volume的方式行不通,是刪不掉
這個很重要,如果你已經使用docker rm 來刪除你的容器,那可能有很多的孤立的volume仍在占用着空間;
Volume只有在下列情況下才能被徹底刪除:
在刪除最后一個關聯數據卷的容器上必須加上-v參數
docker rm -v container
結果如下:
當你執行docker rm -v my_container 命令時,該volume數據卷里的數據不會被刪除
容器也可以與其他容器共享volume。
docker run --name my_container -v /some/path ... docker run --name my_container2 --volumes-from my_container ...
上面的命令將告訴docker從第一個容器掛載相同的volume到第二個容器,它可以在兩個容器之間共享數據。
如果你執行docker rm -v my_container 命令,而上方的第二容器依然存在,那么volume不會被刪除,如果你不使用docker rm -v my_container2命令刪除第二個容器,那么volume數據會一直存在
擴展: 此處若沒了最初的數據容器(my_container),只要有至少一個共享容器,都能延用--volumes-from my_container2來創建下一個共享容器
Docker容器備份、恢復、和遷移
https://linux.cn/article-5967-1.html
遷移容器同時涉及到了備份和恢復,我們可以將任何一個Docker容器從一台機器遷移到另一台機器。在遷移過程中,首先我們將把容器備份為Docker鏡像快照(commit)。然后,該Docker鏡像或者是被推送到了Docker注冊中心,或者被作為tar包文件保存到了本地
(save)。如果我們將鏡像推送到了Docker注冊中心,我們簡單地從任何我們想要的機器上使用 docker run 命令來恢復並運行該容器。但是,如果我們將鏡像打包成tar包備份到了本地,我們只需要拷貝或移動該鏡像到我們想要的機器上,加載該鏡像並運行需要的容
器即可(load)