一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2025-01-07 11:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Dockerfile鏡像制作

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

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


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

基本指令

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

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è)萬(wàn)能指令,用于指定鏡像內(nèi)部執(zhí)行系統(tǒng)命令, 對(duì)于復(fù)雜的RUN命令,避免不必要的分層,多條命令用反斜線換行,或者使用&&組合成一條命令!


RUN apt update && apt install -y vim
Python-dev && # 反斜線表示命令沒(méi)有結(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 # 如果沒(méi)有就自動(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類似,但是沒(méi)有解壓過(guò)程,只有單純復(fù)制,也相當(dāng)于 docker的cp。

將宿主機(jī)的文件, 拷貝到容器內(nèi),但是沒(mé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)括起來(lái)。


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

使用 Dockerfile之前,先切換成國(guó)內(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鏡像,里面源地址過(guò)時(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),允許客戶端通過(guò)任何地址訪問(wèn)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
# 開(kāi)放鏡像的端口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ù)器上找到安全組,并在入方向,開(kāi)放上述的端口,例如:8008。

回到頂部

Docker-Compose容器編排

基本介紹

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

注意:

Docker-Compose僅僅用于批量操作docker容器不能用于podman的,對(duì)于podman的容器批量操作則需要安裝podman-compose來(lái)批量操作。

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

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

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

Docker-Compose允許我們開(kāi)發(fā)者通過(guò)一個(gè)單獨(dú)的docker-compose.yml配置文件(YAML 格式)來(lái)定義一組相關(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,也可以通過(guò)-f 參數(shù)來(lái)指定成其他的配置文件名。

安裝與卸載

安裝環(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 ...] [options] [COMMAND] [ARGS...]

命令選項(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)行容器過(guò)程中的運(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配置的容器,可以通過(guò)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配置的容器,可以通過(guò)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 通過(guò)gzip壓縮構(gòu)建上下環(huán)境
–force-rm 刪除構(gòu)建過(guò)程中的臨時(shí)容器
–no-cache 構(gòu)建鏡像過(guò)程中不使用緩存
–pull 始終嘗試通過(guò)拉取操作來(lái)獲取更新版本的鏡像
-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來(lái)重新構(gòu)建服務(wù)

docker-compose pull


docker-compose pull [options] [SERVICE...]
拉取服務(wù)依賴的鏡像。
選項(xiàng)包括:
–ignore-pull-failures,忽略拉取鏡像過(guò)程中的錯(cuò)誤
–parallel,多個(gè)鏡像同時(shí)拉取
–quiet,拉取鏡像過(guò)程中不打印進(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命令來(lái)停止容器。

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ù)。通過(guò)service=num的參數(shù)來(lái)設(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...]
通過(guò)發(fā)送SIGKILL信號(hào)來(lái)強(qiáng)制停止服務(wù)容器。
支持通過(guò)-s參數(shù)來(lái)指定發(fā)送的信號(hào),例如通過(guò)如下指令發(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)建容器,即使配置和鏡像沒(méi)有改變,不兼容–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í),可通過(guò)該參數(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 忽略推送鏡像過(guò)程中的錯(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"
# 聲明接下來(lái)開(kāi)始配置服務(wù)容器
services:
# 服務(wù)名,開(kāi)發(fā)者自定義的,
ubuntu1:
# image 當(dāng)前服務(wù)容器的基本依賴鏡像,如果本地沒(méi)有該鏡像,則會(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

完成上面的配置以后,可以通過(guò)以下命令,批量創(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)說(shuō)明

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倉(cāng)庫(kù)的url,當(dāng)提供的值是相對(duì)路徑時(shí),被解析為相對(duì)于撰寫文件的路徑,此目錄也是發(fā)送到Docker守護(hù)進(jìn)程的context
dockerfile選項(xiàng)可以指定context對(duì)應(yīng)目錄下的Dockerfile文件來(lái)構(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)槿萜饕蕾噯?wèn)題而啟動(dòng)失敗。例如在沒(méi)啟動(dòng)數(shù)據(jù)庫(kù)容器的時(shí)候啟動(dòng)應(yīng)用容器,應(yīng)用容器會(huì)因?yàn)檎也坏綌?shù)據(jù)庫(kù)而退出。depends_on標(biāo)簽用于解決容器的依賴、啟動(dòng)先后順序的問(wèn)題


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格式來(lái)映射端口時(shí),如果使用的容器端口小于60可能會(huì)得到錯(cuò)誤得結(jié)果,因?yàn)閅AML將會(huì)解析xx:yy這種數(shù)字格式為60進(jìn)制。所以建議采用字符串格式。

volumes

掛載一個(gè)目錄或者一個(gè)已存在的數(shù)據(jù)卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOSTro]格式,后者對(duì)于容器來(lái)說(shuō),數(shù)據(jù)卷是只讀的,可以有效保護(hù)宿主機(jī)的文件系統(tǒng)。 Compose的數(shù)據(jù)卷指定路徑可以是相對(duì)路徑,使用 . 或者 .. 來(lái)指定相對(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ù)訪問(wèn)。僅可以指定內(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"

模板配置編寫案例

在開(kāi)發(fā)中,我們的前端項(xiàng)目經(jīng)常需要提供給外界瀏覽服務(wù),所以往往我們會(huì)使用nginx這樣的web服務(wù)器來(lái)提供前端文件給外界訪問(wèn)。所以我們創(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ù)訪問(wèn)

開(kāi)放安全組端口以后,可以通過(guò)瀏覽器訪問(wèn)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

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

    關(guān)注

    0

    文章

    178

    瀏覽量

    11251
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    515

    瀏覽量

    12974

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Docker Compose的常用命令

    大家好,今天給大家分享Docker Compose的常用命令,以及docker-compose文件的屬性。Docker Compose 是一
    的頭像 發(fā)表于 04-30 13:40 ?456次閱讀

    基于RV1126開(kāi)發(fā)板的板卡Docker環(huán)境部署方法

    隨時(shí)隨地進(jìn)行部署。Dockerfile、Image(鏡像)和Container(容器)為Docker中的三個(gè)重要概念。通過(guò)Image我們可以創(chuàng)建許多個(gè)Container,通過(guò)
    的頭像 發(fā)表于 04-16 10:04 ?232次閱讀
    基于RV1126開(kāi)發(fā)板的板卡<b class='flag-5'>Docker</b>環(huán)境部署方法

    rootfs鏡像制作其實(shí)沒(méi)那么難

    在嵌入式Linux開(kāi)發(fā)中,文件系統(tǒng)的打包和鏡像制作是關(guān)鍵步驟。本文介紹了Linux核心板文件系統(tǒng)的打包與鏡像制作方法,適合嵌入式開(kāi)發(fā)人員快速上手。前言致遠(yuǎn)電子Linux核心板提供的系統(tǒng)
    的頭像 發(fā)表于 04-03 11:37 ?435次閱讀
    rootfs<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>其實(shí)沒(méi)那么難

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過(guò)理解Docker鏡像如何存儲(chǔ)數(shù)據(jù), 以及如何使用工具查看鏡像方方面面的信息來(lái)逆向工程一個(gè)Docker鏡像; 以及如何使
    的頭像 發(fā)表于 03-10 09:45 ?610次閱讀
    基于<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>逆向生成<b class='flag-5'>Dockerfile</b>

    docker-proxy鏡像加速倉(cāng)庫(kù)

    自建多平臺(tái)容器鏡像代理服務(wù),支持 Docker Hub, GitHub, Google, k8s, Quay, Microsoft 等鏡像倉(cāng)庫(kù)。
    的頭像 發(fā)表于 03-06 16:06 ?474次閱讀
    <b class='flag-5'>docker</b>-proxy<b class='flag-5'>鏡像</b>加速倉(cāng)庫(kù)

    Docker-鏡像的分層-busybox鏡像制作

    docker hub里面查看busybox的Dockerfile, 知識(shí)點(diǎn)4:bootfs 和 rootfs? 知識(shí)點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)? 如果多個(gè)
    的頭像 發(fā)表于 01-15 10:44 ?609次閱讀
    <b class='flag-5'>Docker</b>-<b class='flag-5'>鏡像</b>的分層-busybox<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>

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

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

    docker通過(guò)中間鏡像加速部署

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

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

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

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

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

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

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

    如何在樹(shù)莓派上安裝Docker容器

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

    入門級(jí)攻略:如何容器化部署微服務(wù)?

    第一步理解容器化基礎(chǔ),第二步創(chuàng)建Dockerfile,第三步構(gòu)建推送鏡像,第四步部署微服務(wù),第五步管理微服務(wù)、第六步優(yōu)化更新。容器化部署微服務(wù)是現(xiàn)代軟件開(kāi)發(fā)中的一種高效方法,可提供良好
    的頭像 發(fā)表于 10-09 10:08 ?400次閱讀

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

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

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

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