柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Docker學(xué)習(xí)筆記
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Docker學(xué)習(xí)筆記
Docker學(xué)習(xí)筆記
Docker鏡像、容器、工作進(jìn)程關(guān)系圖安裝與卸載Docker(CentOS)安裝卸載
常用命令幫助啟動(dòng)類(lèi)命令鏡像命令列出本地主機(jī)上的鏡像查找遠(yuǎn)程倉(cāng)庫(kù)中的指定鏡像下載鏡像查看鏡像/容器/數(shù)據(jù)卷所占的空間刪除某個(gè)鏡像問(wèn)題:什么是Docker虛懸鏡像
容器命令新建并啟動(dòng)容器列出當(dāng)前所有正在運(yùn)行的容器退出容器啟動(dòng)已經(jīng)停止的容器重啟、停止、強(qiáng)制停止容器刪除已停止的容器啟動(dòng)守護(hù)容器詳解何為守護(hù)容器?機(jī)制解析
查看容器日志查看容器內(nèi)運(yùn)行的進(jìn)程查看容器內(nèi)部細(xì)節(jié)進(jìn)入正在運(yùn)行的容器并以命令行交互(重要)docker exec命令docker attach命令兩者區(qū)別例子:進(jìn)入正在運(yùn)行的redis容器并以命令行形式進(jìn)行交互
從容器內(nèi)拷貝命令到主機(jī)上導(dǎo)入和導(dǎo)出容器(用于自己制作鏡像)方式1:export和import方式2:commit兩者區(qū)別
容器數(shù)據(jù)卷查看容器的掛載目錄(文件)容器卷之間的繼承掛載權(quán)限問(wèn)題
Dockerfile(重點(diǎn))Docker執(zhí)行Dockerfile的大致流程常用保留字*
DockerNetWork(重點(diǎn))DockerNetWork的作用docker網(wǎng)絡(luò)模式設(shè)置方式bridge模式(常用)host模式none模式container模式
自定義docker網(wǎng)絡(luò)(常用)創(chuàng)建和加入命令注意點(diǎn)(關(guān)注)
查看docker網(wǎng)絡(luò)查看網(wǎng)絡(luò)源數(shù)據(jù)
Docker Compose容器編排(重點(diǎn))安裝容器編排步驟Compose 模板文件指令
Docker鏡像、容器、工作進(jìn)程關(guān)系圖
安裝與卸載Docker(CentOS)
官網(wǎng)安裝教程地址
安裝
如果已經(jīng)安裝過(guò)舊版本的docker需要先通過(guò)以下命令刪除
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
然后通過(guò)以下命令確認(rèn)CentOS的版本在7及以上(這里使用的是7.6.1810版本)
cat /etc/centos-release
然后通過(guò)以下命令安裝gcc環(huán)境
sudo yum -y install gcc
sudo yum -y install gcc-c++
然后通過(guò)以下命令安裝yum-utils
sudo yum install -y yum-utils
然后設(shè)置stable鏡像倉(cāng)庫(kù)(用于下載docker遠(yuǎn)程倉(cāng)庫(kù)中的鏡像,因?yàn)樵诖箨懰越ㄗh采用阿里或騰訊等的源) 這里采用阿里云的源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然后最好更新以下yum軟件包索引 注意:CentOS8要去掉fast
sudo yum makecache fast
然后要安裝Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
安裝完以上環(huán)境后就可以啟動(dòng)Docker了
sudo systemctl start docker
啟動(dòng)后通過(guò)以下命令測(cè)試是否啟動(dòng)完成
sudo docker version
如果出現(xiàn)以下信息則說(shuō)明安裝成功 注意:Client端和Server端的版本號(hào)要一致 可以再使用以下命令進(jìn)行驗(yàn)證
sudo docker run hello-world
如果出現(xiàn)以下內(nèi)容說(shuō)明docker運(yùn)行正常
卸載
# 停止服務(wù)
sudo systemctl stop docker
# 移除docker依賴(lài)
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 移除本地配置文件和各種第三方依賴(lài)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
常用命令
幫助啟動(dòng)類(lèi)命令
鏡像命令
列出本地主機(jī)上的鏡像
docker images
如下圖所示: 各個(gè)表格項(xiàng)說(shuō)明: REPOSITORY:表示鏡像的倉(cāng)庫(kù)源 TAG:鏡像的標(biāo)簽(相當(dāng)于版本號(hào)) IMAGE ID:鏡像唯一ID CREATED:鏡像創(chuàng)建時(shí)間 SIZE:鏡像大小
同一倉(cāng)庫(kù)源可以有多個(gè)TAG版本,代表這個(gè)倉(cāng)庫(kù)源的不同個(gè)版本,我們使用REPOSITORY:TAG來(lái)定義不同的鏡像。如果你不指定一個(gè)鏡像的版本標(biāo)簽,例如你只使用ubuntu,docker將默認(rèn)使用ubuntu:latest鏡像
常用參數(shù):
-a:列出本地所有的鏡像(含歷史映像層)
-q:只顯示鏡像ID
查找遠(yuǎn)程倉(cāng)庫(kù)中的指定鏡像
docker search 鏡像名稱(chēng)
比如查找redis鏡像: 各個(gè)表格項(xiàng)說(shuō)明: NAME:鏡像名稱(chēng) DESCRIPTION:鏡像說(shuō)明 STARS:點(diǎn)贊數(shù)量 OFFICIAL:是否是官方的 AUTOMATED:是否是自動(dòng)構(gòu)建的
常用參數(shù):
--limit :只列出N個(gè)鏡像,默認(rèn)25個(gè)
比如:docker search --limit 5 redis
下載鏡像
docker pull 鏡像名稱(chēng)[:TAG]
沒(méi)有TAG就是最新版 等價(jià)于
docker pull 鏡像名字:latest
查看鏡像/容器/數(shù)據(jù)卷所占的空間
docker system df
如下:
刪除某個(gè)鏡像
docker rmi 某個(gè)鏡像名字或ID
當(dāng)被刪除的鏡像已經(jīng)創(chuàng)建了實(shí)例容器后,需要用以下參數(shù)強(qiáng)制刪除:
-f
比如:docker rmi -f redis
強(qiáng)制刪除多個(gè):
docker rmi -f 鏡像名1[:TAG] 鏡像名2[:TAG] ...
問(wèn)題:什么是Docker虛懸鏡像
倉(cāng)庫(kù)名、標(biāo)簽都是
容器命令
新建并啟動(dòng)容器
docker run [options] image [command] [arg...]
run執(zhí)行流程圖 常用選項(xiàng)(options,重點(diǎn)):
--name="容器新名字" 為容器指定一個(gè)名稱(chēng);
-d:后臺(tái)運(yùn)行容器并返回容器ID,也即啟動(dòng)守護(hù)式容器(后臺(tái)運(yùn)行);
-i:以交互模式運(yùn)行容器,通常與t同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用;
也即啟動(dòng)交互式容器(前臺(tái)有偽終端,等待交互);
-P:隨機(jī)端口映射,大寫(xiě)P
-p:指定端口映射,小寫(xiě)p
釋義: 1.啟動(dòng)一個(gè)交互式容器,比如一個(gè)centos系統(tǒng) 如果使用的不是鏡像的latest版本則需要在后面加上版本號(hào)
啟動(dòng)完成后注意觀察終端的用戶(hù)名稱(chēng),會(huì)變?yōu)樾陆K端的名稱(chēng)。此時(shí)可以進(jìn)行交互
2.端口映射的作用
列出當(dāng)前所有正在運(yùn)行的容器
docker ps [options]
常用選項(xiàng):
-a:列出當(dāng)前所有正在運(yùn)行的容器+歷史上運(yùn)行過(guò)的
-l:顯示最近創(chuàng)建的容器
-n:顯示最近n個(gè)創(chuàng)建的容器
-q:靜默模式,只顯示容器編號(hào)
退出容器
1、使用exit命令退出 run進(jìn)去容器,exit退出,容器停止 2、ctrl+p+q run進(jìn)去容器,ctrl+p+q退出,容器不停止
啟動(dòng)已經(jīng)停止的容器
docker start 容器ID或者容器名
重啟、停止、強(qiáng)制停止容器
#重啟
docker restart 容器ID或者容器名
#停止
docker stop 容器ID或者容器名
#強(qiáng)制停止
docker kill 容器ID或者容器名
刪除已停止的容器
一定要先停止容器才能刪除
docker rm 容器ID
常用選項(xiàng)
-f:強(qiáng)制刪除某個(gè)容器,即使正在運(yùn)行
一次性刪除多個(gè)容器實(shí)例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
啟動(dòng)守護(hù)容器詳解
何為守護(hù)容器?
在大部分的場(chǎng)景下,我們希望docker的服務(wù)是在后臺(tái)運(yùn)行的,我們可以過(guò) -d 指定容器的后臺(tái)運(yùn)行模式。
機(jī)制解析
很重要的一點(diǎn): Docker容器后臺(tái)運(yùn)行,就必須有一個(gè)前臺(tái)進(jìn)程 容器運(yùn)行的命令如果不是那些一直掛起的命令(比如運(yùn)行top,tail),就是會(huì)自動(dòng)退出的。
例子:以守護(hù)容器的方式啟動(dòng)redis
查看容器日志
docker logs 容器ID
查看容器內(nèi)運(yùn)行的進(jìn)程
docker top 容器ID
查看容器內(nèi)部細(xì)節(jié)
docker inspect 容器ID
進(jìn)入正在運(yùn)行的容器并以命令行交互(重要)
docker exec命令
docker exec [options] 容器ID 命令行環(huán)境(bash或者/bin/bash或者/bin/sh)
常用選項(xiàng)
-d:后臺(tái)運(yùn)行容器并返回容器ID,也即啟動(dòng)守護(hù)式容器(后臺(tái)運(yùn)行);
-i:以交互模式運(yùn)行容器,通常與t同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用;
也即啟動(dòng)交互式容器(前臺(tái)有偽終端,等待交互);
docker attach命令
docker attach 容器ID
兩者區(qū)別
attach直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程用exit退出,會(huì)導(dǎo)致容器的停止。 exec是在容器中打開(kāi)新的終端,并且可以啟動(dòng)新的進(jìn)程用exit退出,不會(huì)導(dǎo)致容器的停止。
推薦使用exec
例子:進(jìn)入正在運(yùn)行的redis容器并以命令行形式進(jìn)行交互
從容器內(nèi)拷貝命令到主機(jī)上
docker cp 容器ID:容器內(nèi)路徑 目的主機(jī)路徑
導(dǎo)入和導(dǎo)出容器(用于自己制作鏡像)
方式1:export和import
注意:導(dǎo)入的容器會(huì)作為一個(gè)鏡像?。。?/p>
#導(dǎo)出
docker export 容器ID > 文件名.tar(或者一個(gè)新文件的絕對(duì)路徑,只有文件名即導(dǎo)入到當(dāng)前目錄下)
# 導(dǎo)入
cat 文件名.tar(或者一個(gè)新文件的絕對(duì)路徑) | docker import - 鏡像用戶(hù)/鏡像名:鏡像版本號(hào)
鏡像用戶(hù)、鏡像名、鏡像版本號(hào)均可自定義,注意:橫杠和后面的內(nèi)容直接有空格
export導(dǎo)出容器的內(nèi)容流作為一個(gè)tar歸檔文件[對(duì)應(yīng)import命令] import 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)再導(dǎo)入為鏡像[對(duì)應(yīng)export命令]
方式2:commit
通過(guò)該命令將一個(gè)容器處理成一個(gè)鏡像
docker commit -m="提交的信息" -a="作者" 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名[:版本號(hào)]
兩者區(qū)別
方式一相當(dāng)于先把一個(gè)容器打包成壓縮包然后導(dǎo)入成一個(gè)鏡像其本質(zhì)是一個(gè)壓縮包,每次都是一個(gè)整體。方式二相當(dāng)于在Base鏡像的基礎(chǔ)上擴(kuò)展,如下圖:
容器數(shù)據(jù)卷
主要作用: 1.將容器內(nèi)的數(shù)據(jù)備份到宿主機(jī)對(duì)應(yīng)目錄中,防止數(shù)據(jù)丟失 2.在讀寫(xiě)權(quán)限允許的情況下,可以在宿主機(jī)目錄中對(duì)映射的容器內(nèi)對(duì)應(yīng)文件進(jìn)行修改而不必進(jìn)入容器修改。簡(jiǎn)化操作 語(yǔ)法:
1.使用命令
使用多個(gè)-v命令可以?huà)燧d多個(gè)文件或目錄 如果要設(shè)置讀寫(xiě)權(quán)限則在后面加上即可,如下 (默認(rèn)為rw):
這里的權(quán)限限制的是容器內(nèi)的目錄或文件而不是宿主機(jī) 2.使用docker-compose編排服務(wù)
個(gè)人理解: 比如在宿主機(jī)A中有個(gè)xxx.txt文件,在容器B中有個(gè)yyy.txt文件。 此時(shí)通過(guò) -v命令 將宿主機(jī)A中的xxx.txt文件與容器B中的yyy.txt文件進(jìn)行映射(即將容器B中的yyy.txt文件掛載到宿主機(jī)A中的xxx.txt文件)。這種映射可以是文件,也可以是目錄。 此時(shí)如果容器中對(duì)應(yīng)文件是可讀寫(xiě)的,那么當(dāng)在容器B內(nèi)修改yyy.txt文件的內(nèi)容時(shí)宿主機(jī)A中的xxx.txt文件的內(nèi)容也會(huì)相應(yīng)更改,反之亦然。 如果映射的是目錄也是同理,比如在宿主機(jī)A的XXX目錄中新建了一個(gè)xxx.txt文件則在容器內(nèi)對(duì)應(yīng)的YYY目錄中也會(huì)新增一個(gè)xxx.txt文件,反之亦然。 上述操作,即使容器已經(jīng)停止了,只要再啟動(dòng)回來(lái)也依舊能進(jìn)行同步。
查看容器的掛載目錄(文件)
通過(guò)以下命令查看:
docker inspect 容器ID
容器卷之間的繼承
語(yǔ)法:
1.使用命令
個(gè)人理解: 現(xiàn)在有兩個(gè)容器B1和B2,其中容器B1已經(jīng)與宿主機(jī)建立了某種映射關(guān)系?,F(xiàn)在通過(guò)以上命令將容器B2繼承容器B1的映射關(guān)系。此時(shí)容器B2與宿主機(jī)的映射關(guān)系就相同了。此時(shí)哪怕容器B1停止甚至銷(xiāo)毀了,容器B2與宿主機(jī)之間的映射關(guān)系都不會(huì)消失。
掛載權(quán)限問(wèn)題
如果使用命令則加上--privileged=true即可: 如果使用的是docker-compose編排服務(wù)的方式則通過(guò)以下配置開(kāi)啟權(quán)限:
Dockerfile(重點(diǎn))
Dockerfile是用來(lái)構(gòu)建Docker鏡像的文本文件,是由一條條構(gòu)建鏡像所需的指令和參數(shù)構(gòu)成的腳本。 相當(dāng)于一個(gè)清單,里面包含構(gòu)建當(dāng)前鏡像所需要的所有構(gòu)建命令。
在Dockerfile中: 1:每條保留字指令都必須為大寫(xiě)字母且后面要跟隨至少一個(gè)參數(shù) 2:指令按照從上到下,順序執(zhí)行 3:#表示注釋 4:每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層并對(duì)鏡像進(jìn)行提交
Docker執(zhí)行Dockerfile的大致流程
(1)docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器 (2)執(zhí)行一條指令并對(duì)容器作出修改 (3)執(zhí)行類(lèi)似docker commit的操作提交一個(gè)新的鏡像層 (4) docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器 (5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
常用保留字*
FROM 基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的,指定一個(gè)已經(jīng)存在的鏡像作為模板,第一條必須是from
MAINTAINER(已棄用) 鏡像維護(hù)者的姓名和郵箱地址
RUN 指定容器構(gòu)建時(shí)需要運(yùn)行的命令 兩種格式: 1.shell格式:RUN <命令行命令> <命令行命令>等同于,在終端操作的shell命令。 2.exec格式 RUN [“可執(zhí)行文件”,“參數(shù)1”,“參數(shù)2”] 例如: RUN [ “./test.php”, “dev”, “offline”]等價(jià)于RUN ./test.php dev offline
EXPOSE 當(dāng)前容器對(duì)外暴露出的端口
WORKDIR 指定在創(chuàng)建容器后,終端默認(rèn)登錄進(jìn)來(lái)的工作目錄,一個(gè)落腳點(diǎn)。即運(yùn)行該容器后所在的容器內(nèi)部目錄
USER 指定該鏡像以什么樣的用戶(hù)去執(zhí)行,如果都不指定,默認(rèn)是root
ENV 用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量
VOLUME 容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
ADD與COPY ADD:將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像里的目錄且會(huì)自動(dòng)處理URL和解壓tar壓縮包 COPY:拷貝文件和目錄到鏡像中。將從構(gòu)建上下文目錄中<源路徑>的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的<目標(biāo)路徑>位置
CMD與ENTRYPOINT 都是指定容器啟動(dòng)后(run之后) 要干的事情 CMD:
ENTRYPOINT:
DockerNetWork(重點(diǎn))
docker在啟動(dòng)后會(huì)產(chǎn)生一個(gè)名為docker0的虛擬網(wǎng)橋:
DockerNetWork的作用
1.用于進(jìn)行docker的網(wǎng)絡(luò)管理和容器調(diào)用之間的規(guī)劃 2.容器ip變動(dòng)時(shí)候可以通過(guò)服務(wù)名直接網(wǎng)絡(luò)通信而不受到影響。docker容器的ip會(huì)因?yàn)槿萜鞯闹貑ⅰ⒅匦聞?chuàng)建等產(chǎn)生變動(dòng)所以推薦用服務(wù)名來(lái)進(jìn)行網(wǎng)絡(luò)通信,避免寫(xiě)死ip
針對(duì)第二個(gè)作用例子如下: 我們?cè)谌萜骶幣艜r(shí),編排了兩個(gè)服務(wù)mysql和redis: 同時(shí)將它們劃歸到了同一個(gè)名為darkforest_net的自定義docker網(wǎng)絡(luò)下
此時(shí)在springboot項(xiàng)目的配置文件中就可以直接采用服務(wù)名來(lái)連接服務(wù)了,而無(wú)需寫(xiě)死ip地址:
采用這種方式后,無(wú)論mysql和redis兩個(gè)服務(wù)的ip地址如何變化,docker都能自動(dòng)映射。無(wú)需手動(dòng)變更ip
docker網(wǎng)絡(luò)模式
設(shè)置方式
bridge模式(常用)
例子: 通過(guò)ip addr命令查看宿主機(jī)中的ip分配情況:
以同樣的方式查看容器中的ip分配情況:
可以注意到是存在對(duì)應(yīng)關(guān)系的,這里描述的就是上面圖中bridge上的情況。
host模式
none模式
container模式
要注意:諸如tomcat等容器會(huì)默認(rèn)使用8080端口,此時(shí)如果有個(gè)tomcat容器采用這種方式共用另一個(gè)tomcat容器的網(wǎng)絡(luò)模式則會(huì)造成端口沖突(因?yàn)閕p和端口都一樣)。此時(shí)可以選擇更改其中一個(gè)tomcat容器的默認(rèn)端口(8080)。
自定義docker網(wǎng)絡(luò)(常用)
作用:將一個(gè)或一組容器劃歸到同一個(gè)自定義網(wǎng)絡(luò)中(即處在同一網(wǎng)段),以便通過(guò)服務(wù)名實(shí)現(xiàn)容器間的數(shù)據(jù)互通和進(jìn)行網(wǎng)絡(luò)管理。通過(guò)創(chuàng)建多個(gè)自定義網(wǎng)絡(luò)來(lái)管理多組容器
自定義網(wǎng)絡(luò)默認(rèn)使用bridge模式
創(chuàng)建和加入命令
創(chuàng)建自定義網(wǎng)絡(luò)命令:
docker network create 自定義網(wǎng)絡(luò)名稱(chēng)
docker-compose配置文件中:
加入自定義網(wǎng)絡(luò)選項(xiàng):
--network 自定義的網(wǎng)絡(luò)名稱(chēng)
docker-compose配置文件中:
注意點(diǎn)(關(guān)注)
1.采用docker-compose配置文件的方式創(chuàng)建自定義網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)名稱(chēng)會(huì)帶上所在目錄的前綴 在lighthouse目錄下執(zhí)行該docker-compose.yml文件后查看當(dāng)前所有的docker網(wǎng)絡(luò)
可以發(fā)現(xiàn)多了一個(gè)所在目錄的前綴
2.docker-compose配置文件中為容器服務(wù)配置的網(wǎng)絡(luò),一定要在docker-compose配置文件中創(chuàng)建。不能先創(chuàng)建再執(zhí)行會(huì)報(bào)找不到網(wǎng)絡(luò)的錯(cuò),即便加上目錄前綴也沒(méi)用。(docker版本:20.10.21;docker-compose版本:2.12.2)
查看docker網(wǎng)絡(luò)
命令:
docker network ls
查看網(wǎng)絡(luò)源數(shù)據(jù)
命令:
docker network inspect 網(wǎng)絡(luò)ID
Docker Compose容器編排(重點(diǎn))
安裝
見(jiàn)官網(wǎng)地址 官網(wǎng)下載較慢,可以使用國(guó)內(nèi)網(wǎng)站提供的鏡像
容器編排步驟
實(shí)際生產(chǎn)場(chǎng)景中一般使用一下命令來(lái)將容器實(shí)例運(yùn)行為后臺(tái)服務(wù):
docker-compose up -d
Compose 模板文件指令
模板文件是使用 Docker Compose 的核心,涉及到的指令關(guān)鍵字也比較多。默認(rèn)的模板文件名稱(chēng)為 docker-compose.yml ,格式為YAML 格式。一個(gè) docker-compose.yml 文件可以分為三層:
#第一層 版本號(hào)
version: "3.8" #代表使用docker-compose項(xiàng)目的版本號(hào)
#第二層:services 服務(wù)配置
services:
web:
build: .
ports: #宿主機(jī)和容器的端口映射
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
# 第三層 其他配置 網(wǎng)絡(luò)、卷、全局規(guī)劃
...
build 指令
指定 Dockerfile 所在文件夾的路徑(可以是絕對(duì)路徑,或者相對(duì) docker-compose.yml 文件的路徑)。 Compose 將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像,然后使用這個(gè)鏡像。
version: "3.8"
services:
web:
build: . #指定Dockerfile的上下文目錄為當(dāng)前目錄
如上例子:要求構(gòu)建web鏡像的Dockerfile與 docker-compose.yml 文件在同一目錄下。
你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑。 使用 dockerfile 指令指定 Dockerfile 文件名。 使用 arg 指令指定構(gòu)建鏡像時(shí)的變量。 如下例子:
version: '3'
services:
webapp:
build:
context: ./dir #指定Dockerfile的上下文目錄為當(dāng)前目錄的dir目錄下
dockerfile: Dockerfile-alternate #指定要運(yùn)行的Dockerfile文件名為Dockerfile-alternate
args:
buildno: 1
command 指令
覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令,類(lèi)似于docker run image 命令 以下面的Dockerfile文件為例,容器啟動(dòng)后執(zhí)行的是 java -jar apps.jar
FROM openjdk:8-jre
EXPOSE 8081
ENV APP_PATH=/apps
WORKDIR $APP_PATH
COPY apps.jar $APP_PATH
ENTRYPOINT ["java","-jar"]
CMD ["apps.jar"]
如果我們想要容器啟動(dòng)后執(zhí)行的是 java -jar test.jar, 在docker-compose.yml文件中使用指令 command: [“test.jar”]
version: '3'
services:
webapp:
build:
context: ./dir #定Dockerfile的上下文目錄為當(dāng)前目錄的dir目錄下
dockerfile: Dockerfile-alternate
args:
buildno: 1
command: ["test.jar"]
container_name 指令(不推薦使用)
指定容器名稱(chēng)。默認(rèn)將會(huì)使用 所在目錄名_服務(wù)名稱(chēng)_序號(hào) 這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱(chēng)后,該服務(wù)將無(wú)法進(jìn)行擴(kuò)展(scale),因?yàn)?Docker 不允許多個(gè)容器具有相同的名稱(chēng)。
depends_on 指令
解決容器的依賴(lài)、啟動(dòng)先后的問(wèn)題。以下例子中會(huì)先啟動(dòng) redis 、db 再啟動(dòng) web:
version: '3'
services:
web:
build: .
depends_on: # web服務(wù)依賴(lài)于db和web服務(wù)
- db
- redis
redis:
image: redis
db:
image: postgres
注意:在啟動(dòng)web服務(wù)時(shí),并不會(huì)等待 redis 、db 服務(wù)進(jìn)入ready狀態(tài),而只是等到它們被啟動(dòng)狀態(tài)(running狀態(tài))。
environment 指令
設(shè)置環(huán)境變量,相當(dāng)于 docker run -e。你可以使用數(shù)組或字典兩種格式。
只給定名稱(chēng)的變量會(huì)自動(dòng)獲取運(yùn)行 Compose 的宿主機(jī)上對(duì)應(yīng)變量的值,可以用來(lái)防止泄露不必要的數(shù)據(jù)。
version: '3'
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root #字典格式
#====================================================
environment:
- "MYSQL_ROOT_PASSWORD=root" #數(shù)組格式
- "SESSION_SECRET"
env_file 指令
從文件中獲取環(huán)境變量,可以為單獨(dú)的文件路徑或列表。 如果通過(guò) docker-compose -f FILE 方式來(lái)指定 Compose 模板文件,則 env_file 中變量的路徑會(huì)基于模板文件路徑。 如果有變量名稱(chēng)與 environment 指令沖突,則按照慣例,以 environment 為準(zhǔn)。
env_file: .env
env_file: #指定多個(gè)環(huán)境變量文件
- ./common.env
- ./.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 # 開(kāi)頭的注釋行。
環(huán)境變量文件 .env:推薦使用這種命名,因?yàn)樵贚inux下,這種方式命名的文件屬于隱藏文件,一定程度上防止泄露不必要的數(shù)據(jù)。
expose 指令
用來(lái)指定鏡像構(gòu)建過(guò)程中容器暴露的端口號(hào),但不映射到宿主機(jī),只被連接的服務(wù)訪(fǎng)問(wèn)。 該指令compose配置文件中一般不用,都在Dockerfile文件中使用EXPOSE指定。
image 指令
指定創(chuàng)建容器實(shí)例服務(wù)所依賴(lài)的鏡像,一般為鏡像名稱(chēng)或鏡像 ID。如果鏡像在本地不存在,Compose 將會(huì)嘗試?yán)∵@個(gè)鏡像,相當(dāng)于 docker run image(鏡像名)。
networks 指令
指定啟動(dòng)容器時(shí)使用的網(wǎng)絡(luò),相當(dāng)于 docker run --network 詳情見(jiàn)Docker network章節(jié)
version: "3"
services:
some-service:
networks:
- some-network #指定使用的網(wǎng)絡(luò)
- other-network
networks: #創(chuàng)建網(wǎng)絡(luò)
some-network:
other-network:
ports 指令
指定宿主機(jī)和容器端口映射,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以。 注意:當(dāng)使用 HOST:CONTAINER格式來(lái)映射端口時(shí),如果你使用的容器端口小于 60 并且沒(méi)放到引號(hào)里,可能會(huì)得到錯(cuò)誤結(jié)果,因?yàn)閅AML會(huì)自動(dòng)解析xx:yy這種數(shù)字格式為 60 進(jìn)制。為避免出現(xiàn)這種問(wèn)題,建議數(shù)字串都采用引號(hào)包括起來(lái)的字符串格式。
volumes 指令
用來(lái)指定宿主機(jī)目錄(或文件)和容器目錄(或文件)映射。目錄(或文件)不存在時(shí)會(huì)自動(dòng)創(chuàng)建 詳情見(jiàn)容器數(shù)據(jù)卷章節(jié)
version: "3"
services:
my_src:
image: mysql:8.0
volumes: #數(shù)據(jù)卷名稱(chēng)掛載
- mysql_data:/var/lib/mysql
volumes: #定義數(shù)據(jù)卷名稱(chēng)
mysql_data:
restart 指令
指定容器退出后的重啟策略為始終重啟。該命令對(duì)保持服務(wù)始終運(yùn)行十分有效。
restart: always
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Docker學(xué)習(xí)筆記
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。