零基礎學習docker


什么是Docker
Docker是一種開源的容器化平臺,用于幫助開發(fā)者更輕松地打包、分發(fā)和運行應用程序。它通過使用操作系統(tǒng)級虛擬化技術,將應用程序及其所有依賴項打包到稱為"容器"的獨立運行環(huán)境中。這些容器可以在不同的系統(tǒng)上運行,而無需擔心環(huán)境差異和依賴沖突。
Docker的核心概念是鏡像(Image)和容器(Container):
鏡像是一個只讀的文件,包含了運行應用程序所需的所有文件系統(tǒng)、庫和依賴項。它可以被認為是一個應用程序的模板。
容器是鏡像的運行實例,可以被啟動、停止、刪除等。每個容器都是相互隔離的、獨立運行的環(huán)境,具有自己的文件系統(tǒng)、進程空間、網絡配置等。
使用Docker可以帶來許多優(yōu)勢:
簡化部署:Docker允許開發(fā)人員將應用程序和其依賴項打包到一個獨立的、可移植的容器中,使得部署變得非常簡單和一致。
跨平臺:Docker容器可以在不同的操作系統(tǒng)和硬件平臺上運行,無需擔心環(huán)境差異和依賴問題。
高效資源利用:Docker使用操作系統(tǒng)級虛擬化技術,可以在主機上同時運行多個容器,以更高效地利用硬件資源。
快速開發(fā)和測試:容器的輕量級和快速啟動能力使得開發(fā)人員可以快速創(chuàng)建、修改和測試應用程序。
總的來說,Docker是一個強大的工具,可以幫助開發(fā)者簡化應用程序的交付和運行,提高開發(fā)效率和系統(tǒng)的可移植性。
配置環(huán)境
Ubuntu22.04版本
鏡像源(加速下載)
北京大學鏡像源
http://mirrors.pku.edu.cn/Mirrors
方式一:通過命令替換
sudo wget http://mirrors.pku.edu.cn/repoconfig/ubuntu21.04/sources.list -O /etc/apt/sources.list
方式二:修改鏡像源頭位置。
gedit /etc/apt/sources.list
粘貼下面內容并保存。
deb http://mirrors.pku.edu.cn/ubuntu hirsute main restricted universe multiverse
# deb-src http://mirrors.pku.edu.cn/ubuntu hirsute main restricted universe multiverse
deb http://mirrors.pku.edu.cn/ubuntu hirsute-updates main restricted universe multiverse
# deb-src http://mirrors.pku.edu.cn/ubuntu hirsute-updates main restricted universe multiverse
deb http://mirrors.pku.edu.cn/ubuntu hirsute-backports main restricted universe multiverse
# deb-src http://mirrors.pku.edu.cn/ubuntu hirsute-backports main restricted universe multiverse
deb http://mirrors.pku.edu.cn/ubuntu hirsute-security main restricted universe multiverse
# deb-src http://mirrors.pku.edu.cn/ubuntu hirsute-security main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu hirsute partner
# deb-src http://archive.canonical.com/ubuntu hirsute partner
更新軟件包列表
sudo apt update
升級軟件包到最新版
sudo apt upgrade
安裝
刪除已經安裝的docker
sudo apt-get remove docker docker-engine docker.io containerd runc
安裝依賴
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
添加Docker官方GPG密鑰
curl -fsSL https://mirrors.pku.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
添加軟件倉庫
echo \
?"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.pku.edu.cn/docker-ce/linux/ubuntu \
?$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新安裝包
sudo apt-get update
安裝docker社區(qū)版本(免費)
sudo apt-get update
檢查安裝狀態(tài)
sudo systemctl status docker
返回結果
● docker.service - Docker Application Container Engine
? ? Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
? ? Active: active (running) since Mon 2021-09-20 10:18:47 UTC; 2 weeks 0 days ago
TriggeredBy: ● docker.socket
? ? ? Docs: https://docs.docker.com
? Main PID: 891 (dockerd)
? ? ?Tasks: 8
? ? Memory: 66.0M
? ? CGroup: /system.slice/docker.service
? ? ? ? ? ? └─891 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Sep 20 10:18:47 ubuntu systemd[1]: Started Docker Application Container Engine.
Loaded
:顯示 Docker 服務的配置文件位置。Active
:顯示 Docker 服務是否正在運行。Main PID
:顯示 Docker 守護進程(dockerd)的進程 ID。Memory
:顯示 Docker 服務當前的內存使用情況。CGroup
:顯示 Docker 服務運行在的控制組(CGroup)。
在示例輸出中,Active
字段的值為 active (running)
,表示 Docker 服務正在運行。如果狀態(tài)為 inactive
,表示 Docker 服務未運行。
驗證docker安裝
docker run hello-world
鏡像
鏡像加速
網易docker加速器
http://hub-mirror.c.163.com
創(chuàng)建docker配置文件
sudo gedit /etc/default/docker
修改docker配置文件
DOCKER_OPTS="--registry-mirror=https://hub-mirror.c.163.com"
重啟服務
systemctl daemon-reloadsystemctl restart docker
方法2
$ sudo echo "DOCKER_OPTS=\"--registry-mirror=http://hub-mirror.c.163.com\"" >> /etc/default/docker
$ service docker restart
方法3
gedit /etc/docker/daemon.json{"registry-mirrors":["http://hub-mirror.c.163.com"]}
鏡像列表
docker images
返回結果
REPOSITORY
:鏡像的倉庫名稱。這通常是Docker鏡像的名稱,如ubuntu
、nginx
等。TAG
:鏡像的標簽。標簽是用于區(qū)分不同版本或變體的附加標識符。例如,latest
、1.0
等。IMAGE ID
:鏡像的唯一標識符。每個鏡像都有一個唯一的ID,它由Docker生成。CREATED
:鏡像創(chuàng)建的時間。它顯示了鏡像的創(chuàng)建日期和時間。SIZE
:鏡像的大小。以字節(jié)、千字節(jié)(KB)、兆字節(jié)(MB)等形式表示。
下載
docker pull [鏡像名]
刪除
docker rmi [鏡像名]
容器
獲取
下載官方案例
docker pull hello-world
下載Ubuntu鏡像
docker pull ubuntu
啟動
啟動Ubuntu容器
docker run -it ubuntu /bin/bash
docker run
是 Docker 命令,用于在容器中運行一個新的進程。-it
參數(shù)使得容器中的標準輸入(stdin)保持打開狀態(tài),并分配一個偽終端(tty)。這樣,我們就可以與容器進行交互了。ubuntu
是要運行的容器鏡像的名稱。在這種情況下,我們選擇了 Ubuntu 操作系統(tǒng)的官方鏡像。/bin/bash
是要在容器中運行的命令,即進入容器的 bash 終端。
這個命令的作用是在一個新的容器中啟動 Ubuntu 操作系統(tǒng),并打開一個交互式 bash 終端,以便您可以在容器中執(zhí)行各種操作和命令。
偽終端(tty)是一個模擬終端設備的軟件實現(xiàn)。它允許用戶與計算機進行交互,就像在物理終端上一樣。當在容器中使用-it
參數(shù)時,Docker會為容器提供一個偽終端,使得我們可以通過標準輸入(stdin)與容器進行交互。
偽終端在容器中的作用類似于用戶與計算機交互的終端或命令行界面。它允許我們在容器中輸入命令、運行程序,并在終端中查看程序的輸出。通過交互式終端,我們可以像在實際操作系統(tǒng)中一樣,與容器中運行的程序進行交互。
停止
列出所有的容器,包括正在運行的和已經停止的容器。
docker ps -a
docker
是 Docker 命令的前綴。ps
是 Docker 命令,用于列出容器的信息。-a
參數(shù)用于顯示所有的容器,包括正在運行的和已經停止的容器。
該命令的作用是顯示所有的容器的信息,包括容器的 ID、狀態(tài)、創(chuàng)建時間、鏡像名稱、對外映射的端口等。通過執(zhí)行 docker ps -a
命令,您可以查看系統(tǒng)中所有容器的狀態(tài),包括已經停止的容器,以便進行管理或進一步操作。
停止一個容器
docker stop [容器 ID]
docker
是 Docker 命令的前綴。stop
是 Docker 命令,用于停止容器的運行。[容器 ID]
是要停止的容器的唯一標識符。
該命令的作用是停止正在運行的容器。當執(zhí)行 docker stop [容器 ID]
命令后,Docker 會向指定的容器發(fā)送停止信號(SIGTERM),容器會收到該信號并進行相應的處理。如果容器沒有在一定時間內響應停止信號,Docker 會發(fā)送強制停止信號(SIGKILL)。停止容器后,容器中運行的進程會被終止,并釋放相應的系統(tǒng)資源。
注意:請將 [容器 ID]
替換為實際要停止的容器的 ID。您可以使用 docker ps
命令查看容器的 ID。
啟動一個容器
docker start [容器 ID]
docker
是 Docker 命令的前綴。start
是 Docker 命令,用于啟動容器的運行。[容器 ID]
是要啟動的容器的唯一標識符。
該命令的作用是啟動已經停止的容器。當執(zhí)行 docker start [容器 ID]
命令后,Docker 會嘗試重新啟動指定的容器。容器會使用原先的配置和狀態(tài)恢復運行。需要注意的是,只有處于停止狀態(tài)的容器才能被啟動。
通過執(zhí)行 docker start [容器 ID]
命令,您可以重新啟動已經停止運行的容器,使其繼續(xù)運行。這樣可以方便地管理容器,避免每次都需要重新創(chuàng)建容器。
注意:請將 [容器 ID]
替換為實際要啟動的容器的 ID。您可以使用 docker ps -a
命令查看所有容器的 ID。
重啟一個容器
docker restart [容器 ID]
docker
是 Docker 命令的前綴。restart
是 Docker 命令,用于重啟容器的運行。[容器 ID]
是要重啟的容器的唯一標識符。
該命令的作用是停止并重新啟動指定容器。執(zhí)行 docker restart [容器 ID]
命令后,Docker 會先發(fā)送停止信號(SIGTERM)給指定的容器,然后等待一段時間后,再發(fā)送啟動信號,重新啟動容器。這個過程相當于先執(zhí)行了 docker stop [容器 ID]
命令,再執(zhí)行了 docker start [容器 ID]
命令。
通過執(zhí)行 docker restart [容器 ID]
命令,您可以方便地重啟運行中的容器,使其重新加載配置或應用程序的更新,或應用其他更改。
注意:請將 [容器 ID]
替換為實際要重啟的容器的 ID。您可以使用 docker ps
命令查看運行中的容器的 ID。
進入
進入方式一
docker exec -it [容器 ID] /bin/bash
docker
是 Docker 命令的前綴。exec
是 Docker 命令,用于在容器內部執(zhí)行命令。-it
是docker exec
命令的選項,將命令綁定到交互式的終端。[容器 ID]
是要進入的容器的唯一標識符。/bin/bash
是要在容器內執(zhí)行的命令,此處是指定進入容器并打開一個交互式的 Bash Shell。
該命令的作用是進入指定容器的內部,并在容器內部打開一個交互式的 Bash Shell。通過執(zhí)行 docker exec -it [容器 ID] /bin/bash
命令,您可以在容器內部執(zhí)行命令、調試、配置和管理容器。
注意:請將 [容器 ID]
替換為實際要進入的容器的 ID。您可以使用 docker ps
命令查看運行中的容器的 ID。
進入容器后,您可以像在本地計算機的終端中一樣使用 Bash Shell,執(zhí)行任意命令、查看容器內部的文件系統(tǒng)、修改配置等。這個功能非常有用,尤其在調試容器或執(zhí)行一些特定任務時。
進入方式二
docker attach [容器 ID]
docker -it和-d不可以同時使用
docker一共有兩種模式,交互模式和守護進程模式(或后臺模式)。
交互模式
-it
選項用于創(chuàng)建一個交互式的終端會話,可以與容器進行交互,類似于在本機操作系統(tǒng)中打開一個終端窗口并連接到容器。當您退出終端會話時,容器也會停止。
守護進程模式(或后臺模式)
-d
選項用于將容器置于后臺運行模式,也稱為守護進程模式或分離模式。容器將在后臺運行,不會附加到當前終端會話。當您退出終端會話時,容器將繼續(xù)在后臺運行。
因此,您需要根據(jù)自己的需求選擇使用-it
選項或-d
選項。如果您需要與容器進行交互并查看輸出,可以使用-it
選項。如果您只想在后臺運行容器而不需要交互,可以使用-d
選項。
剛啟動容器就關閉
主要原因:后臺沒有進程運行
通過日志查看是否正常關閉。
docker logs [容器ID]
如果沒有內容返回,則是剛啟動因為沒有進程運行,就自動關閉了。
查看容器狀
docker ps -a Exited (0)
如果容器的狀態(tài)顯示為 Exited (0)
,這表示容器已正常退出,并且退出代碼為 0。
如果"Status"字段顯示為"exited",并且"ExitCode"字段為非零值,那么容器可能是由于執(zhí)行的命令或應用程序發(fā)生錯誤而停止。
退出
請使用 exit
命令或 Ctrl + D
組合鍵來退出容器。
使用"exit"命令退出容器: 當您在容器的命令行中輸入"exit"命令并按下回車鍵時,該命令會告訴容器中的主要進程以正常的方式退出,并終止容器。這相當于在容器內部執(zhí)行了一個退出指令,這將關閉容器并結束容器的生命周期。
使用"Ctrl+D"組合鍵退出容器: 在容器的命令行中,按下"Ctrl+D"組合鍵,這將模擬輸入文件的結尾(EOF字符),導致終端會話結束。對于大多數(shù)交互式終端,這相當于發(fā)送了一個信號(SIGQUIT)給容器中的主要進程,要求它退出。容器中的主要進程收到這個信號后,將會先處理自己的退出邏輯,然后自行退出。這樣也會導致容器的終止和生命周期結束。
總的來說,"exit"命令是直接在容器內部執(zhí)行的指令,而"Ctrl+D"是通過發(fā)送信號的方式請求容器內的主要進程退出。無論使用哪種方式,容器的退出和生命周期的結束都是相同的。
退出容器,同時不關閉容器
使用"Ctrl+P"組合鍵。
使用"Ctrl+Q"組合鍵。
按下Ctrl + p,然后按下 q
Ctrl + P:從容器終端中分離,保持容器在后臺運行。 Ctrl + Q:分離(退出)容器終端,但保持容器繼續(xù)在后臺運行。 這兩個組合鍵通常在交互式模式下使用,用于在保持容器運行的同時退出容器終端,以便在后續(xù)需要時重新附加到容器終端。
小提示
由于我現(xiàn)在案例中的是Ubuntu鏡像容器,它本身里面沒有任何進程在運行,因此我們使用-d參數(shù)會出現(xiàn)剛啟動就自動關閉了。
如果我們有項目在容器內運行,啟動容器后,就不會自動關閉。
導出
首先,確保您的容器正在運行。您可以使用
docker ps
命令查看正在運行的容器列表。執(zhí)行以下命令導出容器:
docker export [容器 ID] > container.tar
其中,
[容器 ID]
是要導出的容器的 ID,container.tar
是導出的容器文件的名稱。您可以自定義container.tar
的名稱和路徑。注意:導出的容器將被壓縮為單個 tar 文件。
導出完成后,您可以使用
ls
命令確認導出的文件是否創(chuàng)建成功。
現(xiàn)在,您已經成功地導出了 Docker 容器。您可以將這個導出的文件(tar 文件)傳輸?shù)狡渌麢C器上,并通過docker import
命令導入到 Docker 中,以創(chuàng)建相同的容器?;蛘撸梢栽谛枰獣r保留該文件作為容器的備份。
導入
首先,將包含要導入的容器的鏡像文件(tar 文件)傳輸?shù)侥繕藱C器上。
在目標機器上執(zhí)行以下命令導入容器:
docker import container.tar [新鏡像名稱]
其中,
container.tar
是包含要導入的容器的 tar 文件,[新鏡像名稱]
是為新鏡像指定的名稱。您可以自定義[新鏡像名稱]
。注意:導入的容器將被作為一個新的鏡像創(chuàng)建。
導入完成后,您可以使用
docker images
命令查看導入的鏡像是否創(chuàng)建成功,并顯示其相關的信息。
現(xiàn)在,您已經成功地將 Docker 容器導入為一個新的鏡像。您可以使用這個新鏡像創(chuàng)建和運行新的容器。
刪除
普通刪除
首先,使用
docker ps -a
命令查看所有的容器,包括已停止的容器。找到要刪除的容器的 ID 或名稱。
執(zhí)行以下命令刪除容器:
docker rm [容器 ID 或名稱]
其中,
[容器 ID 或名稱]
是要刪除的容器的 ID 或名稱。您可以根據(jù)需要選擇使用容器的 ID 或名稱。注意:刪除容器將永久刪除容器及其關聯(lián)的數(shù)據(jù)。
您可以使用
docker ps -a
命令再次驗證容器是否已成功刪除。
現(xiàn)在,您已經成功地刪除了 Docker 容器。請注意,刪除容器后,與該容器關聯(lián)的數(shù)據(jù)也將被永久刪除。
強制刪除容器
docker rm -f [容器 ID 或名稱]
可以實現(xiàn)停止正在運行的容器,并卸載,減去手動停止容器的步驟。
批量強制刪除所有容器
docker rm -f $(docker ps -aq)
docker ps -aq
:這個命令將列出所有容器的ID,選項-a
用于顯示所有容器,而選項-q
用于只顯示容器的ID。docker rm -f
:這個命令將強制刪除指定的容器。選項-f
用于強制刪除容器,即使容器正在運行中。
通過將這兩個命令結合起來,并使用子命令$(...)
將第一個命令的輸出作為第二個命令的參數(shù),我們可以批量刪除所有容器。
查看狀態(tài)
列出所有的容器,包括正在運行的和已經停止的容器。
docker ps -a
docker
是 Docker 命令的前綴。ps
是 Docker 命令,用于列出容器的信息。-a
參數(shù)用于顯示所有的容器,包括正在運行的和已經停止的容器。
該命令的作用是顯示所有的容器的信息,包括容器的 ID、狀態(tài)、創(chuàng)建時間、鏡像名稱、對外映射的端口等。通過執(zhí)行 docker ps -a
命令,您可以查看系統(tǒng)中所有容器的狀態(tài),包括已經停止的容器,以便進行管理或進一步操作。
下載
打開終端或命令行窗口。
在終端或命令行中,輸入以下命令來下載容器鏡像:
docker pull [鏡像名稱]
其中,
[鏡像名稱]
是您要下載的容器鏡像的名稱。您可以使用 Docker 鏡像倉庫中的公共鏡像,也可以使用自己私有的鏡像。例如,要下載官方的 Nginx 鏡像,可以執(zhí)行以下命令:
docker pull nginx
Docker 將從 Docker 鏡像倉庫中下載指定的鏡像,并保存到本地。
下載的鏡像將顯示下載進度和狀態(tài)。
完成下載后,您可以使用
docker images
命令來查看已下載的鏡像列表:docker images
該命令將顯示已下載的容器鏡像的列表,包括鏡像的名稱、版本、大小等信息。
現(xiàn)在,您已經成功地下載了 Docker 容器鏡像。您可以根據(jù)需要,下載所需的容器鏡像,并使用它們創(chuàng)建和運行容器。
定義容器名稱
使用 --name
選項,可以在創(chuàng)建容器時為其指定一個可讀性高的名稱,方便在后續(xù)的操作中引用和管理容器。默認情況下,Docker 將為容器分配一個隨機的名稱。
docker run --name mycontainer nginx
上述命令會創(chuàng)建一個名為 "mycontainer" 的容器,并使用 "nginx" 鏡像作為其基礎。
網絡
Docker網絡是Docker容器間進行通信的網絡環(huán)境。在Docker中,每個容器都有一個獨立的網絡棧,這樣它們可以相互通信,并且與宿主機和其他容器隔離開來。
Docker提供了多種網絡模式,可以根據(jù)實際需求選擇適合的模式。
默認橋接網絡(bridge network):這是Docker默認的網絡模式。在這種模式下,所有容器連接到單個特定的網橋(default bridge)上,并被分配IP地址。默認橋接網絡只允許同一主機上的容器通信。
主機網絡(host network):使用主機網絡模式時,容器與宿主機共享網絡棧,即容器使用宿主機的網絡接口,與宿主機共享IP地址。這種模式下容器可以直接使用宿主機上的端口。
自定義橋接網絡(user-defined bridge network):用戶可以創(chuàng)建自己的橋接網絡并將容器連接到這個網絡中。在自定義橋接網絡中,容器之間可以相互通信,并且與默認橋接網絡隔離開來??梢詾樽远x橋接網絡配置子網、網關、IP地址等。
Overlay網絡:Overlay網絡是在多個Docker宿主機之間創(chuàng)建的虛擬網絡,用于在跨主機的容器之間提供通信。這種網絡模式適用于分布式應用程序和集群環(huán)境。
除了以上幾種網絡模式,Docker還支持其他網絡插件和第三方工具,用于擴展網絡功能和提供更高級的網絡服務。
日志
docker logs [容器名稱或ID]
-f
或--follow
:實時顯示日志輸出,并保持連接,類似于tail -f
命令。--tail [行數(shù)]
:僅顯示最后指定行數(shù)的日志,默認為全部日志。-t
或--timestamps
:顯示日志的時間戳。
查看容器的實時日志:使用
docker logs -f
或docker logs --follow
命令可以實時查看容器的日志輸出。這對于觀察容器的運行狀態(tài)、調試問題以及監(jiān)視應用程序的實時日志非常有用。故障排查:通過查看容器的日志,您可以識別容器是否出現(xiàn)了異常、錯誤或崩潰。它可以幫助您找到容器啟動失敗、應用程序錯誤等問題的原因,從而進行相應的故障排查和修復。
記錄應用程序日志:如果您的應用程序在容器內生成日志,例如日志文件或控制臺輸出,您可以使用
docker logs
命令來查看這些日志。這是一種方便的方式,可以從已運行的容器中獲取應用程序的日志信息。監(jiān)控和分析:通過查看容器的日志,您可以監(jiān)控應用程序的活動并進行分析。您可以建立監(jiān)控系統(tǒng),收集容器的日志數(shù)據(jù),并進行檢索、過濾、聚合和可視化等操作,以了解應用程序的性能、行為和趨勢。
總而言之,docker logs
命令是在 Docker 環(huán)境中查看容器日志的主要工具,是監(jiān)控、故障排查和分析容器的重要手段之一。它可以幫助您了解容器的運行狀態(tài)和應用程序的日志輸出。
數(shù)據(jù)卷
Docker數(shù)據(jù)卷是將宿主機上的目錄或文件與容器內的目錄或文件進行映射的一種機制。通過使用數(shù)據(jù)卷,可以在容器之外創(chuàng)建、持久化和共享數(shù)據(jù)。
使用數(shù)據(jù)卷的好處包括:
數(shù)據(jù)持久性:數(shù)據(jù)卷允許在容器終止或重新創(chuàng)建時保留數(shù)據(jù)。即使刪除容器,數(shù)據(jù)卷仍然存在,并且可以重新掛載到新的容器中,以保留數(shù)據(jù)。
數(shù)據(jù)共享:可以通過將多個容器掛載到同一個數(shù)據(jù)卷,實現(xiàn)容器之間的數(shù)據(jù)共享。這使得數(shù)據(jù)在多個容器之間的傳遞和共享變得更加容易,無需復制或移動數(shù)據(jù)。
數(shù)據(jù)備份和恢復:通過將數(shù)據(jù)卷映射到宿主機上的特定目錄,可以方便地對數(shù)據(jù)進行備份和恢復。這樣即使容器或Docker環(huán)境出現(xiàn)故障,數(shù)據(jù)仍然安全可靠。
使用數(shù)據(jù)卷可以通過兩種方式進行:
匿名數(shù)據(jù)卷:在創(chuàng)建容器時可以使用
-v
或--volume
參數(shù)創(chuàng)建匿名數(shù)據(jù)卷,Docker將自動為其生成一個唯一的目錄并與容器中指定的路徑進行映射。示例命令:
docker run -v /path/in/host:/path/in/container image:tag
命名數(shù)據(jù)卷:可以使用
docker volume create
命令顯式創(chuàng)建命名數(shù)據(jù)卷,這樣可以更方便地管理和重用數(shù)據(jù)卷。示例命令:
創(chuàng)建數(shù)據(jù)卷:
docker volume create myvolume
掛載數(shù)據(jù)卷:
docker run -v myvolume:/path/in/container image:tag
一旦數(shù)據(jù)卷創(chuàng)建成功并且與容器建立了映射關系,容器內的操作就會直接影響到映射的宿主機上的目錄或文件。但需要注意的是,Docker數(shù)據(jù)卷是與容器關聯(lián)的,一旦容器被刪除,數(shù)據(jù)卷也會一起被刪除。如果需要保留數(shù)據(jù)卷,可以將其掛載到另一個容器或使用 docker volume prune
命令進行清理。
端口映射
單個端口映射
docker run -p [宿主機端口]:[docker容器內部端口] ...
案例
docker run -p 8080:80 ...
這樣,當你在主機上訪問 http://localhost:8080
時,實際上是在訪問容器內的服務。
多個端口映射
docker run -p 8080:80 -p 3000:3000 ...
這將同時將容器內的 80 端口映射到主機的 8080 端口上,以及將容器內的 3000 端口映射到主機的 3000 端口上。
Docker -p和-P區(qū)別
-p
選項的語法是-p hostPort:containerPort
,它允許你將主機的端口映射到容器的指定端口。例如,使用-p 8080:80
將主機的8080端口映射到容器的80端口。
相反地,-P
選項會自動將容器的所有公開端口映射到主機上的任意端口。Docker會隨機分配一個未使用的主機端口并映射到容器的相應端口。這個選項在你不需要指定特定的主機端口時很方便。
下面是一個簡單的例子來說明這兩個選項的區(qū)別:
docker run -d -p 8080:80 nginx
上面的命令將在后臺運行一個nginx容器,并將主機的8080端口映射到容器的80端口。
docker run -d -P nginx
而這個命令會在后臺運行一個nginx容器,并自動將容器的所有公開端口映射到主機上的任意端口。
總結來說,-p
選項允許你顯式地指定主機端口與容器端口的映射關系,而-P
選項則會自動隨機分配主機端口并映射容器的所有公開端口。
容器互聯(lián)
在 Docker 中,容器互聯(lián)允許不同的容器之間進行通信和交互。通過容器互聯(lián),可以在不使用端口映射的情況下,在容器之間建立網絡連接。
要實現(xiàn)容器互聯(lián),可以使用 Docker 的網絡功能。有兩種主要的網絡模式可以實現(xiàn)容器之間的互聯(lián):橋接模式(Bridge Mode)和用戶定義網絡(User-defined Network)。
橋接模式
橋接模式(Bridge Mode): 橋接模式是 Docker 默認使用的網絡模式。在橋接模式下,Docker 會為每個容器分配一個唯一的 IP 地址,并且容器之間可以相互訪問。你可以創(chuàng)建多個容器并將它們加入同一個網絡中,這樣它們就可以通過容器名稱或 IP 地址進行通信。Docker 創(chuàng)建的默認網絡名為
bridge
。例如,可以使用以下命令創(chuàng)建兩個容器并加入同一個網絡:docker network create my-network
docker run --name container1 --network my-network -d image1
docker run --name container2 --network my-network -d image2在這個例子中,
container1
和container2
將加入名為my-network
的網絡,并且可以通過容器名稱相互訪問。
用戶定義網絡
用戶定義網絡(User-defined Network): 用戶定義網絡允許你創(chuàng)建自己的網絡,并在該網絡上運行容器。通過使用用戶定義網絡,你可以更好地管理容器之間的互聯(lián)。創(chuàng)建用戶定義網絡的步驟如下:
docker network create my-network
docker network connect my-network container1
docker network connect my-network container2在這個例子中,
container1
和container2
將加入名為my-network
的網絡。它們之間可以通過容器名稱或 IP 地址進行通信。如果要從網絡中刪除容器,可以使用docker network disconnect
命令。
無論是橋接模式還是用戶定義網絡,容器之間的通信都可以通過它們的名稱或 IP 地址進行。你可以像使用普通網絡一樣使用容器之間的互聯(lián)來建立各種通信和交互場景。
查看已經創(chuàng)建的網絡
docker network list
該命令將列出當前系統(tǒng)中的所有 Docker 網絡。輸出結果將包含網絡的名稱(NAME)、唯一標識符(ID)、驅動程序(DRIVER)以及網絡范圍(SCOPE)等信息。
示例輸出:
NETWORK ID ? ? NAME ? ? ? ? ? ?DRIVER ? ?SCOPE
1a4c7f14e867 ? bridge ? ? ? ? ?bridge ? ?local
df7bd7a75196 ? host ? ? ? ? ? ?host ? ? ?local
84aa34d3fdf7 ? none ? ? ? ? ? ?null ? ? ?local
其中,bridge
是 Docker 默認的橋接網絡,host
是主機網絡模式,none
是無網絡模式。
如果想查看特定網絡的詳細信息,可以使用以下命令,將 <network_name>
替換為具體的網絡名稱:
docker network inspect <network_name>
這將在終端中顯示有關該網絡的詳細信息,包括網絡的子網、網關和連接到該網絡的容器列表等。
刪除網絡
docker network rm [network_name]
將 "[network_name]" 替換為要刪除的網絡的名稱。
請注意,只有當該網絡沒有正在運行的容器時,才能成功刪除網絡。如果網絡仍在被使用,您需要先停止或刪除使用該網絡的容器,然后才能刪除網絡。
網絡中刪除容器
使用 docker network disconnect
命令將容器從網絡中斷開連接:
docker network disconnect [network_name] [container_id or container_name]
將 "[network_name]" 替換為要從中斷開連接的網絡的名稱,"[container_id or container_name]" 替換為要從網絡中斷開連接的容器的 CONTAINER ID 或名稱。
如此,您就成功將容器從指定的 Docker 網絡中刪除了。請注意,此操作只是將容器與網絡斷開連接,并不會刪除容器本身。如果需要完全刪除容器,請使用 docker rm
命令。
DockerFile(制作鏡像)
案例制作nginx鏡像
準備工作
首先,創(chuàng)建一個名為
Dockerfile
的文件。
touch Dockerfile
2.創(chuàng)建nginx.conf配置文件
touch nginx.confuser ?nginx;
worker_processes ?auto;
error_log ?/var/log/nginx/error.log notice;
pid ? ? ? ?/var/run/nginx.pid;
events {
? ?worker_connections ?1024;
}
http {
? ?include ? ? ? /etc/nginx/mime.types;
? ?default_type ?application/octet-stream;
? ?log_format ?main ?'$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ?'$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? ?'"$http_user_agent" "$http_x_forwarded_for"';
? ?access_log ?/var/log/nginx/access.log ?main;
? ?sendfile ? ? ? ?on;
? ?tcp_nopush ? ? ?on;
? ?tcp_nodelay ? ? on;
? ?keepalive_timeout ?65;
? ?types_hash_max_size 2048;
? ?include /etc/nginx/conf.d/*.conf;
? ?include /etc/nginx/sites-enabled/*;
}
3.創(chuàng)建網頁源代碼文件
touch index.html<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>滄桑docker教程</title>
</head>
<body>
<p>作者:滄桑</p>
<p>嗶哩嗶哩平臺</p>
<p>搜索UID:507560163</p>
<p>經常拍攝電腦編程、軟件等知識分享</p>
</body>
</html>
制作鏡像
1.在Dockerfile
文件中,使用以下內容來定義鏡像構建過程:
# 使用Nginx官方的基礎鏡像
FROM nginx:latest
# 將本地的自定義 Nginx 配置文件復制到容器中
COPY nginx.conf /etc/nginx/nginx.conf
# 將本地的網站文件復制到容器中的默認 Nginx 網站目錄
COPY website.html /usr/share/nginx/html
# 定義容器啟動時需要暴露的端口
EXPOSE 80
# 在容器啟動時運行 Nginx
CMD ["nginx", "-g", "daemon off;"]
在這個例子中,我們使用了nginx:latest
作為基礎鏡像。然后,我們將我們自定義的Nginx配置文件(nginx.conf
)復制到容器的/etc/nginx/nginx.conf
目錄下,將網站文件復制到容器的默認Nginx網站目錄(/usr/share/nginx/html
)下。我們還通過EXPOSE
命令暴露了容器的80端口,并使用CMD
命令指定在容器啟動時運行Nginx。
2.在同一目錄下,創(chuàng)建自定義的Nginx配置文件nginx.conf
和網站文件website
。
touch nginx.conf
touch -R website
根據(jù)自己的需求,可以在nginx.conf
文件中配置Nginx服務器的具體設置,將網站文件放在website
目錄中。
3.構建Docker鏡像。在終端中進入包含Dockerfile
文件的目錄,并執(zhí)行以下命令:
docker build -t my-nginx-image .
這將根據(jù)Dockerfile
文件的內容構建一個名為my-nginx-image
的新的Docker鏡像。請注意最后的點號.
表示使用當前目錄作為構建上下文。
4.等待鏡像構建完成后,可以使用以下命令運行容器:
docker run -p 80:80 --name my-nginx-container my-nginx-image
這將在端口80上運行一個名為my-nginx-container
的新容器,并將該容器的80端口映射到主機的80端口。
現(xiàn)在你應該擁有一個基于Nginx的Docker鏡像,并且可以運行一個Nginx服務器的容器了。請根據(jù)你的實際需求進行自定義配置和修改。
構建鏡像
在Docker主機上構建鏡像:在已經安裝了Docker的主機上,使用
docker build
命令來構建鏡像。在命令行中進入Dockerfile所在的目錄,然后運行以下命令:docker build -t <image_name> .
其中,
<image_name>
是你想要為鏡像命名的名字。命令中的.
表示Dockerfile所在的當前目錄。查看已構建的鏡像:完成構建后,你可以使用以下命令來查看已構建的鏡像:
docker images
這將顯示一個列表,其中包含已構建的鏡像以及它們的標簽和大小。
運行鏡像
運行容器:基于已構建的鏡像,你可以使用
docker run
命令來運行容器。例如:docker run --name <container_name> -d -p <host_port>:<container_port> <image_name>
其中,
<container_name>
是你為容器指定的名字,<host_port>
是你要映射到容器的端口號,<container_port>
是容器內部運行的應用程序的端口號,<image_name>
是之前構建的鏡像的名字。注意,根據(jù)你的需求,可以使用不同的標志來調整容器的配置和行為。
查看運行中的容器:運行以下命令來查看正在運行的容器:
docker ps
這將顯示當前正在運行的容器的列表,包括容器的ID、名稱、運行時間等信息。
發(fā)布
注意:Docker原本所有鏡像都是通過Docker Hub下載資源,但是這個平臺今年開始收費了,不交錢的倉庫就要被強制下架,我為了方便大家學習,選中阿里云倉庫。
以后阿里云倉庫收不收費,我也不知道,視頻內容也用不了了。
大家知道大致的流程,并且可以理解,就算學會發(fā)布了。
登錄阿里云官網
1.搜索容器鏡像服務
2.選擇管理控制臺
3.創(chuàng)建個人實例,點擊并進入
4.選擇鏡像倉庫,并創(chuàng)建
5.創(chuàng)建倉庫信息
輸入倉庫名稱、是否公開、私有,以及倉庫的描述。
6.來源選擇本地倉庫,并且點擊創(chuàng)建。
7.復制倉庫推送信息并使用
8.登錄失敗怎么辦
請回到個人實例位置,點擊訪問憑證并重新設置密碼。
下載鏡像
$ docker pull registry.cn-hangzhou.aliyuncs.com/docker8886/cangsangdockerdemo:1.0
因為我創(chuàng)建的這個鏡像倉庫是“公開”,所以他人下載的時候,不需要輸入登錄密碼。
運行容器
docker run -p 8080:80 -d [鏡像名稱或ID]
修改DNS
編輯
/etc/resolv.conf
文件,可以使用以下命令打開編輯器:sudo gedit /etc/resolv.conf
在文件中,找到并刪除所有已存在的
nameserver
行。添加以下兩行來指定新的DNS服務器地址:
nameserver 114.114.114.114
nameserver 8.8.8.8這將把114.114.114.114和8.8.8.8作為首選DNS服務器地址。
Dockerfile和容器導入導出區(qū)別
Dockerfile:Dockerfile是用于定義和構建Docker鏡像的文本文件。它包含一系列的指令和參數(shù),用于描述Docker鏡像的構建過程。通過執(zhí)行Dockerfile中的指令,我們可以自動化地構建出一個可重復部署的鏡像。Dockerfile通常包含了基礎鏡像的選擇、軟件安裝、配置文件、環(huán)境變量、暴露端口等信息,以及構建鏡像所需要的其他步驟。Dockerfile的主要作用是定義鏡像的構建過程,并提供了一種可重復和可移植的方式來構建鏡像。
容器的導入導出:容器的導入導出是指將正在運行的Docker容器導出為一個文件,并且可以將這個文件導入到另外一臺Docker主機上。通過導出容器,可以將容器的狀態(tài)和數(shù)據(jù)打包成一個文件,然后在其他主機上導入并保留原有的狀態(tài)和數(shù)據(jù)。導出的文件包含了容器的文件系統(tǒng)和元數(shù)據(jù),可以用于備份、遷移容器和共享容器狀態(tài)。導入導出容器的常用命令是
docker export
和docker import
。
總結來說,Dockerfile用于定義和構建鏡像,而容器的導入導出用于將運行中的容器保存成文件以及將導出文件導入到其他主機上。兩者分別針對不同的場景和需求。
FROM
"FROM"是Dockerfile中的一條指令,它用于指定基礎鏡像?;A鏡像是構建Docker容器所需的起點,可以理解為一個用于構建應用程序環(huán)境的空白板。
在Dockerfile中,使用"FROM"指令可以選擇一個現(xiàn)有的基礎鏡像作為構建的起點,然后在該基礎鏡像的基礎上進行進一步的定制。
使用"FROM"指令時,可以指定一個完整的鏡像名稱,或者使用一個簡寫名稱。如果指定的鏡像名稱不是完整的URL,Docker引擎會去預定義的鏡像倉庫中查找該鏡像。
例如,下面是一個簡單的Dockerfile示例,使用FROM指令選擇了一個基礎鏡像:
FROM ubuntu:latest
這個示例中,基礎鏡像選擇了Ubuntu操作系統(tǒng)的最新版本。接著,你可以在Dockerfile中添加更多的指令來定制你的應用程序環(huán)境,例如安裝軟件包、復制文件等。
總之,"FROM"指令的作用是選擇一個基礎鏡像,該基礎鏡像將成為構建Docker容器的起點。
MAINTAINER
在早期版本的Docker中,可以使用MAINTAINER
指令來指定維護者(maintainer)的信息。維護者通常是負責創(chuàng)建和維護Docker鏡像的人或團隊。
MAINTAINER
指令的作用是向用戶提供關于維護者的信息。它的語法如下:
MAINTAINER <name>
<name>
可以是維護者的任意文本信息,例如維護者的姓名、郵箱地址或組織名稱。
然而,在Docker 1.13版本以后,MAINTAINER
指令已被棄用,取而代之的是通過標簽(label)來提供鏡像的相關信息。通過標簽,你可以為鏡像指定一系列自定義的鍵值對,其中包括維護者的信息。
以下是一個使用標簽代替MAINTAINER
指令的示例:
LABEL maintainer="your_email@example.com"
這樣,你就可以使用docker image inspect
命令來查看鏡像的標簽,其中就會包含維護者的信息:
$ docker image inspect your_image_name
"Labels": {
? ?"maintainer": "your_email@example.com"
},
總結來說,MAINTAINER
指令的作用是在Dockerfile中提供維護者的信息。然而,最好的做法是使用標簽來代替MAINTAINER
指令,以便提供更多靈活性和自定義性。
RUN
在Dockerfile中,"RUN"指令用于在鏡像構建過程中執(zhí)行命令。它的作用是在構建鏡像的過程中運行指定的命令,以便安裝軟件包、創(chuàng)建文件、設置環(huán)境變量等。
"RUN"指令的語法如下:
RUN <command>
""可以是任意的命令或命令串,可以使用Shell執(zhí)行命令。Docker引擎將按照Dockerfile中的順序逐行執(zhí)行"RUN"指令。每個"RUN"指令都會在容器中執(zhí)行一個新的臨時容器,并且對該容器的更改都會被記錄到鏡像中。
以下是一個示例,展示了在Dockerfile中使用"RUN"指令安裝軟件包的例子:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
? ?package1 \
? ?package2 \
? ?package3
在這個示例中,首先選擇了一個基礎鏡像,然后使用"RUN"指令運行了兩個命令。第一個命令是更新Ubuntu系統(tǒng)的軟件源列表,第二個命令通過apt-get
命令安裝了三個軟件包。
在構建鏡像時,Docker引擎會執(zhí)行這兩個命令,并將生成的更改記錄到最終的鏡像中。這樣,在之后的容器中,這些軟件包就都已經預先安裝好了。
總之,"RUN"指令在Dockerfile中用于執(zhí)行命令,以便在構建鏡像的過程中進行一系列操作,如安裝軟件包、創(chuàng)建文件、設置環(huán)境變量等。
CMD
在Dockerfile中,"CMD"指令用于設置容器啟動時要執(zhí)行的默認命令或者程序。
"CMD"指令的語法有兩種不同的方式:
Exec 格式:
CMD ["executable","param1","param2"]
這種格式使用 JSON 數(shù)組的形式來指定要執(zhí)行的命令。其中,可執(zhí)行文件和參數(shù)都必須以字符串的形式進行指定。當容器啟動時,會執(zhí)行這個命令。
Shell 格式:
CMD command param1 param2
這種格式以字符串形式直接指定要執(zhí)行的命令。當容器啟動時,會將這個字符串交給默認的 Shell 進行解析執(zhí)行。
需要注意的是,Dockerfile中只能有一個"CMD"指令。如果在一個Dockerfile中出現(xiàn)了多個"CMD"指令,則只有最后一個會生效。
另外,如果在運行Docker容器時指定了要執(zhí)行的命令(通過docker run
命令的參數(shù)來指定),則會覆蓋掉"Dockerfile"中設置的默認命令。
以下是一個使用"CMD"指令的示例:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
? ?package1 \
? ?package2 \
? ?package3
CMD ["echo", "Hello, Docker!"]
在這個示例中,首先選擇了一個基礎鏡像,然后通過"RUN"指令安裝了一些軟件包。最后,通過"CMD"指令設置了默認的命令"echo Hello, Docker!"。
當我們構建這個鏡像并在容器中運行時,會自動執(zhí)行默認命令"echo Hello, Docker!"。
總結來說,"CMD"指令在Dockerfile中用于設置容器啟動時要執(zhí)行的默認命令或程序。它有兩種語法格式,可以通過配置Dockerfile中的"CMD"指令來定義容器的默認行為。
VOLUME
在Dockerfile中,"VOLUME"指令用于在容器中創(chuàng)建一個或多個掛載點,使得容器內的特定路徑可以與宿主機或其他容器進行數(shù)據(jù)共享。
"VOLUME"指令的語法如下:
VOLUME ["<path>"]
或者
VOLUME <path>
其中,<path>
表示容器中的目錄路徑,可以是絕對路徑或相對路徑。
使用"VOLUME"指令可以實現(xiàn)以下幾個功能:
數(shù)據(jù)共享:通過將容器內的某個目錄路徑掛載到宿主機或其他容器上的目錄,可以實現(xiàn)數(shù)據(jù)的共享和持久化。這樣在容器啟動、停止、重新創(chuàng)建等操作時,數(shù)據(jù)都能保持不變,使得容器更加可移植和可靠。
數(shù)據(jù)持久化:通過掛載容器內的目錄到宿主機上的目錄,可以將容器中的數(shù)據(jù)持久化保存到宿主機上,而不會隨著容器的刪除而丟失。這樣在容器重新啟動時,可以通過掛載同樣的目錄,恢復之前的數(shù)據(jù)。
以下是一個使用"VOLUME"指令的示例:
FROM ubuntu:latest
VOLUME /data
在這個示例中,首先選擇了一個基礎鏡像,然后使用"VOLUME"指令創(chuàng)建了一個掛載點。它將容器內的/data
目錄路徑映射到宿主機上的某個目錄,以實現(xiàn)數(shù)據(jù)共享和持久化。
在運行容器時,可以通過-v
參數(shù)指定宿主機上的目錄與容器內的掛載點之間的映射關系,例如:
docker run -v /host/data:/data image_name
這樣就將宿主機上的/host/data
目錄與容器內的/data
目錄進行了映射,實現(xiàn)了數(shù)據(jù)共享和持久化。
總結來說,"VOLUME"指令在Dockerfile中用于創(chuàng)建一個或多個掛載點,以實現(xiàn)容器內數(shù)據(jù)的共享和持久化。通過在運行容器時,指定宿主機上的目錄與容器內的掛載點之間的映射關系,可以將數(shù)據(jù)存儲在宿主機上,而不會隨著容器的生命周期改變。
USER
在Dockerfile中,"USER"指令用于指定在容器中運行應用程序時使用的用戶或用戶組。它的作用是在容器中設置一個特定的用戶身份,以增加容器的安全性和隔離性。
"USER"指令的語法如下:
USER <user>[:<group>] or USER <UID>[:<GID>]
其中,<user>
可以是用戶名或用戶ID(UID), <group>
可以是組名或組ID(GID),也可以省略不寫。如果省略了<group>
,則容器中的默認組將會被使用。
使用"USER"指令可以實現(xiàn)以下幾個功能:
提高容器的安全性:在容器中運行應用程序時,使用非特權用戶身份可以減少潛在的安全風險。通過使用"USER"指令,可以將容器中的進程限制在一個非特權用戶的權限范圍內,減少潛在的攻擊面。
隔離應用程序環(huán)境:通過指定特定的用戶身份,可以將應用程序與宿主機或其他容器隔離開來,避免可能的沖突和干擾。這有助于增加應用程序的可移植性和可靠性。
以下是一個使用"USER"指令的示例:
FROM ubuntu:latest
RUN groupadd -r mygroup && useradd -r -g mygroup myuser
USER myuser:mygroup
在這個示例中,首先選擇了一個基礎鏡像,然后通過RUN
指令創(chuàng)建了一個用戶組和用戶。最后,使用"USER"指令將容器中的進程限制在myuser
用戶和mygroup
組的權限范圍內。
請注意,"USER"指令只影響通過Dockerfile構建的鏡像中的用戶身份。在運行鏡像時,可以通過--user
參數(shù)來指定要使用的用戶身份,覆蓋Dockerfile中的設置。
總結來說,"USER"指令在Dockerfile中用于指定容器中運行應用程序時使用的用戶或用戶組,以增加容器的安全性和隔離性。
WORKDIR
在Dockerfile中,"WORKDIR"指令用于設置容器內部工作目錄,即在容器中執(zhí)行命令時的默認目錄。
使用"WORKDIR"指令可以實現(xiàn)以下幾個功能:
指定默認工作目錄:通過使用"WORKDIR"指令,可以設置容器中的默認工作目錄。這樣,當在容器內部執(zhí)行命令時,可以省略完整路徑,直接相對于該工作目錄執(zhí)行命令。這提供了簡潔性和便利性。
簡化指令路徑:容器中的每個指令都會在指定的工作目錄中執(zhí)行。這樣可以避免在每個執(zhí)行命令時都寫入長路徑,簡化了指令的編寫。
支持相對路徑:"WORKDIR"指令可以接受相對路徑和絕對路徑。使用相對路徑時,它會相對于當前工作目錄進行解析。這樣可以更靈活地操作容器中的文件和目錄。
以下是一個使用"WORKDIR"指令的示例:
FROM ubuntu:latest
WORKDIR /app
COPY . .
RUN make
CMD [ "./app" ]
在這個示例中,首先選擇了一個基礎鏡像,然后使用"WORKDIR"指令將工作目錄設置為/app
。接下來,使用COPY
指令將當前目錄的文件復制到容器中的工作目錄。然后使用make
命令構建應用程序。最后,使用CMD
指令定義了容器啟動時默認執(zhí)行的命令,相對路徑"./app"
會在工作目錄/app
中執(zhí)行。
簡單來說,"WORKDIR"指令用于設置容器內部的工作目錄,以方便在容器中執(zhí)行命令時使用相對路徑。
HEALTHCHECH
在Dockerfile中,"HEALTHCHECK"指令用于指定容器運行時的健康檢查命令。
使用"HEALTHCHECK"指令可以實現(xiàn)以下幾個功能:
容器健康狀態(tài)檢查:通過定義健康檢查命令,可以在容器運行時定期或定時檢查容器的健康狀態(tài)。健康檢查可以包括各種類型的檢查,如執(zhí)行命令、發(fā)送HTTP請求、檢查端口等。
自動容器重啟:當容器的健康狀態(tài)檢查失敗時,Docker守護進程可以自動在指定條件下重啟容器,以使其恢復正常運行狀態(tài)。這樣可以實現(xiàn)容器的自動恢復和高可用性。
以下是一個使用"HEALTHCHECK"指令的示例:
FROM ubuntu:latest
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost/ || exit 1
CMD [ "nginx" ]
在這個示例中,首先選擇了一個基礎鏡像,然后使用"HEALTHCHECK"指令定義了容器的健康檢查命令。該命令使用"curl"命令發(fā)送HTTP請求來測試容器是否可以成功訪問http://localhost/。如果請求失敗,則返回狀態(tài)碼1,這將被Docker守護進程視為容器的健康檢查失敗。最后,使用"CMD"指令定義了容器啟動時默認執(zhí)行的命令,此例中為啟動"nginx"服務。
總結來說,"HEALTHCHECK"指令用于定義容器的健康檢查命令,以檢查容器的健康狀態(tài)并實現(xiàn)自動容器重啟功能。這有助于提高容器的可靠性和可用性。
ARG
在Dockerfile中,"ARG"指令用于定義構建時的變量。這些變量可以在構建過程中被引用,但在容器運行時不可見。
使用"ARG"指令可以實現(xiàn)以下幾個功能:
設置構建時的參數(shù):通過使用"ARG"指令,可以設置構建過程中的參數(shù)。這些參數(shù)可以在構建過程中被引用,如設置環(huán)境變量、鏡像標簽等。
可在構建命令中傳遞參數(shù):構建鏡像時,可以通過命令行傳遞參數(shù)給"ARG"指令定義的變量。這樣可以在構建過程中根據(jù)不同的參數(shù)值執(zhí)行不同的操作,使構建過程更加靈活。
以下是一個使用"ARG"指令的示例:
FROM ubuntu:latest
ARG VERSION=1.0.0
ENV APP_VERSION=$VERSION
在這個示例中,首先選擇了一個基礎鏡像,然后使用"ARG"指令定義了一個名為"VERSION"的變量,并設置其默認值為"1.0.0"。接下來,使用"ENV"指令將這個變量的值賦給一個環(huán)境變量"APP_VERSION"。在構建過程中,可以通過修改"ARG"指令定義的變量值,或者通過構建命令傳遞參數(shù)來改變環(huán)境變量的值。
總結來說,"ARG"指令用于定義構建時的變量,在構建過程中可以根據(jù)這些變量執(zhí)行不同的操作,如設置環(huán)境變量、鏡像標簽等。這增加了構建過程的靈活性和可配置性。
EXPOSE
在Dockerfile中,"EXPOSE"指令用于聲明容器運行時所監(jiān)聽的網絡端口。
使用"EXPOSE"指令可以實現(xiàn)以下幾個功能:
聲明容器對外暴露的端口:通過使用"EXPOSE"指令,可以告訴Docker守護進程容器將要監(jiān)聽的網絡端口。這樣,其他容器或主機可以通過網絡與該端口進行通信。
僅作為文檔使用:"EXPOSE"指令還可以作為Dockerfile中的文檔說明,用于指示容器設計者或使用者應該將哪些端口暴露出來。
需要注意的是,"EXPOSE"指令并不會自動在主機上映射這些端口,它只是聲明這些端口可以被容器監(jiān)聽。在運行容器時,可以使用"-p"或"-P"選項來映射容器內部的某個端口到主機上,以使外部可以訪問。
以下是一個使用"EXPOSE"指令的示例:
FROM nginx:latest
EXPOSE 80 443
在這個示例中,選擇了一個基于最新版的nginx鏡像。然后,使用"EXPOSE"指令聲明容器將會監(jiān)聽80和443端口。這意味著其他容器或主機可以通過網絡與容器內的這兩個端口進行通信。
總結來說,"EXPOSE"指令用于聲明容器運行時所監(jiān)聽的網絡端口,是一種向Docker守護進程提供容器服務端口信息的方式。它并不會自動在主機上映射這些端口,而是需要在運行容器時使用"-p"或"-P"選項進行端口映射。
ENV
在Dockerfile中,"ENV"指令用于設置容器中的環(huán)境變量。
使用"ENV"指令可以實現(xiàn)以下幾個功能:
定義容器中的環(huán)境變量:通過使用"ENV"指令,可以設置容器中的環(huán)境變量。這些環(huán)境變量可以在容器運行時被訪問,供應用程序使用。
傳遞構建時的參數(shù):"ENV"指令還可以通過引用構建時的參數(shù),將構建時的參數(shù)值傳遞給容器中的環(huán)境變量。這樣可以在構建過程中根據(jù)不同的參數(shù)值設置不同的環(huán)境變量。
以下是一個使用"ENV"指令的示例:
FROM ubuntu:latest
ENV VERSION=1.0.0 \
? ?PORT=8080
在這個示例中,首先選擇了一個基礎鏡像,然后使用"ENV"指令定義了兩個環(huán)境變量,分別是"VERSION"和"PORT"。"VERSION"的值被設置為"1.0.0","PORT"的值被設置為"8080"。在容器運行時,可以通過這兩個環(huán)境變量訪問其值。
總結來說,"ENV"指令用于設置容器中的環(huán)境變量,可以在容器運行時被訪問。它可以用于定義靜態(tài)的環(huán)境變量,也可以通過引用構建時的參數(shù)來設置動態(tài)的環(huán)境變量。
ADD
在Dockerfile中,"ADD"指令用于將文件、目錄或遠程URL添加到容器中。
"ADD"指令的作用包括:
將本地文件或目錄添加到容器中:可以使用"ADD"指令將主機上的文件或目錄添加到容器中。Docker會將這些文件或目錄復制到鏡像中的相應位置。
ADD <src> <dest>
其中,""指定了主機上的文件或目錄路徑,""指定了容器中放置文件或目錄的路徑。如果""是一個目錄,那么將會把""中的內容復制到""目錄下。
解壓縮文件:如果""是一個壓縮文件(例如.tar,.tar.gz,.tar.bz2),Docker會自動解壓縮該文件并將解壓后的內容添加到容器中。
添加遠程URL中的文件:可以使用"ADD"指令將來自遠程服務器的文件添加到容器中。Docker會從遠程URL下載文件,然后將其復制到鏡像中。
ADD <src>... <dest>
這種情況下,可以指定多個""參數(shù),每個參數(shù)都是一個URL地址,Docker會依次下載文件并將其添加到鏡像中。
需要注意的是,相對路徑的文件或目錄會相對于當前的構建上下文(通過docker build
命令指定的目錄)進行解析。同時,使用"ADD"指令時會觸發(fā)Docker的緩存策略,只有當""的內容改變時,Docker才會重新復制文件。
在實際使用中,"COPY"指令更常用于文件和目錄的復制操作,而"ADD"指令則主要用于需要自動解壓縮或從遠程URL下載文件的場景。
總結來說,"ADD"指令用于將文件、目錄或遠程URL添加到容器中。它可以將主機上的文件或目錄復制到容器中,也可以解壓縮文件或從遠程URL下載文件并添加到鏡像中。
COPY
在Dockerfile中,"COPY"指令用于將文件或目錄從主機復制到容器中。
"COPY"指令的作用包括:
復制本地文件或目錄到容器中:可以使用"COPY"指令將主機上的文件或目錄復制到容器中。Docker會將這些文件或目錄復制到鏡像中的相應位置。
COPY <src> <dest>
其中,""指定了主機上的文件或目錄路徑,""指定了容器中放置文件或目錄的路徑。如果""是一個目錄,那么將會把""中的內容復制到""目錄下。
復制文件或目錄的權限:使用"COPY"指令復制文件或目錄時,Docker會保留這些文件或目錄的權限,并將其應用于鏡像中的相應文件或目錄。
需要注意的是,相對路徑的文件或目錄會相對于當前的構建上下文(通過docker build
命令指定的目錄)進行解析。同時,使用"COPY"指令時會觸發(fā)Docker的緩存策略,只有當""的內容改變時,Docker才會重新復制文件。
與"ADD"指令相比,"COPY"指令更適合簡單的文件和目錄復制操作,不支持自動解壓縮和從遠程URL下載文件的功能。
以下是一個使用"COPY"指令的示例:
FROM ubuntu:latest
COPY myfile.txt /app/myfile.txt
在這個示例中,選擇了一個基礎鏡像,然后使用"COPY"指令將主機上的"myfile.txt"文件復制到容器中的"/app/myfile.txt"路徑下。
總結來說,"COPY"指令用于將文件或目錄從主機復制到容器中。它可以用于復制本地文件或目錄,并保留權限。相對于"ADD"指令,"COPY"更適合簡單的文件和目錄復制操作。
ENTRYPOINT
在Dockerfile中,"ENTRYPOINT"指令用于配置容器啟動時要執(zhí)行的命令。
"ENTRYPOINT"指令的作用包括:
設置容器的默認執(zhí)行命令:通過指定"ENTRYPOINT"指令,可以將容器的默認執(zhí)行命令設置為特定的命令或腳本。這些命令在容器啟動時會自動執(zhí)行。
ENTRYPOINT ["command", "arg1", "arg2"]
在這個例子中,"command"是要執(zhí)行的命令,"arg1"和"arg2"是命令的參數(shù)??梢酝ㄟ^添加多個參數(shù)來指定命令的參數(shù)列表。
支持傳遞額外的參數(shù):使用"ENTRYPOINT"指令定義容器的默認執(zhí)行命令后,可以在啟動容器時傳遞額外的參數(shù)來修改默認行為。傳遞的參數(shù)將作為默認執(zhí)行命令的參數(shù)。
docker run --rm myimage extra-arg
在這個例子中,"extra-arg"是額外的參數(shù),它將作為默認執(zhí)行命令的參數(shù)。
需要注意的是,"ENTRYPOINT"指令中使用的形式是JSON數(shù)組形式,而不是常規(guī)的命令行形式。這是因為JSON數(shù)組形式可以避免由于特殊字符解析問題引起的錯誤,并允許更好地處理參數(shù)。
"ENTRYPOINT"指令還可以與"Dockerfile"中的其他指令(如"CMD")結合使用,以組合多個命令,并定義容器的啟動命令和默認參數(shù)。
以下是一個使用"ENTRYPOINT"指令的示例:
FROM ubuntu:latest
ENTRYPOINT ["echo"]
CMD ["Hello, Docker!"]
在這個示例中,選擇了一個基礎鏡像,然后使用"ENTRYPOINT"指令將默認執(zhí)行命令設置為"echo"命令,使用"CMD"指令將默認參數(shù)設置為"Hello, Docker!"。當容器啟動時,默認執(zhí)行命令為"echo",并將"Hello, Docker!"作為參數(shù)傳遞。
視頻學習地址:
