在前面一章我们讲到了如何使用docker,这一章将会讲到如何把我们的项目打包成docker镜像,这种需求在我们的工作中很非常常见的,下面将会分别讲到dockerfile文件构成,后端打包镜像,前端打包镜像
构建docker镜像离不开Dockerfile,Docker镜像类似一栋房子,每一层都是由命令构建的,而每一层具体是啥,那就是有Dockerfile这么一个文件去描述每一层怎么来的,它本质是一个文本文件,里面包含了很多条指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile指令
- 2个注释类
escape
- 注释作用,比如
- syntax
# syntax=docker/dockerfile:1 # syntax=docker.io/docker/dockerfile:1 # syntax=example.com/user/repo:tag@sha256:abcdef...
- 17个非注释类
- ARG
- 定义镜像变量,仅作用在Dockerfile中,并且比如只作用在FORM中,那就在FORM之前定义,要在FORM后作用,必须重新在FROM后添加一个ARG
- ARG
# 只作用在 FROM 中 ARG REGISTRY=library FROM ${REGISTRY}/java-1.8.0 # 要想在 FROM 之后再次使用,必须再次指定 ARG REGISTRY=library RUN echo ${DOCKER_USERNAME}
- FROM
- 从哪个镜像开镜构建,比如 FROM nginx:latest
- LABEL
- 标签名,作用于镜像,可以比如为镜像添加额外的标示符号,比如:author=”张三”
- ENV
- 环境变量,作用与镜像启动后,容器内可以读取到,比如:MYSQL_PASSWORD=”123456″
- USER
- 指定后续 【 RUN、CMD、ENTRYPOINT 指令的执行】或【 容器运行 】的用户,比如1000:1000
- VOLUME
- 挂载宿主机或者云服务器的目录到容器中,比如:VOULME /opt/root /tmp/etc/root
- EXPOSE
- 声明暴露端口,只是声明意义,不等于docker run -p 80:80 xxx,比如声明nginx镜像暴露的端口:EXPOSE 80
- WORKDIR
- 进入到某个路径:WORKDIR /app
- RUN
- 在镜像构建中运行命令,这个常用在安装某些包,这里需要的注意的是多个RUN命令建议合并成一个,因为每一句命令都是一层,会增加镜像体积,比如:RUN yum install -y python3-dev \
- yum install -y python3-pip
- ADD
- 添加拷贝文件,除了拷贝,还会自动解压文件,比如拷贝本地文件夹到容器中到/app目录:ADD . /app
- COPY
- 单纯到拷贝没有附加功能,但是要注意,你不能指定上下文以外的路径,例如../path/to/filename 是不生效的,正确用法比如: COPY . /app
- CMD
- 在容器启动时执行的命令,如果还定义了entrypoint 那么cmd将被解释为它的输入参数,如果在docker run指定了cmd参数那么会覆盖dockerfile里面的cmd
- ENTRYPOINT
- 在CMD之前执行的命令,表示的是指定一个可以执行的文件,通常用于在运行应用之前初始化一些环境变量什么的
- ONBUILD
ONBUILD
通常用于缩减容器体积,后面的例子有用到,比如编译镜像的时候需要比较大的基础镜像,但是编译完只需要用到二进制文件,那么可以将二进制文件拷贝到更小镜像中,从而缩小镜像体积。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。比如:ONBUILD COPY . /app/
- STOPSIGNAL
- 当容器退出时向系统发送信号。
- HEALTHCHECK
- 周期性的对容器进行健康检查,返回0表示正常,1表示不正常,2为保留字,不应使用
- SHELL
- 指定Dockerfile中 【 shell form 】命令的默认shell,比如:SHELL [“/bin/bash”, “-c”]
上面指令讲了很多,但是常用的并没有那么多,下面将会拿三个常用的dockerfile举例
Python-Django项目Dockerfile打包
ARG REGISTRY=reg.test.com FROM ${REGISTRY}/library /python:3.6-jessie MAINTAINER xxx<xxx@xxx.cn> ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 # change pip resource COPY dockerfiles/pip.conf /root/.pip/pip.conf COPY requirements.txt /requirements.txt RUN pip install -r /requirements.txt \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # project dir ENV PROJECT_DIR=/opt/root/project_name COPY . ${PROJECT_DIR} WORKDIR ${PROJECT_DIR} EXPOSE 8000 CMD uwsgi -i uwsgi.ini
Go-Gin项目Dockerfile
ARG REGISTRY=reg.test.com FROM ${REGISTRY}/library/project-base:latest AS builder # project dir ENV PROJECT_DIR=/go/src/projects/project-name RUN mkdir -p ${PROJECT_DIR} WORKDIR ${PROJECT_DIR} ADD go.mod . ADD go.sum . RUN export GO111MODULE=on && \ export GOPROXY=https://goproxy.cn && \ go mod download COPY . . RUN go build -o main main.go FROM alpine:3.7 # project dir ENV PROJECT_DIR=/go/src/projects/project-name RUN mkdir -p /root/conf RUN mkdir -p /root/ WORKDIR /root/ COPY --from=builder ${PROJECT_DIR}/main . COPY --from=builder ${PROJECT_DIR}/conf /root/conf ENTRYPOINT ["./main"]
前端vue项目Dockerfile打包
FROM nginx:latest MAINTAINER zhangs LABEL maintainer="zhangs@test.cn" \ description="前端项目" COPY dist/ /usr/share/nginx/html/ EXPOSE 80
docker build from Dockerfile
dockerfile有了,那就得构建镜像了
docker build -t "hello" .
常用参数
-c:控制 CPU 使用
-f:指定 Dockerfile 名称,一般用于你得Dockerfile文件不在当前项目根目录下,或者名称不叫Dockerfile
-m:设置构建内存上限
-q:不显示构建过程的信息
-t:为构建的镜像打上标签
原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/430/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/