0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Dockerfile鏡像制作與Docker-Compose容器編排

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-01-07 11:01 ? 次閱讀

Dockerfile鏡像制作

docker/podman中, 鏡像是容器的基礎(chǔ),每次執(zhí)行docker run的時候都會指定哪個基本鏡像作為容器運行的基礎(chǔ)。我們之前的docker的操作都是使用來自dockerhub提供的官方鏡像,直接使用這些鏡像只能滿足一定的基本需求,當(dāng)基礎(chǔ)鏡像無法滿足我們的業(yè)務(wù)需求時,就得使用Dockerfile自己定制這些鏡像了。

Dockerfile是提供開發(fā)者用于定制自定義鏡像的配置文件。所以我們需要掌握Dockerfile文件的基本語法。


鏡像的定制就類似小時候?qū)W畫畫的水彩畫一樣,水彩畫是一層一層的涂抹上去的,而鏡像的定制則是編寫定制每一層所添加的配置、文件等命令信息。如果可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入到一個腳本,用腳本來構(gòu)建、定制鏡像,這個腳本就是Dockerfile。
Dockerfile 是一個文本文件,其內(nèi)包含了一條條用于自定義鏡像的指令(Instruction),這些指令每一條就構(gòu)建一層,因此每一條指令的內(nèi)容,就是告訴docker該如何構(gòu)建每一層的鏡像內(nèi)容。
注意:每一層指令執(zhí)行結(jié)束以后就會隔離打開一層。所以Dockerfile中的命令層級如果越多,則構(gòu)建生成的鏡像就越大,也就越臃腫,所以我們應(yīng)該在學(xué)習(xí)完Dockerfile的語法以后,盡量采用最少的指令來定制鏡像。

基本指令

0ded76da-cc0f-11ef-9310-92fbcf53809c.png

FROM參數(shù)

一般寫在Dockerfile的首行,指定基礎(chǔ)鏡像,一個Dockerfile中只有一個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ù)

等價于MAINTAINER,用于設(shè)置當(dāng)前dockerfile鏡像的作者相關(guān)信息。


FROM elasticsearch
LABEL version="1.0.0" # 容器元信息,幫助信息,Metadata,類似于代碼注釋
LABEL maintainer="649641514@qq.com"

RUN參數(shù)

RUN參數(shù)是一個萬能指令,用于指定鏡像內(nèi)部執(zhí)行系統(tǒng)命令, 對于復(fù)雜的RUN命令,避免不必要的分層,多條命令用反斜線換行,或者使用&&組合成一條命令!


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

WORKDIR參數(shù)

設(shè)置鏡像啟動以后的容器默認(rèn)工作目錄,相當(dāng)于linux的cd命令


WORKDIR /ect # 相當(dāng)于linux的cd命令,改變目錄,盡量使用絕對路徑?。?!不要用RUN cd
WORKDIR /home/demo # 如果沒有就自動創(chuàng)建
RUN pwd # 打印結(jié)果應(yīng)該是/home/demo

ADD參數(shù)

復(fù)制解壓,把宿主機(jī)的一個文件,添加到容器空間內(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è)置一個mysql常量,這個${MYSQL_VERSION}類似于全局常量
RUN yum install -y mysql-server="${MYSQL_VERSION}" # 如果版本號有變更,則只需要改這個常量就可以了

CMD參數(shù)

Dockerfile的結(jié)尾運行命令,類似RUN ,但是參數(shù)值是一個數(shù)組/列表,使用中括號括起來。


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目錄,在這個目錄下準(zhǔn)備好要構(gòu)建鏡像的文件和源碼包。


mkdir /home/docker && cd /home/docker
# 創(chuàng)建鏡像制作配置文件,
touch Dockerfile
# 創(chuàng)建一個shell腳本,用于后面啟動django項目的。
touch run.sh
# docker官方提供的ubuntu鏡像,里面源地址過時了,所以我們提供一個新的到容器內(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

下載一個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ǔ)鏡像以及版本號
FROM ubuntu:20.04
# 指定鏡像的描述信息[版本號、作者]
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
# 運行終端命令,安裝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)建一個django項目
RUN django-admin.py startproject djdemo
# 從鏡像外界復(fù)制一個run.sh啟動腳本到django項目根目錄下
COPY run.sh /opt/djdemo/run.sh
# 切換工作目錄
WORKDIR /opt/djdemo
# 替換django配置文件settings.py的ALLOWED_HOSTS配置項,允許客戶端通過任何地址訪問django項目并設(shè)置django的啟動腳本的權(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)建完成后,可以看到生成一個新鏡像。

此時后臺啟動鏡像,并把容器8000端口映射到物理機(jī)的8008端口。


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

注意:在云服務(wù)器上找到安全組,并在入方向,開放上述的端口,例如:8008。

回到頂部

Docker-Compose容器編排

基本介紹

使用一個Dockerfile模板文件,可以很方便的定義一個適合自己使用的自定義鏡像。但在工作中經(jīng)常會碰到需要多個容器相互配合來完成某項任務(wù)或運行某個項目的情況。例如要運行一個django項目,除了django容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等,此時我們就需要使用到Docker-Compose了。

注意:

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

當(dāng)然,podman-compose和docker-compose的使用和語法是一樣的。

Docker-Compose項目是Docker官方的開源項目,負(fù)責(zé)實現(xiàn)對Docker容器集群的快速編排。Docker-Compose項目由Python編寫,調(diào)用Docker服務(wù)提供的API來對容器進(jìn)行管理和編排。因此只要所操作的平臺支持Docker API,就可以在其上利用Docker-Compose來進(jìn)行Docker容器的編排和管理。

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

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

Docker-Compose運行指定目錄下的所有關(guān)聯(lián)文件組成一個工程(工程名默認(rèn)為當(dāng)前目錄名)。一個工程當(dāng)中可包含多個服務(wù),每個服務(wù)中可以定義Docker容器運行的鏡像,參數(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
# 生成一個硬連接,作為全局命令
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 ...] [options] [COMMAND] [ARGS...]

命令選項如下


-f --file FILE指定Compose模板文件,默認(rèn)為當(dāng)前目錄下docker-compose.yml
# -p --project-name NAME 指定項目名稱,默認(rèn)使用當(dāng)前所在目錄為項目名
# --verbose 輸出更多調(diào)試信息
# -v,-version 打印版本并退出
# --log-level LEVEL 定義日志等級(DEBUG, INFO, WARNING, ERROR, CRITICAL)

docker-compose up

根據(jù)容器編排配置文件docker-compose.yml,進(jìn)行編排和啟動容器。相當(dāng)于docker run的增強版。


docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
選項包括:
-f 指定compose模板文件名
-d 在系統(tǒng)守護(hù)進(jìn)程的方式批量運行服務(wù)容器
# 常用寫法:
# docker-compose up # 以占據(jù)終端的方式批量啟動docker-compose.yml中配置的所有容器
# docker-compose up -d # 以系統(tǒng)守護(hù)進(jìn)程的方式批量啟動docker-compose.yml中配置的所有容器,不會占據(jù)終端
# docker-compose -f docker-compose.yaml up -d

docker-compose down

停止運行并刪除docker-compose.yml配置的容器、網(wǎng)絡(luò)、卷。相當(dāng)于docker stop與docker rm的組合


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

docker-compose logs

列出當(dāng)前工程項目中運行容器過程中的運行日志。相當(dāng)于docker logs


docker-compose logs [options] [SERVICE...]
選項包括:
-f 跟蹤日志輸出
# 常用寫法:
docker-compose logs # 查看整個docker-compose.yml配置中所有的容器的運行日志,不占據(jù)終端
docker-compose logs -f # 監(jiān)控整個docker-compose.yml配置中所有的容器的運行日志,占據(jù)終端

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 關(guān)閉運行。


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

docker-compose ps

列出當(dāng)前工程項目中的所有服務(wù)容器


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

docker-compose bulid


docker-compose build [options] [--build-arg key=val...] [SERVICE...]
構(gòu)建(重新構(gòu)建)項目中的服務(wù)容器。
選項包括:
–compress 通過gzip壓縮構(gòu)建上下環(huán)境
–force-rm 刪除構(gòu)建過程中的臨時容器
–no-cache 構(gòu)建鏡像過程中不使用緩存
–pull 始終嘗試通過拉取操作來獲取更新版本的鏡像
-m, –memory MEM為構(gòu)建的容器設(shè)置內(nèi)存大小
–build-arg key=val為服務(wù)設(shè)置build-time變量
服務(wù)容器一旦構(gòu)建后,將會帶上一個標(biāo)記名??梢噪S時在項目目錄下運行docker-compose build來重新構(gòu)建服務(wù)

docker-compose pull


docker-compose pull [options] [SERVICE...]
拉取服務(wù)依賴的鏡像。
選項包括:
–ignore-pull-failures,忽略拉取鏡像過程中的錯誤
–parallel,多個鏡像同時拉取
–quiet,拉取鏡像過程中不打印進(jìn)度信息
docker-compose pull
拉取服務(wù)依賴的鏡像

docker-compose restart


docker-compose restart [options] [SERVICE...]
重啟項目中的服務(wù)。
選項包括:
-t, –timeout TIMEOUT,指定重啟前停止容器的超時(默認(rèn)為10秒)
docker-compose restart
重啟項目中的服務(wù)

docker-compose rm


docker-compose rm [options] [SERVICE...]
刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。
選項包括:
–f, –force,強制直接刪除,包括非停止?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í)行一個命令。
docker-compose run ubuntu ping www.baidu.com
在指定容器上執(zhí)行一個ping命令。

docker-compose scale


docker-compose scale web=3 db=2
設(shè)置指定服務(wù)運行的容器個數(shù)。通過service=num的參數(shù)來設(shè)置數(shù)量

docker-compose pause


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

docker-compose uppause


docker-compose unpause [SERVICE...]
恢復(fù)處于暫停狀態(tài)中的服務(wù)。

docker-compose kill


docker-compose kill [options] [SERVICE...]
通過發(fā)送SIGKILL信號來強制停止服務(wù)容器。
支持通過-s參數(shù)來指定發(fā)送的信號,例如通過如下指令發(fā)送SIGINT信號:
docker-compose kill -s SIGINT

docker-compose config


docker-compose config [options]
驗證并查看compose文件配置。
選項包括:
–resolve-image-digests 將鏡像標(biāo)簽標(biāo)記為摘要
-q, –quiet 只驗證配置,不輸出。 當(dāng)配置正確時,不輸出任何內(nèi)容,當(dāng)文件配置錯誤,輸出錯誤信息
–services 打印服務(wù)名,一行一個
–volumes 打印數(shù)據(jù)卷名,一行一個

docker-compose create


docker-compose create [options] [SERVICE...]
為服務(wù)創(chuà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...]
選項包括:
-d 分離模式,后臺運行命令。
–privileged 獲取特權(quán)。
–user USER 指定運行的用戶。
-T 禁用分配TTY,默認(rèn)docker-compose exec分配TTY。
–index=index,當(dāng)一個服務(wù)擁有多個容器時,可通過該參數(shù)登陸到該服務(wù)下的任何服務(wù),例如:docker-compose exec –index=1 web /bin/bash ,web服務(wù)中包含多個容器

docker-compose port


docker-compose port [options] SERVICE PRIVATE_PORT
顯示某個容器端口所映射的公共端口。
選項包括:
–protocol=proto,指定端口協(xié)議,TCP(默認(rèn)值)或者UDP
–index=index,如果同意服務(wù)存在多個容器,指定命令對象容器的序號(默認(rèn)為1)

docker-compose push


docker-compose push [options] [SERVICE...]
推送服務(wù)端的鏡像。
選項包括:
–ignore-push-failures 忽略推送鏡像過程中的錯誤

模板配置入門

Compose模板文件是一個定義服務(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兩個部分。networks是可選參數(shù)。

例如,我們要一次性啟動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"
# 聲明接下來開始配置服務(wù)容器
services:
# 服務(wù)名,開發(fā)者自定義的,
ubuntu1:
# image 當(dāng)前服務(wù)容器的基本依賴鏡像,如果本地沒有該鏡像,則會自動從官網(wǎng)pull拉取
# image 也可以是自己本地基于Dockerfile編譯后產(chǎn)生的定制鏡像,但是必須是已經(jīng)build編譯好的
# 如希望在docker-compose up啟動容器服務(wù)時自動編譯Dockerfile,則必須增加配置項build指定Dockerfile
# 文件的所在路徑,如果不指定,則可能出現(xiàn)從官網(wǎng)拉取鏡像失敗的情況,build配置項寫法如下:
# build: .
# 如使用了build配置項時還聲明了image配置項,則基于build所在的Dockerfile編譯的鏡像名為image指定名字。
# build: .
# image: djdemo:1.0.0
image: ubuntu:20.04
# container_name 指定當(dāng)前服務(wù)容器啟動以后的容器名
container_name: "ubuntu1"
# networks 指定網(wǎng)絡(luò),可以分配容器在一個或多個網(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ū)動:bridge 橋接模式,網(wǎng)卡驅(qū)動有三種模式:bridge、host、none
# 查看網(wǎng)絡(luò):docker network ls
driver: bridge
pro:
driver: bridge

完成上面的配置以后,可以通過以下命令,批量創(chuàng)建ubuntu容器。


# 切換目錄
cd /home/compose
# 批量啟動容器
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

配置項說明

image

image是指定服務(wù)的鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會嘗試?yán)$R像。

注意:如果鏡像有版本號,則鏡像名和版本號之間不能出現(xiàn)空格!否則報錯!??!


services:
ubuntu1:
image: ubuntu:20.04

build

服務(wù)除了可以基于指定的基礎(chǔ)鏡像,還可以基于一份Dockerfile的自定義鏡像,在使用docker-compose up啟動時執(zhí)行docker容器的構(gòu)建任務(wù),構(gòu)建標(biāo)簽是build,可以指定Dockerfile所在文件夾的路徑。Compose將會利用Docker自動構(gòu)建鏡像,然后使用鏡像啟動服務(wù)容器。


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

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


services:
web:
build: ../docker

設(shè)定上下文根目錄,然后以該目錄為準(zhǔn)指定Dockerfile。


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

build都是一個目錄,如果要指定Dockerfile文件需要在build標(biāo)簽的子級標(biāo)簽中使用dockerfile標(biāo)簽指定。 如果同時指定image和build兩個標(biāo)簽,那么Compose會構(gòu)建鏡像并且把鏡像命名為image值指定的名字。


services:
web:
image: djdemo:1.0.0
build:
context: /home/docker
dockerfile: Dockerfile


context選項可以是Dockerfile的文件路徑,也可以是到鏈接到git倉庫的url,當(dāng)提供的值是相對路徑時,被解析為相對于撰寫文件的路徑,此目錄也是發(fā)送到Docker守護(hù)進(jìn)程的context
dockerfile選項可以指定context對應(yīng)目錄下的Dockerfile文件來構(gòu)建,必須指定構(gòu)建路徑

command

使用command可以覆蓋容器啟動后默認(rèn)執(zhí)行的命令。相當(dāng)于docker命令的末尾參數(shù)。

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


command: shell命令

container_name

Compose的容器名稱格式是:<項目名稱><服務(wù)名稱><序號>,相當(dāng)于docker [選項] --name 可以自定義項目名稱、服務(wù)名稱,但如果想完全控制容器的命名,可以使用標(biāo)簽指定:


container_name: app

restart

指定容器是否在操作系統(tǒng)重啟以后,docker啟動以后,是否容器也自動重啟。相當(dāng)于docker --restart=always


restart: always

environment

指定服務(wù)容器中的環(huán)境變量,可以多個環(huán)境變量,每個環(huán)境變量就一個成員,相當(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ù)據(jù)庫容器的時候啟動應(yīng)用容器,應(yīng)用容器會因為找不到數(shù)據(jù)庫而退出。depends_on標(biāo)簽用于解決容器的依賴、啟動先后順序的問題


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

上述YAML文件定義的容器會先啟動redis和db兩個服務(wù),最后才啟動django服務(wù)。

ports

ports用于映射端口的標(biāo)簽。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機(jī)會隨機(jī)映射端口。相當(dāng)于docker -p


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

當(dāng)使用HOST:CONTAINER格式來映射端口時,如果使用的容器端口小于60可能會得到錯誤得結(jié)果,因為YAML將會解析xx:yy這種數(shù)字格式為60進(jìn)制。所以建議采用字符串格式。

volumes

掛載一個目錄或者一個已存在的數(shù)據(jù)卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOSTro]格式,后者對于容器來說,數(shù)據(jù)卷是只讀的,可以有效保護(hù)宿主機(jī)的文件系統(tǒng)。 Compose的數(shù)據(jù)卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。

相當(dāng)于 docker run 終端命令選項-v參數(shù)

數(shù)據(jù)卷的格式可以是下面多種形式


volumes:
# 只是指定一個路徑,Docker 會自動在創(chuàng)建一個數(shù)據(jù)卷(這個路徑是容器內(nèi)部的)。
# 相當(dāng)于 /var/lib/mysql:/var/lib/mysql
- /var/lib/mysql
# 使用絕對路徑掛載數(shù)據(jù)卷
- /opt/data:/var/lib/mysql
# 以 Compose 配置文件為中心的相對路徑作為數(shù)據(jù)卷掛載到容器。
- ./cache:/tmp/cache
# 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
# 已經(jīng)存在的命名的數(shù)據(jù)卷。
- datavolume:/var/lib/mysql

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

volume_driver: mydriver

volumes_from

從另一個服務(wù)或容器掛載其數(shù)據(jù)卷:


volumes_from:
- service_name
- container_name

dns

自定義DNS服務(wù)器??梢允且粋€值,也可以是一個列表。


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ù)名稱(同時作為別名),或者“服務(wù)名稱:服務(wù)別名”(如 SERVICE:ALIAS),例如:


links:
- db
- db:database
- redis

net

設(shè)置網(wǎng)絡(luò)模式。


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

模板配置編寫案例

在開發(fā)中,我們的前端項目經(jīng)常需要提供給外界瀏覽服務(wù),所以往往我們會使用nginx這樣的web服務(wù)器來提供前端文件給外界訪問。所以我們創(chuàng)建并切換到/home/website目錄,創(chuàng)建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

啟動服務(wù)容器

使用docker-compose批量啟動容器


# docker-compose up # 阻塞運行
docker-compose up -d # 后臺運行

服務(wù)訪問

開放安全組端口以后,可以通過瀏覽器訪問web1,web2,web3。


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

注意IP要換成自己的,同時,注意添加安全組的入方向規(guī)則的端口。

鏈接:https://www.cnblogs.com/hanfe1/p/16965717.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鏡像
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    10770
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    478

    瀏覽量

    11872

原文標(biāo)題:Dockerfile鏡像制作 與 Docker-Compose容器編排

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    華為云 Flexus 云服務(wù)器 X 實例之 openEuler 系統(tǒng)部署 Docker Compose 管理工具 Dockge

    docker-compose.yaml 部署文件時,Dockge 以其精美的設(shè)計和易用性脫穎而出,成為不可或缺的管理工具。利用華為云 Flexus 云服務(wù)器 X 實例的強大性能,在 openEuler 系統(tǒng)上部署 Dockge,不僅能夠?qū)崿F(xiàn)對容器應(yīng)用的精細(xì)控制,更能充
    的頭像 發(fā)表于 01-08 11:41 ?73次閱讀
    華為云 Flexus 云服務(wù)器 X 實例之 openEuler 系統(tǒng)部署 <b class='flag-5'>Docker</b> <b class='flag-5'>Compose</b> 管理工具 Dockge

    docker通過中間鏡像加速部署

    使用 docker 打包鏡像的時候, 每次耗費時間最多的就是 docker build 的過程. 特別是對于前端工程的打包, 有時候下載依賴包的時間就要 10 幾分鐘, 這就導(dǎo)致發(fā)布版本的效率極低.
    的頭像 發(fā)表于 01-06 12:39 ?79次閱讀

    在 Huawei Cloud EulerOS 系統(tǒng)中安裝 Docker 的詳細(xì)步驟與常見問題解決

    Docker鏡像 ? 6. 配置Docker鏡像加速 ? 6.1 修改daemon.json文件 ? 6.2 再次拉取鏡像 ? 結(jié)語 ? 前
    的頭像 發(fā)表于 12-26 18:12 ?282次閱讀
    在 Huawei Cloud EulerOS 系統(tǒng)中安裝 <b class='flag-5'>Docker</b> 的詳細(xì)步驟與常見問題解決

    docker-compose配置文件內(nèi)容詳解以及常用命令介紹

    一、Docker Compose 簡介 Docker Compose是一種用于定義和運行多容器Docke
    的頭像 發(fā)表于 12-02 09:29 ?673次閱讀
    <b class='flag-5'>docker-compose</b>配置文件內(nèi)容詳解以及常用命令介紹

    提升DevOps效率,從基礎(chǔ)到進(jìn)階的Dockerfile編寫技巧

    創(chuàng)建自定義鏡像Dockerfile 由一行行命令語句組成,并且支持以 # 開頭的注釋行。 Docker分為四部分: 基礎(chǔ)鏡像信息 維護(hù)者信息
    的頭像 發(fā)表于 11-26 09:44 ?104次閱讀
    提升DevOps效率,從基礎(chǔ)到進(jìn)階的<b class='flag-5'>Dockerfile</b>編寫技巧

    如何在樹莓派上安裝Docker容器

    Pi官網(wǎng) 下載最新版本的Raspberry Pi OS。 使用SD卡寫入工具將鏡像寫入SD卡:可以使用 Etcher 等工具。 將SD卡插入樹莓派并啟動。 2. 更新系統(tǒng) 在安裝Docker之前
    的頭像 發(fā)表于 11-11 11:38 ?706次閱讀

    手動構(gòu)建Docker鏡像的方法

    不推薦使用docker commit命令,而應(yīng)該使用更靈活、更強大的dockerfile來構(gòu)建docker鏡像。
    的頭像 發(fā)表于 08-05 15:30 ?543次閱讀
    手動構(gòu)建<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>的方法

    ARM平臺實現(xiàn)Docker容器技術(shù)

    及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的Linux或Windows機(jī)器上,亦可實現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口。使用Docker,可像管理應(yīng)用程序一樣管理基礎(chǔ)結(jié)構(gòu)
    發(fā)表于 07-25 14:36

    ARM平臺實現(xiàn)Docker容器技術(shù)

    也變得十分簡單。此外,Docker團(tuán)隊同各個開源項目團(tuán)隊一起維護(hù)了一大批高質(zhì)量的官網(wǎng)鏡像,既可直接在生產(chǎn)環(huán)境使用,又可作為基礎(chǔ)進(jìn)一步定制,大大的降低了應(yīng)用服務(wù)的鏡像制作成本。
    發(fā)表于 07-17 11:05

    寶塔面板Docker一鍵安裝:部署GPTAcademic,開發(fā)私有GPT學(xué)術(shù)優(yōu)化工具

    使用寶塔Docker-compose,5分鐘內(nèi)在海外服務(wù)器上搭建gpt_academic。這篇文章講解如何使用寶塔面板的Docker服務(wù)搭建GPT 學(xué)術(shù)優(yōu)化 (GPT Academic)。 ? 在
    的頭像 發(fā)表于 07-02 11:58 ?2662次閱讀
    寶塔面板<b class='flag-5'>Docker</b>一鍵安裝:部署GPTAcademic,開發(fā)私有GPT學(xué)術(shù)優(yōu)化工具

    關(guān)于Docker 的清理命令集錦

    這篇文章主要介紹了Docker 清理命令集錦,需要的朋友可以參考下 復(fù)制代碼代碼如下: docker kill $(docker ps -a -q) ?刪除所有已經(jīng)停止的容器 復(fù)制代碼
    的頭像 發(fā)表于 06-13 15:56 ?394次閱讀

    Docker容器實現(xiàn)開機(jī)自動啟動策略

    如果你的容器依賴于其他服務(wù)(例如數(shù)據(jù)庫或其他容器),你需要確保這些服務(wù)在你的容器啟動之前就已經(jīng)可用。這可以通過編排工具如Docker
    的頭像 發(fā)表于 03-11 10:33 ?2881次閱讀

    ARM平臺實現(xiàn)Docker容器技術(shù)

    什么是Docker? (1)Docker的架構(gòu) Docker是一個開源的應(yīng)用容器引擎,讓開發(fā)者可打包他們的應(yīng)用以及依賴包到一個可移植的鏡像
    的頭像 發(fā)表于 03-07 13:48 ?821次閱讀
    ARM平臺實現(xiàn)<b class='flag-5'>Docker</b><b class='flag-5'>容器</b>技術(shù)

    【昉·星光 2 高性能RISC-V單板計算機(jī)體驗】為 Ubuntu 安裝 Docker 及常用軟件

    docker sudo apt install docker.io 安裝 docker-compose sudo apt-get install docker-compose
    發(fā)表于 02-21 17:54

    RK3568-Docker容器部署方法說明

    RK3568-Docker容器部署方法說明
    的頭像 發(fā)表于 01-22 10:12 ?1431次閱讀
    RK3568-<b class='flag-5'>Docker</b><b class='flag-5'>容器</b>部署方法說明