Dockerfile和Docker-compose

Docker容器-从最基础到Dockerfile、Docker-compose,有这一篇足够了!!! Docker从0-1,从小白-熟练使用容器的高手 阅读详情
AI摘要

本文介绍了Dockerfile和Docker Compose两个工具。Dockerfile用于定义Docker镜像构建规则,适用于单容器应用;Docker Compose用于定义和运行多个容器,适用于多容器应用。文中还详细讲解了Dockerfile基础命令、封装Django镜像方法,以及Docker Compose的安装、常用命令和模板配置。

一、概述

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,可以创建一个自定义的 PHP+Nginx 镜像,例如:
在这里插入图片描述
该 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 可以创建一个自定义的 PHP+Nginx 镜像,而使用 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=“xxx@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常量,这个MYSQLVERSION类似于全局常量RUNyuminstall−ymysql−server="{MYSQL_VERSION}类似于全局常量 RUN yum install -y mysql-server="MYSQLV​ERSION类似于全局常量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.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的源码包

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.04

LABEL version="3.2.18"
LABEL maintainer="562172420@qq.com"

ADD Django-3.2.18.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.18 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="3.2.18"
LABEL maintainer="562172420@qq.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:8000

Docker构建镜像

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 --name=django1 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 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 start
# docker-compose -f docker-compose.yml start

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"
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"
    
# 声明接下来开始配置服务容器
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'
services:
  mysql:
    image: mysql:8.0.32
    restart: always
    container_name: mysql
    networks:
      - mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=root123456"
      - "MYSQL_USER=fs"
      - "MYSQL_PASSWORD=root123456"
      - "MYSQL_DATABASE=fs"
      - "TZ=Asia/Shanghai"

depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目中多个容器的启动,顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后顺序的问题

version: '3'
services:
  django:
    build: .
    depends_on:
      - mysql
      - redis
  redis:
    image: redis:7
  mysql:
    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: 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"
services:
  web1:
    image: nginx:1.23.3
    container_name: "web1"
    ports:
      - "8081:80"
    networks:
      - dev

  web2:
    image: nginx:1.23.3
    container_name: "web2"
    ports:
      - "8082:80"
    networks:
      - dev
      - pro

  web3:
    image: nginx:1.23.3
    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://ip:8081/
http://ip:8082/
http://ip:8083/

注意IP要换成自己的,同时,注意在服务器上添加安全组的入方向规则的端口。

【Docker】- Dockerfile和Docker Compose 基础配置 Dockerfile + Docker compose 就可以实现,方便、优雅,我们先了解两个配置的基础配置。是 Docker 构建镜像的脚本文件,它包含了一系列指令,用于定义容器的环境、安装依赖、复制文件、配置启动命令等。Docker Compose 是 Docker 官方提供的一个工具,可以使用 YAML 文件(用于指定持久化数据的目录,避免数据因容器删除而丢失。如果你的服务需要从源码构建镜像,可以使用。设置容器内运行进程的用户,避免使用。,并不会真正开放端口,容器仍需。设定容器终止时的信号,默认。 阅读详情

相关推荐

中兴交换机配置SSH登录

SSH是在传统的Telnet协议基础上发展起来的一种安全的远程登录协议。发送和接收数据时, SSH会自动对数据进行加密及解密。相比于Telnet,SSH能防止“中间人”攻击、DNS欺骗、IP 欺骗等,无论是在认证方式或者数据传输的安全性上都有很大的提高。SSH用户认证方式有3种,分别为本地(Local)认证、RADIUS认证和TACACS+认证。以表规划数据为例,说明配置SSH登录的步骤。

才怪的博客 7921

Dockerfile和docker-compose详解

Dockerfile是一个用来构建镜像的文本文件, 文本内容包含了一条条构建镜像所需的指令和说明。例如我们要在含python3的centos镜像基础上安装vim,可以这么写。这里的FROM表示从哪个镜像开始构建,可以是本地已有的镜像,也可以是dockerhub或者私域的镜像。用于构建和启动多容器工具, 通过docker-compose.yml来配置项目需要的所有服务, 然后docker-compose up启动所有服务。

LKIDTI数据的博客 4265

资源描述框架RDF及Turtle

文章目录1. RDF1.1 简介1.2 格式1.3 RDF的要求2. Turtle2.1 语法2.1.1 简单三元组2.1.2 Turtle中的命名空间2.1.3 Base URI2.1.4 谓语列表2.1.5 宾语列表2.1.6 空白节点(bNodes)2.1.7 数据类型2.1.8 Class membership2.1.9 空URI2.1.10 集合 1. RDF 1.1 简介 RDF(Resource Description Framework)语义网的标准数据模型,是一个用于描述 Web 上的资

doublewhite233的博客 2491

docker-compose配合Dockerfile使用

也就是在dockers-compose.yml文件中添加build指定一下我的Dockerfile文件的路径例如我的dockers-compose.yml文件在docker-compose文件夹下,而docker-compose文件夹与Dockerfile和项目的war包在同一级目录,也就是Dockerfile文件,在dockers-compose.yml文件的上一级那么就指定和以上../就是上一级目录的意思,Dockerfile就是Dockerfile文件的名称。

哈哈 7943

腾讯会议录屏损坏修复:使用 recover_mp4 工具的完整解决方案

腾讯会议录屏损坏修复指南 当腾讯会议录屏因电脑蓝屏等意外导致MP4文件损坏时,可使用recover_mp4工具结合FFMPEG进行修复。操作步骤包括:1)准备相同参数正常视频作为参考;2)分析正常视频生成结构文件;3)分离损坏视频的音视频流;4)使用FFMPEG重新封装。该方法能有效修复因意外中断导致的视频索引损坏问题。修复前需将工具和文件放在同一目录下,并确保参考视频与损坏录屏的参数完全一致。

m0_62498496的博客 2624

平衡电桥在高压绝缘检测中的动态切换策略与误差优化

本文深入探讨了平衡电桥在高压绝缘检测中的动态切换策略与误差优化方法。通过分析四种基本切换模式及智能切换时序设计,显著提升检测精度与范围。结合电阻选型黄金法则和软件补偿技术,有效降低测量误差,为电动汽车电池管理系统提供可靠的安全保障。

weixin_30275415的博客 471

docker-compose,dockerfile部署项目。

安装docker,docker-compose //安装docker curl -sSL https://get.daocloud.io/docker | sh //安装docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose // ..

qq_49059667的博客 4674

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

dockerfile 和 docker compose

Dockerfile 是一个文本文件,包含了一系列指令,用于自动化创建 Docker 镜像。

pymzy666skr的博客 2160

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1891

华南理工大学-大学物理实验-绪论作业

3.用公式测量某圆柱体铝的密度,测得直径=2.0420.003(cm),高=4.1260.004(cm),质量=36.4880.006(g)。计算铝的密度和测量的标准差,并以测量结果表达式表示之。(要求判别和剔除异常数据)(30分)(了解图解法的注意事项,大学物理实验众多实验数据处理采用这种方法,如PN结温度特性研究,光电效应与普朗克常数的测定,霍尔效应测磁场等等,注意规范作图)实验测得温度与对应的金属丝的长度的数据如下表所示。(了解异常数据的判断方法及具体判断过程,30分的题目n(*≧▽≦*)n)

mohen_777的博客 580

Dockerfile和Docker Compose的关系是什么?

Dockerfile和是互补的工具,前者负责定义单个容器镜像的构建过程,后者则用来管理和启动多个容器。通过理解和合理使用这两者,我们可以更高效地构建、测试和部署复杂的应用程序。

长风破浪会有时的博客 1272

[工作流节点10] 获取多条数据并循环执行 —— 明道云批处理自动化实战

本文系统介绍了明道云工作流中"获取多条数据+循环执行"的批处理功能。该功能通过筛选数据集合并逐条处理,适用于批量通知、数据更新等场景。文章详细解析了功能配置方法,包括数据筛选、循环设置和异常处理,并提供了合同到期提醒等典型应用案例。同时强调了数据量控制、分批处理、错误处理等优化策略,帮助用户实现高效批量自动化。这一功能组合能将业务从单条处理升级为批量驱动,显著提升工作效率。

每日出拳老爷子的博客 453

关于docker-compose 和Dockerfile的认识

关于docker-compose 和Dockerfile的认识 docker-compose 主要是用来编排容器的,Dockerfile主要是用来构建镜像。 Dockerfile简介 scratch是所有镜像的基础,是base镜像。 每条保留字指令必须为大写且必须有参数 指令按顺序执行 每条指令都会创建一个行的镜像层,并且提交。 Dockerfile使用说明 WORKDIR 用于指定后续命令执行的目录,非常类似cd WORKDIR /usr/local/ FROM 用于指定从哪个镜像引入,必须是第

weixin_38052017的博客 2659

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Dockerfile 和 docker-compose.yml

Dockerfile和FROMRUNCOPY/ADDEXPOSEservicesbuildportsvolumesdepends_onfill:#333;color:#333;color:#333;fill:none;构建启动Dockerfile自定义镜像公共镜像多容器应用。

刘皇叔说Java的博客 1488

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Dockerfile和docker-compose

Dockerfile是用来自动化创建Docker镜像的脚本文件,通过编写Dockerfile文件,可以自动化构建过程,减少手动操作,确保环境一致性,在Dockerfile中常见的命令有:FROM(指定基础镜像)、RUN(执行命令)、COPY/ADD(拷贝文件)、WORKDIR(设置工作目录)、CMD/ENTRYPOINT(指定容器启动时的命令)、EXPOSE(指定暴露的端口)、ENV(设置环境变量)。配置好dockerfile脚本后,就可以通过一下命令构建镜像并启动容器。

qq_40121308的博客 433

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Docker-compose——Dockerfile和Docker-compose.yml

前言 本章内容主要涉及内容: 在使用Docker-compose时用到的Dockerfile和Docker-compose.yml这两文件应该如何编写。 我在自己学习摸索的时候搜索过很多相关Dockerfile和Docker-compose.yml这两个文件编写的文章,基本上都都是没有比较详细的作用解释的,走了很多弯路,系统这篇文章可以帮助到有需要的人。 本章内容不是专业性的学术研究,而是近期自己使用学习Docker得到的经验分享。 有误的地方可以在评论告知,好让我进行更正。 Docker-comp

什么都会一点。 1196

docker-compose 和 Dockerfile 配合使用

1.编译 jar 包 2.Dockerfile: 构建docker镜像配置 FROM: 基础镜像,通过jdk8镜像开始 MAINTAINER: 维护者 ADD: 复制jar包到镜像内,名字为app.jar EXPOSE: 声明端口 ENTRYPOINT: docker启动时,运行的命令.这里就是容器运行就启动jar服务 使用 Dockerfile 直接构建 [root@VM-12-3-centos alibaba-cloud-admin]# docker build -t alibaba-cloud-a

weixin_47032745的博客 6689

深入理解 Dockerfile 和 docker-compose[实战篇]

🌱 Dockerfile和docker-compose是Docker中两个非常重要的工具。Dockerfile提供了创建Docker镜像的手段,而docker-compose则提供了一种管理和运行多个服务的有效方法。对于开发者来说理解并掌握这两个工具在实际工作中会有很大帮助。🍂

一名后端程序猿 1774

docker学习:dockerfile和docker-compose

以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。

Hot_Ant的博客 681

编写Dockerfile和docker-compose.yaml文件案例

本文使用flask基于redis构建一个web接口,教你使用Dockerfile来构建镜像和使用docker-compose来启动这一系列服务。 1. Flask服务 from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host=&quot;redis&quot;,port=6379) @app.r...

李谦的博客 1万+

Dockerfile 和docker-compose

类似于RUN指令,CMD指令也可用于运行任何命令或应用程序 RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时。不过,docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序。与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;

god_mycode的博客 838

Docker 配置文件 Dockerfile 和 docker-compose.yml

Docker 是一款流行的容器化平台,可以用于构建、部署和运行容器化应用程序。在 Docker 中,Dockerfile 和 docker-compose.yml 是常用的两种配置文件,用于构建镜像和运行容器。Dockerfile 是一种用于定义 Docker 镜像的文本文件,包含了一系列的指令和参数,用于描述如何构建 Docker 镜像。通过编写 Dockerfile,可以定义镜像中的基础操作系统、应用程序、服务、环境变量、配置文件等等。Dockerfile 是用于构建 Docker 镜像的工具。

liulanba的博客 4261

Dockerfile 和 docker-compose.yml的区别(转载)

参考:Dockerfile 和 docker-compose.yml的区别(转载) – 九霄天空-IT技术分享学习 Dockerfile 和 docker-compose.yml的区别(转载) 2020年9月7日 Docker,Others 1,370 clicked 1. 明确概念   Dockerfile是用来构建自定义镜像的,并没有直接生成容器。只是可以在运行镜像时运行容器而已。   docker-compose.yml文件可以做容器编排进行环境部署,里面可以用 Dockerfile, ..

qq_33043025的博客 1617
上一篇: 云原生概述
时代广场的蟋蟀
博客等级 码龄6年 174粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值