Centos上安裝配置docker(命令集)

導出鏡像存儲: docker save house/redis:3.2 > redis_img.tar   (也可使用鏡像ID)html

導入鏡像存儲: docker load < redis_img.tarlinux

導出容器快照: docker export myredis3.2 >myredis.tar  (也可使用容器ID)nginx

以導出的容器快照建立新的鏡像: cat myredis.tar | docker import - test/myredis:v1.8   (import---Import the contents from a tarball to create a filesystem image)web

導出 export 與 保存 save 的區別:redis

 (1)export導出的鏡像文件大小 小於 save保存的鏡像docker

 (2)export 導出(import導入)是根據容器拿到的鏡像,再導入時會丟失鏡像全部的歷史,因此沒法進行回滾操做(好比:docker tag <LAYER ID> <IMAGE NAME>);而save保存(load加載)的鏡像,沒有丟失鏡像的歷史,能夠回滾到以前的層(layer)。shell

import 與 load 的區別:數據庫

可使用 docker import 從容器快照文件中再導入爲鏡像,如:cat myredis.tar | docker import - test/myredis:v1.8 (我的感受相比使用docker build更靠譜些)apache

注:用戶既可使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可使用 docker import 來導入一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時能夠從新指定標籤等元數據信息vim

-----------------------------------------------------------------------------------------

參數形式ARG

這是docker提供的另一個,讓我有點懵逼的命令. 他的實際效果和 ENV 的區別能夠趨近於無。

# 使用ARG定義變量
ARG buildno # 設置默認值 ARG user1=someuser

固然,咱們能夠在命令中,手動指定替換.

# 在dockerfile定義了默認變量
ARG user=jimy # 在運行時,進行手動替換 docker build --build-arg user=sam -t jimmy/demo .

上面說了ARG和ENV比較相似,不過,裏面的區別仍是有的. 即, ARG只能用在 docker build 的階段, 而且不會被保存在 image 中,這就是和ENV的區別.

-----------------------------------------------------------------------------------------

官網安裝步驟:https://docs.docker.com/engine/installation/linux/centos/

 一鍵docker安裝命令: curl -fsSL http://get.docker.com | sh

 

Docker是一個開源的應用容器引擎,開發者能夠利用Docker打包本身的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化。

Docker是一個可以把開發的應用程序自動部署到容器的開源引擎。

 

安裝docker的先決條件:

  • 運行64位CPU架構的計算機,請注意,Docker目前不支持32位CPU
  • 運行Linux3.8或更高版本的內核。一些老版本的2.6.x或其後的內核也可以運行Docker,但運行結果會有很大不一樣。並且,若是你須要就老版本內核尋求幫助時,一般你們會建議你升級到更高版本的內核。
  • 內核必須支持一種適合的存儲驅動(storeage driver),例如:

      Device Manager;

      AUFS;

      vfs;

      btrfs;

      默認存儲驅動一般是Device Mapper.

  • 內核必須支持並開啓cgroup和命名空間 (namespace)功能。

 ----------------------------

檢查Device Mapper

# ls -l /sys/class/misc/device-mapper
lrwxrwxrwx 1 root root 0 Mar 8 12:15 /sys/class/misc/device-mapper -> ../../devices/virtual/misc/device-mapper

# grep deice-mapper /proc/devices

若是沒有檢測到Device Mapper,便開始安裝

# yum install -y device-mapper

安裝完成後,還須要加載 dm_mod 內核模塊

# modprobe dm_mod

# lsmod | grep dm_mod

 

開始安裝docker,前提準備好epel源

# yum -y install docker-io

# service docker start

# docker info    (驗證)

 

若是須要修改docker數據根目錄的話,vim /etc/sysconfig/docker other_args後面添加--graph參數

other_args='--insecure-registry 10.0.30.5:5000 --graph=/data/docker'

自動生成/data/docker目錄(0700),並在該目錄下建立 docker 相關文件

---------------------------------------------------------------------------

docker help run

-i  interact交互式,保證容器中STDIN是開啓的

-t 它告訴Docker爲要建立的窗口分配一個僞tty終端。

這樣新建立的容器才能提供一個交互式shell

 

docker images  查看本地已有的鏡像

docker ps      查看當前系統中正運行的容器的列表

docker ps -a  查看當前系統中正運行的和已經中止的容器的列表

docker ps -l   列出最後一次運行的容器,包括正在運行和已經中止的

docker stop wjoyxt  中止守護式容器,刪除以前須要先中止正在運行的容器

docker rm wjoyxt  或 docker rm 容器ID   刪除一個容器

docker rm `docker ps -a -q`  刪除全部容器

docker rmi centos 或 docker rmi 鏡像ID   刪除一個鏡像

docker run --name wjoyxt -i -t centos /bin/bash  爲新建立的容器自定義名稱,而且容器的命名必須是惟一的。若是建立兩相名稱相同的容器,則命令將失敗。

docker run --name daemon_wjoyxt -d centos /bin/sh -c "while true; do echo hello world;sleep 2;done"  建立長期運行的守護式容器示例

docker create  只是單獨地建立一個新的容器,並不運行它

docker start wjoyxt  或 docker start 容器ID   從新啓動一個已經中止的容器,會沿用docker run命令時指定的參數來運行

docker attach wjoyxt  或 docker attach 容器ID  從新附着到從新啓動的容器的會話上,你可能須要按下回車鍵才能進入該會話,exit退出後,容器中止運行。

docker logs wjoyxt  獲取守護式容器的日誌

docker logs -f wjoyxt 跟蹤守護式容器的日誌,經過Ctrl+C退出日誌跟蹤

docker logs -ft wjoyxt 使用 -t 標誌爲每條日誌項加上時間戳

docker logs --tail 10 wjoyxt 獲取日誌的最後10行內容

docker logs --tail 0 -f wjoyxt 跟蹤某個容器的最新日誌而沒必要讀取整個日誌文件

docker top wjoyxt 查看窗口內的進程

docker exec -d wjoyxt touch /etc/new_config_file 在容器中運行後臺任務,-d代表運行一個後臺進程,後面指定的是要在內部執行這個命令的容器名字以及要執行的命令內容

docker exec -t -i wjoyxt /bin/bash 在wjoyxt容器中啓動一個打開shell的交互式任務,exit退出後,容器仍在運行

docker cp jiajia:/etc/haha  /root/        從容器文件系統拷貝文件/目錄到宿主機路徑

 

docker inspect wjoyxt  獲取容器更詳細的相關信息

docker inspect --format='{{ .State.Running }}'  wjoyxt  使用-f或者--format標誌來選定查看結果

再例如: docker inspect --f='{{ .Config.Labels.license }}'  wjoyxt

 

docker login  登陸到Docker Hub

docker commit 容器ID wjoyxt/mycontainer  建立新的鏡像。提交的只是建立容器的鏡像與容器的當前狀態之間有差別的部分,這使得該更新很是輕量

docker commit -m="A new custom image" --author="wjoyxt" 容器ID wjoyxt/mycontainer:mywebserver  能夠在提交鏡像時指定更多的數據(包括標籤)來詳細描述所作的修改

 

docker build  -t="wjoyxt/my_web:v1" .   構建新鏡像,使用 -t 設置倉庫、鏡像和標籤名稱。(Dockerfile在當前目錄下)

docker build  --no-cache  -t="wjoyxt/my_web"  忽略Dockerfile的構建緩存

docker history  鏡像ID  查看鏡像的每一層,以及建立這些層的Dockerfile指令

docker run -d -p 8080:80 --name wjoyxt nginx -g "daemon off"    -p 將容器中的80端口綁定到宿主機的8080端口上,可使用docker inspect或 docker port命令來查看容器內的端口具體被綁定到了宿主機的哪一個端口上,也能夠經過在端口綁定時使用/udp後綴來指定UDP端口

 

搭建私有倉庫: (此方法已過期,請參考本博客的「Docker私有倉庫 Registry中的鏡像管理」)

docker push wjoyxt/my_web  將鏡像推送到Docker Hub 

運行本身的Docker Registry:有時候咱們可能但願構建和存儲包含不想被公開的信息或數據的鏡像。這時候咱們有兩種選擇:

  • 利用Docker Hub上的私有倉庫
  • 在防火牆後面運行你本身的Registry

docker run -d -p 5000:5000 registry  運行基於容器的Registry,並綁定到本地宿主機的5000端口。

默認狀況下,會將倉庫存放於容器內的/tmp/registry目錄下,這樣若是運行在registry上的容器被刪除,則存放於容器中的鏡像也會丟失,因此咱們通常狀況下會指定本地一個目錄掛載到容器內的/tmp/registry下,以下:

或者# docker run -d -p 5000:5000  -v  /opt/registry:/tmp/registry  registry    

<宿主機目錄>:<容器目錄>   這兩個目錄會被自動建立好,無需提早建立

 (經過-v 參數,冒號前爲宿主機目錄,必須爲絕對路徑,冒號後爲鏡像內掛載的路徑。目的是將宿主機的目錄做爲卷,掛載到容器裏。若是目的目錄不存在,Docker會自動建立一個)

 

測試新Registry:

首先找到要上傳的鏡像的ID,並使用新的Registry給該鏡像打上標籤。爲了指定新的Registry目的地址,須要在鏡像名前加上主機名和端口前綴。在這個例子裏,咱們的Registry主機名爲wjoyxt.example.com或者使用IP:

docker tag 鏡像ID 172.16.21.2:5000/wjoyxt/my_web

# docker push 172.16.21.2:5000/wjoyxt/my_web

若是執行以上命令出現如下錯誤時:  vim /etc/sysconfig/docker   other_args="--selinux-enabled --insecure-registry 172.16.21.2:5000" 重啓Docker服務後便可(本地push端和遠程pull端都須要修改,不然都會報如下相同的錯誤)。

 

Error response from daemon: invalid registry endpoint https://172.16.21.2:5000/v0/: unable to ping registry endpoint https://172.16.21.2:5000/v0/
v2 ping attempt failed with error: Get https://172.16.21.2:5000/v2/: EOF
v1 ping attempt failed with error: Get https://172.16.21.2:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 172.16.21.2:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/172.16.21.2:5000/ca.crt

這是由於Docker從1.3.X以後,與docker registry交互默認使用的是https,然而此處搭建的私有倉庫只提供http服務,因此當與私有倉庫交互時就會報上面的錯誤。爲了解決這個問題須要在啓動docker server時增長啓動參數爲默認使用http訪問。

 

爲鏡像打完標籤以後,就能經過docker push命令將它推送到新的Registry中去了。這樣就本地局域網內就能夠直接使用docker run命令構建新容器了

# docker search 172.16.21.2:5000/wjoyxt   使用以前可使用docker search查詢一下可以使用的倉庫鏡像

docker run -it 172.16.21.2:5000/wjoyxt/my_web  /bin/bash

 

關於Docker Registry V2 按上述安裝成功後,執行curl -XGET http://172.16.21.2:5000/v2/ 後,頁面會出現一個{}符號

因爲版本區別,在Registry V2版本中沒法使用search查看私有倉庫鏡像,須要使用如下命令查看:

curl -XGET http://registry:5000/v2/_catalog
curl -XGET http://registry:5000/v2/{image_name}/tags/list

                                                wjoyxt/my_web

 

 

 

容器互連:

# docker run -d --name redis wjoyxt/redis

# docker run -p 4567 --name webapp --link redis:db -it -v $PWD/webapp:/opt/webapp wjoyxt/my_web /bin/bash

--link標誌建立了兩個容器間的父子鏈接。這個標誌須要兩個參數:一個是要鏈接的容器的名字,另外一個是鏈接後容器的別名。這個例子中,把新容器鏈接到redis容器,並使用db做爲別名。別外讓咱們能夠訪問公開的信息,而無須關注底層容器的名字。鏈接讓父容器有能力訪問子容器,而且把子容器的一些鏈接細節分享給父容器,這些細節有助於配置應用程序並使用這個鏈接。

鏈接也能獲得一些安全上的好處。注意到啓動Redis 容器時,並無使用-p標誌公開Redis的端口。由於不須要這麼作。經過把容器鏈接在一塊兒,可讓父容器直接訪問任意子容器的公開端口。更妙的是,只有使用--link標誌鏈接到這個容器的容器才能鏈接到這個端口。容器的端口不須要對本地宿主機公開,如今咱們已經擁有一個很是安全的模型。在這個模型裏,容器化的應用程序限制了可被攻擊的界面,減小了公開暴露的網絡。

注意:也能夠把多個容器鏈接在一塊兒。可是被鏈接的容器必須運行在同一個Docker宿主機上。不一樣Docker宿主機上運行的容器沒法鏈接

Docker在父容器裏的如下兩個地方寫入了鏈接信息:

  • /etc/hosts文件裏
  • 包含鏈接信息的環境變量中 

 

 

Dockerfile指令:

CMD:用於指定一個容器啓動時要運行的命令,相似於RUN指令,只是RUN指令是指定鏡像被構建時要運行的命令。能夠在docker run命令中覆蓋CMD指令。

CMD ["/bin/bash","-l"]

 

ENTRYRPOINT:與CMD很是相似,區別是ENTRYPOINT指令提供的命令不容易在啓動容器時被覆蓋,若是須要能夠在運行時使用docker run的--entrypoint標誌來覆蓋

 

WORKDIR:用來在從鏡像建立一個新容器時,在容器內部設置一個工做目錄,ENTRYPOINT 和/或 CMD指定的程序會在這個目錄下執行

 

ENV:用來在鏡像構建過程當中設置環境變量,也可使用docker run命令行的 -e 標誌來傳遞環境變量,這些變量將只會在運行時有效。

ENV MY_PATH /opt/app

WORKDIR $MY_PATH

#docker run -it -e "MY_PATH=/opt/app" wjoyxt

 

USER:用來指定該鏡像會以什麼樣的用戶去運行,能夠指定用戶名或UID以及組或GID,甚至是二者的組合。不過能夠用docker run -u 選項來覆蓋該指令指定的值

USER user

USER user:group

USER uid

USER uid:gid

USER user:gid

USER uid:group

 

VOLUME:用來向基於鏡像建立的容器添加捲。一個卷是能夠存在於一個或者多個容器內的特定的目錄,這個目錄能夠繞過聯合文件系統,並提供以下共享數據或者對數據進行持久化的功能。

  • 卷能夠在容器間共享和重用
  • 一個容器能夠不是必須和其餘容器共享卷
  • 對卷的修改是立時生效的
  • 對卷的修改不會更新鏡像產生影響
  • 卷會一直存在直到沒有任何容器再使用它

卷功能讓咱們能夠將數據(如源代碼)、數據庫或者其餘內容添加到鏡像中而不是將這些內容提交到鏡像中,而且容許咱們在多個容器間共享這些內容。

VOLUME ["/opt/project"]  這條指令將會爲基於此鏡像建立的任何容器自動建立一個名爲/opt/project的掛載點

VOLUME ["/opt/project",  "/data"]  也能夠經過指定數組的方式指定多個卷

 

ADD:用來將構建環境下的文件和目錄複製到鏡像中,Docker經過目的地址參數末尾的字符來判斷文件源是目錄仍是文件。若是源目標地址以 / 結尾,那麼Docker就認爲源位置指向的是一個目錄。文件源也可使用URL的格式。

值得一提的是,ADD在處理本地歸檔文件(tar archive)時,若是將一個歸檔文件(合法的歸檔文件包括 gzip、bzip二、xz)指定爲源文件,Docker會自動將歸檔文件解開(unpack)

ADD latest.tar.gz  /var/www/wordpress/  

Docker解開歸檔文件的行爲和使用帶-x選項的tar命令同樣:該指令執行後的輸出是原目的目錄已經存在的內容加上歸檔文件中的內容。若是目的位置的目錄下已經存在了和歸檔文件同名的文件或者目錄,那麼目的位置中的文件或者目錄不會被覆蓋

若是目的位置不存在的話,Docker將會爲咱們建立這個全路程,包括路徑中的任何目錄。新建立的文件和目錄的模式爲0755,而且UID和GID都是0

注意:ADD指令會使得構建緩存變得無效,這一點很是重要。若是經過ADD指令向鏡像添加一個文件或目錄,那麼這將使Dockerfile中的後續指令都不能繼續使用以前的構建緩存

 

COPY:其很是相似於ADD,它們根本的不一樣是COPY只關心在構建上下文中複製本地文件,而不會去作文件提取(extraction)和解壓(decompression)的工做。

COPY  conf.d/  /etc/apache2/

 

 ONBUILD:爲鏡像添加觸發器(trigger)。當一個鏡像被用作其餘鏡像的基礎鏡像時(好比你的鏡像須要從某未準備好的位置添加源代碼,或者你須要執行特定於構建鏡像的環境的構建腳本),該鏡像中的觸發器將會被執行。

觸發器會在構建過程當中插入新指令,咱們能夠認爲這些指令是緊跟在FROM以後指定的。觸發器能夠是任何構建指令。例如:

ONBUILD ADD . /app/src

ONBUILD RUN cd /app/src && make

上面的代碼將會在建立的鏡像中加入ONBUILD觸發器,ONBUILD指令能夠在鏡像上運行docker inspect命令來查看。

ONBUILD觸發器會按照在父鏡像中指定的順序執行,而且只能被繼承一次(也就是說只能在子鏡像中執行,而不會在孫子鏡像中執行)。若是咱們再基於wjoyxt/my-web 構建一個鏡像,則新鏡像是wjoyxt的孫子鏡像,所以在該鏡像的構建過程當中,ONBUILD觸發器是不會被執行的。

注意:這裏有好幾條指令是不能用在ONBUILD指令中的,包括FROM、MAINTAINER和ONBUILD自己。之因此這麼規定是爲了防止在Dockerfile構建過程當中產生遞歸調用的問題。

 

 

 

 在Nginx配置文件裏面設置成daemon off;選項阻止Nginx進入後臺,強制其在前臺運行。這是由於要想保持Docker容器的活躍狀態,須要其中運行的進程不能中斷。默認狀況下,Nginx會以守護進程的方式啓動,這會致使容器只是短暫運行,在守護進程被fork啓動後,發起守護進程的原始進程就會退出,這時容器就中止運行了。

 

 

FAQ:

# docker exec -t -i b69d5e9ac58b /bin/bash
Error response from daemon: Unsupported: Exec is not supported by the lxc driver

解決方法:vim  /etc/sysconfig/docker  刪除 --exec-driver=lxc 而後重啓docker便可 (官方已經早就不推薦使用lxc了)

相關文章
相關標籤/搜索