当前位置: 首页 > 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,故只简单列举几个

文章参考:菜鸟编程

相关文章:

Docker的简单使用(不全)

Docker Hello World Docker 允许在容器内运行应用程序&#xff0c;使用docker run命令来在容器内运行一个应用程序 输出Hello World runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world docker&#xff1a;Docker的二进制执行文件 run…...

A2A与MCP:理解它们的区别以及何时使用

随着AI不断深入到商业工作流中&#xff0c;多个AI代理&#xff08;Agent&#xff09;之间的无缝协作成为了一个主要挑战。 为了解决这个问题&#xff0c;Google Cloud推出了一种名为Agent2Agent&#xff08;A2A&#xff09;的开放协议&#xff0c;旨在使不同平台和系统中的AI代…...

AI Agent开源技术栈

构建和编排Agent的框架 如果您是从头开始构建&#xff0c;请从这里开始。这些工具可以帮助您构建Agent的逻辑——做什么、何时做以及如何处理工具。您可以将其视为将原始语言模型转化为更自主的模型的核心大脑。 2. 计算机和浏览器的使用 一旦你的Agent能够规划&#xff0c…...

判断用户选择的Excel单元格区域是否跨页?

VBA应用程序开发过程中&#xff0c;经常需要处理用户选中的单元格区域&#xff0c;有的应用场景中&#xff0c;需要限制用户选中区域位于同一页中&#xff08;以打印预览显示的分页划分&#xff09;&#xff0c;但是VBA对象模型中并没有提供相应的接口&#xff0c;用于快速查询…...

驱动开发硬核特训 · Day 24(上篇):走进Linux内核时钟子系统 —— 硬件基础全解析

一、前言 在 SoC&#xff08;System on Chip&#xff09;设计中&#xff0c;“时钟&#xff08;Clock&#xff09;”不仅是信号同步的基石&#xff0c;也是各个模块协调运作的前提。没有合理的时钟体系&#xff0c;CPU无法运行&#xff0c;外设无法通信&#xff0c;存储器无法…...

【GPU 微架构技术】Pending Request Table(PRT)技术详解

PRT&#xff08;Pending Request Table&#xff09;是 GPU 中用于管理 未完成内存请求&#xff08;outstanding memory requests&#xff09;的一种硬件结构&#xff0c;旨在高效处理大规模并行线程的内存访问需求。与传统的 MSHR&#xff08;Miss Status Handling Registers&a…...

角度(degrees)和弧度(radians)转换关系

目录 1.从角度转换到弧度&#xff1a; 2.从弧度转换到角度&#xff1a; 示例 将90度转换为弧度&#xff1a; 将π/3​弧度转换为角度&#xff1a; 角度&#xff08;degrees&#xff09;和弧度&#xff08;radians&#xff09;之间的转换关系可以通过以下公式来实现&#xff…...

【大语言模型DeepSeek+ChatGPT+GIS+Python】AI大语言模型驱动的地质灾害全流程智能防治:风险评估、易发性分析与灾后重建多技术融合应用

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下&#xff0c;地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害&#xff0c;还包括崩塌、泥石流…...

第十六届蓝桥杯 2025 C/C++组 25之和

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12339 [蓝桥杯 2025 省 B/Python B 第二场] 25 之和…...

万界星空科技QMS质量管理系统几大核心功能详解

QMS质量管理系统&#xff08;Quality Management System&#xff09;是一款专为现代企业设计的、全面且高效的质量管理工具&#xff0c;融合了现代质量管理理念与前沿的信息技术&#xff0c;旨在帮助企业构建完善的质量管理体系&#xff0c;确保产品和服务质量。以下为你详细介…...

SSR同构渲染深度解析

同构渲染&#xff08;Isomorphic Rendering&#xff09;是SSR&#xff08;服务器端渲染&#xff09;的核心概念&#xff0c;指同一套代码既能在服务器端运行&#xff0c;也能在客户端运行。下面我将从原理到实践全面介绍SSR同构渲染。 一、同构渲染核心原理 1. 基本工作流程 …...

【论文阅读/复现】RT-DETR的网络结构/训练/推理/验证/导出模型

利用ultralytics仓库&#xff0c;复现RT-DETR官方实验环境。 使用基于ResNet50和ResNet101的RT-DETR。 目录 一 RT-DETR的网络结构 1 编码器结构 2 RT-DETR 3 CCFF中的融合块 4 实验结果 二 RT-DETR的安装/训练/推理/验证/导出模型 1 安装 2 配置文件 3 训练 4 推理 …...

KUKA机器人关机时冷启动介绍

KUKA机器人在正常关机时&#xff0c;可以从示教器上操作。在示教器上操作时需要选择“冷启动”方式关闭计算机。等示教器屏幕关闭之后&#xff0c;再把主开关旋钮关闭。 一、先登录【管理员】权限&#xff0c;再在【主菜单】下选择【关机】。 二、在关机的默认中&#xff0c;…...

MCP Java SDK 介绍与使用指南

MCP与MCP Java SDK 概念 MCP 是什么&#xff1f; 模型上下文协议&#xff08;Model Context Protocol, MCP&#xff09;是用于标准化AI模型与工具间通信的规范。通过定义通用接口&#xff0c;确保不同AI组件&#xff08;如模型推理服务、工具插件&#xff09;能无缝协作。MCP …...

【Java核心】一文理解Java面向对象(超级详细!)

一&#xff1a;概述 1.1Java类及类的成员 属性、方法、构造器、代码块、内部类 1.2 面向对象的特征 封装、继承、多态&#xff08;抽象&#xff09; 1.3 其它关键字的使用 This、super、package、import、static、final、interface、abstract 1.4 面向对象和面向过程 &…...

2025年DDoS攻击防御全解析:应对超大流量的实战策略

一、2025年DDoS攻击的新趋势 超大规模攻击常态化&#xff1a;攻击流量突破300Gbps&#xff0c;部分案例甚至达到T级规模&#xff0c;传统单点防御已无法应对。 混合攻击模式盛行&#xff1a;攻击者结合应用层&#xff08;HTTP Flood、CC攻击&#xff09;与网络层&#xff08;U…...

【动态导通电阻】 GaN PiN二极管电导调制对动态 RON 的影响

2020 年,浙江大学电气工程学院的Shaowen Han等人采用实验研究的方法,对垂直 GaN-on-GaN PiN 二极管中电导调制的瞬态行为及其对动态导通电阻(RON)的影响进行了深入探究。他们基于高质量的 GaN 基板开发的垂直 GaN-on-GaN 功率器件具有高电流容量和高击穿电压等优势,而与间…...

第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;移动距离 试题C&#xff1a;可分解的正整数 试题D&#xff1a;产值调整 试题E&#xff1a;画展布置 前言&#xff1a; 我参加的是第一轮省赛&#xff0c;说实话第一次参加还是比较紧张的&#xff0c;真到考场上看啥都想打暴力&…...

MySQL 实战 45 讲 笔记 ----来源《极客时间》

01 | 基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f; 1. MySQL 可以分为 Server层 和 存储引擎层 两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等。存储引擎层支持 InnoDB、MyISAM等. (1) 连接器&#xff1a;管理连接&#xff0c;权限认证…...

海思SD3403边缘计算AI核心设备概述

1、海思SD3403边缘计算AI设备4TOPS算力&#xff08;SD3403模组&#xff09; 2、AI训练服务器 (≥60TOPS算力 INT8 算力越高AI训练速度越快&#xff09; 3、普通监控IPC摄像机&#xff08;低成本&#xff0c;批量化安装项目&#xff09; 4、AI数据标定工作终端 (≥10TOPS算力 IN…...

算法设计:回溯法的基础原理与应用

目录 一、基本概念 二、适用问题 三、基本步骤 四、算法模式 递归回溯算法模式&#xff08;求一个解&#xff09; 非递归回溯算法模式&#xff08;求一个解&#xff09; 非递归回溯算法模式&#xff08;求所有解&#xff09; 五、经典应用 1数字组合问题 2数字排列问题…...

PyTorch 深度学习实战(23):多任务强化学习(Multi-Task RL)之扩展

之前的PyTorch 深度学习实战&#xff08;23&#xff09;&#xff1a;多任务强化学习&#xff08;Multi-Task RL)总结扩展运用代码如下&#xff1a; import torch import torch.nn as nn import torch.optim as optim import numpy as np from torch.distributions import Norm…...

音视频开发---视频编码基础

一、视频编码的必要性 1. 存储与传输成本高 未经编码压缩的原始视频的数据量极大,例如:一般电影的亮度信号采样频率为13.5MHz;色度信号的频带通常为亮度信号的一半或更少,为6.75MHz或3.375MHz。以4:2:2的采样频率为例,Y信号采用13.5MHz,色度信号U和V采用6.75MHz采样,…...

深入蜂窝物联网 第四章 Cat-1 与 5G RedCap:带宽、低时延与未来趋势

1. 前言与应用场景 随着物联网对带宽与时延的需求不断增长,LTE Cat-1 和 5G RedCap(Reduced Capability)应运而生: Cat-1:在传统 LTE 网络上提供最高 10 Mbps 下行、5 Mbps 上行,兼容性佳; 5G RedCap:在 5G NSA/SA 网络中提供 1–20 Mbps,时延可降至 10 ms 级,且模组…...

FPGA 39 ,FPGA 网络通信协议栈进阶,RGMII、ARP 与 UDP 协议与模块设计( RGMII、ARP、UDP原理与模块设计 )

目录 目录​​​​​​​​​​​​​​ 一、核心原理 1.1 RGMII 接口&#xff1a;高效数据传输的物理桥梁 1.2 ARP 协议&#xff1a;IP 与 MAC 地址的动态映射引擎 1.3 UDP 协议&#xff1a;轻量级数据传输的高效选择 1.4 FPGA 实现流程 二、时序约束 2.1 时序约束理论…...

《系统分析师-第三阶段—总结(七)》

背景 采用三遍读书法进行阅读&#xff0c;此阶段是第三遍。 过程 本篇总结第13章第14章的内容 第13章 第14章 总结 系统设计分为概要设计与详细设计&#xff0c;然后重点讲解了处理流程设计&#xff0c;输入输出原型设计&#xff0c;面向对象设计、人机交互设计&#xff1…...

Lightroom 2025手机版:专业编辑,轻松上手

在摄影和图像编辑的世界里&#xff0c;Adobe Lightroom一直是一个不可或缺的工具。无论是专业摄影师还是摄影爱好者&#xff0c;都依赖它来提升照片的质量和视觉效果。今天&#xff0c;我们要介绍的 Lightroom 2025手机版&#xff0c;是Adobe公司为移动设备量身定制的照片编辑器…...

Cursor:AI时代的智能编辑器

在开发者社区掀起热潮的Cursor&#xff0c;正以破竹之势重塑编程工具格局。这款基于VS Code的AI优先编辑器&#xff0c;不仅延续了经典IDE的稳定基因&#xff0c;更通过深度集成的智能能力&#xff0c;将开发效率推向全新维度。2023年Anysphere公司获得的6000万美元A轮融资&…...

x86架构-k8s设置openebs的hostpath作为默认存储类的部署记录

文章目录 前言一、openebs是什么&#xff1f;二、准备步骤1.下载yaml文件2.准备一个新的单点k8s用于测试2.将openebs-operator.yaml中的镜像修改成使用国内加速源的 三、执行yaml1.openebs-operator.yaml2.local-hostpath-pvc.yaml和local-hostpath-pod.yaml 四、关于默认存储路…...

废品回收小程序:全链路数字化解决方案,赋能绿色未来

用户端&#xff1a;一键触达&#xff0c;便捷回收新体验 废品百科与估价指南&#xff1a;分类标准与实时价格一目了然&#xff0c;用户轻松掌握废品价值。一键预约&#xff0c;轻松回收&#xff1a;指尖轻点即可完成预约&#xff0c;上门服务省时省力。精准定位&#xff0c;导…...

Kotlin和JavaScript的对比

Kotlin和JavaScript有一些相似之处&#xff0c;但也存在显著的差异&#xff0c;下面从多个方面为你详细分析&#xff1a; 相似点 1. 语法灵活性 变量声明&#xff1a;二者在变量声明上都较为灵活。在JavaScript里&#xff0c;借助var、let和const可以声明变量。其中&#xf…...

蓝桥杯 5. 拼数

拼数 原题目链接 题目描述 给定 n 个正整数 a1, a2, …, an&#xff0c;你可以将它们任意排序。 现要将这 n 个数字连接成一排&#xff0c;即令相邻数字收尾相接&#xff0c;组成一个数。 问&#xff0c;这个数最大可以是多少。 输入格式 第一行输入一个正整数 n&#x…...

(即插即用模块-特征处理部分) 四十四、(2024 TGRS) FEM 特征增强模块

文章目录 1、Feature Enhancement Module2、代码实现 paper&#xff1a;FFCA-YOLO for Small Object Detection in Remote Sensing Images Code&#xff1a;https://github.com/yemu1138178251/FFCA-YOLO 1、Feature Enhancement Module 遥感图像中&#xff0c;小目标的特征通…...

“情况说明“以后,Unity XR 开发者如何选择?

Unity自4月7日发布了一系列“情况说明”&#xff0c;点进来的朋友应该都是看过的&#xff0c;此处不再赘述。此后引发了开发者社区的广泛关注和讨论。作为细分领域的XR开发者&#xff0c;此时也会面临着工具和版本的抉择或迷茫。笔者同样面临这些问题&#xff0c;因为要确定未来…...

c#版yolo可视化标注和一键免环境训练系统0429更新介绍

yolo免环境一键训练工具c#版yolo标注工具 ## 更新日志 - 2025.4.1&#xff1a; 1、软件上线 - 2025.4.6 1、调整界面&#xff0c;修复用户在1920*1080不能全部显示问题 2、修复 刷新当前目录 无法加载新增图片问题 3、新增 下一张图片快捷键 Enter或者ctrl↓&…...

Leetcode 3533. Concatenated Divisibility

Leetcode 3533. Concatenated Divisibility 1. 解题思路2. 代码实现 题目链接&#xff1a;3533. Concatenated Divisibility 1. 解题思路 这一题的话事实上如果我们原始的数组有序排列一下&#xff0c;然后依次考察每个元素是否可以被选用&#xff0c;此时&#xff0c;我们得…...

CosyVoice、F5-TTS、GPT-SoVITS、Fish-Speech声音模型项目深度对比:选型指南

在数字人、虚拟助手、智能客服等应用快速发展的背景下&#xff0c;文本转语音&#xff08;TTS&#xff09;和语音克隆技术已成为AI领域的核心技术之一。本文将对目前主流的四个开源语音合成项目——CosyVoice、F5-TTS、GPT-SoVITS 和 Fish-Speech进行全方位对比分析&#xff0c…...

什么是DNS缓存?怎么清理DNS缓存?

在网络世界中&#xff0c;当我们输入一个网址想要访问某个网站时&#xff0c;计算机并不能直接识别“www.example.com”这样的网址&#xff0c;而是需要将其转换为对应的IP地址才能进行通信。这个转换过程由域名系统&#xff08;DomainNameSystem&#xff0c;简称DNS&#xff0…...

基于STM32、HAL库的ATECC508A安全验证及加密芯片驱动程序设计

一、简介: ATECC508A是Microchip公司生产的一款加密认证芯片,提供以下主要特性: 基于硬件的ECDSA (Elliptic Curve Digital Signature Algorithm) 加密 支持SHA-256哈希算法 内置真随机数生成器(TRNG) 16个密钥存储槽位,可配置多种用途 支持I2C接口,最高1MHz时钟频率 超低…...

初中九年级学生体测准考证照片采集软件使用说明

随着中考体育测试的临近&#xff0c;各校陆续开始组织学生进行准考证照片、中考报名照片的采集工作。为方便学校集中采集和学生自主完成照片拍摄&#xff0c;本文将详细介绍使用"校园证件照采集平台"进行手机拍照线上采集的操作方法&#xff0c;帮助学校轻松完成体测…...

提供一些其他常见的字符串处理算法的Java示例

以下为你提供几种常见字符串处理算法的 Java 示例&#xff1a; 1. 字符串反转 反转字符串即把字符串中的字符顺序颠倒。 public class RemoveSpaces {public static String removeSpaces(String str) {return str.replaceAll("\\s", "");}public static…...

软件设计师-软考知识复习(2)

PERT图详解 PERT&#xff08;Program Evaluation and Review Technique&#xff0c;计划评审技术&#xff09;是一种用于项目管理的图形化工具&#xff0c;主要用于分析任务的时间安排、识别关键路径和优化资源分配。它特别适用于复杂项目&#xff0c;其中任务之间存在依赖关系…...

Qwen3快速部署 Qwen3-0.6B、Qwen3-8B、Qwen3-14B,Think Deeper

文章目录 0 Qwen31 平台与环境安装1 模型下载2 模型测试 0 Qwen3 今天&#xff0c;通义千问Qwen团队正式开源推出 Qwen3&#xff0c;这是 Qwen 系列大型语言模型的最新成员。最新的Qwen3系列模型具备双模推理能力&#xff08;深入思考/快速响应&#xff09;、支持119种语言及方…...

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十七章 IO流:超越FILE*的维度战争

一、从C文件操作到Java流的进化 1.1 C文件操作的原始挑战 C语言通过FILE*和低级文件描述符进行I/O操作&#xff0c;存在诸多限制&#xff1a; 典型文件复制代码&#xff1a; #include <stdio.h> int copy_file(const char* src, const char* dst) { FILE* in fope…...

Leetcode刷题记录22——滑动窗口最大值

题源&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; 暴力遍历法&#xff0c;通过一个长度为k的滑动窗口遍历nums&#xff0c;将其中最大的数依次记…...

React 第三十四节 Router 开发中 useLocation Hook 的用法以及案例详解

一、useLocation基础用法 作用&#xff1a;获取当前路由的 location 对象 返回对象结构&#xff1a; {pathname: "/about", // 当前路径search: "?namejohn", // 查询参数&#xff08;URL参数&#xff09;hash: "#contact", …...

BT134-ASEMI机器人功率器件专用BT134

编辑&#xff1a;LL BT134-ASEMI机器人功率器件专用BT134 型号&#xff1a;BT134 品牌&#xff1a;ASEMI 封装&#xff1a;TO-126 批号&#xff1a;最新 引脚数量&#xff1a;3 封装尺寸&#xff1a;如图 特性&#xff1a;双向可控硅 工作结温&#xff1a;-40℃~150℃…...

十五种光电器件综合对比——《器件手册--光电器件》

十五、光电器件 名称 原理 特点 应用 发光二极管&#xff08;LED&#xff09; 基于半导体材料的电致发光效应&#xff0c;当电流通过时&#xff0c;电子与空穴复合&#xff0c;释放出光子。 高效、节能、寿命长、响应速度快、体积小。 广泛用于指示灯、照明、显示&#…...

网络安全攻防演练实训室建设方案

一、引言 在数字化浪潮席卷全球的当下&#xff0c;网络已深度融入社会的各个层面&#xff0c;成为推动经济发展、社会进步和科技创新的关键力量。从日常生活中的移动支付、社交互动&#xff0c;到企业运营中的数据管理、业务拓展&#xff0c;再到国家关键基础设施的运行&#…...

极客天成受邀参加2050大会,共赴人工智能科技盛宴

2025年4月25日&#xff0c;备受瞩目的2050大会在杭州云栖小镇盛大开幕。作为科技领域的佼佼者&#xff0c;北京极客天成科技有限公司受邀参加了此次盛会&#xff0c;与全球科技爱好者共同探索科技的未来。 大会盛况空前&#xff0c;科技盛宴开启 2050大会是由杭州市云栖科技创…...