docker基礎及進階

第一章   docker基礎

1、   docker介紹

Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從Apache2.0協議開源。node

2、    初識docker

1.       Docker容器 vs 全虛擬化

全虛擬化的系統分配到的是獨有的一組資源,只有極少許的資源會共享,是有更強的隔離性,可是更加劇了(須要更加多的資源)。用Docker容器有弱些的隔離性,可是它們更加輕量,須要更少的資源,因此你能夠絕不費力地啓動上千個容器。python

基本上,Docker容器和全虛擬化VM有着本質上不一樣的目標mysql

虛擬機(VM)是對某種計算機操做系統的模擬,虛擬機的實現是基於計算機虛擬化的架構和指令,具體可能須要特定的硬件、軟件、或軟硬件同時的支持。linux

Docker是一個建立封裝好的隔離計算機環境,每一個封裝好的環境都被稱爲容器,並沒由傳統虛擬化中的Hypervisor層,由於docker是基於容器技術的輕量級虛擬機,相對於傳統的虛擬化技術,省去了Hypervisor的開銷,並且其虛擬化技術是基於cgroup和Namespace技術,處理邏輯與內核深度融合,nginx

2.       docker 架構

                       

 

由上圖可知,git

在功能上,docker經過Libcontainer實現對容器生命週期的管理,信息的設置和查詢,以及監控和通訊等功能,容器以鏡像爲基礎,同時又爲鏡像提供了一個標準的和隔離的執行環境。github

在概念上,容器很好的詮釋了docker集裝箱的理念,它能夠安裝任意的集裝和運輸方式,作任意的運行環境配置,web

在通訊上,docker並不會直接與內核交互,它是經過一個更底層的工具Libcontainer與內核交互的,Libcontainer是真正意義上容器引擎,它經過clone系統調用直接建立容器,經過pivot_root系統調用進入容器,且經過直接操做cgroupfs文件實現對資源的監控,而docker自己則側重於處理更上層的業務。redis

命名空間sql

Docker充分使用稱爲namespace的技術來提供分離的工做空間,咱們稱爲容器。當你運行一個容器,Docker爲這個容器創造一些列命名空間。

這個提供了一層分離:容器的每個方面運行在他本身的明明空間中,而且不能訪問其命名空間以外的數據。

Docker引擎在Linux中使用的命名空間有:

  • pid命名空間:進程分離
  • net命名空間:管理網絡接口
  • ipc命名空間:管理IPC資源訪問
  • mnt命名空間:管理掛載點
  • uts命名空間:分離內核和版本識別

3.       功能和組件

docker引擎是一個c/s結構的應用,主要組件見下圖:

 

  • image:Docker 鏡像是用於建立 Docker 容器的模板。
  • container: 容器是獨立運行的一個或一組應用。
  • Server是一個常駐進程
  • REST API 實現了client和server間的交互協議
  • CLI 實現容器和鏡像的管理,爲用戶提供統一的操做界面
  • Docker Daemon咱們稱之爲Docker守護進程,也就是Server端,Server端能夠部署在遠程,也能夠部署在本地,由於Server端與客戶端(Docker Client)是經過Rest API進行通訊。
  • docker CLI 實現容器和鏡像的管理,爲用戶提供統一的操做界面,這個 客戶端提供一個只讀的鏡像,而後經過鏡像能夠建立一個或者多個容器(container),這些容器能夠只是一個RFS(Root File System),也能夠是一個包含了用戶應用的RFS。容器在docker Client中只是一個進程,兩個進程是互不可見的。
  • Docker客戶端,以docker二進制的形式出現,是Docker最基本的用戶接口。他接收來自用戶的命令,而後和Docker守護進程來回溝通。

4.       容器的組成

容器的核心技術是cgroup+namespace,對於linux容器的最小組成,能夠由如下公式來表示

容器=cgroup+namespace+rootfs+容器引擎(用戶態工具)

cgroup:資源控制

namespace:訪問隔離

rootfs:文件系統隔離

容器引擎:生命週期控制

5.       鏡像、容器、應用的關係是什麼?

鏡像:Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。

容器:鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。

6.       Dockerfile、Docker鏡像和Docker容器的關係

Dockerfile 是軟件的原材料,Docker 鏡像是軟件的交付品,而 Docker 容器則能夠認爲是軟件的運行態。從應用軟件的角度來看,Dockerfile、Docker 鏡像與 Docker 容器分別表明軟件的三個不一樣階段,Dockerfile 面向開發,Docker 鏡像成爲交付標準,Docker 容器則涉及部署與運維,三者缺一不可,協力充當 Docker 體系的基石。

簡單來說,Dockerfile構建出Docker鏡像,經過Docker鏡像運行Docker容器。

咱們能夠從Docker容器的角度,來反推三者的關係。首先能夠來看下圖:

 

 

7.       容器如何工做?

一個容器包含一個操做系統,用戶文件和元數據。正如咱們看到的,每個容器都是從鏡像中被構建的。那個鏡像告訴Docker容器保存什麼數據,當容器發佈的時候運行什麼進程,還有其餘一些配置數據。Docker鏡像是隻讀的。當Docker從一個鏡像中運行一個容器的時候,他在鏡像的最頂層添加一個讀寫層(使用union文件系統),在該層中你的應用程序能夠運行。

 

8.       運行容器過程

不管是使用docker二進制仍是API,Docker客戶端告訴Docker守護程序來運行一個容器。

$ docker run -i -t ubuntu /bin/bash

Docker引擎客戶端使用帶有run選項的docker二進制運行一個新的容器。Docker客戶端須要告訴Docker守護進程運行容器的最低限度是:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像建立並啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛在一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個ip地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止

如今你就擁有一個運行的容器了。如今你能夠管理你的容器,與你的應用交互,當結束的時候,能夠中止和移除你的容器。

9.       術語

宿主系統 vs 客戶系統

宿主系統:是直接安裝在計算機上的原生系統

客戶系統:是安裝在一個虛擬機上,或者宿主機一個分區上的系統

若是安裝在虛擬機上,二者可不一樣,若是安裝在一個分區上,二者必須一致。

Hypervisor:是一種計算機軟件,固件或硬件,用於建立並運行虛擬機的,一個系統若是安裝此服務,裏邊運行着一個或多個虛擬機,這個系統可被定義宿主機,各個虛擬機定義客戶機。

3、           Dockerfile介紹及使用

1.      什麼是Dockerfile?

Dockerfile是自動構建docker鏡像的配置文件,Dockerfile中的命令很是相似linux shell下的命令 Dockerfile,可讓用戶自定義構建docker鏡像,支持以 # 開頭的註釋行 通常,Dockerfile分爲4部分 1.基礎鏡像(父鏡像)信息 2.維護者信息 3.鏡像操做命令 4.容器啓動命令

#第一行必須指令基於的基礎鏡像

From ubutu

#維護者信息

MAINTAINER docker_user  docker_user@mail.com

#鏡像的操做指令

apt/sourcelist.list

RUN apt-get update && apt-get install -y ngnix

RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf

#容器啓動時執行指令

CMD /usr/sbin/ngnix

 

2.      指令指令

一、From指令 From 或者From :

DockerFile第一條必須爲From指令。若是同一個DockerFile建立多個鏡像時,可以使用多個From指令(每一個鏡像一次)

二、MAINTAINER 格式爲maintainer ,指定維護者的信息

三、RUN 格式爲Run 或者Run [「executable」 ,」Param1」, 「param2」] 前者在shell終端上運行,即/bin/sh -C,後者使用exec運行。例如:RUN [「/bin/bash」, 「-c」,」echo hello」] 每條run指令在當前基礎鏡像執行,而且提交新鏡像。當命令比較長時,可使用「/」換行。

四、CMD指令 支持三種格式: CMD [「executable」 ,」Param1」, 「param2」]使用exec執行,推薦 CMD command param1 param2,在/bin/sh上執行 CMD [「Param1」, 「param2」] 提供給ENTRYPOINT作默認參數。

每一個容器只能執行一條CMD命令,多個CMD命令時,只最後一條被執行。

五、EXPOSE

格式爲 EXPOSE […] 。

告訴Docker服務端容器暴露的端口號,供互聯繫統使用。在啓動Docker時,能夠經過-P,主機會自動分配一個端口號轉發到指定的端口。使用-P,則能夠具體指定哪一個本地端口映射過來

例如: EXPOSE 22 80 8443

六、ENV

格式爲 ENV 。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。

例如

9.3ENV PG_MAJOR
9.3.4ENV PG_VERSION
-SL//example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …RUN curlhttp:
local-$PG_MAJOR$PATHENV PATH /usr//postgres/bin:

七、ADD 格式爲 ADD 。

該命令將複製指定的 到容器中的 。 其中 能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。則。

八、COPY

格式爲 COPY 。

複製本地主機的 (爲Dockerfile所在目錄的相對路徑)到容器中的 。

當使用本地目錄爲源目錄時,推薦使用 COPY 。

九、ENTRYPOINT

兩種格式:

ENTRYPOINT [「executable」, 「param1」, 「param2」] ENTRYPOINT command param1 param2 (shell中執行)。 配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。

每一個Dockerfile中只能有一個 ENTRYPOINT ,當指定多個時,只有最後一個起效。

十、VOLUME

格式爲 VOLUME [「/data」] 。

建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等。

十一、USER

格式爲 USER daemon 。

指定運行容器時的用戶名或UID,後續的 RUN 也會使用指定用戶。

當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要臨時獲取管理員權限可使用 gosu ,而不推薦 sudo 。

十二、WORKDIR

格式爲 WORKDIR /path/to/workdir 。

爲後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工做目錄。

可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如

WORKDIR /a WORKDIR b WORKDIR c RUN pwd 則最終路徑爲 /a/b/c 。

1三、ONBUILD

格式爲 ONBUILD [INSTRUCTION] 。

配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令。

例如,Dockerfile使用以下的內容建立了鏡像 image-A 。

[…] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build –dir /app/src […] 若是基於A建立新的鏡像時,新的Dockerfile中使用 FROM image-A 指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。

3.      構建鏡像

以上文件就是用來生成第一個docker鏡像的Dockerfile,經過docker build指令來生成docker鏡像 docker build -t hanxt/centos:7 . 若是Dockerfile在當前目錄下,輸入點.就能夠進行加載當前目錄下的Dockerfile 若是不在當前目錄下須要運行 docker build -t hanxt/centos:7 <Dockerfile_dir>加載相對路徑下的Dockerfile

4.      樣例

# canal

FROM tomcat

WORKDIR /home/software

ADD canal.zip /home/software/

RUN unzip -oq /home/software/canal.zip -d /opt/mateinfo/ \

    && rm -f /home/software/* \

    && rm -rf /opt/mateinfo/app \

    && chown -R mateinfo:inoc /opt/mateinfo \

    && chmod -R 700 /opt/mateinfo \

    && chmod -R 750 /opt/mateinfo/logs

EXPOSE 11111 12111

CMD ["/bin/bash"]

 

4、   Docker的網絡鏈接

  • 橋接
  • 網橋方式須要安裝網橋管理工具
  • yum install bridge-utils
  • brctl show //能夠看到虛擬機的網絡關係
  • 經過虛擬網橋橋接互通,全部網卡都要在一個網段下,因此要對每一個Docker守護進程對ip的分配作出限制
  • 下面,咱們就來實現這個結構:

個人兩臺Ubuntu 14.04 的虛擬機ip:

Host1 : 10.211.55.3  網卡:eth0

Host2 :10.211.55.5   網卡   eth1

網關:10.211.55.1

對容器ip的劃分:

Host1: 10.211.55.64/26

  地址範圍: 10.211.55.65~10.211.55.126

 

Host2: 10.211.55.128/26

  地址範圍: 10.211.55.129~10.211.55.190

須要的操做:

如下,以Host1 爲例,Host2 上操做類似,只是網卡名字不同,我在這裏,沒有使用默認的docker0 網橋,而是新建了虛擬網橋

1. 分別在Docker主機上創建虛擬網橋:

   Host1: $ sudo brctl addbr br0

2. 爲網橋分配一個同網段ip

  Host1: $ sudo ifconfig br0 10.211.55.10 netmask 255.255.255.0

  Host2: $ sudo ifconfig br0 10.211.55.20 netmask 255.255.255.0

3. 橋接本地網卡

  Host1: $ sudo brctl addif br0 eth0

這裏,咱們就準備好了網橋設置

下面咱們來修改Docker的配置,使用咱們新建的網橋代替docker0:

1. 修改 /etc/default/docker文件

  $sudo vim /etc/default/docker

2. 添加守護進程的啓動選項:

  Host1: DOCKER_OPTS=" -b=br0 --fixed-cidr=‘10.211.55.64/26‘ "  

  Host2: DOCKER_OPTS=" -b=br1 --fixed-cidr=‘10.211.55.128/26‘ "

      這裏,-b 用來指定容器鏈接的網橋名字

     --fixed-cidr用來限定爲容器分配的IP地址範圍

3. 保存文件並重啓Docker服務

  $ sudo service docker restart

下面,就能夠來驗證:

1.分別在兩個Host上啓動一個容器

  $ docker run -it ubuntu /bin/bash

 2.在容器中運行ping命令查看鏈接狀況

  • ovs

ovs: open vswitch是一個高質量的,多層虛擬交換機

操做步驟:

1.在虛擬機中創建ovs網橋

2.添加gre鏈接

3.配置docker容器虛擬網橋

4.爲虛擬網橋添加ovs接口

5.添加不一樣Docker容器網段路由

GRE:通用路由協議封裝

GRE隧道:隧道技術(Tunneling)是一種經過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據(或負載)能夠是不一樣協議的數據幀或包。隧道協議將其它協議的數據幀或包從新封裝而後經過隧道發送。新的幀頭提供路由信息,以便經過互聯網傳遞被封裝的負載數據。

$ ovs-vsctl show  

 $ ovs-vsctl add-br obr0  

 $ ovs-vsctl add-port obr0 gre0  

 $ ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.59.104  

 $ ovs-vsctl show  

 $ brctl addbr br0

 $ ifconfig br0 192.168.1.1 netmask 255.255.255.0  

 $ brctl addif br0 obr0  

 $ brctl show  

 $ ip route add 192.168.2.0/24 via 192.168.59.104 dev eth0

 

weave

 

Docker的原生網絡支持很是有限,且沒有跨主機的集羣網絡方案。目前實現Docker網絡的開源方案有Weave、Kubernetes、Flannel、Pipework以及SocketPlane等,其中Weave被評價爲目前最靠譜的,那麼這裏就對Weave的基本原理及使用方法作個總結。

Weave: 是由Zett.io公司開發的,它可以建立一個虛擬網絡,用於鏈接部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網絡交換機,那些使用網絡的應用程序沒必要去配置端口映射和連接等信息。外部設備可以訪問Weave網絡上的應用程序容器所提供的服務,同時已有的內部系統也可以暴露到應用程序容器上。Weave可以穿透防火牆並運行在部分鏈接的網絡上,另外,Weave的通訊支持加密,因此用戶能夠從一個不受信任的網絡鏈接到主機。

安裝與啓動

$ wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave

$ chmod a+x /usr/local/bin/weave

啓動weave路由器,這個路由器其實也是以容器的形式運行的。

$ weave launch

此時會發現有兩個網橋,一個是Docker默認生成的,另外一個是Weave生成的。 

$ brctl show

$ docker ps

簡單使用

準備

1. host1: 10.0.2.6

2. host2: 10.0.2.8

3. host1上的應用容器1: 192.168.0.2/24 host1上的應用容器2: 192.168.1.2/24

4. host2上的應用容器1: 192.168.0.3/24

兩臺機上均安裝Docker及Weave,並均啓動好Weave路由容器。

在兩臺機上均啓動一個應用容器。能夠直接使用weave run命令,也能夠先使用docker run啓動好容器,而後使用weave attach命令給容器綁定IP地址。

$ weave run 192.168.0.2/24 -itd ubuntu bash

或者

$ docker run -itd ubuntu bash

$ weave attach 192.168.0.2/24 $ID

此時發現兩個容器之間是不通的,須要使用weave connect命令在兩臺weave的路由器之間創建鏈接。

$ weave connect 10.0.2.8

會發現,此時位於兩臺不一樣主機上的容器之間能夠相互ping通了。可是處於不一樣子網的兩個容器是不能互聯的,這樣咱們就可使用不一樣子網進行容器間的網絡隔離了。

咱們會發現,若是不使用Docker的原生網絡,在容器內部是不能訪問宿主機以及外部網絡的。此時咱們可使用weave expose 192.168.0.1/24來給weave網橋添加IP,以實現容器與宿主機網絡連通。可是,此時在容器內部依然不能訪問外部網絡。

咱們能夠同時使用Docker的原生網絡和weave網絡來實現容器互聯及容器訪問外網和端口映射。使用外部網絡及端口映射的時候就使用docker0網橋,須要容器互聯的時候就使用weave網橋。每一個容器分配兩個網卡。

其餘特性

  • 應用隔離:不一樣子網容器之間默認隔離的,即使它們位於同一臺物理機上也相互不通(使用-icc=false關閉容器互通);不一樣物理機之間的容器默認也是隔離的
  • 安全性:能夠經過weave launch -password wEaVe設置一個密碼用於weave peers之間加密通訊
  • 查看weave路由狀態:weave ps
  • 注意(容器重啓問題)
  • 若是使用weave,則就不能再使用docker自帶的auto-restart feature(如docker run –restart=always redis),由於weave是在docker以外爲容器配置的網絡,容器重啓的時候docker自己不會作這些事情。於是,還需額外的工具來管理容器的狀態(好比systemd, upstart等),這些工具要調用weave命令(weave run/start/attach)來啓動容器。

5、     鏡像倉庫Registry API

1.常見API

詳細可見https://docs.docker.com/registry/spec/api/#detail

方法

路徑/v2/<name>

實體

描述

實例

GET

/v2/

Base

檢查是否正常

curl –X GET http://localhost:5000/v2/

GET

/tags/list

Tags

鏡像清單

http://localhost:5000/v2/foo/bar/tags/list

GET

/manifests/<referevce>

Manifest

清單內容

 

Put

/manifests/<referevce>

Manifest

 

 

Delete

/manifests/<referevce>

Manifest

 

 

GET

/v2/_catalog

Catalog

列出存儲庫

 

2.部署私有倉庫

2.1使用docker-hub自帶鏡像registry

執行# docker run -d \

         -e SETTINGS_FLAVOR=local \

         -e STORAGE_PATH=/opt/docker-registry \

         -e SEARCH_BACKEND=sqlalchemy \

         -v /opt/docker-registry/:/var/lib/registry/ \

         -p 5000:5000 \

         registry

# curl -XGET http://registry:5000/v2/_catalog

# curl -XGET http://registry:5000/v2/image_name/tags/list

# curl -XGET http://100.90.61.14:5000/v2/_catalog

vim  /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd  --insecure-registry 192.168.0.153:5000

 

2.2使用harbor作私有鏡像庫

6、    經常使用命令      

1.列出本機的鏡像 docker images

刪除<none>懸掛鏡像, -q 列出id

# docker image –filter 「dangling=true」 –q | xargs docker rmi

docker images | awk '/^.*none.*/ { print $3 }'

docker rmi -f $(docker images | awk '/^.*none.*/ { print $3 }')

鏡像:Docker 鏡像是用於建立 Docker 容器的模板 容器:容器是獨立運行的一個或一組應用 倉庫:用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫

一個倉庫中包含多個鏡像,以鏡像爲模板可建立出多個容器,每一個容器是獨立運行的一個或者一組應用。 容器是鏡像的實例,鏡像是容器的模板 。

簡略:

容器生命週期:run、start/stop/restart、kill、rm、pause/unpause、create、exec

容器操做:ps、inspect、top、attach、events、logs、wait、export、port

容器rootfs:commit、cp、diff

鏡像倉庫:login/logout、pull、push、search

本地鏡像管理:images、rmi、tag、build、history、save、import

info|version:info、version       【docker info/vaersion分別查看系統信息和版本信息】

容器

增:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]  #建立一個新的容器但不啓動它

 

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  #建立一個新的容器並運行一個命令

進:

docker exec -ti <container name/id> #不會像attach方式由於退出,致使整個容器退出。         

docker attach  <container name/id> #進入虛擬機,若是從這個stdin中exit,會致使容器的中止。

開啓/中止/重啓

docker container  start/stop/restart   <hash>

docker container rm <hash> # 今後機器中移除指定的容器【刪除容器時,容器必須是中止狀態,不然會報以下錯誤】

 

 

刪:

docker container rm $(docker container ls -a -q) # 刪除全部容器 docker container kill <hash> # 強制關閉指定的容器

查:

docker container ls # 列出全部運行的容器

docker container ls -a # 列出全部的容器
docker ps # 查看咱們正在運行的容器

docker ps -l # 查詢最後一次建立的容器

 

docker logs <container id> # 查看容器內的標準輸出

docker logs <container name> # 查看容器內的標準輸出
docker port <container name/id> <port> # 查看容器端口的映射狀況
docker inspect <container id/name> #查看Docker的底層信息,它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息

 

 

鏡像

增:docker build -t friendlyname . # 使用此目錄的「Dockerfile」建立鏡像

docker push 192.168.1.52:5000/zabbix #提交鏡像到本地私有 docker pull ubuntu:13.10 # 下載ubuntu:13.10鏡像

刪:

\docker image rm <image id> # 從機器中移除指定鏡像

docker image rm $(docker image ls -a -q) # 從機器上移除全部鏡像

查:

docker image ls -a # 列出機器上全部鏡像

docker search httpd # 經過 docker search 命令搜索 httpd 來尋找適合咱們的鏡像

運:

docker run httpd # 使用鏡像倉庫

docker commit 將容器保存爲鏡像

經常使用命令

導出鏡像

docker save -o image_name.tar image_name

查看docker網絡

[root@docker ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

3f91f2097286        bridge              bridge              local

d7675dbd247c        docker_gwbridge     bridge              local

5b36c7e947fd        host                host                local

ims6qkpikafu        ingress             overlay             swarm

85ba10e7ef79        none                null                local

建立一個docker網絡my-docker

docker network create -d bridge \

--subnet=192.168.0.0/24 \

--gateway=192.168.0.100 \

--ip-range=192.168.0.0/24 \

my-docker

利用剛纔建立的網絡啓動一個容器

#docker run --network=my-docker --ip=192.168.0.5 -itd --name=con_name -h lb01 image_name

--network   #指定容器網絡

--ip        #設定容器ip地址

-h          #給容器設置主機名

查看容器pid

#方法一:

docker top con_name

 

#方法二:

 

docker build 構建鏡像

"cmsdev:v1.0"#基於當前目錄Dockerfile構建鏡像docker build -t=.

docker cp 容器與本機文件複製

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

2.0:/etc/zabbixdocker cp hscf-zabbix-agent-/zabbix

docker commit 將容器保存爲鏡像

format: docker commit containerId repo/image:version

7.hjl.hscf.com5000.0docker commitf7045d72b2c repo:/zabbix-server:v1

docker exec -it 到容器內執行命令

format: docker exec -it containerId/containerName bash

execdocker-it devdb bash

docker history 查看鏡像的建立歷史

docker history imageId

docker images 列出鏡像

docker'/^.*none.*/ { print $3 }'#查看全部包含none的鏡像images | awk
no#列出完整鏡像ID的鏡像docker images ---trunc 

docker inspect 分析鏡像

docker inspect imageid

docker info 查看docker信息

dockerinfo

docker load 將壓縮包恢復爲鏡像

load.04docker< ubuntu_14.tar

docker login 登錄鏡像庫

.hscf.com5000docker login repo:

docker logs 查看容器日誌

docker logs containerId

docker kill 殺死容器

sudo#中止全部已退出的容器docker kill $(docker ps -q)

docker ps 列出鏡像

# 查看全部鏡像docker ps
trunc# 查看有完整容器ID的鏡像docker ps --no-

docker push 推送鏡像到鏡像庫

push.hscf.com5000.0dockerrepo:/cmsdev:v1

docker restart 重啓容器

docker restart containerId或containerName

docker rm 刪除容器

sudo-a# 刪除全部容器docker rm $(docker ps-q)

docker rmi 刪除鏡像

刪除全部包含 none的鏡像

-f'/^.*none.*/ { print $3 }'docker rmi$(docker images | awk)

docker run 運行容器

包含環境變量、磁盤掛載、端口映射、docker連接的例子

---web-nginx-mysql\docker runname zabbix
--link-server-mysql-server\zabbix:zabbix
-e="Asia/Shanghai"\PHP_TZ
-vvar\/u01/SCFDOCKER/registry://lib/registry
-p800080\:
-d-web-nginx-mysqlzabbix/zabbix

docker stop 中止容器運行

stopdocker save 將鏡像保存爲壓縮包dockercontainerId
dockersave-oubuntu_14.04.tarubuntu:14.04
docker search 搜索鏡像
dockersearchcentos:latest

docker tag 鏡像打tag

爲鏡像cmsdev:v1.0打一個tag

.0.hscf.com5000.0docker tag cmsdev:v1repo:/cmsdev:v1

經常使用組合命令

中止並刪除全部容器

-qdocker kill $(sudo docker ps)
-a-qdocker rm $(sudo docker ps)
-a-qdocker ps

打tag並推送鏡像

"cmsdev:v1.0"docker build -t=
.0.hscf.com5000.0docker tag cmsdev:v1repo:/cmsdev:v1
push.hscf.com5000.0dockerrepo:/cmsdev:v1

刪除含有 none的鏡像

docker'/^.*none.*/ { print $3 }'images | awk
'/^.*none.*/ { print $3 }'docker rmi -f $(docker images | awk)

保存鏡像並恢復

.04.tar14.04docker save -o ubuntu_14ubuntu:
.04.tardocker load < ubuntu_14

查看日誌

200# 查看容器最後200行日誌docker logs --tail=containerId
-f# 動態查看日誌docker logscontainerId
nogrep# 獲取特定鏡像的容器ID全程docker ps ---trunc |cmsdev
#進入容器所在目錄cd /var/lib/docker/containers/containerFullId
log# 該文件就是容器的日誌文件contailerFullId-json.
 
docker cp 從容器複製一個文件或目錄到本地目錄或標準輸出

1.  配置docker daemon的參數,因爲每一個發行版的linux的init系統不用,因此使用通用的命令行方式重啓docker daemon

docker daemon --insecure-registry 192.168.6.65:5000 &

4、docker 技巧

1..清理無用的docker容器命令

docker ps -aqf  status=exited | xargs docker rm

2.清理無用鏡像的命令

docker images -qf dangling=true | xargs docker rmi

3.清理無用的docker掛載

docker volume rm $(docker volume ls -q -f dangling=true)

dockerignore使用

docker rm $(echo $(docker ps -q --no-trunc) $(dockerps -a -q--no-trunc) | sed 's|\s|\n|g' |sort | uniq -u)

刪除當前不在運行狀態的容器ID,也能夠把前面改爲docker rm

docker images -a -q --no-trunc        顯示當前倉庫中的鏡像與臨時鏡像的ID,不截斷輸出 做者:淹死的魚_hz 連接:https://www.jianshu.com/p/711bc4ffcecf 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

 

1. 在宿主機中查看 docker容器的ip地址

[root@hadoop mydockerbuild]# docker inspect docker_test1 --format '{{.NetworkSettings.IPAddress}}'

172.17.0.2

 

docker build 構建鏡像

 

Usage: docker [OPTIONS] COMMAND [arg...]

       docker [ --help | -v | --version ]

 

A self-sufficient runtime for containers.

 

Options:

 

  --config=~/.docker              Location of client config files

  -D, --debug                     Enable debug mode

  -H, --host=[]                   Daemon socket(s) to connect to

  -h, --help                      Print usage

  -l, --log-level=info            Set the logging level

  --tls                           Use TLS; implied by --tlsverify

  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA

  --tlscert=~/.docker/cert.pem    Path to TLS certificate file

  --tlskey=~/.docker/key.pem      Path to TLS key file

  --tlsverify                     Use TLS and verify the remote

  -v, --version                   Print version information and quit

docker --help

Commands:

    attach    Attach to a running container

    build     Build an image from a Dockerfile

    commit    Create a new image from a container's changes

    cp        Copy files/folders between a container and the local filesystem

    create    Create a new container

    diff      Inspect changes on a container's filesystem

    events    Get real time events from the server

    exec      Run a command in a running container

    export    Export a container's filesystem as a tar archive

    history   Show the history of an image

    images    List images

    import    Import the contents from a tarball to create a filesystem image

    info      Display system-wide information

    inspect   Return low-level information on a container, image or task

    kill      Kill one or more running containers

    load      Load an image from a tar archive or STDIN

    login     Log in to a Docker registry.

    logout    Log out from a Docker registry.

    logs      Fetch the logs of a container

    network   Manage Docker networks

    node      Manage Docker Swarm nodes

    pause     Pause all processes within one or more containers

    port      List port mappings or a specific mapping for the container

    ps        List containers

    pull      Pull an image or a repository from a registry

    push      Push an image or a repository to a registry

    rename    Rename a container

    restart   Restart a container

    rm        Remove one or more containers

    rmi       Remove one or more images

    run       Run a command in a new container

    save      Save one or more images to a tar archive (streamed to STDOUT by default)

    search    Search the Docker Hub for images

    service   Manage Docker services

    start     Start one or more stopped containers

    stats     Display a live stream of container(s) resource usage statistics

    stop      Stop one or more running containers

    swarm     Manage Docker Swarm

    tag       Tag an image into a repository

    top       Display the running processes of a container

    unpause   Unpause all processes within one or more containers

    update    Update configuration of one or more containers

    version   Show the Docker version information

    volume    Manage Docker volumes

    wait      Block until a container stops, then print its exit code

相關文章
相關標籤/搜索