dockerfile编写
dcoker 的一个操作和交互的关系流程:
dockerfile 编写规则
- 习惯使用大写
- 非注释行第一行必须是FROM
- 文件名必须是dockerfile
- 指定一个专门的工作目录
- 所有引入的映射文件必须在这个工作空间目录下
- 工作空间不支持隐藏文件
- (.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
- 每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条
构建过程
编写一个dockerfile 文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库!)
dockerfile常用指令
FROM
指定基础镜像,必须要指定,格式: FROM :
MAINTAINER(构建指令)
设置镜像制作者的信息,
COPY(构建指令)
将本地文件拷贝到docker容器中去,且两者的目录结构是相同的,
目标路径不存在时会自动创建。当使用本地目录为源目录时,推荐使用COPY。
格式: copy
详解:复制本地主机的 下内容到镜像中的 ,目标路径不存在时,会自动创建。
:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)
:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
路径:支持正则表达式, COPY test* /tmp
–from 指令:
表示将从from指定的构建阶段中寻找源文件:
栗子:
# 第一构建阶段:将仅用于生成 requirements.txt 文件
FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage
#将当前的工作目录设置为 /tmp
WORKDIR /tmp
RUN touch requirements.txt
# 第二构建阶段,在这往后的任何内容都将保留在最终容器映像中
FROM python:3.9
# 将当前工作目录设置为 /code
WORKDIR /code
# 从第一个阶段复制requirements.txt; 这个文件是只存在于前一个docker构建阶段的,所以使用--from-requirements-stage(第一节点的别称) 进行复制的原因,
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
# 运行命令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
LABEL
LABEL指令,是将元数据添加到镜像,label是键值对的方式,其中有空格的话,需要进行\转义,
例子: LABEL version=“1.0”
一个镜像可以有多个标签,可以指定多个,
基础或父镜像中包含的标签将由您的镜像继承,如果标签已经存在了但具有不同的值,则以最近的为准.
RUN命令
格式为RUN 或RUN [“executable”,“param1”,“param2”]。
前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如:
RUN [“/bin/bash”,“-c”,“echo hello”]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行,例如:RUN echo “hello world\nhello tom” > /tmp/abc &&
cat /tmp/abc
CMD指令
CMD ["executable","param1","param2"]使用exec执行,推荐方式
CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用
CMD ["param1","param2"]提供给ENTRYPOINT的默认参数
CMD用于指定启动容器时默认要执行的命令,每个dickerfile只能有一条cmd命令,如果被指定了多条指令,只会有最后一条被执行,同时如果用户在命令行指定了新的cmd将会覆盖掉文件里面的cmd.
EXPOSE
EXPOSE 22 80 8443
指定容器暴露的对外端口号,
ARG
表示当前构建过程中使用的环境变量, ARG user=root
当镜像构建编译成功之后,指定的变量就不会存在,ENV指定的变量是会一直存在,
而它只存在于镜像构建的过程中,
生效范围:
- 如果在FROM指令之前指定,那么就只能用于FROM指令中,后面的其他程序是不能够引用的,
- 一般的定义与FROM之后,供全局变量引用使用,.
ENV
指定一个环境变量,会被run 运行的命令使用,并一直保持,
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(会自动解压为目录)。copy指令不会解压,
ENTRYPOINT
ENTRYPOINT有两种格式:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2(在shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和保持的数据.
USER
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用gosu,而不推荐sudo。如果不指定,容器默认是root运行。
WORKDIR
格式为 WORKDIR /path/to/workdir。
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为/a/b/c。
ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像的时候,所执行的操作指令,
**STOPSIGNAL **
该指令是表示向容器中发送信号,缺省信号为SIGTERM
其中可以是kill -l信号也可以是数字,
docker run命令的选项可以覆盖掉镜像定义的STOPSTGNAL信号
在docker stop停止运行容器的时候指定发送给容器里pid为1的角色信号,默认超时10秒,超时就会发送kill强杀进程,一般的业务进程都是pid为1,所有的官方的进程都吹处理收到的SIGTERM信号进行优雅的收尾退出
构建命令
Dockerfile是一个用来构建镜像的文本文件,在docker客户端命令行中我们可以通过docker build 命令使用Dockerfile文件来创建镜像。
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
build-arg=[] :设置镜像创建时的变量;
cpu-shares :设置 cpu 使用权重;
cpu-period :限制 CPU CFS周期;
cpu-quota :限制 CPU CFS配额;
cpuset-cpus :指定使用的CPU id;
cpuset-mems :指定使用的内存 id;
disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
force-rm :设置镜像过程中删除中间容器;
isolation :使用容器隔离技术;
label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
no-cache :创建镜像的过程不使用缓存;
pull :尝试去更新镜像的新版本;
quiet, -q :安静模式,成功后只输出镜像 ID;
rm :设置镜像成功后删除中间容器;
shm-size :设置/dev/shm的大小,默认值是64M;
ulimit :Ulimit配置。
tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
network: 默认 default。在构建期间设置RUN指令的网络模式
例:
构建当前目录下的dockerfile,构建后的镜像版本是runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 .
dockerfile实例
#base images
FROM centos:7
#下载基础工具
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum install -y net-tools vim
# 设置环境变量
ENV GOROOT=/usr/local/go/go
ENV PATH=$PATH:$GOROOT/bin
## 拷贝压缩包到指定目录并解压
ADD /usr/local/go/go1.11.5.linux-amd64.tar.gz /usr/local/go/
## 拷贝一个脚本文件过去
COPY crub_innode.sh /root
## 设置工作目录
WORKDIR /root
## 开放端口
EXPOSE 80
## 启动执行的命令:
ENTRYPOINT [ "sh","-c", "echo hello test container" ]
docker file 练习
**构建命令: **
构建Tomcat镜像:
#基础镜像centos
FROM centos:v1
#下载基础工具
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum install -y net-tools vim rpm alien
RUN yum -y install alien
WORKDIR /usr/local/jdk
COPY jdk-8u341-linux-x64.rpm /usr/local/jdk/
RUN rmp -ivh jdk-8u341-linux-x64.rpm && java
WORKDIR /usr/local/tomcat/
ADD apache-tomcat-8.5.83.tar.gz /usr/local/tomcat
CMD ["java"]
#开放端口
EXPOSE 8080
## 启动执行的命令:
ENTRYPOINT [ "sh","-c", "/usr/local/tomcat/apache-tomcat-8.5.83/bin/startup.sh" ]
打包node16镜像docker file
FROM harbor.etouch.cn/wlbasic/centos_7.6.1810:1.0
LABEL Name="node.js"
LABEL Version="16.18.1"
ENV NODEJS_PATH /usr/local/nodejs
ENV PATH ${NODEJS_PATH}/bin:$PATH
ADD node-v16.18.1-linux-x64.tar.gz ${NODEJS_PATH}
WORKDIR ${NODEJS_PATH}
RUN mv node-v16.18.1-linux-x64/* ${NODEJS_PATH} && rm -rf node-v16.18.1-linux-x64
RUN ln -s /usr/local/nodejs/bin/npm /usr/local/bin
RUN ln -s /usr/local/nodejs/bin/npx /usr/local/bin
CMD ["node"]
CMD ["npm"]
docker tag nodejs_16.18.1:v1 harbor.etouch.cn/wlbasic/nodejs:16.18.1_v1
docker push harbor.etouch.cn/wlbasic/nodejs:16.18.1_v1