企业网站建设豪禾网络,上海网站制作机构,搜索引擎网站怎么做,wordpress 忘记数据库密码一、概述
Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具#xff0c;但它们的作用和使用方式不同。
Dockerfile
Dockerfile 是一个文本文件#xff0c;用于定义 Docker 镜像的构建规则。它包含一系列指令#xff0c;如 FROM#xff08;指定基础镜像…一、概述
Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具但它们的作用和使用方式不同。
Dockerfile
Dockerfile 是一个文本文件用于定义 Docker 镜像的构建规则。它包含一系列指令如 FROM指定基础镜像、RUN执行命令、COPY拷贝文件、EXPOSE暴露端口和 CMD设置容器启动时执行的命令等用于指定容器运行时的操作系统、软件环境、应用程序、文件拷贝等信息。通过 Dockerfile可以构建出一个自定义的 Docker 镜像使得该镜像能够在任意支持 Docker 的主机上运行。Dockerfile 适用于简单的单容器应用场景。
Docker Compose
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。它使用 YAML 文件来描述应用程序的服务、网络、存储等资源并允许用户通过一个命令如 docker-compose up来启动、停止、重启和管理整个应用程序。Docker Compose 可以定义多个 Docker 容器每个容器都可以使用自定义的 Docker 镜像并可以指定容器之间的依赖关系和通信方式。这对于需要多个相互关联的容器组成的应用程序非常有用简化了容器的部署和管理过程特别是在开发、测试和部署阶段。Docker Compose 适用于复杂的多容器应用场景。12 总结来说Dockerfile 主要用于创建和定制 Docker 镜像而 Docker Compose 主要用于管理多个 Docker 容器的运行确保它们可以协同工作来构建一个完整的应用程序。
举例说明
假设你要在 CentOS 7 系统上运行一个 PHP Web 应用程序并使用 Nginx 作为 Web 服务器可以使用 Dockerfile 和 Docker Compose 来实现。 使用 Dockerfile可以创建一个自定义的 PHPNginx 镜像例如 该 Dockerfile 基于官方的 PHP 7.4-fpm 镜像安装了 Nginx并将应用程序代码复制到容器的 /var/www/html 目录下。该镜像还将容器的 80 端口映射到宿主机以便可以从宿主机通过浏览器访问该应用程序。
使用 Docker Compose可以定义一个 YAML 文件来同时启动 PHP 和 Nginx 两个容器并将它们连接到同一个 Docker 网络中。例如 该 Docker Compose 文件定义了两个服务一个是基于官方的 PHP 7.4-fpm 镜像另一个是基于官方的 Nginx 镜像。它们都挂载了本地的应用程序代码和 Nginx 配置文件并将它们连接到一个名为 my-network 的 Docker 网络中。此外Nginx 容器的 80 端口也映射到了宿主机的 80 端口上。
总的来说Dockerfile 更适合创建和定制单个镜像而 Docker Compose 更适合管理多个容器并将它们组合在一起构建一个完整的应用程序。在这个例子中使用 Dockerfile 可以创建一个自定义的 PHPNginx 镜像而使用 Docker Compose 可以同时启动 PHP 和 Nginx 两个容器并将它们连接到同一个 Docker 网络中。
二、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:7 # 以centos为基础镜像进行二次构建镜像 FROM ubuntu:20.04 # 带有tag的基础镜像
LABEL参数
等价于MAINTAINER用于设置当前dockerfile镜像的作者相关信息。
FROM elasticsearch
LABEL version“1.0.0” # 容器元信息帮助信息Metadata类似于代码注释 LABEL maintainer“xxxqq.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常量,这个 M Y S Q L V E R S I O N 类似于全局常量 R U N y u m i n s t a l l − y m y s q l − s e r v e r {MYSQL_VERSION}类似于全局常量 RUN yum install -y mysql-server MYSQLVERSION类似于全局常量RUNyuminstall−ymysql−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.listsources.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的源码包
cd /opt/
wget -O Django-3.2.18.tar.gz https://www.djangoproject.com/download/3.2.18/tarball/
tar xzf Django-3.2.18.tar.gz编写Dockerfile构建镜像的配置文件
vim Dockerfile
FROM ubuntu:20.04LABEL version3.2.18
LABEL maintainer562172420qq.comADD Django-3.2.18.tar.gz /opt/
COPY sources.list /etc/apt/sources.listRUN apt update apt install -y python3 python3-pipWORKDIR /opt/
RUN mv Django-3.2.18 djangoWORKDIR /opt/django
RUN python3 setup.py installWORKDIR /opt
RUN django-admin.py startproject djdemo
COPY run.sh /opt/djdemo/run.shWORKDIR /opt/djdemo
RUN sed -i s/ALLOWED_HOSTS \[\]/ALLOWED_HOSTS \[\*\]/g /opt/djdemo/djdemo/settings.py chmod 755 run.shEXPOSE 8000
CMD [/bin/sh,run.sh]注意Dockerfile中不能出现命令以外的任何注释。以下是注释版本
# 指定当前定制镜像的基础镜像以及版本号
FROM ubuntu:20.04
# 指定镜像的描述信息[版本号、作者]
LABEL version3.2.18
LABEL maintainer562172420qq.com# 从镜像外复制并解压到镜像内部
ADD Django-3.2.18.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.18 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:8000Docker构建镜像
cd /home/docker
# docker build -t 镜像名:镜像版本 Dockerfile所在路径
sudo docker build -t djdemo:3.2.18 .
docker images构建完成后可以看到生成一个新镜像。
此时后台启动镜像并把容器8000端口映射到物理机的8008端口。
docker run -d -p 8000:8000 --namedjango1 djdemo:3.2.18注意在云服务器上找到安全组并在入方向开放上述的端口例如8000。
三、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
查看版本
https://github.com/docker/compose/releases/
# 下载docker-compose的python二进制执行脚本程序
sudo curl -L https://github.com/docker/compose/releases/download/v2.17.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# 上一句如果下载太慢的话可以在本地下载后再上传到服务器中将本地上传的移动到/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 SERVICENUM...] [SERVICE...]
选项包括-f 指定compose模板文件名-d 在系统守护进程的方式批量运行服务容器# 常用写法
# docker-compose up # 以占据终端的方式批量启动docker-compose.yml中配置的所有容器
# docker-compose up -d # 以系统守护进程的方式批量启动docker-compose.yml中配置的所有容器不会占据终端
# docker-compose -f docker-compose.yaml up -ddocker-compose down 停止运行并删除docker-compose.yml配置的容器、网络、卷。相当于 docker stop 与 docker rm的组合
docker-compose down [options]选项包括-f 指定compose模板文件名# 常用写法
# docker-compose down
# docker-compose -f docker-compose.yml downdocker-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 stopdocker-compose start 启动运行docker-compose.yml配置的容器可以通过docker-compose stop 关闭运行。
docker-compose start [SERVICE...]
选项包括-f 指定compose模板文件名# 常用写法
# docker-compose start
# docker-compose -f docker-compose.yml startdocker-compose ps 列出当前工程项目中的所有服务容器
docker-compose ps [options] [SERVICE...]docker-compose bulid
docker-compose build [options] [--build-arg keyval...] [SERVICE...]
构建重新构建项目中的服务容器。
选项包括
–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg keyval为服务设置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 KEYVAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com
在指定容器上执行一个ping命令。docker-compose scale
docker-compose scale web3 db2
设置指定服务运行的容器个数。通过servicenum的参数来设置数量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 SIGINTdocker-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。
–indexindex当一个服务拥有多个容器时可通过该参数登陆到该服务下的任何服务例如docker-compose exec –index1 web /bin/bash web服务中包含多个容器docker-compose port
docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口。
选项包括
–protocolproto指定端口协议TCP默认值或者UDP
–indexindex如果同意服务存在多个容器指定命令对象容器的序号默认为1docker-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.ymldocker-compose.yml代码
version: 3
services:ubuntu1:image: ubuntu:20.04container_name: ubuntu1networks:- devubuntu2:image: ubuntu:20.04container_name: ubuntu2networks:- dev- proubuntu3:image: ubuntu:20.04container_name: ubuntu3networks:- pronetworks:dev:driver: bridgepro:driver: bridgedocker-compose.yml注释版本代码
# 目前我们使用的基本都是Version3版本最新版本是3.9。
version: 3# 声明接下来开始配置服务容器
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.0image: ubuntu:20.04# container_name 指定当前服务容器启动以后的容器名container_name: ubuntu1# networks 指定网络可以分配容器在一个或多个网络如果不指定则默认分配在docker的default网络中networks:- devubuntu2:image: ubuntu:20.04container_name: ubuntu2networks:- dev- proubuntu3:image: ubuntu:20.04container_name: ubuntu3networks:- pro
# 网络配置
networks:# 指定网络名称相当于网卡名dev:# driver 网卡驱动bridge 桥接模式网卡驱动有三种模式bridge、host、none# 查看网络docker network lsdriver: bridgepro:driver: bridge完成上面的配置以后可以通过以下命令批量创建ubuntu容器。
# 切换目录
cd /home/compose
# 批量启动容器
docker-compose up
# 查看当前目录下的docker-compose.yml配置的容器
docker-compose ps
# 删除docker-compose.yml配置的容器
docker-compose downdocker-compose up -d
docker-compose ps
docker-compose down配置项说明 image image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在Compose将会尝试拉取镜像。
注意如果镜像有版本号则镜像名和版本号之间不能出现空格否则报错
services:ubuntu1:image: ubuntu:20.04build 服务除了可以基于指定的基础镜像还可以基于一份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: ../dockerdockerfile: Dockerfilebuild都是一个目录如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。
如果同时指定image和build两个标签那么Compose会构建镜像并且把镜像命名为image值指定的名字。
services:web:image: djdemo:1.0.0build:context: /home/dockerdockerfile: 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: apprestart 指定容器是否在操作系统重启以后docker启动以后是否容器也自动重启。相当于 docker --restartalways
restart: alwaysenvironment 指定服务容器中的环境变量可以多个环境变量每个环境变量就一个成员相当于 docker -e
version: 3
services:mysql:image: mysql:8.0.32restart: alwayscontainer_name: mysqlnetworks:- mysqlenvironment:- MYSQL_ROOT_PASSWORDroot123456- MYSQL_USERfs- MYSQL_PASSWORDroot123456- MYSQL_DATABASEfs- TZAsia/Shanghaidepends_on 在使用Compose时最大的好处就是少打启动命令但一般项目中多个容器的启动顺序是有要求的如果直接从上到下启动容器必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后顺序的问题
version: 3
services:django:build: .depends_on:- mysql- redisredis:image: redis:7mysql:image: mysql:8.0.32上述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: mydrivervolumes_from 从另一个服务或容器挂载其数据卷
volumes_from:- service_name - container_namedns 自定义DNS服务器。可以是一个值也可以是一个列表。
dns8.8.8.8
dns- 8.8.8.8 - 9.9.9.9
expose
暴露端口但不映射到宿主机只允许能被连接的服务访问。仅可以指定内部端口为参数如下所示expose:- 3000- 8000links 链接到其它服务中的容器。使用服务名称同时作为别名或者“服务名称:服务别名”如 SERVICE:ALIAS例如
links:- db- db:database- redisnet 设置网络模式。
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
services:web1:image: nginx:1.23.3container_name: web1ports:- 8081:80networks:- devweb2:image: nginx:1.23.3container_name: web2ports:- 8082:80networks:- dev- proweb3:image: nginx:1.23.3container_name: web3ports:- 8083:80networks:- pronetworks:dev:driver: bridgepro:driver: bridge启动服务容器# 使用docker-compose批量启动容器
# docker-compose up # 阻塞运行
#docker-compose up -d # 后台运行服务访问# 开放安全组端口以后可以通过浏览器访问web1web2web3。
http://ip:8081/
http://ip:8082/
http://ip:8083/注意IP要换成自己的同时注意在服务器上添加安全组的入方向规则的端口。