天天看點

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

作者:wljslmz

你好,這裡是網絡技術聯盟站,我是瑞哥。

Docker,這個字眼大家不陌生吧,不過作為網絡工程師可能平時接觸不到,如果在看文章的是運維人員,那麼70%以上的運維人員都會跟Docker打交道。即使網工用不到,作為非常火爆熱門的技術,也希望大家能堅持看50%的文章,熏陶一下技術。

Docker由Solomon Hykes于2013年推出,最初是一個開源項目,旨在簡化開發人員在開發、測試和生産環境中部署應用程式的過程。Docker通過容器技術提供了一種輕量級的虛拟化解決方案,使應用程式可以在任何環境中一緻地運作。随着Docker的普及,DevOps和雲計算領域的工作方式發生了深刻變化,Docker已成為現代軟體開發和部署的重要工具。

在現代軟體開發中,快速疊代和持續傳遞變得至關重要。Docker的出現使得開發人員可以輕松建立、共享和運作應用程式,進而提高了開發效率,降低了環境不一緻性帶來的問題。此外,Docker的隔離特性增強了系統的安全性和穩定性,使其在微服務架構和雲原生應用中得到了廣泛應用。

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
如果已經有Docker基礎的朋友,可以直接滑到最後總結部分進行查漏補缺!

容器技術

容器與虛拟機的差別

  • 虛拟機 (VM)
  • VM包含完整的作業系統,并在虛拟化層之上運作多個作業系統執行個體。
  • VM需要更多的系統資源(CPU、記憶體、存儲)來管理這些作業系統執行個體。
  • 容器 (Container)
  • 容器共享主機作業系統的核心,具有獨立的檔案系統、程序和網絡空間。
  • 容器更輕量級,啟動速度快,占用資源少。
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
特性 虛拟機 容器
啟動時間 幾分鐘 幾秒
資源開銷 高(包含作業系統核心) 低(共享主機作業系統核心)
性能 中等 高(更接近主機性能)
隔離級别 強(完全隔離) 較弱(共享核心)
适用場景 多種作業系統和更高安全隔離需求 快速部署、微服務、開發測試等

容器化的優點

  • 快速啟動:容器可以在幾秒鐘内啟動,提高了開發和部署效率。
  • 輕量級:容器共享主機作業系統核心,占用更少的系統資源。
  • 一緻性:確定應用程式在開發、測試和生産環境中的行為一緻,減少“環境問題”。
  • 便捷性:容器化應用可以打包成獨立的單元,便于分發、複制和管理。
  • 可移植性:容器化應用可以在任何支援Docker的平台上運作,無需修改代碼。

Docker的基本概念

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

鏡像 (Image)

Docker鏡像是一個輕量級、獨立、可執行的軟體包,包含了運作某個應用程式所需的全部内容,包括代碼、運作時、庫、環境變量和配置檔案。鏡像是隻讀的,當容器啟動時,Docker會在鏡像的頂部添加一個可寫層。

容器 (Container)

容器是鏡像的一個運作執行個體,它包括了鏡像中的所有内容以及一個可寫層。容器是獨立的、可移植的單元,可以在任何支援Docker的平台上運作。

倉庫 (Repository)

Docker倉庫是存儲和分發鏡像的地方。Docker Hub是官方的公共倉庫,使用者也可以搭建私有倉庫來存儲自己的鏡像。倉庫中可以包含多個鏡像,每個鏡像可以有不同的标簽(Tag)。

Docker引擎 (Docker Engine)

Docker引擎是一個輕量級的運作時和工具集,用于建立和管理容器。它包括以下元件:

  • Docker守護程序 (Docker Daemon):負責管理容器的生命周期。
  • Docker CLI (指令行界面):用于與Docker守護程序互動的指令行工具。
  • Docker Registries (鏡像倉庫):存儲和分發Docker鏡像。

Docker架構

Docker用戶端與服務端

Docker采用了用戶端-服務端(Client-Server)架構,用戶端通過Docker CLI與服務端的Docker守護程序通信。Docker CLI發送指令給Docker守護程序,後者負責執行這些指令(如建構、運作和分發容器)。

Docker的元件

  • Docker守護程序 (Docker Daemon):背景程序,負責管理Docker對象(如鏡像、容器、網絡和卷)。
  • Docker CLI:指令行工具,使用者通過它與Docker守護程序通信。
  • Docker Registries:存儲和分發Docker鏡像的地方,包含公共的Docker Hub和私有的Docker Registry。

安裝Docker

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
  • Windows
  • 下載下傳并安裝Docker Desktop for Windows。
  • 啟動Docker Desktop并進行基本配置。
  • 驗證安裝:在指令行中運作docker --version。
  • macOS
  • 下載下傳并安裝Docker Desktop for Mac。
  • 啟動Docker Desktop并進行基本配置。
  • 驗證安裝:在終端中運作docker --version。
  • Linux
  • 以Ubuntu為例:
  • 更新APT包索引:sudo apt-get update
  • 安裝必要的包:sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • 添加Docker的官方GPG密鑰:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 設定Docker的穩定版倉庫:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 安裝Docker Engine:sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 驗證安裝:sudo docker --version

Docker鏡像

Docker鏡像是建構容器的基礎,它包含了應用程式運作所需的所有依賴和配置。鏡像是不可變的,每次運作鏡像時都會生成一個新的容器執行個體。

常見的Docker鏡像源包括:

  • Docker Hub:最廣泛使用的公共鏡像庫,包含了大量官方和社群維護的鏡像。
  • 私有鏡像庫:使用者可以搭建自己的Docker Registry來存儲和管理私有鏡像。

Docker鏡像的基礎操作

拉取鏡像 (docker pull)

docker pull指令用于從鏡像倉庫拉取鏡像。文法如下:

docker pull <鏡像名>:<标簽>
           

例如,拉取官方的nginx鏡像:

docker pull nginx:latest
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

檢視鏡像 (docker images)

docker images指令用于列出本地存儲的所有Docker鏡像。文法如下:

docker images
           

示例輸出:

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

删除鏡像 (docker rmi)

docker rmi指令用于删除本地的Docker鏡像。文法如下:

docker rmi <鏡像ID或鏡像名>:<标簽>
           

例如,删除nginx鏡像:

docker rmi nginx:latest
           

建構Docker鏡像

Dockerfile是一個文本檔案,包含了建構Docker鏡像所需的一系列指令。每個指令在建構過程中建立鏡像的一層。常用的Dockerfile指令包括:

  • FROM:指定基礎鏡像
  • RUN:在鏡像内執行指令
  • COPY:将檔案從主控端複制到鏡像内
  • CMD:指定容器啟動時要執行的指令

Dockerfile指令

  • FROM
FROM ubuntu:20.04
           

指定基礎鏡像為Ubuntu 20.04。

  • RUN
RUN apt-get update && apt-get install -y nginx
           

在鏡像内執行指令,安裝nginx。

  • COPY
COPY . /app
           

将目前目錄下的所有檔案複制到鏡像内的/app目錄。

  • CMD
CMD ["nginx", "-g", "daemon off;"]
           

指定容器啟動時執行的指令。

建構鏡像 (docker build)

docker build指令用于根據Dockerfile建構鏡像。文法如下:

docker build -t <鏡像名>:<标簽> <Dockerfile路徑>
           

例如,建構一個名為mynginx的鏡像:

docker build -t mynginx:latest .
           

優化Docker鏡像

多階段建構

多階段建構可以在一個Dockerfile中使用多個FROM指令,減少最終鏡像的大小。例如:

# 第一階段:建構應用程式
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二階段:建立最終鏡像
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
           

鏡像瘦身技巧

  • 使用輕量級基礎鏡像:如Alpine Linux。
  • 減少鏡像層數:合并多個RUN指令。
  • 清理不必要的檔案:在Dockerfile中删除臨時檔案。

管理鏡像

标簽用于辨別鏡像的不同版本。通過标簽,使用者可以友善地管理和拉取特定版本的鏡像。例如:

docker tag nginx:latest mynginx:v1.0
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

通過合理使用标簽和版本控制系統(如Git),可以有效管理鏡像的不同版本,確定應用程式在各個環境中的一緻性。

Docker容器

Docker容器是運作在Docker引擎上的獨立運作環境。每個容器都是從一個鏡像啟動的,并在鏡像的基礎上添加一個可寫層。容器提供了應用程式的隔離環境,使其運作所需的所有依賴和配置都封裝在容器内。

鏡像是靜态的檔案系統和應用程式配置的組合,而容器是鏡像的運作執行個體。當我們啟動一個容器時,Docker會在鏡像的基礎上建立一個可寫層,進而使容器變得可操作。鏡像可以被多次使用來建立多個容器。

Docker容器的基本操作

建立并啟動容器 (docker run)

docker run指令用于建立并啟動一個容器。文法如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
           

例如,運作一個nginx容器:

docker run -d -p 80:80 nginx
           

此指令會下載下傳nginx鏡像(如果本地沒有),然後在背景運作一個nginx容器,并将主機的80端口映射到容器的80端口。

停止與重新開機容器 (docker stop, docker start)

  • 停止容器
docker stop <容器ID或容器名>
           

例如,停止一個名為mynginx的容器:

docker stop mynginx
           
  • 重新開機容器
docker start <容器ID或容器名>
           

例如,重新開機mynginx容器:

docker start mynginx
           

進入容器 (docker exec, docker attach)

  • 使用docker exec進入容器

docker exec指令用于在運作的容器内執行指令。文法如下:

docker exec -it <容器ID或容器名> <指令>
           

例如,進入一個正在運作的容器的bash環境:

docker exec -it mynginx /bin/bash
           
  • 使用docker attach連接配接到容器

docker attach指令用于連接配接到一個運作中的容器。文法如下:

docker attach <容器ID或容器名>
           

例如,連接配接到mynginx容器:

docker attach mynginx
           

容器的生命周期管理

容器的狀态管理

  • 檢視運作中的容器
docker ps
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

該指令列出所有正在運作的容器。

  • 檢視所有容器(包括停止的)
docker ps -a
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
  • 删除容器
docker rm <容器ID或容器名>
           

例如,删除mynginx容器:

docker rm mynginx
           

持久化存儲 (Volumes)

Docker容器中的資料預設是臨時的,當容器删除時,資料也随之删除。為了持久化資料,我們可以使用卷(Volumes)。

  • 建立卷
docker volume create <卷名>
           

例如,建立一個名為myvolume的卷:

docker volume create myvolume
           
  • 使用卷

在運作容器時挂載卷:

docker run -d -p 80:80 -v myvolume:/data nginx
           

該指令将myvolume挂載到容器内的/data目錄。

  • 檢視卷
docker volume ls
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
  • 删除卷
docker volume rm <卷名>
           

容器網絡

Docker的網絡模式

Docker提供了多種網絡模式,用于配置容器之間的通信。

  • 橋接網絡 (Bridge Network)

預設網絡模式。每個容器連接配接到一個橋接網絡,可以通過容器IP進行通信。

docker run --network bridge <鏡像>
           
  • 主機網絡 (Host Network)

容器與主機共享網絡棧。

docker run --network host <鏡像>
           
  • 無網絡 (None Network)

容器不連接配接到任何網絡。

docker run --network none <鏡像>
           

自定義網絡

  • 建立自定義橋接網絡
docker network create <網絡名>
           

例如,建立一個名為mynetwork的自定義橋接網絡:

docker network create mynetwork
           
  • 将容器連接配接到自定義網絡
docker run --network mynetwork <鏡像>
           

容器間通信

通過自定義網絡,可以使用容器名直接進行通信。例如,在mynetwork中運作兩個容器,一個容器可以通過另一個容器的名字進行通信:

docker run -d --network mynetwork --name container1 nginx
docker run -d --network mynetwork --name container2 nginx
           

此時,container2可以通過ping container1與container1通信。

容器日志與調試

容器日志檢視 (docker logs)

docker logs指令用于檢視容器的日志。文法如下:

docker logs <容器ID或容器名>
           

例如,檢視mynginx容器的日志:

docker logs mynginx
           

容器調試技巧

  • 檢視容器内程序
docker top <容器ID或容器名>
           
  • 檢查容器的資源使用情況
docker stats <容器ID或容器名>
           
  • 導出容器的中繼資料
docker inspect <容器ID或容器名>
           

Docker倉庫與Docker Hub

Docker倉庫用于存儲和分發Docker鏡像,友善開發團隊之間共享應用程式。Docker倉庫分為公共倉庫和私有倉庫。公共倉庫如Docker Hub,提供了大量的開源鏡像資源;私有倉庫則用于存儲企業内部的專有鏡像,保障安全和合規。

Docker Hub是最廣泛使用的Docker公共倉庫,提供了海量的官方和社群鏡像。使用者可以從Docker Hub拉取、推送鏡像,并使用Docker Hub的CI/CD內建功能。

使用Docker Hub

建立Docker Hub賬戶

  1. 通路 Docker Hub https://hub.docker.com。
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
  1. 點選“Sign Up”按鈕進行注冊。
  2. 填寫相關資訊并完成賬戶注冊。

登入Docker Hub

在指令行中使用docker login指令登入Docker Hub:

docker login
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

輸入Docker Hub的使用者名和密碼即可完成登入。

拉取鏡像 (docker pull)

從Docker Hub拉取鏡像非常簡單,使用docker pull指令:

docker pull <鏡像名>:<标簽>
           

例如,拉取官方的Python鏡像:

docker pull python:3.9
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

推送鏡像 (docker push)

要推送鏡像到Docker Hub,首先需要給鏡像打标簽,然後推送:

  1. 給鏡像打标簽:
docker tag <本地鏡像ID或名稱>:<标簽> <Docker Hub使用者名>/<鏡像名>:<标簽>
           

例如,将本地鏡像myapp打标簽為Docker Hub的myapp:

docker tag myapp:latest myusername/myapp:latest
           
  1. 推送鏡像:
docker push <Docker Hub使用者名>/<鏡像名>:<标簽>
           

例如,推送myapp鏡像:

docker push myusername/myapp:latest
           

管理鏡像庫

在Docker Hub網站上可以管理自己的鏡像庫,包括建立新的倉庫、設定倉庫的可見性(公共或私有)、檢視鏡像的詳細資訊和下載下傳次數等。

私有Docker倉庫

搭建私有倉庫

Docker官方提供了一個開源的私有倉庫實作——Docker Registry。可以使用官方的Registry鏡像快速搭建一個私有倉庫。

  1. 拉取Registry鏡像:
docker pull registry:2
           
  1. 運作Registry容器:
docker run -d -p 5000:5000 --name myregistry registry:2
           

此時,私有倉庫将運作在本地主機的5000端口。

推送和拉取私有倉庫的鏡像

  1. 給鏡像打标簽:
docker tag <本地鏡像ID或名稱>:<标簽> localhost:5000/<鏡像名>:<标簽>
           

例如,将本地鏡像myapp打标簽為私有倉庫的myapp:

docker tag myapp:latest localhost:5000/myapp:latest
           
  1. 推送鏡像:
docker push localhost:5000/myapp:latest
           
  1. 拉取鏡像:
docker pull localhost:5000/myapp:latest
           

安全性配置

為了提高私有倉庫的安全性,可以啟用SSL/TLS和基礎認證。

  • 啟用SSL/TLS

需要生成自簽名證書或從CA獲驗證書,并配置Registry容器使用這些證書。

生成自簽名證書:

mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
           

啟動Registry容器時挂載證書:

docker run -d -p 5000:5000 --name myregistry \
  -v $(pwd)/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2
           
  • 啟用基礎認證

需要建立一個包含使用者名和密碼的htpasswd檔案,并配置Registry容器使用這個檔案。

安裝htpasswd工具:

sudo apt-get install apache2-utils
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

建立htpasswd檔案:

mkdir -p auth
htpasswd -Bc auth/htpasswd myusername
           

啟動Registry容器時挂載htpasswd檔案:

docker run -d -p 5000:5000 --name myregistry \
  -v $(pwd)/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:2
           

Docker倉庫的進階功能

自動建構

Docker Hub提供了自動建構功能,可以與GitHub或Bitbucket內建,當代碼庫有新的送出時自動建構并推送鏡像。

  • 設定自動建構
  • 在Docker Hub上建立新的倉庫,選擇自動建構。
  • 連接配接到GitHub或Bitbucket,選擇代碼庫和分支。
  • 配置Dockerfile的路徑和建構規則。

Webhooks

Webhooks允許Docker Hub在鏡像建構完成後向指定的URL發送HTTP請求,用于觸發後續的CI/CD流程。

  • 配置Webhooks
  • 在Docker Hub倉庫的設定頁面,找到Webhooks。
  • 添加新的Webhook,填寫目标URL。

鏡像掃描

Docker Hub提供了鏡像掃描功能,可以掃描鏡像中的已知漏洞,幫助提高應用程式的安全性。

  • 啟用鏡像掃描 在Docker Hub倉庫的設定頁面,啟用鏡像掃描功能。每次推送新鏡像時,Docker Hub将自動進行安全掃描,并提供掃描報告。

Docker Compose

Docker Compose 是用于定義和運作多容器Docker應用程式的工具。通過一個簡單的YAML檔案,使用者可以配置應用程式需要的所有服務,并使用單個指令啟動和停止這些服務。Compose 是開發、測試和部署微服務架構應用的利器。

Docker Compose 通常與Docker一起安裝,但也可以單獨安裝。以下是在不同平台上的安裝步驟:

  • Linux:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
           
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎
  • MacOS: 使用 Homebrew 安裝
brew install docker-compose
           
  • Windows: Docker Desktop 自帶Docker Compose,安裝 Docker Desktop 即可。

Docker Compose的基本概念

服務(Services)

在Docker Compose中,服務定義了一個容器的配置。一個服務可以是資料庫、Web伺服器等。Compose檔案通過services關鍵字定義多個服務,每個服務對應一個容器。

網絡(Networks)

Compose允許定義多個網絡,服務可以連接配接到這些網絡中進行通信。預設情況下,Compose會為所有服務建立一個預設網絡。

卷(Volumes)

卷用于持久化存儲。Compose允許定義卷,并将其挂載到服務的容器中。

Docker Compose檔案格式

一個簡單的docker-compose.yml檔案示例如下:

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
           

版本(Version)

Compose檔案的版本定義了文法的格式,不同版本支援的功能有所不同。建議使用最新的版本(如3或3.8)。

version: '3.8'
           

服務配置詳解

  • image: 指定使用的鏡像
  • build: 指定建構鏡像的上下文路徑和Dockerfile
  • ports: 端口映射
  • environment: 環境變量
  • volumes: 卷的挂載
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db_data:/var/lib/mysql
           

網絡配置

預設情況下,所有服務都連接配接到一個名為default的網絡。可以定義自定義網絡:

networks:
  frontend:
  backend:
           

并将服務連接配接到這些網絡:

services:
  web:
    networks:
      - frontend
  db:
    networks:
      - backend
           

卷配置

在Compose檔案中可以定義卷:

volumes:
  db_data:
           

并将其挂載到服務的容器中:

services:
  db:
    volumes:
      - db_data:/var/lib/mysql
           

Docker Compose的基本操作

啟動和停止服務 (docker-compose up, docker-compose down)

  • 啟動服務:
docker-compose up
           

該指令将啟動Compose檔案中定義的所有服務,并在控制台中輸出日志。

  • 背景運作服務:
docker-compose up -d
           
  • 停止服務:
docker-compose down
           

檢視服務狀态 (docker-compose ps)

docker-compose ps指令用于檢視目前運作的服務狀态:

docker-compose ps
           

重新開機服務 (docker-compose restart)

docker-compose restart指令用于重新開機服務:

docker-compose restart <服務名>
           

檢視服務日志 (docker-compose logs)

docker-compose logs指令用于檢視服務的日志:

docker-compose logs <服務名>
           

Docker Compose的進階功能

多環境配置

通過使用多個Compose檔案,可以為不同的環境(如開發、測試、生産)定義不同的配置。

  • 基礎Compose檔案 (docker-compose.yml):
version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "80:80"
           
  • 覆寫Compose檔案 (docker-compose.override.yml):
version: '3.8'
services:
  web:
    environment:
      - NGINX_ENV=development
           
  • 啟動服務時,會自動應用覆寫檔案:
docker-compose up
           
  • 自定義環境Compose檔案:

例如,為生産環境建立docker-compose.prod.yml:

version: '3.8'
services:
  web:
    environment:
      - NGINX_ENV=production
           

啟動時指定環境檔案:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
           

擴充服務

通過scale選項可以擴充服務的副本數量,用于負載均衡和高可用。

  • 擴充服務副本:
docker-compose up -d --scale web=3
           

以上指令将啟動3個web服務的副本。

依賴管理

可以通過depends_on選項管理服務啟動的依賴關系。例如,web服務依賴于db服務:

services:
  web:
    image: nginx
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
           

假設我們要建構一個簡單的Web應用程式,包括一個前端服務(使用nginx)、一個後端服務(使用Node.js)和一個資料庫服務(使用MySQL)。

建立一個docker-compose.yml檔案,定義前端、後端和資料庫服務:

version: '3.8'
services:
  frontend:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./frontend:/usr/share/nginx/html
    networks:
      - app-network

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    networks:
      - app-network

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: appdb
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:

volumes:
  db_data:
           

建立必要的目錄和檔案:

  • 前端目錄結構:
frontend/
└── index.html
           
  • 後端目錄結構:
backend/
├── Dockerfile
└── app.js
           

編寫前端的index.html:

<!DOCTYPE html>
<html>
<head>
    <title>My App</title>
</head>
<body>
    <h1>Hello from Nginx</h1>
</body>
</html>
           

編寫後端的Dockerfile:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
           

編寫後端的app.js:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from Node.js');
});

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});
           

啟動應用:

docker-compose up -d
           

此時,應用的前端服務通過http://localhost通路,後端服務通過http://localhost:3000通路。

Docker Swarm

Docker Swarm是Docker原生的容器編排工具,用于在多主機上管理和編排Docker容器。Swarm叢集由多個Docker引擎組成,提供了高可用性、擴充性和負載均衡等功能。使用Swarm,開發者可以像管理單個Docker執行個體一樣,管理整個叢集中的多個節點和容器。

Docker Swarm和Kubernetes是兩種主要的容器編排工具。Swarm內建在Docker中,使用簡單,适合中小型項目;Kubernetes功能強大,适合大規模複雜應用。根據項目需求選擇合适的編排工具,是提升開發和運維效率的關鍵。

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

Docker Swarm的基本概念

節點(Nodes)

Swarm叢集由多個節點組成。每個節點都是一個運作Docker的主機,分為管理節點(Manager Node)和工作節點(Worker Node)。管理節點負責叢集管理和任務排程,工作節點負責實際運作容器。

服務(Services)

服務是Swarm管理的基本機關。服務定義了應用程式的容器鏡像、運作參數和數量。Swarm會根據服務定義在叢集中部署和管理容器。

任務(Tasks)

任務是服務的具體執行個體。每個任務對應一個運作中的容器,Swarm負責排程和管理任務,確定服務的高可用性和負載均衡。

堆棧(Stacks)

堆棧是由多個服務組成的應用程式。使用堆棧,開發者可以定義和管理整個應用的服務、網絡和卷。堆棧檔案類似于Compose檔案,但适用于Swarm叢集。

設定和管理Docker Swarm叢集

初始化Swarm叢集

在主機上初始化Swarm叢集,使用docker swarm init指令:

docker swarm init --advertise-addr <管理節點IP>
           

初始化成功後,指令行會輸出加入Swarm叢集的指令和token。

加入和離開Swarm叢集

在工作節點上,使用docker swarm join指令加入叢集:

docker swarm join --token <worker-token> <管理節點IP>:2377
           

使用docker swarm leave指令離開叢集:

docker swarm leave
           

在管理節點上使用docker swarm leave --force指令強制離開并停止叢集:

docker swarm leave --force
           

管理節點和角色

  • 檢視節點清單:
docker node ls
           
  • 提升節點為管理節點:
docker node promote <節點ID>
           
  • 降級管理節點為工作節點:
docker node demote <節點ID>
           

建立和管理Swarm服務

建立服務

使用docker service create指令建立服務:

docker service create --name <服務名> --replicas <副本數量> <鏡像>
           

例如,建立一個運作nginx的服務:

docker service create --name web --replicas 3 -p 80:80 nginx
           

更新服務

使用docker service update指令更新服務:

docker service update --replicas <新的副本數量> <服務名>
           

例如,将web服務的副本數量更新為5:

docker service update --replicas 5 web
           

删除服務

使用docker service rm指令删除服務:

docker service rm <服務名>
           

例如,删除web服務:

docker service rm web
           

檢視服務狀态

使用docker service ls指令檢視服務清單:

docker service ls
           

使用docker service ps指令檢視服務的任務狀态:

docker service ps <服務名>
           

Swarm支援服務的滾動更新,確定應用程式在更新過程中保持高可用性。使用docker service update指令并指定更新參數:

docker service update --image <新鏡像> <服務名>
           

例如,更新web服務的鏡像:

docker service update --image nginx:latest web
           

如果服務更新出現問題,可以使用docker service rollback指令復原到上一個版本:

docker service rollback <服務名>
           

Swarm支援建立覆寫網絡,使容器可以跨主機通信。使用docker network create指令建立覆寫網絡:

docker network create --driver overlay <網絡名>
           

然後在服務建立時指定網絡:

docker service create --name <服務名> --network <網絡名> <鏡像>
           

Swarm支援配置和密鑰管理,確定敏感資訊安全地傳遞給服務。使用docker config和docker secret指令管理配置和密鑰。

例如,建立一個配置:

echo "my-config-data" | docker config create my-config -
           

在服務建立時使用配置:

docker service create --name <服務名> --config source=my-config,target=/path/in/container <鏡像>
           

⏰寫在最後

Docker作為現代容器化技術的核心,極大地改變了軟體開發、測試和部署的方式。

最後我們來個簡單的總結,友善大家快速的掌握本文内容,能看到最後的勇士,可以好好記總結部分。

網絡工程師需要熟悉Docker嗎?我覺得不需要精通,但是得懂基礎

Docker的基礎概念

  • 容器(Container):輕量級、獨立的可執行軟體包,包括應用程式及其所有依賴項。
  • 鏡像(Image):不可變的容器模闆,用于建立容器。
  • Docker引擎(Docker Engine):運作Docker容器的核心引擎。
  • Dockerfile:建構Docker鏡像的腳本,定義了鏡像的建構過程。

Docker的基本操作

  • 鏡像操作:
  • docker pull:從Docker Hub拉取鏡像。
  • docker build:根據Dockerfile建構鏡像。
  • docker push:将鏡像推送到Docker Hub。
  • 容器操作:
  • docker run:啟動容器。
  • docker stop:停止容器。
  • docker rm:删除容器。
  • docker exec:在運作中的容器内執行指令。

資料管理與網絡

  • 卷(Volume):持久化存儲,獨立于容器生命周期。
  • 建立和管理卷:docker volume create、docker volume ls、docker volume rm。
  • 卷挂載:在docker run指令中使用-v選項。
  • 網絡(Network):容器之間通信的橋梁。
  • 建立和管理網絡:docker network create、docker network ls、docker network rm。
  • 網絡模式:Bridge、Host、Overlay等。

Docker Compose

  • 定義和運作多容器應用:
  • 使用YAML檔案定義服務、網絡和卷。
  • 啟動和管理服務:docker-compose up、docker-compose down、docker-compose ps。
  • 進階功能:
  • 多環境配置:通過多個Compose檔案支援不同環境配置。
  • 擴充服務:通過docker-compose scale擴充服務副本。

Docker Swarm

  • 叢集管理和編排:
  • 初始化Swarm叢集:docker swarm init。
  • 加入和離開叢集:docker swarm join、docker swarm leave。
  • 管理節點和服務:docker node、docker service。
  • 進階功能:
  • 服務滾動更新和復原:docker service update、docker service rollback。
  • 配置和密鑰管理:docker config、docker secret。
  • 多主機網絡:通過Overlay網絡實作跨主機通信。

本文完!

繼續閱讀