Dockerfile

From:

定制的镜像都是基于 FROM 的镜像

RUN:

执行命令,在镜像构建的时候会执行。有两种模式

shell格式

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

exec格式

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

多一个run都会在docker上新建一层,过多层,使镜像过大。可以用 && 组合命令。  这样就只有一个run 就只有一层。

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

COPY:

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

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

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

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

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

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

CMD:

CMD 在docker run 时运行。
RUN 是在 docker build。

作用 在容器启动时候运行默认的程序,程序结束,容器就结束了。cmd指令指定的程序会被docker run命令行参数中指定运行的程序覆盖

注意 如果DockerFile中有多个cmd,只有最后一个生效。

shell格式

CMD <shell 命令>

exec格式  推荐使用

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

 

ENTRYPOINT:

类似于 CMD 指令, 在容器启动时候运行默认的程序,程序结束,容器就结束了。但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令

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

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

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

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

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参   run命令中可以修改的

 

不传参数
$ docker run  nginx:test

容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf

 

传参数
$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令
nginx -c /etc/nginx/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 <参数名>[=<默认值>]

 

EXPOSE:

声明镜像端口

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE <端口1> [<端口2>...]

 

WORKDIR:

工作目录

#test
FROM ubuntu
MAINTAINER hello
RUN mkdir /mydir
RUN echo hello world > /mydir/test.txt
WORKDIR /mydir
CMD ["more" ,"test.txt"]

CMD ["more" ,"test.txt"] 中没有指定test.txt的目录,就可以直接输出,原因是制定了工作目录为/mydir,相当于cd

可以在 docker run命令中用 -w参数覆盖掉WORKDIR指令的设置。

 

USER:

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

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

 

 

 

一个.net core项目的dockefile文件

FROM hub.xxxxx.cn/public/dotnet-core:v2.2.2
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

WORKDIR /app
EXPOSE 8000
COPY . /app

WORKDIR /app
ENTRYPOINT [ "dotnet", "/app/xxx.dll" ]

 

 

Docker build

参数说明

--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指令的网络模式

 

1、dockerfile文件路径  (常用)

使用当前目录的 Dockerfile 创建镜像,标签为 XXX/CRMAPI:V1。

docker build -t XXX/CRMAPI:v1 .

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

docker build github.com/creack/docker-firefox

也可以通过 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .

 

2、上下文路径

docker build -t nginx:test .

最后的  .   是上下文路径。

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

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

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

 

官方文档

 


Docker run

docker run -d -p 8030:8000 --cpus=2 -m 2G --memory-swap=2G --env ASPNETCORE_ENVIRONMENT=release -v /data/pf/logs/errorLogs:/app/wwwroot/errorLogs -v /data/pf/logs/NSLogs:/app/wwwroot/NSLogs -v /data/pf/logs/subscribenbusLogs:/app/wwwroot/subscribenbusLogs --name="xxxxx" hub.xxxx.con/xxxxx:latest

 

 

 

常用参数

-d后台运行

-i即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用

-t分配一个伪tty,一般与 -i 连用

 

不用-it  docker attach 就不能用