docker 從入門到實踐-筆記
由於工作中經常用到docker,所以把 docker入門實踐讀了讀,以便熟練使用。順便記了點筆記,精簡下內容,方便查閱。
筆記只到前八章,後面的內容感覺不是op基本不太用的到。
文章目錄
一、docker簡介
1 什麼是docker?
- dotcloud內部專案》13年開源〉Linux基金會加入
- go語言開發,對程序進行封裝隔離,屬於作業系統層面的虛擬化技術。
- 與傳統虛擬化的區別
- 傳統虛擬化是先虛擬一套硬體後,在其上執行一個完整的作業系統,然後再在上面執行所需的應用程序,耗費資源。
- docker容器內的應用程序直接運行於宿主的核心,容器沒有自己的核心,而且也沒有自己的硬體虛擬。容器要比傳統的虛擬機器更為輕便。
2 為什麼要使用docker?
- 更高效地利用系統資源
- 更快速地啟動時間
- 一致的執行環境
- 持續的交付和部署
- 更輕鬆的遷移
- 更輕鬆的維護和擴充套件
對比傳統虛擬機器的總結:
二、基本概念
1 docker映象
對Linux而言,核心啟動後,會掛載root檔案系統。docker映象就相當於一個root檔案系統。
docker 映象是一個特殊的檔案系統,除了提供容器執行所需的程式、庫、資源配置檔案外,還包含了一些為執行時準備的配置引數(如匿名卷、環境變數、使用者等。
驚醒不包含任何動態資料,其內容在構建之後也不會被改變。
分層儲存
- 使用Union FS 的基礎,設計為分層儲存的架構
- 映象並不是一個ISO那樣的打包檔案,只是一個虛擬的概念,由一組檔案系統,或者說多層檔案系統聯合組成。
- 構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不再發生任何變化,後一層的改變只發生在自己一層。
- 例如,刪除前一層的檔案操作,實際不會刪除前一層的檔案,而是在當前層標記該檔案已刪除。
- 所以在構建映象時,要額外小心,每一層應儘量只包含該層需要新增的東西。
- 分層儲存使映象的複用、定製變得更容易。
2 docker 容器
- 映象和容器的關係,類似類和物件的關係
- 容器可以被建立、啟動、停止、刪除、暫停等
- 容器的實質是程序,但是該程序與直接在宿主機的程序不同,容器程序有屬於自己的獨立的名稱空間。
- 容器可以擁有自己的 root檔案系統、網路配置、程序空間、甚至自己的使用者ID空間。
容器和映象使用的都是分層儲存。
- 每個容器執行時,以映象為基礎層,在其上建立一個當前容器的儲存層,可以稱這個為容器執行時讀寫而準備的儲存層為容器儲存層。
- 容器儲存層生命週期和容器保持一致。
- 最佳實踐要求:容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用資料卷、或者繫結宿主目錄。其效能和穩定性也更高。
- 資料卷的生命週期獨立。容器刪除或重新執行後,資料不會丟失。
3 docker registry
Docker Registry 是一個集中的儲存、分發映象的服務。
一個 docker registry 中可以包含多個 倉庫-repository;每個倉庫可以含有多個標籤-tag;每個標籤對應一個映象。
<倉庫名>:<標籤名> 映象;如果忽略標籤,則預設為 latest
倉庫名一般為兩段式路徑,如jwilder/nginx-proxy;前面往往是docker registry 多使用者環境下的使用者名稱,後者則是對應的軟體名。
Docker Registry 公開服務
- 公開服務開放給使用者使用,允許使用者管理映象。允許使用者免費上傳、下載公開的映象。
- 最常用的 Docker Hub
- 國內提供了針對Docker hub 的加速映象。如:阿里雲加速。
私有 Docker Registry
- 使用者可以在本地搭建私有Docker Registry。
- Docker 官方提供了 Docker Registry 的映象。可以直接使用為私有Registry服務。
- 除了官方,也有第三方軟體實現了 Docker Registry API,甚至提供了使用者介面以及一些高階功能。如:VMWare Harbor 和 Sonatype Nexus。
三、安裝Docker
CE:社群版。支援週期7個月。每6個月釋出一個stable版本
EE:企業版
CentOS 安裝 docker CE
支援 64 位的 centos7,要求版本核心不低於3.10
- 解除安裝舊版本
-
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
-
使用yum安裝
-
更新國內yum源
-
sudo yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce .repo
-
安裝依賴包
-
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
安裝
-
sudo yum makecache fast sudo yum install docker-ce
-
啟動
-
sudo systemctl enable docker sudo systemctl start docker
-
建立docker 使用者組
-
預設 docker命令會用 Unix socket 與Docker 引擎通訊。而只有 root使用者和docker組的使用者才可以訪問Docker引擎的 Unix socket。
-
建立docker組
-
sudo groupadd docker
-
將當前使用者加入 docker 組
-
sudo usermod -aG docker $USER
-
退出當前終端並重新登入,進行如下測試。
-
測試 Docker 是否安裝正確
-
docker run hello-world
-
-
-
映象加速
-
請在 /etc/docker/daemon.json (如果檔案不存在請新建該檔案)
-
{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
-
重啟服務
-
sudo systemctl daemon-reload sudo systemctl restart docker
-
檢測加速是否生效
-
docker info
看到
Registry Mirrors: https://registry.docker-cn.com/
-
-
四、使用docker 映象
docker 執行容器需要本地存在對應的映象,如果本地不存在該映象,docker會從映象倉庫下載該映象。
1 獲取映象
-
docker pull 從 映象倉庫獲取映象
-
docker pull 【選項】 【docker registry 地址【:埠號】/倉庫名【:標籤】
-
具體可看 docker pull --help
-
映象倉庫地址格式為:<域名/IP>[:埠號]。 預設地址是 Docker Hub
-
倉庫名同之前的格式。對應docker hub 如果不給出使用者名稱,則預設是 library,也就是官方映象。
-
2 使用映象
-
docker image ls 列出映象
-
映象體積
- docker hub上顯示的是壓縮後的,本地顯示的是解壓後的體積
- docker image ls 列表中的映象體積總和並不是所有映象的實際硬碟消耗,因為其多層儲存,實際硬碟佔用空間可能比這個體積總和小很多。
- docker system df 檢視映象、容器、資料卷佔用的空間。
-
虛懸映象
- 由於新舊映象同名,舊映象名稱被取消,從而出現倉庫名、標籤均為。
- docker pull, docker build 都可以導致這種現象。
- docker image ls -f dangling=true 可以專門顯示這種映象。
- 虛懸映象已經失去存在價值,可以使用 docker image prune 刪除
-
中間層映象
- docker image ls 只會顯示頂層映象。
- docker image ls -a 會顯示包括中間映象的所有映象
- 這會看到很多無標籤的映象,這些是中間映象,是其他映象的依賴,他們不應該被刪除。
- 刪除所有依賴中間映象的映象後,這些依賴的中間映象也會被連帶刪除
-
列出部分映象
-
根據倉庫名列出映象
-
docker image ls ubuntu
-
-
列出某個特定映象
-
docker image ls ubuntu:18.04
-
-
過濾刪選 --filter 或者-f
-
# 在 mongo:3.2 之後建立的映象 docker image ls -f since=mongo:3.2
-
-
-
以特定格式顯示
-
預設 docker image ls 會顯示完整的表格
-
docker image ls -q 只顯示id
-
可以與 -f 配合使用,篩選id 批量刪除
-
使用go的模版用法,自己組織排列表格
-
#下面的命令會直接列出映象結果,並且只包含映象ID和倉庫名: docker image ls --format "{{.ID}}: {{.Repository}}" #打算以表格等距顯示,並且有標題行,和預設一樣,不過自己定義列: docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.T ag}}"
-
-
-
刪除本地映象
-
docker image rm 命令
-
docker image rm [選項] <映象1> [<映象2> ...]
-
其中 <映象> 可以是 映象短id 、映象長id、映象名、或者映象摘要。
-
id去前三個以上能夠區別就可以。
-
-
-
Untagged 和 Deleted
- 映象的唯一標識是 id和摘要,一個映象可能對應多個標籤。
- 按映象標籤刪除映象會首先刪除標籤,如果沒有標籤指向該映象,則會執行delete操作。
- 刪除行為自上而下進行判斷刪除。
-
docker image ls 配合docker image rm。
-
3 利用 commit 理解映象構成
-
docker commit 可以將容器儲存為映象
-
語法格式
-
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]] 例如: docker commit \ --author "Tao Wang <[email protected]>" \ --message "修改了預設網頁" \ webserver \ nginx:v2
-
docker history 可以檢視映象內的歷史記錄
-
-
慎用 docker commit
- 會有大量無關內容新增,導致映象極為臃腫。
- 對所有的映象操作都是黑箱,除了製作映象的人知道執行過什麼命令,怎麼生成的映象,別人無從得知。
- 每層commit 都會使映象更加臃腫一次
-
4 使用 Dockerfile 定製映象
Dockerfile 是一個文字檔案,其內包含了一條條的指令,每條指令構建一層。因此每一條指令的內容,就是描述該層如何構建。
-
步驟
-
在一個空白目錄中,建立一個文字檔案,命名為Dockerfile
-
寫入構建內容,例如
-
FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index .html
-
-
執行命令構建映象
-
#例如 docker build -t nginx:v3
-
-
-
FROM 指定基礎映象
-
FROM 是 Dockerfile的必備指令,也必須是第一條指令
-
在 Docker Hub 上有非常多的高質量的官方映象,有可以直接拿來使用的服務類的 映象,如 nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;也有一些方便開發、構建、執行各種語言應用的映象,如
node 、 openjdk 、 python 、 ruby 、 golang 等。可以在其中尋找一個最 符合我們最終目標的映象為基礎映象進行定製。
如果沒有找到對應服務的映象,官方映象中還提供了一些更為基礎的作業系統鏡 像,如 ubuntu 、 debian 、 centos 、 fedora 、 alpine 等,這些操作系 統的軟體庫為我們提供了更廣闊的擴充套件空間。
-
scratch 是一個特殊的映象,是一個虛擬的概念,表示空白映象,並不實際存在。
-
-
RUN 執行命令
- RUN指令用來執行命令列命令。在定製映象時最常用。
- 有兩種格式
- shell 格式 : RUN <命令>
- exec格式:RUN [“可執行檔案”,“引數1”,“引數2”]
- AUFS 最大層數現在是不超過127層
- 應該把多個命令合併為一個RUN指令,只建立一層映象,並及時刪除多餘下載,快取等。僅僅使用一個RUN指令,並使用&&將各個所需命令連線起來。
- Dockerfile 支援shell類的行尾加 \ 換行 以及 # 的註釋方式
-
docker build 進行映象構建
-
格式
-
docker build [選項] <上下文路徑/URL/- >
-
-
1 映象構建上下文 (Context)
docker build [選項] <上下文路徑/URL/->
- docker build 的工作原理:並非在本地構建,而是在服務端
- 使用者指定上下文路徑,docker build 會將路徑下的所有內容打包,上傳給docker 引擎。
- dockerfile中的相對路徑都是相對上下文的。
- 可以用 .dockerignore 忽略不需要上傳的內容。
- 預設使用上下文路徑先的dockerfile。也可以單獨通過 -f 檔案路徑指定。
2 其它 docker build 的用法
-
直接用 git repo 構建
-
docker build https://github.com/twang2218/gitlab-ce-zh.git#:11 .1
-
指定了構建的 git repo url;指定預設分支master;構建目錄 為 /11.1/
-
docker 會自己clone 切換分支、指定目錄,然後開始構建。
-
-
用給定的tar壓縮包構建
-
docker build http://server/context.tar.gz
-
自動下載、解壓,以其作為上下文,開始構建。
-
-
從標準輸入中讀取 Dockerfile 進行構建
-
docker build - < Dockerfile # 或者 cat Dockerfile | docker build -
-
只能讀取Dockerfile ,沒有上下文,所以不能把本地檔案COPY進映象。
-
-
從標準輸入中讀取上下文壓縮包進行構建
-
docker build - < context.tar.gz
-
如果發現輸入的檔案格式為 gzip、bzip2 以及 xz,會自動解壓展開,作為上下文,開始構建。
-
3 Dockerfile 指令詳解
-
COPY 複製檔案
-
兩種指令格式,一種類似命令列,一種類似函式呼叫
-
COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
-
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
-
-
<源路徑>可以有多個,甚至可以是萬用字元
-
<目標路徑>可以是容器內的絕對路徑,也可以是相對工作目錄的相對路徑。工作目錄可以用WORKDIR指定。
-
使用指令時 可以加上 --chown=: 改變檔案所屬使用者及所屬組。
-
-
ADD 更高階的複製檔案
- 性質與COPY基本一致,增加了一些功能。
- <源路徑>可以是URL,會自動下載,下載後的檔案許可權為600. URL 下載不會自動解壓縮。
- <源路徑>是tar檔案,gzip或者bzip2 以及 sz,add 會自動解壓縮。如果希望不自動解壓,則要使用COPY。
- ADD會使映象構建快取失效,所以會使構建變慢。語義也不如COPY清晰。
- 最佳實踐要求:儘可能使用COPY,只有需要解壓縮時使用 ADD
- 使用指令時也可以加上 --chown=: 改變檔案所屬使用者及所屬組
-
CMD 容器啟動命令
-
CMD指令的格式和RUN相似,也是兩種格式
-
shell格式
-
CMD <命令>
-
-
exec 格式
-
CMD ["可執行檔案", "引數1", "引數2"]
-
-
引數列表格式,在指定了 ENTRYPOINT 後, 用 CMD指定引數
-
CMD [ "引數1", "引數2"]
-
-
-
CMD 是用於指定預設的容器主程序的啟動命令的。如 ubuntu 映象預設的 CMD 是 /bin/bash
-
推薦使用exec,這種格式會解析為JSON資料,一定要用 " " 雙引號
-
實際上shell格式,會被包裝成sh -c 的 exex 引數格式。
-
docker的所有應用都應放在前臺執行,否則主程式就會退出,容器就失去了存在的意義。所以不能用 CMD service XXX start
-
正確做法是 直接執行 XXX 可執行檔案,並且以前臺形式執行:
-
CMD ["nginx", "-g", "daemon off;"]
-
-
4 ENTRYPOINT 入口點
- ENTRYPOINT 的格式 也分為 shell 和exec兩種格式
- ENTRYPOINT的目的和CMD 一樣,都是在指定容器啟動程式以及引數。
- 指定ENTRYPOINT後 ,CMD的含義就發生了改變,不再是直接執行的命令,而是將其內容作為引數傳給ENTRYPOINT。
- 即執行 “”
- ENTRYPOINT主要是為了一下場景
- 讓映象變成命令一樣使用,直接執行映象後接的引數會傳送給ENTRYPOINT,而不是直接替換CMD。
- 執行應用執行前的準備工作。可以寫一個指令碼,然後放入ENTRYPOINT 中執行。
5 ENV設定環境變數
- 有兩種格式
- ENV
- ENV = =…
- 作用是設定環境變數,之後的其它命令或應用都可以直接使用定義的環境變數。
5 ARG 構建引數
- 格式:ARG <引數名>[=<預設值>]
- 構建引數和ENV的效果一樣,但是ARG定義的引數只在構建時存在,容器執行時不存在
- docker build 中 用 --build-arg <引數名>=<值> 可以覆蓋 ARG定義的引數。
6 VOLUME 定義匿名卷
- 格式
- VOLUME ["<路徑1>","<路徑2>"]
- VOLUME <路徑>
- 容器執行時,應儘量保持容器儲存層不發生寫操作,對於需要儲存的動態資料,其資料檔案應該儲存在卷中。
- 為防止執行時使用者忘記將動態檔案目錄掛載為卷,可以通過VOLUME 事先將這些目錄掛載為匿名卷。
- 執行時 可以 在 docker run 後加 -v 引數替代掛載配置。
7 EXPOSE 宣告埠
- 格式: EXPOSE <埠1> [<埠2>…]
- EXPOSE 命令宣告執行時容器提供服務埠,僅僅只是宣告。
- 執行時應用並不會因為這個宣告開啟這個埠的服務。
- 好處
- 幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。
- 在執行時使用隨機埠對映時,即 docker run -P 時,會自動隨機對映 EXPOSE的埠。
- 注意區分 EXPOSE 和執行時 -p <宿主埠>:<容器埠>
- -p 是對映宿主埠和容器埠,即將容器的對應埠服務公開給外界訪問
- 而EXPOSE 僅僅是宣告容器打算使用什麼埠,而不會自動與宿主埠進行對映。
8 WORKDIR 指定工作目錄
- 格式為:WORKDIR <工作目錄路徑>
- 使用 WORKDIR 可以指定工作目錄(當前目錄),以後的各層的當前目錄都會變成這個目錄。
- 注意 dockerfile 和shell不同。每個RUN命令是單獨的一層容器。是獨立的,上一個RUN進入某個目錄,下一個RUN並不在這個目錄。WORKDIR會使每次RUN都在指定目錄
- 如果指定的目錄不存在,WORKDIR會自動幫忙建立。
9 USER 指定當前使用者
- 格式為: USER <使用者名稱>[:<使用者組>]
- 與 WORKDIR 相似,都是改變環境狀態,並影響以後的層。
- USER 改變之後層的 執行 RUN CMD 以及 ENTRYPOINT的身份
- USER 切換的使用者必須是事先建立好的。
在TTY缺失的情況下 可以下載使用gosu 替換 su 和 sudo的使用。
10 HEALTHCHECK 健康檢查
- 格式
- 設定檢查容器健康狀況的命令
- HEALTHCHECK [選項] CMD <命令>
- 遮蔽基礎映象的健康檢查命令,如果有
- HEALTHCHECK NONE
- 設定檢查容器健康狀況的命令
- 作用,通過檢測容器健康狀態,避免程式進入死鎖,不退出,卻無法提供服務的情況。
- 指定 HEALTHCHECK 指令後,容器初始狀態為 starting,在指令檢查成功後 變為 healthy,如果連續一定次數失敗 則會變為 unhealthy
- HEALTHCHECK 支援一下選項
- –interval=<間隔> : 兩次健康檢查的時間間隔,預設30s
- –timeout=<時長> :健康檢查命令執行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,預設 30 秒;
- –retries=<次數>:當連續失敗指定次數後,則將容器狀態視為unhealthy,預設 3 次。
- 同 CMD,ENTRYPOINT ,HEALTHCHECK 只可以出現一次,如果出現多個,只有最後一個生效。
- HEALTHCHECK 【選項】 CMD 後面的命令 可以是 shell 或exec 格式。命令的返回值決定了檢查是否成功: 0-成功 1-失敗 2-保留不要使用。
11 ONBUILD 為他人做嫁衣
- 格式:ONBUILD <其它指令>
- ONBUILD 後的命令在當前映象構建時並不會執行,只有以當前映象為基礎映象,去構建下一級映象時才會被執行。
5 多階段構建
-
docker 17.05 之前 ,構建映象時通常會採用兩種方式
- 全部放入一個dockerfile
- 映象層次多,體積較大,部署的時間變長
- 原始碼存在洩漏的風險
- 分散到多個dockerfile
- 部署過程比較複雜
- 全部放入一個dockerfile
-
17.05 之後開始支援分階段構建,只需要編寫一個dockerfile 就可以解決上述問題
-
只構建某一階段的映象
-
可以使用as來為某一階段命名
-
FROM golang:1.9-alpine as builder
-
如果只想構建 這個階段的映象,構建時增加 --target=builder 引數即可,如
-
docker build --target builder -t username/imagename:tag .
-
-
構建時從其它映象複製檔案
-
COPY --from=0 <源路徑> <目標路徑> 從上一階段的映象中複製檔案
-
也可以複製任意映象中的檔案,如
-
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
-
-
-
-
實戰多階段構建 Laravel 映象 (PHP開發)
6 其它的映象構建方式
- 從rootfs 壓縮包匯入
- 壓縮包可以是本地檔案、遠端 Web 檔案,甚至是從標準輸入中得到。壓縮包將會 在映象 / 目錄展開,並直接作為映象第一層提交。
- docker save 和docker load
- 將映象儲存為一個檔案,然後傳輸到另一個位置,然後在載入進來。
- 這是沒有Docker Registry 時的做法,現在不推薦
- docker save 將映象儲存為歸檔檔案
7 映象的實現原理
- Docker 映象是怎麼實現增量的修改和維護的?
- 每個映象由很多層次構成
- Docker 使用Union FS 將這些不同的層結合到一個映象中。
- Union FS 通常有兩個用途
- 實現不借助 LVM 、RAID 將多個disk掛到同一目錄下。
- 將一個只讀的分支可一個可寫的分支聯合在一起。
- Union FS 通常有兩個用途
五、操作Docker 容器
容器:獨立執行的一個或一組應用,以及它們的執行態環境。
虛擬機器:模擬執行的一整套作業系統
如何管理一個容器,建立、啟動、停止
1 啟動容器
- 兩種啟動方式:
- 基於映象新建一個容器並啟動
- 將在終止狀態的容器重新啟動。
-
新建並啟動
- docker run 【選項】 映象 <命令> <命令引數>
- 互動模式
- -t 分配一個偽終端 (pseudo-tty)並繫結到容器的標準輸入上
- -i 讓容器的標準輸入保持開啟
- 當利用docker run 來建立容器時,後臺執行的標準操作包括:
- 檢查本地是否存在指定的映象,不存在則從公有倉庫下載
- 利用映象建立並啟動一個容器
- 分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
- 從宿主機配置的網橋介面中橋接一個虛擬介面到容器中
- 從地址池配置一個ip地址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
-
啟動已終止容器
- docker container start
- 容器中所需的資源都是應用程式所必須的,除此之外,並沒有其它的資源。
-
後臺執行
- -d 引數,讓docker 在後臺執行而不是直接把執行命令的結果輸出在當前的宿主機下
- 容器是否會長久執行,和docker run 指定的命令有關,和 -d 無關
- -d 會返回一個 唯一 id ,docker container ls 可以檢視
- docker container logs [container ID or NAMES] 可以獲取容器的輸出資訊
-
終止容器
- docker container stop 終止一個在執行的容器
- 當dock兒中指定的應用終結時,容器也會自動終止。
- 如果只啟動終端,exit 或者 ctr +d 退出終端時,所建立的容器會立刻終止。
- 終止狀態的容器可以用 docker container ls -a 檢視
- docker container start 命令來重新啟動
- docker container restart 命令會將一個執行態的容器終止,然後再重 新啟動它
-
進入容器
docker attach 或者 docker exec 可以進入容器,推薦使用 exec
- attach命令
- 進入後,exit 會導致容器終止
- exec
- docker exec 後面可以跟多個引數,主要是 -i -t
- exit 不會導致容器終止
- attach命令
-
匯出和匯入容器
-
docker ecport 可以匯出本地某個容器,匯出的容器快照到本地檔案,如
-
docker export 7691a814370e > ubuntu.tar
-
-
docker import 從容器快照檔案中再匯入為映象
-
cat ubuntu.tar | docker import - test/ubuntu:v1.0
-
也支援指定 URL或目錄匯入
docker import http://example.com/exampleimage.tgz example/imag erepo
-
docker load vs docker import
- docker import 容 器快照檔案將丟棄所有的歷史記錄和元資料資訊(即僅儲存容器當時的快照狀 態),
- 而docker load 映象儲存檔案將儲存完整記錄,體積也要大。此外,從容器快照檔案匯入 時可以重新指定標籤等元資料資訊。
-
-
-
刪除容器
- docker container rm
- 刪除執行中的容器 -f 引數,docker會發送 SIGKILL訊號給容器
-
清理所有處於終止狀態的容器
-
docker container prune
-
六、訪問倉庫
- Repository 倉庫是集中存放映象的地方
- Registry 註冊伺服器,是管理倉庫的具體伺服器。每個伺服器可以有多個倉庫,每個倉庫下面有多個映象。
1 docker hub
Docker hub 是官方維護的公共倉庫
- 登陸
- 可以在官網註冊一個賬號
- docker login / docker logout 登陸/退出
- 拉取映象
- docker search 關鍵詞 查詢官方映象
- docker pull 映象 拉取映象
- 前面沒有使用者名稱的映象,由docker 公司建立、驗證、支援、提供。被稱為基礎映象或者根映象
- 前面有使用者字首的是有docker使用者建立並維護的映象
- 在查詢時 --filter=stars=N 可以僅顯示收藏數量N以上的映象
- 推送映象
- docker push 使用者字首/倉庫名:tag
- 自動建立
2 私有倉庫
- 略
Nexus3.x 私有倉庫
- 略
七、docker 資料管理
- 資料卷 Volumes
- 掛載主機目錄 Bind mounts
-
資料卷
-
資料卷是一個可供一個或多個容器使用的特殊目錄。繞過了 UFS
- 在容器間可以共享和重用
- 對資料卷的修改會立馬生效
- 對資料卷的更新不會影響映象
- 資料卷 預設一直存在,即使容器被刪除。
-
建立資料卷,例如
-
docker volume create my-vol
-
-
檢視所有的 資料卷
-
docker volume ls
-
-
檢視指定資料卷的資訊
-
docker volume inspect my-vol
-
-
啟動一個掛載資料卷的容器
-
docker run -d -P \ --name web \ # -v my-vol:/webapp \ --mount source=my-vol, target=/webapp \ training/webapp \ python app,py
-
-
檢視容器的具體資訊時可以看到資料卷的具體資訊
-
docker inspect web
-
在 “Mounts” key 的下面
-
-
刪除資料卷
-
資料卷生命週期獨立於容器,docker不會自動刪除資料卷
-
如果要在刪除容器時同時刪除資料卷,使用 docker rm -v 刪除容器
-
清理無主資料卷
-
docker volume prune
-
-
-
-
掛載主機目錄
-
使用 --mount 可以指定掛載一個本機目錄到容器中
-
docker run -d -P \ --name web \ # -v /src/webapp:opt/webapp \ --mount type=bind,source=/src/webapp, target=/opt/webapp \ training/webapp \ python app.py
-
本地目錄必須是絕對路徑
-
如果 路徑不存在,–mount 會報錯
-
方便測試
-
預設許可權是讀寫,可以增加 readonly 選項 改為只讀
-
也可以掛載一個本地主機檔案作為資料卷
-
-
八、docker中的網路功能介紹
docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務
-
外部訪問容器
- 通過 -P 或者 -p 來指定埠對映
- -P 會隨機對映一個 49000-49900 的埠到容器開放的網路埠
- -p 則可以指定要對映的埠,一個指定埠只能繫結一個容器
- -p 可以使用多次,繫結多個埠
- -p 支援的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
- 只指定port 忽略ip,是對映介面上的所有地址
- docker port container 可以檢視容器的埠配置
-
容器互聯
- docker run --link 可以使容器互聯
- 自定義docker網路連線多個容器
-
建立一個新的 Docker 網路
-
docker network create -d bridge my-net
-
-d 指定docker網路的型別,有 bridge overlay 兩個選項
-
-
執行一個容器並連線到新建的 my-net 網路
-
docker run -it --rm --name busybox1 --network my-net busybox sh
-
-
開啟新終端,再執行一個容器並加入到 my-net
-
docker run -it --rm --name busybox2 --network my-net busybox sh
-
-
在兩個容器中用 ping 可以證明 busybox1 容器和 busybox2 容器建立了互關係
-
# busybox1中 PING busybox2 # busybox2 中 PING busybox1
-
-
docker compose
- 如果有多個容器需要連線,推薦使用 docker compose
-
配置DNS
- 略
-
高階網路配置
- 略
-
Docker Compose 專案
- 略