要讓外部存取 Docker 容器內的服務,必須將容器埠對映到主機埠。使用 docker run
命令的 -p
引數可以完成埠對映設定。執行 docker run -d --name nginx01 -p 8080:80 ubuntu/nginx:latest
命令後,主機的 8080 埠就會對映到容器的 80 埠。執行前,最好使用 ss -ntl
或 lsof -i:8080
檢查主機埠是否已被佔用。啟動容器後,使用 docker ps
驗證容器狀態和埠對映是否正確。最後,使用 curl localhost:8080
或瀏覽器存取 http://localhost:8080
測試服務是否正常執行。
容器基礎:使用Docker暴露服務埠
在前面的章節中,我們已經瞭解瞭如何使用Docker執行容器。本章節將探討如何暴露容器內的服務埠,使其能夠被外部存取。
執行容器並暴露埠
要暴露容器的埠,我們需要使用docker run
命令,並配合特定的引數。以下是一個範例命令,用於啟動一個名為nginx01
的容器,並將其80埠對映到主機的8080埠:
docker run -d --name nginx01 -e TZ=EDT -p8080:80 ubuntu/nginx:latest
-d
:使容器在背景執行。--name nginx01
:為容器指定名稱為nginx01
。-e TZ=EDT
:設定容器內的時區為EDT(東部夏令時)。您可以根據需要更改時區。-p8080:80
:將主機的8080埠對映到容器的80埠。ubuntu/nginx:latest
:指定要執行的Docker映像。
在執行此命令之前,我們需要確認主機的8080埠是否可用。可以使用ss
或lsof
命令檢查連接埠占用情況。
檢查連接埠占用情況
使用ss
命令檢查所有監聽埠:
ss -ntl
輸出範例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:46433 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
使用lsof
命令檢查特定埠(例如8080)是否被佔用:
lsof -i:8080
如果這些命令沒有輸出,表示8080埠未被佔用,可以安全使用。
驗證容器啟動和埠對映
啟動容器後,使用docker ps
命令驗證容器是否成功執行:
docker ps
輸出範例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b51b6f4a5934 ubuntu/nginx:latest "/docker-entrypoint...." 26 seconds ago Up 25 seconds 0.0.0.0:8080->80/tcp nginx01
此輸出確認了容器nginx01
正在執行,並且將主機的8080埠對映到容器的80埠。
測試容器服務
確認容器執行後,我們可以檢查8080埠是否正在監聽:
ss -ntl | grep [8]080
輸出範例:
LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 4096 [::]:8080 [::]:*
這表明8080埠正在監聽,容器內的服務已經成功暴露。
使用curl測試服務
使用curl
命令存取http://localhost:8080
,驗證Nginx服務是否正常執行:
curl localhost:8080
輸出範例:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width:35em; margin:0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
內容解密:
docker run
命令引數:-d
引數使容器在背景執行,不佔用當前終端。--name
用於指定容器名稱,方便後續管理和識別。-e TZ=EDT
設定容器內的時區,這對於日誌記錄和時間相關的操作非常重要。-p8080:80
將主機的8080埠對映到容器的80埠,使外部能夠透過主機的8080埠存取容器內的Nginx服務。
埠檢查:
- 使用
ss -ntl
或lsof -i:8080
命令檢查連接埠占用情況,確保所選埠未被其他程式佔用。
- 使用
docker ps
命令:- 用於列出當前正在執行的容器,並顯示容器的ID、映像名稱、執行命令、建立時間、狀態、埠對映和容器名稱等資訊。
埠對映驗證:
- 使用
ss -ntl | grep [8]080
命令檢查主機的8080埠是否正在監聽,以驗證埠對映是否成功。
- 使用
curl
命令測試:- 透過存取
http://localhost:8080
來驗證容器內的Nginx服務是否成功啟動並暴露給外部。
- 透過存取
隨著容器技術的不斷發展,未來可能會出現更多高效的容器管理和協調工具。掌握Docker的基本操作和原理,將有助於更好地理解和應用這些新技術。
容器埠對映流程
graph LR A[啟動容器] --> B[檢查連接埠占用] B --> C[執行docker run命令] C --> D[驗證容器狀態] D --> E[檢查埠監聽狀態] E --> F[使用curl測試服務] F --> G[確認服務正常執行]
圖表翻譯:
此圖表展示了容器埠對映的流程。首先啟動容器,接著檢查所需埠是否被佔用,然後執行docker run
命令並對映埠。隨後驗證容器是否成功啟動,並檢查主機上的埠是否正在監聽。最後,使用curl
命令測試服務是否正常執行,以確認整個流程的成功。
使用Docker建置自訂容器映像檔
在前一章中,我們學習瞭如何從Docker Hub找到預先建置的容器映像檔並執行它們。本章將著重於如何建立自己的容器映像檔,這對於佈署企業軟體至關重要,因為大多數企業軟體都是專有或閉源的。
建立容器映像檔的流程
建立容器映像檔的過程與從原始碼編譯成可執行檔的過程相似。首先,我們需要定義容器映像檔的建置步驟,這些步驟被寫在一個名為Dockerfile
的檔案中。然後,我們執行docker build
命令,根據Dockerfile
中的指示建立容器映像檔。最後,我們可以使用docker run
命令執行這個容器映像檔。
Dockerfile詳解
Dockerfile
是一個文字檔案,其中包含了一系列的指令,用於告訴Docker如何建置映像檔。以下是一些基本的指令:
FROM
:指定基礎映像檔RUN
:執行命令COPY
:複製檔案到容器中EXPOSE
:暴露容器的埠CMD
:指定容器啟動時執行的命令
建置自訂的靜態網站容器
讓我們繼續使用靜態網站的例子,這次我們不使用預先建置的Docker映像檔,而是建立自己的容器映像檔,包含我們自己的index.html
檔案。
步驟1:準備基礎OS映像檔
我們需要一個包含Ubuntu 22.04的基礎映像檔。可以從Docker Hub搜尋並使用官方的Ubuntu映像檔。
FROM ubuntu:22.04
步驟2:安裝nginx
在Dockerfile
中使用RUN
指令安裝nginx。
RUN apt update && apt install -y nginx
步驟3:複製自訂的index.html
將我們自己的index.html
檔案複製到容器中的適當位置。
COPY index.html /var/www/html/
步驟4:暴露埠
暴露容器的80埠,以便可以從外部存取。
EXPOSE 80
步驟5:指定啟動命令
指定容器啟動時執行的命令,在本例中是啟動nginx。
CMD ["nginx", "-g", "daemon off;"]
完整的Dockerfile範例
FROM ubuntu:22.04
# 安裝nginx
RUN apt update && apt install -y nginx
# 複製自訂的index.html
COPY index.html /var/www/html/
# 暴露80埠
EXPOSE 80
# 指定啟動命令
CMD ["nginx", "-g", "daemon off;"]
建置與執行容器
使用以下命令建置容器映像檔:
docker build -t my-nginx .
執行容器:
docker run -d -p 8080:80 my-nginx
#### 內容解密:
這裡我們建立了一個名為my-nginx
的Docker映像檔,並將主機的8080埠對映到容器的80埠。現在,我們可以透過存取http://localhost:8080
來檢視我們的靜態網站。
執行多個容器例項
就像前一章所做的那樣,我們可以執行多個容器例項,每個例項對映到不同的埠。
docker run -d --name nginx01 -p 8080:80 my-nginx
docker run -d --name nginx02 -p 8081:80 my-nginx
#### 內容解密:
這裡我們執行了兩個容器例項,nginx01
和nginx02
,並將它們分別對映到主機的8080和8081埠。
驗證容器狀態
使用docker ps
命令可以檢視正在執行的容器。
docker ps
#### 內容解密:
此命令列出所有正在執行的容器,包括它們的ID、映像檔名稱、建立時間、狀態、埠對映等資訊。
你的任務
嘗試建立一個包含Apache HTTPD的容器映像檔,而不是nginx。可以參考官方的httpd
映像檔或使用ubuntu/apache2
映像檔作為基礎。練習建立自己的Dockerfile
並執行它。
未來方向
在未來的章節中,我們將探討更多關於容器化的主題,包括容器協調、網路和安全性。這些知識將幫助您更好地理解如何使用容器技術來佈署和管理複雜的應用程式。
建構第一個容器映像檔
在前面的章節中,我們已經成功地執行了nginx容器,並確認了其運作狀態。現在,我們將進一步探討如何建立自己的容器映像檔。首先,我們需要了解容器映像檔的基本概念以及如何使用Docker來建立和管理它們。
取得Ubuntu容器映像檔
首先,我們需要下載Ubuntu容器映像檔。Docker Hub提供了多個版本的Ubuntu映像檔,我們可以根據需求選擇合適的版本。在本例中,我們將使用ubuntu:latest
這個標籤來取得最新的Ubuntu映像檔。
下載Ubuntu容器映像檔
docker pull ubuntu:latest
下載完成後,我們可以確認映像檔是否已經存在於本地的Docker映像檔倉函式庫中:
docker images
執行Ubuntu容器
下載完成後,我們可以執行Ubuntu容器:
docker run ubuntu:latest
執行後,我們可以使用docker ps
和docker ps -a
命令來檢視容器的執行狀態。
內容解密:
docker run ubuntu:latest
:執行Ubuntu容器,但由於沒有持續執行的程式,容器會立即離開。docker ps
:列出目前正在執行的容器。docker ps -a
:列出所有容器,包括已離開的容器。
互動式執行Ubuntu容器
為了能夠與容器互動,我們可以使用以下命令:
docker run -i -t -e /bin/bash ubuntu:latest
內容解密:
-i
:互動式執行容器。-t
:分配一個偽終端,以便我們能夠與容器互動。-e /bin/bash
:在容器中執行/bin/bash
命令。
執行後,我們會進入容器的命令列介面,可以在其中執行各種命令。
確認容器ID
在另一個終端機中,我們可以使用docker ps
命令來確認容器的ID:
docker ps
內容解密:
- 容器的ID會顯示在
CONTAINER ID
欄位中。 - 我們可以確認容器的ID與在容器內部看到的主機名是否一致。
建立專案目錄並下載nginx套件
在開始建立自訂容器映像檔之前,我們需要建立一個專案目錄,並下載所需的nginx套件。
mkdir container-static-website && cd container-static-website
mkdir ubuntupkgs && cd ubuntupkgs
接著,我們需要造訪Ubuntu Packages網站,下載nginx-light
套件及其所有依賴套件。
使用curl下載套件
curl -L -s http://security.ubuntu.com/ubuntu/pool/universe/n/nginx/nginx-light_1.18.0-6ubuntu14.3_amd64.deb -o nginx-light_1.18.0-6ubuntu14.3_amd64.deb
內容解密:
curl
命令用於下載檔案。-L
選項用於跟隨重定向。-s
選項用於靜默模式,下載過程中不會顯示進度資訊。-o
選項用於指定輸出的檔案名稱。
未來步驟
在下載完成所需的套件後,我們將進一步探討如何使用這些套件來建立自訂的容器映像檔。
容器建立流程
graph LR; A[下載Ubuntu映像檔] --> B[執行Ubuntu容器]; B --> C[互動式執行Ubuntu容器]; C --> D[下載nginx套件]; D --> E[建立自訂容器映像檔];
圖表翻譯: 此圖表展示了建立自訂容器映像檔的流程。首先,我們下載Ubuntu映像檔並執行容器。接著,我們以互動式方式執行容器,並在其中下載所需的nginx套件。最後,我們使用這些套件來建立自訂的容器映像檔。