1. 程式人生 > 實用技巧 >Docker服務安裝以及使用

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命令網址                    -------->         http://www.cnblogs.com/ivictor/archive/2015/09/08/4791274.html           
注意:容器追求的是速度快,容器是用來跑服務的,提供計算能力,不是用來儲存大量檔案的
Dockerhub : 是 docker 官方的映象儲存站點 

2. centos6.x 安裝方法

yum install -y epel-release
yum install -y docker-io

3. centos7.X 安裝方法

Docker 軟體包已經包括在預設的 CentOS-Extras 軟體源裡。因此想要安裝 docker,只需要執行下面的 yum 命令
yum  install  -y  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 配置檔案的方式,預設為/etc/docker/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. 製作映象

方法1: 通過已存在的映象或容器,建立新的映象。

     語法: docker commit <container_ID | container_name> <new_image_name>:<tag>

將安裝好的容器打包成映象,儲存container 的當前狀態到image後,生成對應的image

注:無論容器什麼狀態執行打包均可,然後可以根據這個容器映象,接著進行啟動一個新的容器(雖然沒有影響,不過推薦關閉容器進行建立映象)

docker commit   264117d8cf64    centos_nginx:v1       通過容器ID進行建立新映象
docker commit   centos-nginx    centos_nginx:v2        通過容器名稱進行建立新映象

方法2: docker build

案例1: docker build 使用dockerfile 檔案自動化製作image(簡單原始碼安裝nginx)

建立dockerfile如下:

//cat   dockerfile
FROM          centos:6.8
MAINTAINER    yangjw 2018.03.13
RUN           yum install -y wget gcc gcc-c++ make openssl-devel  pcre*  \
         &&   useradd  nginx   \
         &&   wget  http://nginx.org/download/nginx-1.8.1.tar.gz
ADD           nginx-1.8.1.tar.gz /usr/local/src 
WORKDIR       /usr/local/src/nginx-1.8.1 
RUN           ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module \
              && make         \
              && make install \
              && echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf 
ENV           PATH /usr/local/nginx/sbin:$PATH 
EXPOSE        80 
CMD           ["nginx"]

建立新的容器映象檔案 在dockerfile檔案所在同級目錄下執行如下命令

docker  build   -t  centos/nginx:v1  .
docker  images 

啟動容器//把宿主機90埠對映到容器內的80埠

docker  run  -d  --name  NGINX  -p 90:80  centos/nginx-1.8.1:v1

測試:

curl  -I   宿主機IP:90   
或者
瀏覽器中訪問   宿主機IP:90

8. 匯出本地映象

語法: docker save -o <匯出的映象名>.tar 本地映象名

docker save  yangsir/centos  >  <image_name>.tar             
或
docker save  -o centos-httpd-docker-image.tar    centos:httpd

9. 匯入本地映象

docker load  -i centos-httpd-docker-image.tar   
或
docker load  <  centos-httpd-docker-image.tar

10. 修改映象標籤

docker tag <映象名 | 映象ID> <新的映象標籤名>

11. 埠對映

啟動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

12. docker容器預設儲存空間的修改

只能在執行容器時,指定;不指定,預設是10G

--storage-opt size=? 按Tab鍵,size就會出來

  eg:如下進行啟動的時候,注意順序一定要把 這個“--storage-opt size=20G” 放到 前面,而且,這個儲存空間大小的配置也是有要求得,太小的話,會提示錯誤,容器啟動建立失敗

13. diff檢查發生變化的檔案或目錄

docker diff container

這些變化包括新增(A-add),刪除(D-delete),修改(C-change)等

14. 檢視容器執行的狀態

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

15. 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 是同步到磁盤裡(這個實驗不準確,再說)

 

7. Docker 修改移動預設儲存位置

  首先,停掉docker服務以及所有容器,複製拷貝docker目錄成另外一個名字

其次,將拷貝的目錄移動到目標地,然後,將原始的改成非docker 的目錄,以免衝突

再次,將目標地址的docker目錄軟連線到原始的目錄下

  操作步驟如下:

  第一步要先把docker 服務給 stop 在進行拷貝,移動,等操作

 就ok

四.資料卷和資料卷容器

參考網址
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)

五. Docker映象和docker家目錄遷移

參考網址
http://blog.csdn.net/pipisorry/article/details/51330126

映象遷移操作,切記,要在docker服務停止下進行

大概思路:

停服務---->新增磁碟---->掛載到目錄下---->把目錄掛載到/var/lib/docker目錄下---->啟服務
檢查用 df -h /var/lib/docker

這裡的 掛載目錄有兩種方法

先將磁碟掛載到/data/docker下,在掛載目錄

其一,mount --bind /data/docker /var/lib/docker //將前者掛載到後者目錄下

其二,#cat /etc/fstab //新新增

/data/docker /var/lib/docker none bind 0 0
#mount -a //重新掛載一下

如此,預設的/空間不足情況就得以 遷移新增新磁碟解決了

六. Dockerfile檔案使用方法

FROM        基礎映象
MAINTAINER  維護者的記錄資訊
RUN                 執行shell命令
ADD:複製檔案指令。它有兩個引數<src>和<dest>。
              該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 檔案(自動解壓為目錄)。
注意:  
         ①如果執行docker build – < somefile即通過標準輸入來建立時,ADD指令只支援url方式,另外如果url需要認證,則可以通過RUN wget …或RUN curl …來完成,ADD指令不支援認證。
         ②<src>路徑必須與Dockerfile在同級目錄或子目錄中,例如不能使用ADD ../somepath,因為在執行docker build時首先做的就是把Dockerfile所在目錄包含子目錄傳送給docker的守護程序。
         ③如果<src>是一個url且<dest>不是以”/“結尾,則會下載檔案並重命名為<dest>。
         ④如果<src>是一個url且<dest>以“/”結尾,則會下載檔案到<dest>/<filename>,url必須是一個正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。
         ⑤如果<src>是一個本地的壓縮包且<dest>是以“/”結尾的目錄,則會呼叫“tar -x”命令解壓縮,如果<dest>有同名檔案則覆蓋,但<src>是一個url時不會執行解壓縮。
COPY略
          複製本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。當使用本地目錄為源目錄時,推薦使用 COPY。COPY和ADD的不同就是:ADD多了自動解壓和支援URL路徑的功能
CMD       -------->      語法:①CMD ["executable", "param1", "param2"]                   #將會呼叫exec執行,首選方式                   
          |_____>        語法 : ②CMD ["param1", "param2"]                                         #當使用ENTRYPOINT指令時,為該指令傳遞預設引數
          |_____>        語法 : ③CMD <command> [ <param1>|<param2> ]                #將會呼叫/bin/sh -c執行

        指令中指定的命令會在映象執行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最後一個CMD指令有效。當出現ENTRYPOINT指令時,CMD中定義的內容會作為ENTRYPOINT指令的預設引數,也就是說可以使用CMD指令給ENTRYPOINT傳遞引數。
 
EXPOSE: 指令用來告訴Docker這個容器在執行時會監聽哪些埠,Docker在連線不同的容器(使用–link引數)時使用這些資訊
ENTRYPOINT       -------->      語法:①ENTRYPOINT ["executable", "param1", "param2"]       #將會呼叫exec執行,首選方式
                   |_____>      語法:②ENTRYPOINT command param1 param2                    #將會呼叫/bin/sh -c執行

    指令中指定的命令會在映象執行時執行,在Dockerfile中只能存在一個,如果使用了多個ENTRYPOINT指令,則只有最後一個指令有效。ENTRYPOINT指令中指定的命令(exec執行的方式)可以通過docker run來傳遞引數,例如docker run
    <images> -l啟動的容器將會把-l引數傳遞給ENTRYPOINT指令定義的命令並會覆蓋CMD指令中定義的預設引數(如果有的話),但不會覆蓋該指令定義的引數,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當通過docker run <image>啟動容器時該容器會執行ls -a
    /etc命令,當使用docker run <image> -l啟動時該容器會執行ls -a -l命令,-l引數會覆蓋CMD指令中定義的/etc引數。
WORKDIR          -------->      語法:WORKDIR /path/to/workdir

        指令用於設定Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(預設為/目錄),該指令在Dockerfile檔案中可以出現多次,如果使用相對路徑則為相對於WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。
ENV              -------->       語法:ENV <key> <value>
        ENV指令用於設定環境變數,在Dockerfile中這些設定的環境變數也會影響到RUN指令,當執行生成的映象時這些環境變數依然有效,如果需要在執行時更改這些環境變數可以在執行docker run時新增–env <key>=<value>引數來修改。

注意:最好不要定義那些可能和系統預定義的環境變數衝突的名字,否則可能會產生意想不到的結果。 11. USER --------> 語法:USER [username|uid] USER指令用於設定使用者或uid來執行生成的映象和執行RUN指令 12. VOLUME --------> 語法: VOLUME ["samepath"] VOLUME指令用來設定一個掛載點,可以用來讓其他容器掛載以實現資料共享或對容器資料的備份、恢復或遷移,具體用法請參考其他文章。