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="649641514@qq.com" |
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的區別:
如果不是復制壓縮包到容器內部,優先使用COPY命令
ADD除了COPY功能還有解壓功能
添加遠程網絡文件/目錄使用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="649641514@qq.com" | |
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="649641514@qq.com" | |
# 從鏡像外復制并解壓到鏡像內部 | |
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 |
命令選項如下
-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 stop與docker 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]格式,或者使用[HOSTro]格式,后者對于容器來說,數據卷是只讀的,可以有效保護宿主機的文件系統。 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" |
links
鏈接到其它服務中的容器。使用服務名稱(同時作為別名),或者“服務名稱:服務別名”(如 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要換成自己的,同時,注意添加安全組的入方向規則的端口。
鏈接:https://www.cnblogs.com/hanfe1/p/16965717.html
-
鏡像
+關注
關注
0文章
168瀏覽量
10770 -
Docker
+關注
關注
0文章
478瀏覽量
11872
原文標題:Dockerfile鏡像制作 與 Docker-Compose容器編排
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論