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:v1docker import http://example.com/exampleimage.tgz example/imagerepodocker 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镜像使用
管理和使用本地Docker主机镜像
创建镜像
列出镜像
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镜像仓库中下载的镜像不能满足我们的需求是,我们可以通过以下两种方式对镜像进行更改。
-
从已经创建的容器中更新镜像,并且提交这个镜像
-
使用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
FROM和RUN指令作用
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.0RUN 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 | 检查间隔时间(支持 s 、m 、h 单位) | 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 timeimport redisfrom flask import Flaskapp = 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,故只简单列举几个
文章参考:菜鸟编程