Dockerfile鏡像制作
docker/podman中, 鏡像是容器的基礎(chǔ),每次執(zhí)行docker run的時(shí)候都會(huì)指定哪個(gè)基本鏡像作為容器運(yùn)行的基礎(chǔ)。我們之前的docker的操作都是使用來自dockerhub提供的官方鏡像,直接使用這些鏡像只能滿足一定的基本需求,當(dāng)基礎(chǔ)鏡像無法滿足我們的業(yè)務(wù)需求時(shí),就得使用Dockerfile自己定制這些鏡像了。
Dockerfile是提供開發(fā)者用于定制自定義鏡像的配置文件。所以我們需要掌握Dockerfile文件的基本語法。
| 鏡像的定制就類似小時(shí)候?qū)W畫畫的水彩畫一樣,水彩畫是一層一層的涂抹上去的,而鏡像的定制則是編寫定制每一層所添加的配置、文件等命令信息。如果可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入到一個(gè)腳本,用腳本來構(gòu)建、定制鏡像,這個(gè)腳本就是Dockerfile。 | |
| Dockerfile 是一個(gè)文本文件,其內(nèi)包含了一條條用于自定義鏡像的指令(Instruction),這些指令每一條就構(gòu)建一層,因此每一條指令的內(nèi)容,就是告訴docker該如何構(gòu)建每一層的鏡像內(nèi)容。 | |
| 注意:每一層指令執(zhí)行結(jié)束以后就會(huì)隔離打開一層。所以Dockerfile中的命令層級(jí)如果越多,則構(gòu)建生成的鏡像就越大,也就越臃腫,所以我們應(yīng)該在學(xué)習(xí)完Dockerfile的語法以后,盡量采用最少的指令來定制鏡像。 |
基本指令

FROM參數(shù)
一般寫在Dockerfile的首行,指定基礎(chǔ)鏡像,一個(gè)Dockerfile中只有一個(gè)FROM
| FROM elasticsearch # 制作base image(基礎(chǔ)鏡像),盡量使用官方的image作為base image | |
| FROM centos:8 # 以centos為基礎(chǔ)鏡像,進(jìn)行二次構(gòu)建鏡像 | |
| FROM ubuntu:20.04 # 帶有tag的基礎(chǔ)鏡像 |
LABEL參數(shù)
等價(jià)于MAINTAINER,用于設(shè)置當(dāng)前dockerfile鏡像的作者相關(guān)信息。
| FROM elasticsearch | |
| LABEL version="1.0.0" # 容器元信息,幫助信息,Metadata,類似于代碼注釋 | |
| LABEL maintainer="649641514@qq.com" |
RUN參數(shù)
RUN參數(shù)是一個(gè)萬能指令,用于指定鏡像內(nèi)部執(zhí)行系統(tǒng)命令, 對(duì)于復(fù)雜的RUN命令,避免不必要的分層,多條命令用反斜線換行,或者使用&&組合成一條命令!
| RUN apt update && apt install -y vim | |
| Python-dev && # 反斜線表示命令沒有結(jié)束,僅僅換行 | |
| /bin/bash -c "source $HOME/.bashrc;echo $HOME" |
WORKDIR參數(shù)
設(shè)置鏡像啟動(dòng)以后的容器默認(rèn)工作目錄,相當(dāng)于linux的cd命令
| WORKDIR /ect # 相當(dāng)于linux的cd命令,改變目錄,盡量使用絕對(duì)路徑?。?!不要用RUN cd | |
| WORKDIR /home/demo # 如果沒有就自動(dòng)創(chuàng)建 | |
| RUN pwd # 打印結(jié)果應(yīng)該是/home/demo |
ADD參數(shù)
復(fù)制解壓,把宿主機(jī)的一個(gè)文件,添加到容器空間內(nèi),相當(dāng)于 docker的cp
| ADD /opt/django/manage.py /opt/ # 把宿主機(jī)的/opt/django/manage.py放到容器空間內(nèi)的/opt/目錄下 | |
| ADD /opt/python3.8.12.tar.gz /opt/ # ADD的解壓文件作用,將宿主機(jī)的/opt/下的python3.6.tar.gz解壓到容器內(nèi)的/opt/目錄下 |
COPY參數(shù)
拷貝指令,功能與ADD類似,但是沒有解壓過程,只有單純復(fù)制,也相當(dāng)于 docker的cp。
將宿主機(jī)的文件, 拷貝到容器內(nèi),但是沒有解壓縮的命令,盡量使用COPY,不要使用ADD
| COPY /opt/django/manage.py /opt/ # 把宿主機(jī)的/opt/django/manage.py放到容器空間內(nèi)的/opt/目錄下 |
注意:ADD與COPY的區(qū)別:
如果不是復(fù)制壓縮包到容器內(nèi)部,優(yōu)先使用COPY命令
ADD除了COPY功能還有解壓功能
添加遠(yuǎn)程網(wǎng)絡(luò)文件/目錄使用RUN curl或RUN wget
ENV參數(shù)
設(shè)置docker容器內(nèi)部的系統(tǒng)環(huán)境變量,相當(dāng)于docker -e
| ENV MYSQL_VERSION 5.6 # 設(shè)置一個(gè)mysql常量,這個(gè)${MYSQL_VERSION}類似于全局常量 | |
| RUN yum install -y mysql-server="${MYSQL_VERSION}" # 如果版本號(hào)有變更,則只需要改這個(gè)常量就可以了 |
CMD參數(shù)
Dockerfile的結(jié)尾運(yùn)行命令,類似RUN ,但是參數(shù)值是一個(gè)數(shù)組/列表,使用中括號(hào)括起來。
| CMD ["sh", "run.sh"] |
使用 Dockerfile之前,先切換成國內(nèi)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目錄,在這個(gè)目錄下準(zhǔn)備好要構(gòu)建鏡像的文件和源碼包。
| mkdir /home/docker && cd /home/docker | |
| # 創(chuàng)建鏡像制作配置文件, | |
| touch Dockerfile | |
| # 創(chuàng)建一個(gè)shell腳本,用于后面啟動(dòng)django項(xiàng)目的。 | |
| touch run.sh | |
| # docker官方提供的ubuntu鏡像,里面源地址過時(shí)了,所以我們提供一個(gè)新的到容器內(nèi)部 | |
| 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 |
下載一個(gè)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構(gòu)建鏡像的配置文件
| 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中不能出現(xiàn)命令以外的任何注釋。以下是注釋版本:
| # 指定當(dāng)前定制鏡像的基礎(chǔ)鏡像以及版本號(hào) | |
| FROM ubuntu:20.04 | |
| # 指定鏡像的描述信息[版本號(hào)、作者] | |
| LABEL version="1.0.0" | |
| LABEL maintainer="649641514@qq.com" | |
| # 從鏡像外復(fù)制并解壓到鏡像內(nèi)部 | |
| ADD Django-3.2.5.tar.gz /opt/ | |
| # 設(shè)置當(dāng)前定制鏡像的鏡像源 | |
| COPY /etc/apt/sources.list /etc/apt/sources.list | |
| # 運(yùn)行終端命令,安裝python3以及相關(guān)工具包 | |
| 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 | |
| # 創(chuàng)建一個(gè)django項(xiàng)目 | |
| RUN django-admin.py startproject djdemo | |
| # 從鏡像外界復(fù)制一個(gè)run.sh啟動(dòng)腳本到django項(xiàng)目根目錄下 | |
| COPY run.sh /opt/djdemo/run.sh | |
| # 切換工作目錄 | |
| WORKDIR /opt/djdemo | |
| # 替換django配置文件settings.py的ALLOWED_HOSTS配置項(xiàng),允許客戶端通過任何地址訪問django項(xiàng)目并設(shè)置django的啟動(dòng)腳本的權(quán)限為755 | |
| RUN sed -i "s/ALLOWED_HOSTS = []/ALLOWED_HOSTS = ['*']/g" /opt/djdemo/djdemo/settings.py && chmod 755 run.sh | |
| # 開放鏡像的端口8000 | |
| EXPOSE 8000 | |
| # CMD就是RUN,用于在結(jié)尾執(zhí)行終端命令 | |
| CMD ["/bin/sh","run.sh"] |
編寫run.sh
| vim run.sh |
| python3 manage.py runserver 0.0.0.0:8000 |
Docker構(gòu)建鏡像
| # docker build -t 鏡像名:鏡像版本 Dockerfile所在路徑 | |
| sudo docker build -t djdemo:3.2.5 . | |
| docker images |
構(gòu)建完成后,可以看到生成一個(gè)新鏡像。
此時(shí)后臺(tái)啟動(dòng)鏡像,并把容器8000端口映射到物理機(jī)的8008端口。
| docker run -d -p 8008:8000 --name=django1 djdemo:3.2.5 |
注意:在云服務(wù)器上找到安全組,并在入方向,開放上述的端口,例如:8008。
回到頂部
Docker-Compose容器編排
基本介紹
使用一個(gè)Dockerfile模板文件,可以很方便的定義一個(gè)適合自己使用的自定義鏡像。但在工作中經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來完成某項(xiàng)任務(wù)或運(yùn)行某個(gè)項(xiàng)目的情況。例如要運(yùn)行一個(gè)django項(xiàng)目,除了django容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等,此時(shí)我們就需要使用到Docker-Compose了。
注意:
Docker-Compose僅僅用于批量操作docker容器不能用于podman的,對(duì)于podman的容器批量操作則需要安裝podman-compose來批量操作。
當(dāng)然,podman-compose和docker-compose的使用和語法是一樣的。
Docker-Compose項(xiàng)目是Docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排。Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來對(duì)容器進(jìn)行管理和編排。因此只要所操作的平臺(tái)支持Docker API,就可以在其上利用Docker-Compose來進(jìn)行Docker容器的編排和管理。
Docker-Compose將所管理的Docker容器分為三層,分別是工程(project),服務(wù)(service)以及容器(container)。
Docker-Compose允許我們開發(fā)者通過一個(gè)單獨(dú)的docker-compose.yml配置文件(YAML 格式)來定義一組相關(guān)聯(lián)的docker容器為一個(gè)工程(project)。一個(gè)工程至少有一個(gè)服務(wù),一個(gè)服務(wù)下至少有一個(gè)容器。
Docker-Compose運(yùn)行指定目錄下的所有關(guān)聯(lián)文件組成一個(gè)工程(工程名默認(rèn)為當(dāng)前目錄名)。一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中可以定義Docker容器運(yùn)行的鏡像,參數(shù),環(huán)境依賴等信息。
Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml,也可以通過-f 參數(shù)來指定成其他的配置文件名。
安裝與卸載
安裝環(huán)境查看
| uname -a | |
| lsb_release -a # CentOS: yum install redhat-lsb |
安裝地址:https://docs.docker.com/compose/install/
發(fā)布地址:https://github.com/docker/compose/releases
| # 下載docker-compose的python二進(jìn)制執(zhí)行腳本程序 | |
| 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 | |
| # 給當(dāng)前docker-compose腳本程序增加執(zhí)行權(quán)限 | |
| sudo chmod +x /usr/local/bin/docker-compose | |
| # 生成一個(gè)硬連接,作為全局命令 | |
| 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 |
命令選項(xiàng)如下
| -f --file FILE指定Compose模板文件,默認(rèn)為當(dāng)前目錄下docker-compose.yml | |
| # -p --project-name NAME 指定項(xiàng)目名稱,默認(rèn)使用當(dāng)前所在目錄為項(xiàng)目名 | |
| # --verbose 輸出更多調(diào)試信息 | |
| # -v,-version 打印版本并退出 | |
| # --log-level LEVEL 定義日志等級(jí)(DEBUG, INFO, WARNING, ERROR, CRITICAL) |
docker-compose up
根據(jù)容器編排配置文件docker-compose.yml,進(jìn)行編排和啟動(dòng)容器。相當(dāng)于docker run的增強(qiáng)版。
| docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...] | |
| 選項(xiàng)包括: | |
| -f 指定compose模板文件名 | |
| -d 在系統(tǒng)守護(hù)進(jìn)程的方式批量運(yùn)行服務(wù)容器 | |
| # 常用寫法: | |
| # docker-compose up # 以占據(jù)終端的方式批量啟動(dòng)docker-compose.yml中配置的所有容器 | |
| # docker-compose up -d # 以系統(tǒng)守護(hù)進(jìn)程的方式批量啟動(dòng)docker-compose.yml中配置的所有容器,不會(huì)占據(jù)終端 | |
| # docker-compose -f docker-compose.yaml up -d |
docker-compose down
停止運(yùn)行并刪除docker-compose.yml配置的容器、網(wǎng)絡(luò)、卷。相當(dāng)于docker stop與docker rm的組合
| docker-compose down [options] | |
| 選項(xiàng)包括: | |
| -f 指定compose模板文件名 | |
| # 常用寫法: | |
| # docker-compose down | |
| # docker-compose -f docker-compose.yml down |
docker-compose logs
列出當(dāng)前工程項(xiàng)目中運(yùn)行容器過程中的運(yùn)行日志。相當(dāng)于docker logs
| docker-compose logs [options] [SERVICE...] | |
| 選項(xiàng)包括: | |
| -f 跟蹤日志輸出 | |
| # 常用寫法: | |
| docker-compose logs # 查看整個(gè)docker-compose.yml配置中所有的容器的運(yùn)行日志,不占據(jù)終端 | |
| docker-compose logs -f # 監(jiān)控整個(gè)docker-compose.yml配置中所有的容器的運(yùn)行日志,占據(jù)終端 |
docker-compose stop
停止運(yùn)行docker-compose.yml配置的容器,可以通過docker-compose start 再次啟動(dòng)
| docker-compose stop [options] [SERVICE...] | |
| 選項(xiàng)包括: | |
| -f 指定compose模板文件名 | |
| # 常用寫法: | |
| # docker-compose stop | |
| # docker-compose -f docker-compose.yml stop |
docker-compose start
啟動(dòng)運(yùn)行docker-compose.yml配置的容器,可以通過docker-compose stop 關(guān)閉運(yùn)行。
| docker-compose start [SERVICE...] | |
| 選項(xiàng)包括: | |
| -f 指定compose模板文件名 | |
| # 常用寫法: | |
| # docker-compose stop | |
| # docker-compose -f docker-compose.yml stop |
docker-compose ps
列出當(dāng)前工程項(xiàng)目中的所有服務(wù)容器
| docker-compose ps [options] [SERVICE...] |
docker-compose bulid
| docker-compose build [options] [--build-arg key=val...] [SERVICE...] | |
| 構(gòu)建(重新構(gòu)建)項(xiàng)目中的服務(wù)容器。 | |
| 選項(xiàng)包括: | |
| –compress 通過gzip壓縮構(gòu)建上下環(huán)境 | |
| –force-rm 刪除構(gòu)建過程中的臨時(shí)容器 | |
| –no-cache 構(gòu)建鏡像過程中不使用緩存 | |
| –pull 始終嘗試通過拉取操作來獲取更新版本的鏡像 | |
| -m, –memory MEM為構(gòu)建的容器設(shè)置內(nèi)存大小 | |
| –build-arg key=val為服務(wù)設(shè)置build-time變量 | |
| 服務(wù)容器一旦構(gòu)建后,將會(huì)帶上一個(gè)標(biāo)記名??梢噪S時(shí)在項(xiàng)目目錄下運(yùn)行docker-compose build來重新構(gòu)建服務(wù) | |
docker-compose pull
| docker-compose pull [options] [SERVICE...] | |
| 拉取服務(wù)依賴的鏡像。 | |
| 選項(xiàng)包括: | |
| –ignore-pull-failures,忽略拉取鏡像過程中的錯(cuò)誤 | |
| –parallel,多個(gè)鏡像同時(shí)拉取 | |
| –quiet,拉取鏡像過程中不打印進(jìn)度信息 | |
| docker-compose pull | |
| 拉取服務(wù)依賴的鏡像 |
docker-compose restart
| docker-compose restart [options] [SERVICE...] | |
| 重啟項(xiàng)目中的服務(wù)。 | |
| 選項(xiàng)包括: | |
| -t, –timeout TIMEOUT,指定重啟前停止容器的超時(shí)(默認(rèn)為10秒) | |
| docker-compose restart | |
| 重啟項(xiàng)目中的服務(wù) |
docker-compose rm
| docker-compose rm [options] [SERVICE...] | |
| 刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。 | |
| 選項(xiàng)包括: | |
| –f, –force,強(qiáng)制直接刪除,包括非停止?fàn)顟B(tài)的容器 | |
| -v,刪除容器所掛載的數(shù)據(jù)卷 | |
| docker-compose rm | |
| 刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。推薦先執(zhí)行docker-compose stop命令來停止容器。 |
docker-compose run
| docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] | |
| 在指定服務(wù)上執(zhí)行一個(gè)命令。 | |
| docker-compose run ubuntu ping www.baidu.com | |
| 在指定容器上執(zhí)行一個(gè)ping命令。 |
docker-compose scale
| docker-compose scale web=3 db=2 | |
| 設(shè)置指定服務(wù)運(yùn)行的容器個(gè)數(shù)。通過service=num的參數(shù)來設(shè)置數(shù)量 |
docker-compose pause
| docker-compose pause [SERVICE...] | |
| 暫停一個(gè)服務(wù)容器 |
docker-compose uppause
| docker-compose unpause [SERVICE...] | |
| 恢復(fù)處于暫停狀態(tài)中的服務(wù)。 |
docker-compose kill
| docker-compose kill [options] [SERVICE...] | |
| 通過發(fā)送SIGKILL信號(hào)來強(qiáng)制停止服務(wù)容器。 | |
| 支持通過-s參數(shù)來指定發(fā)送的信號(hào),例如通過如下指令發(fā)送SIGINT信號(hào): | |
| docker-compose kill -s SIGINT |
docker-compose config
| docker-compose config [options] | |
| 驗(yàn)證并查看compose文件配置。 | |
| 選項(xiàng)包括: | |
| –resolve-image-digests 將鏡像標(biāo)簽標(biāo)記為摘要 | |
| -q, –quiet 只驗(yàn)證配置,不輸出。 當(dāng)配置正確時(shí),不輸出任何內(nèi)容,當(dāng)文件配置錯(cuò)誤,輸出錯(cuò)誤信息 | |
| –services 打印服務(wù)名,一行一個(gè) | |
| –volumes 打印數(shù)據(jù)卷名,一行一個(gè) |
docker-compose create
| docker-compose create [options] [SERVICE...] | |
| 為服務(wù)創(chuàng)建容器。 | |
| 選項(xiàng)包括: | |
| –force-recreate:重新創(chuàng)建容器,即使配置和鏡像沒有改變,不兼容–no-recreate參數(shù) | |
| –no-recreate:如果容器已經(jīng)存在,不需要重新創(chuàng)建,不兼容–force-recreate參數(shù) | |
| –no-build:不創(chuàng)建鏡像,即使缺失 | |
| –build:創(chuàng)建容器前,生成鏡像 |
docker-compose exec
| docker-compose exec [options] SERVICE COMMAND [ARGS...] | |
| 選項(xiàng)包括: | |
| -d 分離模式,后臺(tái)運(yùn)行命令。 | |
| –privileged 獲取特權(quán)。 | |
| –user USER 指定運(yùn)行的用戶。 | |
| -T 禁用分配TTY,默認(rèn)docker-compose exec分配TTY。 | |
| –index=index,當(dāng)一個(gè)服務(wù)擁有多個(gè)容器時(shí),可通過該參數(shù)登陸到該服務(wù)下的任何服務(wù),例如:docker-compose exec –index=1 web /bin/bash ,web服務(wù)中包含多個(gè)容器 |
docker-compose port
| docker-compose port [options] SERVICE PRIVATE_PORT | |
| 顯示某個(gè)容器端口所映射的公共端口。 | |
| 選項(xiàng)包括: | |
| –protocol=proto,指定端口協(xié)議,TCP(默認(rèn)值)或者UDP | |
| –index=index,如果同意服務(wù)存在多個(gè)容器,指定命令對(duì)象容器的序號(hào)(默認(rèn)為1) |
docker-compose push
| docker-compose push [options] [SERVICE...] | |
| 推送服務(wù)端的鏡像。 | |
| 選項(xiàng)包括: | |
| –ignore-push-failures 忽略推送鏡像過程中的錯(cuò)誤 |
模板配置入門
Compose模板文件是一個(gè)定義服務(wù)、網(wǎng)絡(luò)和邏輯卷的YAML文件。Compose模板文件默認(rèn)路徑是當(dāng)前目錄下的docker-compose.yml,可以使用.yml或.yaml作為文件擴(kuò)展名。 Docker-Compose標(biāo)準(zhǔn)模板文件應(yīng)該包含version、services、networks 三大部分,最關(guān)鍵的是services和networks兩個(gè)部分。networks是可選參數(shù)。
例如,我們要一次性啟動(dòng)3個(gè)ubuntu容器運(yùn)行各自不同的配置下。
| 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" | |
| # 聲明接下來開始配置服務(wù)容器 | |
| services: | |
| # 服務(wù)名,開發(fā)者自定義的, | |
| ubuntu1: | |
| # image 當(dāng)前服務(wù)容器的基本依賴鏡像,如果本地沒有該鏡像,則會(huì)自動(dòng)從官網(wǎng)pull拉取 | |
| # image 也可以是自己本地基于Dockerfile編譯后產(chǎn)生的定制鏡像,但是必須是已經(jīng)build編譯好的 | |
| # 如希望在docker-compose up啟動(dòng)容器服務(wù)時(shí)自動(dòng)編譯Dockerfile,則必須增加配置項(xiàng)build指定Dockerfile | |
| # 文件的所在路徑,如果不指定,則可能出現(xiàn)從官網(wǎng)拉取鏡像失敗的情況,build配置項(xiàng)寫法如下: | |
| # build: . | |
| # 如使用了build配置項(xiàng)時(shí)還聲明了image配置項(xiàng),則基于build所在的Dockerfile編譯的鏡像名為image指定名字。 | |
| # build: . | |
| # image: djdemo:1.0.0 | |
| image: ubuntu:20.04 | |
| # container_name 指定當(dāng)前服務(wù)容器啟動(dòng)以后的容器名 | |
| container_name: "ubuntu1" | |
| # networks 指定網(wǎng)絡(luò),可以分配容器在一個(gè)或多個(gè)網(wǎng)絡(luò),如果不指定,則默認(rèn)分配在docker的default網(wǎng)絡(luò)中 | |
| networks: | |
| - dev | |
| ubuntu2: | |
| image: ubuntu:20.04 | |
| container_name: "ubuntu2" | |
| networks: | |
| - dev | |
| - pro | |
| ubuntu3: | |
| image: ubuntu:20.04 | |
| container_name: "ubuntu3" | |
| networks: | |
| - pro | |
| # 網(wǎng)絡(luò)配置 | |
| networks: | |
| # 指定網(wǎng)絡(luò)名稱,相當(dāng)于網(wǎng)卡名 | |
| dev: | |
| # driver 網(wǎng)卡驅(qū)動(dòng):bridge 橋接模式,網(wǎng)卡驅(qū)動(dòng)有三種模式:bridge、host、none | |
| # 查看網(wǎng)絡(luò):docker network ls | |
| driver: bridge | |
| pro: | |
| driver: bridge |
完成上面的配置以后,可以通過以下命令,批量創(chuàng)建ubuntu容器。
| # 切換目錄 | |
| cd /home/compose | |
| # 批量啟動(dòng)容器 | |
| docker-compose up | |
| # 查看當(dāng)前目錄下的docker-compose.yml配置的容器 | |
| docker-compose ps | |
| # 刪除docker-compose.yml配置的容器 | |
| docker-compose down | |
| docker-compose up -d | |
| docker-compose ps | |
| docker-compose down |
配置項(xiàng)說明
image
image是指定服務(wù)的鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會(huì)嘗試?yán)$R像。
注意:如果鏡像有版本號(hào),則鏡像名和版本號(hào)之間不能出現(xiàn)空格!否則報(bào)錯(cuò)?。?!
| services: | |
| ubuntu1: | |
| image: ubuntu:20.04 |
build
服務(wù)除了可以基于指定的基礎(chǔ)鏡像,還可以基于一份Dockerfile的自定義鏡像,在使用docker-compose up啟動(dòng)時(shí)執(zhí)行docker容器的構(gòu)建任務(wù),構(gòu)建標(biāo)簽是build,可以指定Dockerfile所在文件夾的路徑。Compose將會(huì)利用Docker自動(dòng)構(gòu)建鏡像,然后使用鏡像啟動(dòng)服務(wù)容器。
| services: | |
| web: | |
| build: /home/docker # 指定Dockerfile文件的路徑,如果與docker-compose.yml在同一個(gè)目錄,則可以使用 . 表示當(dāng)前目錄 |
也可以是相對(duì)路徑,只要上下文確定就可以讀取到Dockerfile。
| services: | |
| web: | |
| build: ../docker |
設(shè)定上下文根目錄,然后以該目錄為準(zhǔn)指定Dockerfile。
| services: | |
| web: | |
| build: | |
| context: ../docker | |
| dockerfile: Dockerfile |
build都是一個(gè)目錄,如果要指定Dockerfile文件需要在build標(biāo)簽的子級(jí)標(biāo)簽中使用dockerfile標(biāo)簽指定。 如果同時(shí)指定image和build兩個(gè)標(biāo)簽,那么Compose會(huì)構(gòu)建鏡像并且把鏡像命名為image值指定的名字。
| services: | |
| web: | |
| image: djdemo:1.0.0 | |
| build: | |
| context: /home/docker | |
| dockerfile: Dockerfile |
| context選項(xiàng)可以是Dockerfile的文件路徑,也可以是到鏈接到git倉庫的url,當(dāng)提供的值是相對(duì)路徑時(shí),被解析為相對(duì)于撰寫文件的路徑,此目錄也是發(fā)送到Docker守護(hù)進(jìn)程的context | |
| dockerfile選項(xiàng)可以指定context對(duì)應(yīng)目錄下的Dockerfile文件來構(gòu)建,必須指定構(gòu)建路徑 |
command
使用command可以覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令。相當(dāng)于docker命令的末尾參數(shù)。
compose的command會(huì)覆蓋Dockerfile里面的CMD的值。
| command: shell命令 |
container_name
Compose的容器名稱格式是:<項(xiàng)目名稱><服務(wù)名稱><序號(hào)>,相當(dāng)于docker [選項(xiàng)] --name 可以自定義項(xiàng)目名稱、服務(wù)名稱,但如果想完全控制容器的命名,可以使用標(biāo)簽指定:
| container_name: app |
restart
指定容器是否在操作系統(tǒng)重啟以后,docker啟動(dòng)以后,是否容器也自動(dòng)重啟。相當(dāng)于docker --restart=always
| restart: always |
environment
指定服務(wù)容器中的環(huán)境變量,可以多個(gè)環(huán)境變量,每個(gè)環(huán)境變量就一個(gè)成員,相當(dāng)于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時(shí),最大的好處就是少打啟動(dòng)命令,但一般項(xiàng)目中多個(gè)容器的啟動(dòng),順序是有要求的,如果直接從上到下啟動(dòng)容器,必然會(huì)因?yàn)槿萜饕蕾噯栴}而啟動(dòng)失敗。例如在沒啟動(dòng)數(shù)據(jù)庫容器的時(shí)候啟動(dòng)應(yīng)用容器,應(yīng)用容器會(huì)因?yàn)檎也坏綌?shù)據(jù)庫而退出。depends_on標(biāo)簽用于解決容器的依賴、啟動(dòng)先后順序的問題
| version: '3.7' | |
| services: | |
| django: | |
| build: . | |
| depends_on: | |
| - mysql | |
| - redis | |
| redis: | |
| image: redis:6.0 | |
| mysql: | |
| image: mysql:8.0.26 |
上述YAML文件定義的容器會(huì)先啟動(dòng)redis和db兩個(gè)服務(wù),最后才啟動(dòng)django服務(wù)。
ports
ports用于映射端口的標(biāo)簽。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機(jī)會(huì)隨機(jī)映射端口。相當(dāng)于docker -p
| ports: | |
| - "3000" # 等價(jià)于 "3000:3000" | |
| - "8000:8000" | |
| - "49100:22" |
當(dāng)使用HOST:CONTAINER格式來映射端口時(shí),如果使用的容器端口小于60可能會(huì)得到錯(cuò)誤得結(jié)果,因?yàn)閅AML將會(huì)解析xx:yy這種數(shù)字格式為60進(jìn)制。所以建議采用字符串格式。
volumes
掛載一個(gè)目錄或者一個(gè)已存在的數(shù)據(jù)卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOSTro]格式,后者對(duì)于容器來說,數(shù)據(jù)卷是只讀的,可以有效保護(hù)宿主機(jī)的文件系統(tǒng)。 Compose的數(shù)據(jù)卷指定路徑可以是相對(duì)路徑,使用 . 或者 .. 來指定相對(duì)目錄。
相當(dāng)于 docker run 終端命令選項(xiàng)-v參數(shù)
數(shù)據(jù)卷的格式可以是下面多種形式
| volumes: | |
| # 只是指定一個(gè)路徑,Docker 會(huì)自動(dòng)在創(chuàng)建一個(gè)數(shù)據(jù)卷(這個(gè)路徑是容器內(nèi)部的)。 | |
| # 相當(dāng)于 /var/lib/mysql:/var/lib/mysql | |
| - /var/lib/mysql | |
| # 使用絕對(duì)路徑掛載數(shù)據(jù)卷 | |
| - /opt/data:/var/lib/mysql | |
| # 以 Compose 配置文件為中心的相對(duì)路徑作為數(shù)據(jù)卷掛載到容器。 | |
| - ./cache:/tmp/cache | |
| # 使用用戶的相對(duì)路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。 | |
| - ~/configs:/etc/configs/:ro | |
| # 已經(jīng)存在的命名的數(shù)據(jù)卷。 | |
| - datavolume:/var/lib/mysql |
如果不使用宿主機(jī)的路徑,可以指定一個(gè)volume_driver。
volume_driver: mydriver
volumes_from
從另一個(gè)服務(wù)或容器掛載其數(shù)據(jù)卷:
| volumes_from: | |
| - service_name | |
| - container_name |
dns
自定義DNS服務(wù)器。可以是一個(gè)值,也可以是一個(gè)列表。
| dns:8.8.8.8 | |
| dns: | |
| - 8.8.8.8 | |
| - 9.9.9.9 |
expose
暴露端口,但不映射到宿主機(jī),只允許能被連接的服務(wù)訪問。僅可以指定內(nèi)部端口為參數(shù),如下所示:
| expose: | |
| - "3000" | |
| - "8000" |
links
鏈接到其它服務(wù)中的容器。使用服務(wù)名稱(同時(shí)作為別名),或者“服務(wù)名稱:服務(wù)別名”(如 SERVICE:ALIAS),例如:
| links: | |
| - db | |
| - db:database | |
| - redis |
net
設(shè)置網(wǎng)絡(luò)模式。
| net: "bridge" | |
| net: "none" | |
| net: "host" |
模板配置編寫案例
在開發(fā)中,我們的前端項(xiàng)目經(jīng)常需要提供給外界瀏覽服務(wù),所以往往我們會(huì)使用nginx這樣的web服務(wù)器來提供前端文件給外界訪問。所以我們創(chuàng)建并切換到/home/website目錄,創(chuàng)建docker-compose.yml,并編寫配置多個(gè)nginx容器批量啟動(dòng)。
| 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 |
啟動(dòng)服務(wù)容器
使用docker-compose批量啟動(dòng)容器
| # docker-compose up # 阻塞運(yùn)行 | |
| docker-compose up -d # 后臺(tái)運(yùn)行 |
服務(wù)訪問
開放安全組端口以后,可以通過瀏覽器訪問web1,web2,web3。
| http://114.115.200.1:8081/ | |
| http://114.115.200.1:8082/ | |
| http://114.115.200.1:8083/ |
注意IP要換成自己的,同時(shí),注意添加安全組的入方向規(guī)則的端口。
鏈接:https://www.cnblogs.com/hanfe1/p/16965717.html
-
鏡像
+關(guān)注
關(guān)注
0文章
178瀏覽量
11484 -
Docker
+關(guān)注
關(guān)注
0文章
525瀏覽量
13854
原文標(biāo)題:Dockerfile鏡像制作 與 Docker-Compose容器編排
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
創(chuàng)龍 瑞芯微 RK3588 國產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Docker容器部署方法說明
Docker鏡像構(gòu)建與管理指南
深入剖析兩大容器編排平臺(tái)的核心差異
Docker容器安全攻防實(shí)戰(zhàn)案例
Docker Compose的常用命令
基于RV1126開發(fā)板的板卡Docker環(huán)境部署方法
基于Docker鏡像逆向生成Dockerfile
docker-proxy鏡像加速倉庫
Docker-鏡像的分層-busybox鏡像制作
華為云 Flexus 云服務(wù)器 X 實(shí)例之 openEuler 系統(tǒng)部署 Docker Compose 管理工具 Dockge
docker通過中間鏡像加速部署
在 Huawei Cloud EulerOS 系統(tǒng)中安裝 Docker 的詳細(xì)步驟與常見問題解決
提升DevOps效率,從基礎(chǔ)到進(jìn)階的Dockerfile編寫技巧

Dockerfile鏡像制作與Docker-Compose容器編排
評(píng)論