1. 程式人生 > 其它 >Dockerfile映象製作 與 Docker-Compose容器編排

Dockerfile映象製作 與 Docker-Compose容器編排

Dockerfile映象製作

docker/podman中, 映象是容器的基礎,每次執行docker run的時候都會指定哪個基本映象作為容器執行的基礎。我們之前的docker的操作都是使用來自dockerhub提供的官方映象,直接使用這些映象只能滿足一定的基本需求,當基礎映象無法滿足我們的業務需求時,就得使用Dockerfile自己定製這些映象了。

Dockerfile是提供開發者用於定製自定義映象的配置檔案。所以我們需要掌握Dockerfile檔案的基本語法。

映象的定製就類似小時候學畫畫的水彩畫一樣,水彩畫是一層一層的塗抹上去的,而映象的定製則是編寫定製每一層所新增的配置、檔案等命令資訊。如果可以把每一層修改、安裝、構建、操作的命令都寫入到一個指令碼,用指令碼來構建、定製映象,這個指令碼就是Dockerfile。

Dockerfile 是一個文字檔案,其內包含了一條條用於自定義映象的指令(Instruction),這些指令每一條就構建一層,因此每一條指令的內容,就是告訴docker該如何構建每一層的映象內容。
注意:每一層指令執行結束以後就會隔離開啟一層。所以Dockerfile中的命令層級如果越多,則構建生成的映象就越大,也就越臃腫,所以我們應該在學習完Dockerfile的語法以後,儘量採用最少的指令來定製映象。

基本指令

FROM引數

一般寫在Dockerfile的首行,指定基礎映象,一個Dockerfile中只有一個FROM

FROM elasticsearch # 製作base image(基礎映象),儘量使用官方的image作為base image
FROM centos:8 # 以centos為基礎映象,進行二次構建映象
FROM ubuntu:20.04 # 帶有tag的基礎映象

LABEL引數

等價於MAINTAINER,用於設定當前dockerfile映象的作者相關資訊。

FROM elasticsearch 

LABEL version="1.0.0"     # 容器元資訊,幫助資訊,Metadata,類似於程式碼註釋
LABEL maintainer="[email protected]"

RUN引數

RUN引數是一個萬能指令,用於指定映象內部執行系統命令, 對於複雜的RUN命令,避免不必要的分層,多條命令用反斜線換行,或者使用&& 組合成一條命令!

RUN apt update && apt install -y vim \
         Python-dev  && # 反斜線表示命令沒有結束,僅僅換行
        /bin/bash -c "source $HOME/.bashrc;echo $HOME"

WORKDIR引數

設定映象啟動以後的容器預設工作目錄,相當於linux的cd命令

WORKDIR /ect # 相當於linux的cd命令,改變目錄,儘量使用絕對路徑!!!不要用RUN cd
WORKDIR /home/demo # 如果沒有就自動建立
RUN pwd       # 列印結果應該是/home/demo

ADD引數

複製解壓,把宿主機的一個檔案,新增到容器空間內,相當於 docker的cp

ADD /opt/django/manage.py /opt/  # 把宿主機的/opt/django/manage.py放到容器空間內的/opt/目錄下
ADD /opt/python3.8.12.tar.gz /opt/  # ADD的解壓檔案作用,將宿主機的/opt/下的python3.6.tar.gz解壓到容器內的/opt/目錄下

COPY引數

拷貝指令,功能與ADD類似,但是沒有解壓過程,只有單純複製,也相當於 docker的cp。

將宿主機的檔案, 拷貝到容器內,但是沒有解壓縮的命令,儘量使用COPY,不要使用ADD

COPY /opt/django/manage.py /opt/ # 把宿主機的/opt/django/manage.py放到容器空間內的/opt/目錄下

注意:ADD與COPY的區別:

  1. 如果不是複製壓縮包到容器內部,優先使用COPY命令
  2. ADD除了COPY功能還有解壓功能
  3. 新增遠端網路檔案/目錄使用RUN curl或RUN wget

ENV引數

設定docker容器內部的系統環境變數,相當於 docker -e

ENV MYSQL_VERSION 5.6 # 設定一個mysql常量,這個${MYSQL_VERSION}類似於全域性常量
RUN yum install -y mysql-server="${MYSQL_VERSION}"  # 如果版本號有變更,則只需要改這個常量就可以了

CMD引數

Dockerfile的結尾執行命令,類似RUN ,但是引數值是一個數組/列表,使用中括號括起來。

CMD ["sh", "run.sh"]

使用 Dockerfile之前,先切換成國內docker映象源

mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json


{
    "registry-mirrors" : [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com",
        "https://cr.console.aliyun.com/"
    ]
}

使用Dockerfile封裝Django映象

在/home下建立了docker目錄,在這個目錄下準備好要構建映象的檔案和原始碼包。

mkdir /home/docker && cd /home/docker
# 建立映象製作配置檔案,
touch Dockerfile
# 建立一個shell指令碼,用於後面啟動django專案的。
touch run.sh
# docker官方提供的ubuntu映象,裡面源地址過時了,所以我們提供一個新的到容器內部
touch sources.list
sudo cp /etc/apt/sources.list ./
vim sources.list

sources.list,程式碼:

deb http://repo.huaweicloud.com/ubuntu/ focal main restricted
deb http://repo.huaweicloud.com/ubuntu/ focal-updates main restricted
deb http://repo.huaweicloud.com/ubuntu/ focal universe
deb http://repo.huaweicloud.com/ubuntu/ focal-updates universe
deb http://repo.huaweicloud.com/ubuntu/ focal multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-updates multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu focal-security main restricted
deb http://repo.huaweicloud.com/ubuntu focal-security universe
deb http://repo.huaweicloud.com/ubuntu focal-security multiverse

下載一個django-3.2.5的原始碼包

wget -O Django-3.2.5.tar.gz https://gitee.com/mirrors/django/repository/archive/3.2.5?format=tar.gz

編寫Dockerfile構建映象的配置檔案

vim Dockerfile
FROM ubuntu:20.04

LABEL version="3.2.5"
LABEL maintainer="[email protected]"

ADD Django-3.2.5.tar.gz /opt/
COPY sources.list  /etc/apt/sources.list

RUN apt update &&  apt install -y python3 python3-pip

WORKDIR /opt/
RUN mv django-3.2.5 django

WORKDIR /opt/django
RUN python3 setup.py install

WORKDIR /opt
RUN django-admin.py startproject djdemo
COPY run.sh /opt/djdemo/run.sh

WORKDIR /opt/djdemo
RUN sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['\*'\]/g" /opt/djdemo/djdemo/settings.py &&  chmod 755 run.sh

EXPOSE 8000
CMD ["/bin/sh","run.sh"]

注意:Dockerfile中不能出現命令以外的任何註釋。以下是註釋版本:

# 指定當前定製映象的基礎映象以及版本號
FROM ubuntu:20.04
# 指定映象的描述資訊[版本號、作者]
LABEL version="1.0.0"
LABEL maintainer="[email protected]"

# 從映象外複製並解壓到映象內部
ADD Django-3.2.5.tar.gz /opt/
# 設定當前定製映象的映象源
COPY /etc/apt/sources.list  /etc/apt/sources.list
# 執行終端命令,安裝python3以及相關工具包
RUN apt update &&  apt install -y python3 python3-pip
# 切換工作目錄
WORKDIR /opt/
# 改目錄名
RUN mv django-3.2.5 django
# 切換工作目錄
WORKDIR /opt/django
# 安裝django框架
RUN python3 setup.py install
# 切換工作目錄
WORKDIR /opt
# 建立一個django專案
RUN django-admin.py startproject djdemo
# 從映象外界複製一個run.sh啟動指令碼到django專案根目錄下
COPY run.sh /opt/djdemo/run.sh

# 切換工作目錄
WORKDIR /opt/djdemo
# 替換django配置檔案settings.py的ALLOWED_HOSTS配置項,允許客戶端通過任何地址訪問django專案並設定django的啟動指令碼的許可權為755
RUN sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['\*'\]/g" /opt/djdemo/djdemo/settings.py && chmod 755 run.sh
# 開放映象的埠8000
EXPOSE 8000
# CMD就是RUN,用於在結尾執行終端命令
CMD ["/bin/sh","run.sh"]

編寫run.sh

vim run.sh
python3 manage.py runserver 0.0.0.0:8000

Docker構建映象

# docker build -t 映象名:映象版本 Dockerfile所在路徑
sudo docker build -t djdemo:3.2.5 .
docker images

構建完成後,可以看到生成一個新映象。

此時後臺啟動映象,並把容器8000埠對映到物理機的8008埠。

docker run -d -p 8008:8000 --name=django1 djdemo:3.2.5

注意:在雲伺服器上找到安全組,並在入方向,開放上述的埠,例如:8008。

Docker-Compose容器編排

基本介紹

使用一個Dockerfile模板檔案,可以很方便的定義一個適合自己使用的自定義映象。但在工作中經常會碰到需要多個容器相互配合來完成某項任務或執行某個專案的情況。例如要執行一個django專案,除了django容器本身,往往還需要再加上後端的資料庫服務容器,甚至還包括負載均衡容器等,此時我們就需要使用到Docker-Compose了。

注意:

Docker-Compose僅僅用於批量操作docker容器不能用於podman的,對於podman的容器批量操作則需要安裝podman-compose來批量操作。

當然,podman-compose和docker-compose的使用和語法是一樣的。

Docker-Compose專案是Docker官方的開源專案,負責實現對Docker容器叢集的快速編排。Docker-Compose專案由Python編寫,呼叫Docker服務提供的API來對容器進行管理和編排。因此只要所操作的平臺支援Docker API,就可以在其上利用Docker-Compose來進行Docker容器的編排和管理。

Docker-Compose將所管理的Docker容器分為三層,分別是工程(project),服務(service)以及容器(container)。

Docker-Compose允許我們開發者通過一個單獨的docker-compose.yml配置檔案(YAML 格式)來定義一組相關聯的docker容器為一個工程(project)。一個工程至少有一個服務,一個服務下至少有一個容器。

Docker-Compose執行指定目錄下的所有關聯檔案組成一個工程(工程名預設為當前目錄名)。一個工程當中可包含多個服務,每個服務中可以定義Docker容器執行的映象,引數,環境依賴等資訊。

Docker-Compose的工程配置檔案預設為docker-compose.yml,也可以通過-f 引數來指定成其他的配置檔名。

安裝與解除安裝

安裝環境檢視

uname -a
lsb_release -a  # CentOS: yum install redhat-lsb

安裝地址:https://docs.docker.com/compose/install/

釋出地址:https://github.com/docker/compose/releases

# 下載docker-compose的python二進位制執行指令碼程式
sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 給當前docker-compose指令碼程式增加執行許可權
sudo chmod +x /usr/local/bin/docker-compose
# 生成一個硬連線,作為全域性命令
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

檢視安裝的版本

docker-compose version

解除安裝

sudo rm /usr/local/bin/docker-compose
sudo rm /usr/bin/docker-compose

常用命令

基本命令格式

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

命令選項如下

-f --file FILE指定Compose模板檔案,預設為當前目錄下docker-compose.yml
# -p --project-name NAME 指定專案名稱,預設使用當前所在目錄為專案名
# --verbose  輸出更多除錯資訊
# -v,-version 列印版本並退出
# --log-level LEVEL 定義日誌等級(DEBUG, INFO, WARNING, ERROR, CRITICAL)

docker-compose up

根據容器編排配置檔案docker-compose.yml,進行編排和啟動容器。相當於docker run的增強版。

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
選項包括:
  -f 指定compose模板檔名
  -d 在系統守護程序的方式批量執行服務容器
    
# 常用寫法:
# docker-compose up  # 以佔據終端的方式批量啟動docker-compose.yml中配置的所有容器
# docker-compose up -d   # 以系統守護程序的方式批量啟動docker-compose.yml中配置的所有容器,不會佔據終端
# docker-compose -f docker-compose.yaml up -d

docker-compose down

停止執行並刪除docker-compose.yml配置的容器、網路、卷。相當於 docker stopdocker rm的組合

docker-compose down [options]
選項包括:
  -f 指定compose模板檔名
  
# 常用寫法:
# docker-compose down
# docker-compose -f docker-compose.yml down

docker-compose logs

列出當前工程專案中執行容器過程中的執行日誌。相當於docker logs

docker-compose logs [options] [SERVICE...]
選項包括:
  -f 跟蹤日誌輸出

# 常用寫法:
docker-compose logs    # 檢視整個docker-compose.yml配置中所有的容器的執行日誌,不佔據終端
docker-compose logs -f  # 監控整個docker-compose.yml配置中所有的容器的執行日誌,佔據終端

docker-compose stop

停止執行docker-compose.yml配置的容器,可以通過docker-compose start 再次啟動

docker-compose stop [options] [SERVICE...]
選項包括:
  -f 指定compose模板檔名
  
# 常用寫法:
# docker-compose stop
# docker-compose -f docker-compose.yml stop

docker-compose start

啟動執行docker-compose.yml配置的容器,可以通過docker-compose stop 關閉執行。

docker-compose start [SERVICE...]
選項包括:
  -f 指定compose模板檔名
  
# 常用寫法:
# docker-compose stop
# docker-compose -f docker-compose.yml stop

docker-compose ps

列出當前工程專案中的所有服務容器

docker-compose  ps [options] [SERVICE...]

docker-compose bulid

docker-compose build [options] [--build-arg key=val...] [SERVICE...]
構建(重新構建)專案中的服務容器。
選項包括:
–compress 通過gzip壓縮構建上下環境
–force-rm 刪除構建過程中的臨時容器
–no-cache 構建映象過程中不使用快取
–pull 始終嘗試通過拉取操作來獲取更新版本的映象
-m, –memory MEM為構建的容器設定記憶體大小
–build-arg key=val為服務設定build-time變數
服務容器一旦構建後,將會帶上一個標記名。可以隨時在專案目錄下執行docker-compose build來重新構建服務

docker-compose pull

docker-compose pull [options] [SERVICE...]
拉取服務依賴的映象。
選項包括:
–ignore-pull-failures,忽略拉取映象過程中的錯誤
–parallel,多個映象同時拉取
–quiet,拉取映象過程中不列印進度資訊
docker-compose pull
拉取服務依賴的映象

docker-compose restart

docker-compose restart [options] [SERVICE...]
重啟專案中的服務。
選項包括:
-t, –timeout TIMEOUT,指定重啟前停止容器的超時(預設為10秒)
docker-compose restart
重啟專案中的服務

docker-compose rm

docker-compose rm [options] [SERVICE...]
刪除所有(停止狀態的)服務容器。
選項包括:
–f, –force,強制直接刪除,包括非停止狀態的容器
-v,刪除容器所掛載的資料卷
docker-compose rm
刪除所有(停止狀態的)服務容器。推薦先執行docker-compose stop命令來停止容器。

docker-compose run

docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務上執行一個命令。
docker-compose run ubuntu ping www.baidu.com
在指定容器上執行一個ping命令。

docker-compose scale

docker-compose scale web=3 db=2
設定指定服務執行的容器個數。通過service=num的引數來設定數量

docker-compose pause

docker-compose pause [SERVICE...]
暫停一個服務容器

docker-compose uppause

docker-compose unpause [SERVICE...]
恢復處於暫停狀態中的服務。

docker-compose kill

docker-compose kill [options] [SERVICE...]
通過傳送SIGKILL訊號來強制停止服務容器。
支援通過-s引數來指定傳送的訊號,例如通過如下指令傳送SIGINT訊號:
docker-compose kill -s SIGINT

docker-compose config

docker-compose config [options]
驗證並檢視compose檔案配置。
選項包括:
–resolve-image-digests 將映象標籤標記為摘要
-q, –quiet 只驗證配置,不輸出。 當配置正確時,不輸出任何內容,當檔案配置錯誤,輸出錯誤資訊
–services 列印服務名,一行一個
–volumes 列印資料卷名,一行一個

docker-compose create

docker-compose create [options] [SERVICE...]
為服務建立容器。
選項包括:
–force-recreate:重新建立容器,即使配置和映象沒有改變,不相容–no-recreate引數
–no-recreate:如果容器已經存在,不需要重新建立,不相容–force-recreate引數
–no-build:不建立映象,即使缺失
–build:建立容器前  ,生成映象

docker-compose exec

docker-compose exec [options] SERVICE COMMAND [ARGS...]
選項包括:
-d 分離模式,後臺執行命令。
–privileged 獲取特權。
–user USER 指定執行的使用者。
-T 禁用分配TTY,預設docker-compose exec分配TTY。
–index=index,當一個服務擁有多個容器時,可通過該引數登陸到該服務下的任何服務,例如:docker-compose exec –index=1 web /bin/bash ,web服務中包含多個容器

docker-compose port

docker-compose port [options] SERVICE PRIVATE_PORT
顯示某個容器埠所對映的公共埠。
選項包括:
–protocol=proto,指定埠協議,TCP(預設值)或者UDP
–index=index,如果同意服務存在多個容器,指定命令物件容器的序號(預設為1)

docker-compose push

docker-compose push [options] [SERVICE...]
推送服務端的映象。
選項包括:
–ignore-push-failures 忽略推送映象過程中的錯誤

模板配置入門

Compose模板檔案是一個定義服務、網路和邏輯卷的YAML檔案。Compose模板檔案預設路徑是當前目錄下的docker-compose.yml,可以使用.yml或.yaml作為副檔名。
Docker-Compose標準模板檔案應該包含version、services、networks 三大部分,最關鍵的是services和networks兩個部分。networks是可選引數。

例如,我們要一次性啟動3個ubuntu容器執行各自不同的配置下。

mkdir -p /home/compose && cd /home/compose
vim docker-compose.yml

docker-compose.yml,程式碼:

version: "3.8"
services:
  ubuntu1:
    image: ubuntu:20.04
    container_name: "ubuntu1"
    networks:
      - dev

  ubuntu2:
    image: ubuntu:20.04
    container_name: "ubuntu2"
    networks:
      - dev
      - pro

  ubuntu3:
    image: ubuntu:20.04
    container_name: "ubuntu3"
    networks:
      - pro

networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

docker-compose.yml,註釋版本,程式碼:

# 目前我們使用的基本都是Version3版本,最新版本是3.9。
version: "3.8"
    
# 宣告接下來開始配置服務容器
services:
  # 服務名,開發者自定義的,
  ubuntu1:
    # image 當前服務容器的基本依賴映象,如果本地沒有該映象,則會自動從官網pull拉取
    # image 也可以是自己本地基於Dockerfile編譯後產生的定製映象,但是必須是已經build編譯好的
    # 如希望在docker-compose up啟動容器服務時自動編譯Dockerfile,則必須增加配置項build指定Dockerfile
    # 檔案的所在路徑,如果不指定,則可能出現從官網拉取映象失敗的情況,build配置項寫法如下:
    # build: .
    # 如使用了build配置項時還聲明瞭image配置項,則基於build所在的Dockerfile編譯的映象名為image指定名字。
    # build: .
    # image: djdemo:1.0.0
    image: ubuntu:20.04
    # container_name 指定當前服務容器啟動以後的容器名
    container_name: "ubuntu1"
   	# networks 指定網路,可以分配容器在一個或多個網路,如果不指定,則預設分配在docker的default網路中
    networks:
      - dev

  ubuntu2:
    image: ubuntu:20.04
    container_name: "ubuntu2"
    networks:
      - dev
      - pro

  ubuntu3:
    image: ubuntu:20.04
    container_name: "ubuntu3"
    networks:
      - pro

# 網路配置
networks:
  # 指定網路名稱,相當於網絡卡名
  dev:
    # driver 網絡卡驅動:bridge 橋接模式,網絡卡驅動有三種模式:bridge、host、none
    # 檢視網路:docker network ls
    driver: bridge
  pro:
    driver: bridge

完成上面的配置以後,可以通過以下命令,批量建立ubuntu容器。

# 切換目錄
cd /home/compose
# 批量啟動容器
docker-compose up
# 檢視當前目錄下的docker-compose.yml配置的容器
docker-compose ps
# 刪除docker-compose.yml配置的容器
docker-compose down

docker-compose up -d
docker-compose ps
docker-compose down

配置項說明

image

image是指定服務的映象名稱或映象ID。如果映象在本地不存在,Compose將會嘗試拉取映象。

注意:如果映象有版本號,則映象名和版本號之間不能出現空格!否則報錯!!!

services:
  ubuntu1:
    image: ubuntu:20.04
build

服務除了可以基於指定的基礎映象,還可以基於一份Dockerfile的自定義映象,在使用docker-compose up啟動時執行docker容器的構建任務,構建標籤是build,可以指定Dockerfile所在資料夾的路徑。Compose將會利用Docker自動構建映象,然後使用映象啟動服務容器。

services:
    web:
        build: /home/docker  # 指定Dockerfile檔案的路徑,如果與docker-compose.yml在同一個目錄,則可以使用 . 表示當前目錄

也可以是相對路徑,只要上下文確定就可以讀取到Dockerfile。

services:
    web:
        build: ../docker

設定上下文根目錄,然後以該目錄為準指定Dockerfile。

services:
  web:
    build:
      context: ../docker
      dockerfile: Dockerfile

build都是一個目錄,如果要指定Dockerfile檔案需要在build標籤的子級標籤中使用dockerfile標籤指定。
如果同時指定image和build兩個標籤,那麼Compose會構建映象並且把映象命名為image值指定的名字。

services:
  web:
    image: djdemo:1.0.0
    build:
      context: /home/docker
      dockerfile: Dockerfile
context選項可以是Dockerfile的檔案路徑,也可以是到連結到git倉庫的url,當提供的值是相對路徑時,被解析為相對於撰寫檔案的路徑,此目錄也是傳送到Docker守護程序的context
dockerfile選項可以指定context對應目錄下的Dockerfile檔案來構建,必須指定構建路徑
command

使用command可以覆蓋容器啟動後預設執行的命令。相當於 docker命令的末尾引數。

compose的command會覆蓋Dockerfile裡面的CMD的值。

command: shell命令
container_name

Compose的容器名稱格式是:<專案名稱><服務名稱><序號>,相當於 docker [選項] --name
可以自定義專案名稱、服務名稱,但如果想完全控制容器的命名,可以使用標籤指定:

container_name: app
restart

指定容器是否在作業系統重啟以後,docker啟動以後,是否容器也自動重啟。相當於 docker --restart=always

restart: always
environment

指定服務容器中的環境變數,可以多個環境變數,每個環境變數就一個成員,相當於 docker -e

version: '3.7'
services:
  mysql:
    image: mysql:8.0.26
    restart: always
    container_name: mysql
    networks:
      - mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_USER=luffycity"
      - "MYSQL_PASSWORD=luffycity"
      - "MYSQL_DATABASE=luffycity"
      - "TZ=Asia/Shanghai"
depends_on

在使用Compose時,最大的好處就是少打啟動命令,但一般專案中多個容器的啟動,順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。例如在沒啟動資料庫容器的時候啟動應用容器,應用容器會因為找不到資料庫而退出。depends_on標籤用於解決容器的依賴、啟動先後順序的問題

version: '3.7'
services:
  django:
    build: .
    depends_on:
      - mysql
      - redis
  redis:
    image: redis:6.0
  mysql:
    image: mysql:8.0.26

上述YAML檔案定義的容器會先啟動redis和db兩個服務,最後才啟動django服務。

ports

ports用於對映埠的標籤。
使用HOST:CONTAINER格式或者只是指定容器的埠,宿主機會隨機對映埠。相當於docker -p

ports:
 - "3000"  # 等價於 "3000:3000"
 - "8000:8000"
 - "49100:22"

當使用HOST:CONTAINER格式來對映埠時,如果使用的容器埠小於60可能會得到錯誤得結果,因為YAML將會解析xx:yy這種數字格式為60進位制。所以建議採用字串格式。

volumes

掛載一個目錄或者一個已存在的資料卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,後者對於容器來說,資料卷是隻讀的,可以有效保護宿主機的檔案系統。
Compose的資料卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。

相當於 docker run 終端命令選項-v引數

資料卷的格式可以是下面多種形式

volumes:
  # 只是指定一個路徑,Docker 會自動在建立一個數據卷(這個路徑是容器內部的)。
  # 相當於 /var/lib/mysql:/var/lib/mysql
  - /var/lib/mysql
  # 使用絕對路徑掛載資料卷
  - /opt/data:/var/lib/mysql
  # 以 Compose 配置檔案為中心的相對路徑作為資料卷掛載到容器。
  - ./cache:/tmp/cache
  # 使用使用者的相對路徑(~/ 表示的目錄是 /home/<使用者目錄>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  # 已經存在的命名的資料卷。
  - datavolume:/var/lib/mysql

如果不使用宿主機的路徑,可以指定一個volume_driver。

volume_driver: mydriver

volumes_from

從另一個服務或容器掛載其資料卷:

volumes_from:
   - service_name   
     - container_name
dns

自定義DNS伺服器。可以是一個值,也可以是一個列表。

dns:8.8.8.8
dns:
    - 8.8.8.8   
      - 9.9.9.9
expose

暴露埠,但不對映到宿主機,只允許能被連線的服務訪問。僅可以指定內部埠為引數,如下所示:

expose:
    - "3000"
    - "8000"

連結到其它服務中的容器。使用服務名稱(同時作為別名),或者“服務名稱:服務別名”(如 SERVICE:ALIAS),例如:

links:
    - db
    - db:database
    - redis
net

設定網路模式。

net: "bridge"
net: "none"
net: "host"

模板配置編寫案例

在開發中,我們的前端專案經常需要提供給外界瀏覽服務,所以往往我們會使用nginx這樣的web伺服器來提供前端檔案給外界訪問。所以我們建立並切換到/home/website目錄,建立docker-compose.yml,並編寫配置多個nginx容器批量啟動。

mkdir /home/website && cd /home/website 
vim docker-compose.yml

配置程式碼:

version: "3.8"
services:
  web1:
    image: nginx:1.21.4
    container_name: "web1"
    ports:
      - "8081:80"
    networks:
      - dev

  web2:
    image: nginx:1.21.4
    container_name: "web2"
    ports:
      - "8082:80"
    networks:
      - dev
      - pro

  web3:
    image: nginx:1.21.4
    container_name: "web3"
    ports:
      - "8083:80"
    networks:
      - pro

networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

啟動服務容器

使用docker-compose批量啟動容器

# docker-compose up      # 阻塞執行
docker-compose up -d     # 後臺執行

服務訪問

開放安全組埠以後,可以通過瀏覽器訪問web1,web2,web3。

http://114.115.200.1:8081/
http://114.115.200.1:8082/
http://114.115.200.1:8083/

注意IP要換成自己的,同時,注意新增安全組的入方向規則的埠。