1. 我是皮皮虾首页
  2. 编程开发
  3. Docker

docker教程系列之docker怎么构建镜像

前面一章我们讲到了如何使用docker,这一章将会讲到如何把我们的项目打包成docker镜像,这种需求在我们的工作中很非常常见的,下面将会分别讲到dockerfile文件构成,后端打包镜像,前端打包镜像

构建docker镜像离不开Dockerfile,Docker镜像类似一栋房子,每一层都是由命令构建的,而每一层具体是啥,那就是有Dockerfile这么一个文件去描述每一层怎么来的,它本质是一个文本文件,里面包含了很多条指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

docker教程系列之docker怎么构建镜像
docker build

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
# 只作用在 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/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注