Docker筆記 基礎理解
Docker筆記一
容器的基本結構
映象(images)就是一堆只讀層的統一視角。
從上向下可以看到多個只讀層,他們從疊在一起。上層有指標指向本層,並且這些只讀層可以在主機訪問。docker 的統一檔案系統(Aufs)技術將不同的層整合成一個檔案系統,為這些層提供了統一的視角,在使用者角度來看,只存在一個檔案系統。
容器
容器就是在映象的統一視角上加可讀可寫的一層。
容器: 映象 + 讀寫層。
使用dockerfile檔案定製映象
首先看一張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 -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 create
和 docker start
命令的組合