Dockerfile 简介

1. Dockerfile 简介

        Dockerfile是包含一些Linux命令的、名为Dockerfile的文件。Docker通过读取该文件中的命令来组建镜像。Dockerfile一般分为“基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令”等四部分(注释符号为“#”)。

# 运行Dockerfile ("."代表当前目录)
docker build -t image_name:tag_name .

# 通过-f 指定Dockerfile文件位置
docker build -f /path/Dockerfile .

        Docker的images是由一层层的layer组成的,然后通过联合挂载的方式挂载成一个文件系统。如果更改了某一层的信息,那么从这层之后所有的层都需要重新build。

2. 通过Dockerfile 制作镜像

分别使用不同基础镜像(centos、ubuntu)构建指定镜像。

2.1 构建一个包含nginx软件的镜像(centos作为基础镜像)

FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7
MAINTAINER kk

RUN yum -y update &&\
        yum install -y pcre pcre-devel zlib openssl openssl-devel &&\
        yum clean all

ARG NGINX_VERSION=1.15.0

# Nginx
WORKDIR /tmp

RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz &&\
    tar zxf nginx-${NGINX_VERSION}.tar.gz &&\
    cd /tmp/nginx-${NGINX_VERSION}.tar.gz &&\
    ./configure \
        --prefix=/usr/local/nginx \
        --with-http_ssl_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_gzip_static_module \
        --with-http_stub_status_module \
        --with-debug && \
    make && \
    make install

# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

# 开放端口
EXPOSE 80 443

# 执行命令
ENTRYPOINT ["nginx", "-g", "daemon off;"]

2.2 构建一个包含django软件的镜像ubuntu作为基础镜像

Dockerfile 文件

1: 构建镜像时位置为打包代码的根目录;
2: 镜像末尾需附上服务启动命令CMD**。

FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get install -y --no-install-recommends apt-utils && \
    apt-get install -y --no-install-recommends python3.8 python3-pip && \
    ln -sv /usr/bin/python3.8 /usr/bin/python && \
    ln -sv /usr/bin/pip3 /usr/bin/pip

RUN apt-get install -y curl wget mysql-client inetutils-ping  

RUN apt install -y nginx vim procps xinetd telnetd telnet && \
    apt install -y net-tools lsof strace 

RUN python3 -m pip install uwsgi DBUtils==1.2 drf-yasg2 dj-rest-auth django-filter django-rest-swagger django djangorestframework pymysql django-import-export django-cors-headers

RUN pip3 install MarkupSafe pandas threadpool
# RUN pip3 install --no-cache-dir numpy Cython onnxruntime pymilvus -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# RUN pip3 install -U insightface==0.6.2 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

RUN rm -rf /tmp/ && \
    rm -rf /var/lib/apt/lists/*

# ---------需要在docker内自动启动程序时使用-----------------
COPY . /fingerprint
WORKDIR /fingerprint
-------- 测试环境变量声明---------
# CMD ["export", "ENV=test"]
ENV ENV=test
-----------END------------------

# CMD ["python3", "-m", "http.server", "8080"]  # 调试用,进入后(执行下条命令)手动启动服务
CMD ["python3", "./fingerprint/api/manage.py", "runserver", "0.0.0.0:8099"]

制作镜像

docker build -t fingerprint:1.0 .
docker save fingerprint:1.0 > dkfile.tar.gz

3. 命令详解

3.1 常用命令

3.1.1 RUN: 构建镜像时执行的命令

RUN ["/bin/executable", "param1", "param2"]
# RUN yum install nginx

3.1.2 ENV: 设置环境变量

ENV name=kk
ENV name qwe asd (qwe,asd均为value)

        如果想在运行期间使用某些变量,那么ENV是唯一的选择。ENV主要是定义环境变量,在docker run的时候ENV的配置会加载到容易内部,但ARG的参数在内部是没法看到的。

可以通过下面命令更改ENV的默认值:

docker run -e var=yyy

3.1.3 ARG: 用于指定传递给构建运行时的变量

ARG site
ARG build_user=www

ARG主要是定义一个变量,在使用docker build时可以通过参数来设定。

docker build --build-arg <varname>=<value>

因此如果需要在build期间使用某些变量,ARG是最好的选择。

3.1.4 CMD: 构建容器后调用

即在容器启动时才进行调用。

CMD 用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的指令。

CMD ["executable", "param1", "param2"] (执行可执行文件,优先)
CMD ["param1", "param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
eg:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc", "--help"]

3.1.5 ENTRYPOINT: 配置容器,使其可执行

配合CMD可省去“application”,只使用参数。

ENTRYPOINT ["executable", "param1", "param2"] (可执行文件,优先)
ENTRYPOINT command param1 param2 (shell内部命令)
eg:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

     ENTRYPOINT与CMD非常类似,不同的是通过docker run 执行的命令不会覆盖ENTRYPOINT,而docker run 命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

docker run -itd --name=nginx nginx echo 'hello word'

3.1.6 WORKDIR: 工作目录

类似cd命令

WORKDIR /usr/local/       (当前的工作目录)

 在使用docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

3.2 其他命令

3.2.1 FROM: 指定基础镜像

必须为第一个命令。

FROM <image>
FROM <image>:<tag>    (tag表示版本)
FROM <image>@<digest>
eg:
FROM centos:7.0

 3.2.2 MAINTAINER: 维护者信息

MAINTAINER Tom

3.2.3  ADD: 将本地的文件添加到容器中

tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

ADD <src>... <dest>
# 添加所有以“tes”开头的文件
ADD test* /mydir/
# "?"代表任一字符
ADD tes?.txt /mydir/
# 添加“test”到相对目录(第一个参数时宿主机文件路径,第二个参数时容器路径)
ADD test relativeDir

3.2.4 COPY: 类似ADD

但不会自动解压文件,也不能访问网络资源。

3.2.5 EXPOSE: 指定与外界交互的端口

        EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run 运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

EXPOSE 80 443
EXPOSE 8080

3.2.6 VOLUME: 用于指定持久化目录

VOLUME ["/data"]
VOLUME ["/var/www", "var/log/apache2", "/etc/apache2"] 

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1. 卷可以在容器间共享和重用;

2. 容器并不一定要和其他容器共享卷;

3. 修改卷后会立即生效;

4. 对卷的修改不会对镜像产生影响;

5. 卷会一直存在,直到没有任何容器在使用它。

3.2.7 其他

LABEL: 用于为镜像添加元数据
LABEL version="1.0" description="这是一个nginx镜像"

USER: 指定运行容器时的用户名或UID
USER user
USER user:group
USER uid:gid

ONBUILD: 用于设置镜像触发器
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值