1. 程式人生 > >Docker筆記 基礎理解

Docker筆記 基礎理解

Docker筆記一

容器的基本結構

容器分層

映象(images)就是一堆只讀層的統一視角。

映象
從上向下可以看到多個只讀層,他們從疊在一起。上層有指標指向本層,並且這些只讀層可以在主機訪問。docker 的統一檔案系統(Aufs)技術將不同的層整合成一個檔案系統,為這些層提供了統一的視角,在使用者角度來看,只存在一個檔案系統。

容器

容器
容器就是在映象的統一視角上加可讀可寫的一層。
容器: 映象 + 讀寫層。

使用dockerfile檔案定製映象

首先看一張docker檔案系統圖:
docker檔案系統

dockerfile常用指令有:

  • FROM 指定基礎映象。FROM ubuntu:16.04
  • RUN 執行命令列命令。用來執行shell命令:RUN apt-get update
  • COPY 複製檔案。將構建上下文目錄中的檔案/目錄複製到新的一層映象內。COPY app/* /usr/src/app
  • ADD 更高階的複製檔案。性質和COPY 基本一致,但是可以以url作為源路經。並且如果目標檔案是tar壓縮檔案,ADD 命令會自動解壓到目標路徑。
  • ENV 設定環境變數 ENV VERSION=1.0 EMAIL="xxx.gmail.xom"
  • VOLUME 定義匿名卷VOLUME /data
  • EXPOSE 暴露埠,但這只是宣告,並不會在執行時因此宣告而開啟埠,不過在執行時指定隨機對映埠(docker run -P)時會使用該宣告的埠EXPOSE 80
  • WORKDIR 指定工作目錄,該層後的各層都以該目錄為當前目錄WOEKDIR /app
  • USER 指定當前使用者,和WOEKDIR相似改變本層環境狀態影響後面各層。

由上圖和下圖可以看出–每一條dockerfile命令都會建立一層新映象(重複的執行 1.create和start 2.修改 3.commit),而aufs檔案系統對映象層數有限制,所以如何編寫最佳dockerfile檔案值得深思。
docker build 命令執行過程


構建映象

docker build -t [tag] [映象構建上下文]

Docker 基本操作圖解

圖片描述

掛載卷

可以在dickerfile中使用

VOLUME [“<路徑一>”,<路徑二>]

也可以在啟動時使用

docker run -v <本地路徑>:<容器路徑> 來掛載 ... #(會覆蓋dockerfile中掛載設定) 

資料卷:
docker提供一種高階的用法– 資料卷
資料卷 是一個可供一個或多個容器使用的特殊目錄。資料卷的使用,類似於Linux下對目錄或檔案進行 mount,映象中的被指定為掛載點的目錄中的檔案會隱藏掉,能顯示看的是掛載的 資料卷。

docker volume create my-vol  # 建立資料卷
docker volume ls # 檢視所有的資料卷
docker volume inspect my-vol # 檢視制定資料卷的詳細資訊
# 容器啟動時 可以使用 -v my-vol:/data  或 --mount source=my-vol,target=/data 來掛載資料卷

資料容器(已不使用):“其實就是一個正常的容器,專門用來提供資料卷供其它容器掛載的”。感覺像是由一個容器定義的一個數據掛載資訊。其他的容器啟動可以直接掛載資料卷容器中定義的掛載資訊。

docker run -v /home/dock/Downloads:/usr/Downloads  --name dataVol ubuntu64 /bin/bash
# 建立一個普通的容器。用--name給他指定了一個名(不指定的話會生成一個隨機的名子)。

# 再建立一個新的容器,來使用這個資料容器。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
# --volumes-from用來指定要從哪個資料容器來掛載資料。
docker 網路管理
單個Docker容器是預設地與其他容器和外部網路隔離的。Docker提供了bridge介面,名為docker0,這其實是在Docker Engine安裝時就建立好的。
它通過Docker的bridge介面作為閘道器可以讓容器間以及容器和主機之間進行通訊。
ifconfig docker0 # 檢視宿主機上的docker bridge
➜  ~ ifconfig docker0 
docker0   Link encap:Ethernet  HWaddr 02:42:f0:6e:e5:47  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:f0ff:fe6e:e547/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:56272 errors:0 dropped:0 overruns:0 frame:0
          TX packets:72764 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4101518 (4.1 MB)  TX bytes:106931650 (106.9 MB)

一、外部訪問容器內某些應用
啟動時 使用 -P 和 -p 引數指定埠對映。
使用 -P 時docker會隨機對映一個 49000~49900 的埠 到 容器內部開放的網路埠。
使用 -p 時 (可以多次使用來繫結多個埠)

  • ‘ -p 80:80 ’ 即 對映容器的80埠到主機所有地址的80埠
  • ‘-p 127.0.0.1:80:80’ 對映容器藉口到指定地址的介面
  • ‘-p 127.0.0.1::80’ 對映到指定地址的任意介面
  • ‘-p 127.0.0.1:80:80/udp’ 使用udp標記指定udp埠

新建一個橋接網路

docker network create -d bridge one-net

➜  ~ ifconfig   # 新的橋接網路建立好後 通過ifconfig列印可以看出 閘道器為172.18.0.1
br-410e7c6dcd3c Link encap:Ethernet  HWaddr 02:42:bf:21:46:ce  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:bfff:fe21:46ce/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:108 errors:0 dropped:0 overruns:0 frame:0
          TX packets:338 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6768 (6.7 KB)  TX bytes:47071 (47.0 KB)

在容器啟動時通過 –network引數設定加入那個網路:

docker run -it --rm --name="c1" --network one-net ubuntu:16.04  bash

DNS配置
docker 預設使用宿主機的dns資訊。如果主機的resolv.conf改變,而容器的狀態為stoped,則立即更新。如果狀態為running等到變為stoped後更新。
可以在啟動時使用:

  • –dns=‘IP_ADDEESS’將DNS伺服器新增到容器的/etc/resolv.conf
  • -h HOSTNAME | –hostname=HOSTNAME 可以將hostname設定到容器的/etc/hosts、/etc/hostname、bash中
  • –link=CONTAINER or ID:ALIAS 可以將ALIAS和CONTAINER_NAME/ID對應的容器IP新增到容器的/etc/hosts中。

docker run 命令是 docker createdocker start 命令的組合