Docker服務安裝以及使用


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)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM