• Dockerfile 简介


    1. Dockerfile 简介

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

    1. # 运行Dockerfile ("."代表当前目录)
    2. docker build -t image_name:tag_name .
    3. # 通过-f 指定Dockerfile文件位置
    4. docker build -f /path/Dockerfile .

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

    2. 通过Dockerfile 制作镜像

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

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

    1. FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7
    2. MAINTAINER kk
    3. RUN yum -y update &&\
    4. yum install -y pcre pcre-devel zlib openssl openssl-devel &&\
    5. yum clean all
    6. ARG NGINX_VERSION=1.15.0
    7. # Nginx
    8. WORKDIR /tmp
    9. RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz &&\
    10. tar zxf nginx-${NGINX_VERSION}.tar.gz &&\
    11. cd /tmp/nginx-${NGINX_VERSION}.tar.gz &&\
    12. ./configure \
    13. --prefix=/usr/local/nginx \
    14. --with-http_ssl_module \
    15. --with-http_sub_module \
    16. --with-http_dav_module \
    17. --with-http_flv_module \
    18. --with-http_gzip_static_module \
    19. --with-http_stub_status_module \
    20. --with-debug && \
    21. make && \
    22. make install
    23. # 设置环境变量
    24. ENV PATH /usr/local/nginx/sbin:$PATH
    25. # 开放端口
    26. EXPOSE 80 443
    27. # 执行命令
    28. ENTRYPOINT ["nginx", "-g", "daemon off;"]

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

    Dockerfile 文件

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

    1. FROM ubuntu:18.04
    2. ENV DEBIAN_FRONTEND noninteractive
    3. RUN apt-get update && \
    4. apt-get install -y --no-install-recommends apt-utils && \
    5. apt-get install -y --no-install-recommends python3.8 python3-pip && \
    6. ln -sv /usr/bin/python3.8 /usr/bin/python && \
    7. ln -sv /usr/bin/pip3 /usr/bin/pip
    8. RUN apt-get install -y curl wget mysql-client inetutils-ping
    9. RUN apt install -y nginx vim procps xinetd telnetd telnet && \
    10. apt install -y net-tools lsof strace
    11. 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
    12. RUN pip3 install MarkupSafe pandas threadpool
    13. # RUN pip3 install --no-cache-dir numpy Cython onnxruntime pymilvus -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
    14. # RUN pip3 install -U insightface==0.6.2 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
    15. RUN rm -rf /tmp/ && \
    16. rm -rf /var/lib/apt/lists/*
    17. # ---------需要在docker内自动启动程序时使用-----------------
    18. COPY . /fingerprint
    19. WORKDIR /fingerprint
    20. -------- 测试环境变量声明---------
    21. # CMD ["export", "ENV=test"]
    22. ENV ENV=test
    23. -----------END------------------
    24. # CMD ["python3", "-m", "http.server", "8080"] # 调试用,进入后(执行下条命令)手动启动服务
    25. CMD ["python3", "./fingerprint/api/manage.py", "runserver", "0.0.0.0:8099"]

    制作镜像

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

    3. 命令详解

    3.1 常用命令

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

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

    3.1.2 ENV: 设置环境变量

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

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

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

    docker run -e var=yyy

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

    1. ARG site
    2. ARG build_user=www

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

    docker build --build-arg =

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

    3.1.4 CMD: 构建容器后调用

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

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

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

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

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

    1. ENTRYPOINT ["executable", "param1", "param2"] (可执行文件,优先)
    2. ENTRYPOINT command param1 param2 (shell内部命令)
    3. eg:
    4. FROM ubuntu
    5. ENTRYPOINT ["top", "-b"]
    6. 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: 指定基础镜像

    必须为第一个命令。

    1. FROM
    2. FROM : (tag表示版本)
    3. FROM @
    4. eg:
    5. FROM centos:7.0

     3.2.2 MAINTAINER: 维护者信息

    MAINTAINER Tom
    

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

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

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

    3.2.4 COPY: 类似ADD

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

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

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

    1. EXPOSE 80 443
    2. EXPOSE 8080

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

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

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

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

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

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

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

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

    3.2.7 其他

    1. LABEL: 用于为镜像添加元数据
    2. LABEL version="1.0" description="这是一个nginx镜像"
    3. USER: 指定运行容器时的用户名或UID
    4. USER user
    5. USER user:group
    6. USER uid:gid
    7. ONBUILD: 用于设置镜像触发器
    8. ONBUILD ADD . /app/src
    9. ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    10. 当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。


     

  • 相关阅读:
    Anaconda下载安装
    【源码+文档+调试】springboot文化传承小程序的设计与实现小程序源码分享
    八、手把手教你搭建SpringCloudAlibaba之Sentinel服务降级
    Dubbo面试系列问题总结
    Dubbo-接口数据序列化Serialization
    Delphi 技术的优缺点与应用
    数据库索引失效
    Ant-design-vue Table 列表 columns 将作为导出功能入参
    Linux多线程
    Go 异常处理流程
  • 原文地址:https://blog.csdn.net/MusicDancing/article/details/126409846