当前位置: 首页 > news >正文

Docker的简单使用(不全)

Docker Hello World

Docker 允许在容器内运行应用程序,使用docker run命令来在容器内运行一个应用程序

输出Hello World

 runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world

docker:Docker的二进制执行文件

run:与前边的docker组合来运行一个容器

ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

/bin/echo "Hello world": 在启动的容器里执行的命令

运行交互式容器

可以通过docker的两个参数-i,-t,让docker运行的容器实现"对话"的能力

 runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bashroot@0123ce188bd8:/#
  • -t:在新容器内指定一个伪终端或终端

  • -i:允许对容器内的标准输入进行交互

启动容器(后台模式)

以进程方式运行的容器

  C:\Users\liuch> docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"cf4a5520318cc5dd7a8b54cb3a4186c3fb166c317622958060c05cb69e9388d8 #容器ID
docker ps

确认容器状态

  • 容器 ID:容器的唯一标识符。

  • 镜像名称:容器基于的镜像。

  • 启动命令:容器启动时执行的命令。

  • 创建时间:容器的创建时间。

  • 状态:容器的运行状态(如 Up 2 hours 表示已运行 2 小时)。

  • 端口映射:容器端口与宿主机端口的绑定关系。

  • 容器名称:容器的自定义名称(若未指定,Docker 会随机生成)。

docker logs [容器ID/名称]

查看容器内的标准输出

停止容器

docker stop [容器ID/名称]

Docker 容器使用

容器使用

获取镜像

 docker pull ubuntu

启动容器

 docker run -it ubuntu /bin/bash
  • /bin/bash:放在镜像后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash

退出终端:exit

启动已停止的容器

查看所有的容器命令如下:

 $ docker ps -a

使用docker start启动一个已停止的容器:

 docker start <容器 ID>
后台运行

在大部分的场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的运行模式。

 docker run -itd --name ubuntu-test ubuntu /bin/bash

-d:以分离模式(Detached Mode)运行容器。

停止一个容器
 docker stop <容器ID>

停止的容器可以通过docker restart重启

 docker restart <容器ID>
进入容器

在使用-d参数时启动容器时,容器会运行在后台,这时如果要进入容器,可以通过以下命令进入:

  • docker attach <容器ID>:允许你与容器的标准输入(stdin)、输出(stdout)和标准错误(stderr)进行交互,如果从这个容器退出(exit),会导致容器的停止

  • docker exec :推荐大家使用docker exec命令,因为此命令会退出容器终端,但不会导致容器的停止

exec
 docker exec -it <容器ID> /bin/bash

注意:如果从这个容器退出,容器不会停止,推荐使用这个

docker exec --help查看命令帮助

导出和导入容器

导出容器

 docker export <容器ID> > ubuntu.tar

导入容器

 # 这个在本机windows11下不知道为什么运行不起来cat ubuntu.tar | docker import - test/ubuntu:v1​docker import http://example.com/exampleimage.tgz example/imagerepo​docker import xxx.tar base_mes:1.1# 其中xxx.tar为目标文件,base_mes:1.1是目标镜像名:tag

- 的含义

  • - 是 Unix/Linux 命令行中的通用占位符,通常表示:

    • 标准输入(stdin):当作为输入参数时(如 docker import -)。

    • 标准输出(stdout):当作为输出参数时(如 tar -cvf - files/ > backup.tar)。

  • 在此命令中,- 明确告诉 Docker 从管道接收数据(即 cat ubuntu.tar 的输出内容)。

删除容器

删除容器使用docker rm命令:

docker rm -f <容器ID>

清除所有处于终止状态的容器:

 docker container prune

Docker镜像使用

  1. 管理和使用本地Docker主机镜像

  2. 创建镜像

列出镜像
 docker images

各个选项说明:

  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

同一镜像源有多个TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用REPOSITORY:TAG来定义不同的镜像

如果不指定一个镜像的版本标签,例如只使用ubuntu,docker将默认使用ubuntu:lastest镜像

获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时Docker就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用docker pull命令来下载它

 docker pull ubuntu:13.10
查找镜像
 docker search <镜像>

NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否docker官方发布

stars:类似Github里边的star

AUTOMATED:自动构建

拖取镜像
 docker pull <镜像>
删除镜像
 docker rmi hello-world
创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求是,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像

  2. 使用Dockerfile指令来创建一个新的镜像

更新镜像

eg:比如更新ubuntu系统

 apt-get updateapt-get upgrade -y

提交副本

 docker commit -m="has update" -a='dabidai' <容器ID> 指定要创建的目标容器名
  • -m:提交的描述信息

  • -a:指定镜像作者

构建镜像

使用命令docker build,从零开始来创建一个新的镜像。为此,需要创建一个Dockerfile文件,其中包含一组指令来告诉Docker如何构建我们的镜像

 FROM    centos:7 #使用6.7会报错LABEL maintainer="Liuch <liuch@sudops.com>"​RUN     /bin/echo 'root:123456' | chpasswdRUN     useradd dabidaiRUN     /bin/echo 'dabidai:123456' | chpasswdRUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/localEXPOSE  22EXPOSE  80CMD     /usr/sbin/sshd -D​

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的

FROM:指定使用哪个镜像源

RUN:高速docker在镜像内执行命令

使用docker build命令来构建一个镜像

  docker build -t dabidai/centos:7 "D:\dockerLearn\"
  • -t:指定要创建的目标镜像名

  • "D:\dockerLearn\":Dockerfile文件所在目录,可以指定Dockerfile的绝对路径

注意:最后一个指定Dockerfile的位置时,使用的是Dockerfile所在的路径,不包括Dockerfile这个文件

设置镜像标签
 docker tag <容器ID> <镜像源名>:<标签名>

eg:

 docker tag 97d7b96cc00a dabidai/centos:dev

Docker容器连接

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P-p参数来指定端口映射

网络端口映射

使用deepseek生成一个简易FlaskApp

 docker run -d -P app python app.pydocker run -d -p 5000:5000 app python app.py
  • -P(大写):是容器内部端口随机映射到主机的端口,可使用docker ps查看绑定端口

  • -p(小写):是容器内部端口绑定到指定的主机端口

可以指定容器绑定的网络地址,比如绑定127.0.0.1

 docker run -d -p 127.0.0.1:5001:5000 app python app.py

上述绑定的都是TCP端口,如果要绑定UDP端口,可在端口后加上/udp

 docker run -d -p 127.0.0.1:5000:5000/udp app python app.py

docker port命令可以让我们快捷查看端口的绑定情况

 docker port <容器ID/names> 5000
Docker容器互联

端口映射并不是唯一把docker连接到另一个容器的方法。

docker有一个连接系统允许将多个容器连接在一起,共享连接信息

docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:

 docker run -d -P --name rename_app app python app.py
新建网络

创建一个新的Docker网络

 docker network create -d bridge test-net

参数:

-d:参数指定Docker网络类型,有bridge、overlay

连接容器

运行一个容器并连接到新建的test-net网络:

 docker run -itd --name test1 --network test-net ubuntu /bin/bash

同理,再运行一个容器并加入到test-net网络:

 docker run -itd --name test2 --network test-net ubuntu /bin/bash

如果多个容器之间需要互相连接,推荐使用Docker Compose,后边会介绍

配置DNS

我们可以在宿主机的/etc/docker/daemon.json文件中增加以下内容来设置全部的容器的DNS:

 {"dns" : ["114.114.114.114","8.8.8.8"]}

设置后,启动容器的DNS会自动配置为114.114.114.114和8.8.8.8

配置完,需要重启docker才能生效。

查看容器的DNS是否生效可以使用以下命令,它会输出容器的DNS信息:

 $ docker run -it --rm  ubuntu  cat etc/resolv.conf
手动指定容器的配置

如果只想在指定的容器设置DNS,则可以使用以下命令:

 $ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

--rm:容器退出时自动清理容器内部的文件系统

-h HOSTNAME 或者 --hostname=HOSTNAME:设定容器的主机名,它会被写入到容器内的/etc/hostname和/etc/hosts

--dns=IP_ADDRESS:添加DNS服务器到容器的/etc/resolv.conf中,让容器用这个服务器来解析所有不再/etc/hosts中的主机名

--dns-search=DOMAIN:设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com

Docker仓库管理

仓库是集中存放镜像的地方。

Docker Hub

目前Docker官方维护了一个公共仓库Docker Hub

大部分需求都可以通过在Docker Hub中直接下载镜像来实现

注册

在DockerHub官网免费注册一个 Docker 账号。

登录

登录和退出需要输入用户名和密码,登陆成功后,我们就可以从docker hub上拉去自己账号下的全部镜像。

 docker login
退出
 docker logout
拉取镜像

可以通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令来将它下载到本地。

 docker search ubuntu

使用docker pull将官方ubuntu镜像下载到本地

 docker pull ubuntu
推送镜像

用户登录后,可以通过docker push命令将自己的镜像推送到Docker Hub。

 docker tag ubuntu:18.04 username/ubuntu:18.04docker push username/ubuntu:18.04

查看

 docker search username/ubuntu

Dockerfile

什么是Dockerfile?

Dockerfile是一个文本文件,包含了构建Docker镜像的所有指令。

Dockerfile是一个用来构建镜像的文本文件,文件内容包含了一条条构建镜像所需的指令和说明。

通过定义一系列命令和参数,Dockerfile指导Docker构建一个自定义的镜像。

使用Dockerfile定制镜像
定制一个nginx镜像

(构建好的镜像内会有一个(/user/share/nginx/html/index.html)

  • 在一个空目录下,新建一个名为Dockerfile文件,并在文件内添加以下内容:

  •  FROM nginxRUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

FROMRUN指令作用

FROM:定制的镜像都是基于FROM的镜像,这里的nginx就是定制需要的基础镜像。后续的操作都是基于nginx。

RUN:用于执行后面跟着的命令行命令。有两种格式:

shell格式:

 RUN <命令行命令># <命令行命令>等同于在终端操作的shell命令。

exec格式:

 RUN ["可执行文件", "参数1", "参数2"]# 例如:# RUN ["./test.php", "dev", "offline"]等价于RUN ./test.php dev offline

注意:Dockerfile的指令每执行一次都会在docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

 FROM centosRUN yum -y install wgetRUN wget -O redis.tar.gz "http://download.redis.io/release/redis-5.0.3.tar.gz"RUN tar -xvf redis.tar.gz

以上执行会创建3层镜像。可简化为以下格式:

 FROM centosRUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/release/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz

如上,以&&符号连接命令,这样执行后,只会创建一层镜像。

开始构建镜像

在Dockerfile文件的存放目录下,执行构建动作。

以下示例,通过目录下的Dockerfile构建一个nginx:v3(镜像名称:镜像标签)。

 docker build -t nginx:v3 .

最后的.代表本次执行的上下文路径

上下文路径,是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build命令得知这个路径后,会将路径下的所有内容打包。

解析:由于docker的运行模式是C/S。我们本机是C,docker引擎是S。实际的构建过程是在docker引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机指定目录下的文件一起打包提供给docker引擎使用。如果未说明最后一个参数,那么默认上下文路径就是Dockerfile所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给docker引擎,如果文件过多会造成过程缓慢。

指令详解
Dockerfile 指令说明
FROM指定基础镜像,用于后续的指令构建。
MAINTAINER指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL添加镜像的元数据,使用键值对的形式。
RUN在构建过程中在镜像中执行命令。
CMD指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT设置容器创建时的主要命令。(不可被覆盖)
EXPOSE声明容器运行时监听的特定网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL复制到镜像中。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:

 COPY [--chown=<user>:<group>] <源路径1>... <目标路径>COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足Go的filepath.Match规则。例如:

 COPY hom* /mydir/COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD指令和COPY的使用类似(同样需求,推荐使用COPY)。功能也类似,不同之处如下:

  • 优点:在执行<源文件>为tar压缩文件的话,压缩格式为gzip,bzip2以及xz的情况下,会自动复制并解压到<目标路径>

  • 缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得缓慢。可根据是否需要自动解压来决定是否使用

CMD

类似于RUN指令,用于运行程序,但二者运行的时间点不同:

  • CMD在docker run时运行

  • RUN是在docker build

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD指令指定的程序可被docker run命令行参数中指定要运行的程序所覆盖。

注意:如果Dockerfile中存在多个CMD,仅最后一个生效。

格式:

 # Shell格式CMD <shell命令># exec格式CMD ["<可执行文件或命令>", "<param1>", "<param2>", ...]​CMD ["<param1>", "<param2>", ...] #该写法是为ENTRYPOINT指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转化成第二种格式运行,并且默认可执行文件是sh。

ENTRYPOINT

类似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。

但是,如果运行docker run时使用了--entrypoint选项,将覆盖ENTRYPOINT指令指定的程序。

优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数

注意:如果Dockerfile中如果存在多个ENTRYPOINT指令,进最后一个生效

格式:

 ENTRYPOINT ["<execute>", "<param1>", "<param2>", ..]

可以搭配CMD命令使用:一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参

eg:

假设已通过Dockerfile构建了nginx:test镜像:

 FROM nginxENTRYPOINT ["nginx", "-c"] # 定参CMD ["/etc/nginx/nginx.conf"] # 变参

不传参执行

 docker run nignx:test

容器内会默认运行以下命令,启动主进程。

 nginx -c /etc/nginx/nginx.conf

传参运行

 docker run nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

 nginx -c /etc/nignx/new.conf
ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

 ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>...

下示例设置NODE_VERSION=7.2.0,在后续的指令中可以通过$NODE_VERSION引用:

 ENV NODE_VERSION 7.2.0​RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG

构建参数,与ENV作用一致。不过作用域不一样。ARG设置的环境变量仅对Dockerfile内有效,也就是说只有docker build的过程有效,构建好的镜像内不存在此环境变量

构建命令docker build中可以用--build-arg <参数名>=<值>来覆盖。

 ARG <参数名>[=<默认值>]
VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。

  • 避免容器不断变大

格式:

 VOLUMN ["<路径1>", "<路径2>"...]VOLUMN <路径>

在启动容器docker run的时候,我们可以通过-v参数修改挂载点。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

  • 在运行时使用随机端口映射时,也就是docker run -P时,会自动随机映射EXPOSE的端口。

格式:

 EXPOSE <端口1> [<端口2>...]
WORKDIR

指定工作目录。用WORKDIR指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR会帮你建立目录。

docker build构建镜像过程中的每一个RUN命令都是新建的一层。只有通过WORKDIR创建的目录才会一直存在。

格式:

 WORKDIR <工作目录>
USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:

 USER <用户名>[:<用户组>]
HEALTHCHECK

用于指定某个程序或者指令来监控docker容器服务的运行状态。

格式:

 HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

CMD 后的命令会在容器内执行,返回值决定健康状态:

  • 0(成功):容器标记为 healthy

  • 1(失败):容器标记为 unhealthy

选项描述默认值
--interval检查间隔时间(支持 smh 单位)30s
--timeout单次检查超时时间,超时视为失败30s
--start-period容器启动后的初始化时间,此期间内的失败不计入重试次数(Docker 17.05+)0s
--retries连续失败指定次数后标记为不健康3
 HEALTHCHECK --interval=1m --timeout=10s --start-period=30s --retries=3 \CMD curl -f http://localhost/health || exit 1
  • 每1分钟检查一次,超时10秒。

  • 容器启动后等待30秒开始检查。

  • 连续3次失败则标记为不健康。

  • 使用 curl 检测 /health 端点,失败返回1。

ONBUILD

用于延迟构建命令的执行。简单地说,就是Dockerfile里用ONBUILD指定的命令,在本次构建镜像的过程中不会执行(假设镜像为test-build)。当有新的Dockerfile使用了之前构建的镜像FROM test-build,这时执行新镜像的Dockerfile构建的时候,会执行test-build的Dockerfile里的ONBUILD指定的命令。

格式:

 ONBUILD <其它指令>
LABEL

LABEL指令用来给镜像添加一些原数组(metadata),以键值对的形式,语法如下:

 LABEL <key>=<value> <key>=<value> ...

eg:

 LABEL org.opencontainers.image.authors="runoob"

Docker Compose

Compose简介

Compose适用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件中创建并启动所有服务。

Compose使用步骤:

  • 使用Dockerfile定义应用程序的环境

  • 使用docker-compose.yml定义构成应用程序的服务,这样它们可以在隔离环境中一起运行

  • 最后,执行docker-compose up命令来启动并运行整个应用程序

使用
准备

创建一个测试目录

在测试目录中创建一个名为app.py的文件

 import time​import redisfrom flask import Flask​app = Flask(__name__)cache = redis.Redis(host='redis', port=6379)​​def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)​​@app.route('/')def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

在此实例中,redis是应用程序网络上的redis容器的主机名,该主机使用的端口为6379。

创建另一个名为requirements.txt文件,内容如下:

 flaskredis
创建Dockerfile文件

内容如下:

 FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]

FROM python:3.7-alpine:从Python 3.7映像开始构建镜像。

WORKDIR /code:将工作目录设置为/code

 ENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0

设置flask命令使用的环境变量

RUN apk add --no-cache gcc musl-dev linux-headers:安装gcc,以便诸如MarkupSafe和SQLAlchemy之类的Python包可以编译加速

 COPY requirements.txt requirements.txtRUN pip install -r requirements.txt

复制requirements.txt并安装Python依赖项

COPY . .:将.项目中的当前目录复制到.镜像中的工作目录。

CMD ["flask", "run"]:容器提供默认的执行命令为:flask run。

创建docker-compose.yml

在测试目录中创建一个名为docker-compose.yml的文件,然后粘贴以下内容:

 # yaml 配置version: '3'services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

该Compose文件定义了两个服务:web和redis。

web:该web服务使用从Dockerfile当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口5000。此示例服务使用Flask Web服务器的默认端口5000。

redis:该redis服务使用Docker Hub的公共Redis映像。

使用Compose命令构建和运行应用

在测试目录中,执行以下命令来启动应用程序:

 docker-compose up

如果你想在后台执行该服务可以加上-d参数

 docker-compose up -d
yaml配置指令参考
version

指定本yml依赖于compose哪个版本

例如weba服务,指定为从上下文路径./dir/Dockerfile所构建的镜像:

 version: "3.7"services:webapp:build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的Dockerfile和args:

 version: "3.7"services:webapp:build:context: ./dirdockerfile: Dockerfile-alternateargs:buildno: 1labels:- "com.example.description=Accounting webapp"- "com.example.department=Finance"- "com.example.label-with-empty-value"target: prod

context:上下文路径

dockerfile:指定构建镜像的Dockerfile文件名

args:添加构建参数,这是只能在构建过程中访问的环境变量。

labels:设置构建镜像的标签。

target:多层构建,可以指定构建哪一层

cap_add, cap_drop

添加或删除容器拥有的宿主机的内核功能。

 cap_add:- ALL # 开启全部权限cap_drop:- SYS_PTRACE #关闭ptrace权限
cgroup_parent

为容器指定父cgroup组,意味着将继承该组的资源限制。

 cgroup_parent: m-executor-abcd
command

覆盖容器启动的默认命令。

 command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
 container_name: my-web-container
depends_on

设置依赖关系

docker-compose up:以依赖性顺序启动服务。在以下实例中,先启动db和redis,才会启动web。

docker-compose up SERVICE:自动包含SERVICE的依赖项。在以下实例中,docker-compose up web还将创建并启动db和redis。

docker-compose stop:按依赖关系顺序停止服务。在以下实例中,web在db和redis之前停止

 version: "3.7"services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres

注意:web服务不会等待redis db完全启动后才启动。

由于笔者还未完全熟练使用dockerfile,故只简单列举几个

文章参考:菜鸟编程

相关文章:

  • python数据分析(六):Pandas 多数据操作全面指南
  • 深度学习中的混合精度是什么?
  • 【动态导通电阻】GaN功率器件中动态导通电阻退化的机制、表征及建模方法
  • Java中的接口和抽象类
  • 模拟集成电路设计与仿真 : Feedback System
  • Sping中获取bean的方式总结-笔记
  • JR6001语音模块详解(STM32)
  • 【安全扫描器原理】ICMP扫描
  • 前端安全中的XSS(跨站脚本攻击)
  • 服务器和数据库哪一个更重要
  • 不同类型插槽的声明方法和对应的调用方式
  • k8s集群环境部署业务系统
  • 服务器主动发送响应?聊天模块如何实现?
  • 深入理解Spring AI框架的核心概念
  • 首款 AI 固定资产管理系统,引领管理新变革
  • Python return 语句
  • mangodb的数据库与集合命令,文档命令
  • UVA1537 Picnic Planning
  • java 解析入参里的cron表达式,修改周时间
  • 链表的中间节点
  • 探索演艺产业新路径,2万观众走进音乐科技融创节
  • 买新房可申领学位,广州南沙出台购房入学政策
  • 历史新高!上海机场一季度营收增至31.72亿元,净利润增34%
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 玉渊谭天丨中方减少美国农产品进口后,舟山港陆续出现巴西大豆船
  • 教育强国建设基础教育综合改革试点来了!改什么?怎么改?