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
当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。