资讯专栏INFORMATION COLUMN

Docker入门- 使用Dockerfile创建镜像(CentOS 7)

IT那活儿 / 1901人阅读
Docker入门- 使用Dockerfile创建镜像(CentOS 7)

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

Dockerfile指令说明

创建镜像

命令格式:docker build [OPTIONS] PATH | URL | -

该命令将读取上下文路径(PATH指定的路径)下的Dockerfile,并将该路径下所有数据作为上下文(Context)发送给Docker服务端进行镜像创建。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:

  • 可以使用-f来指定使用不在上下文路径中的Dockerfile文件。
  • 除非是生成镜像所必须的文件,否则不要放在上下文路径下,因为会一起打包发送给 docker 引擎,如果文件过多会造成创建过程缓慢。
创建镜像举例
创建一个标签Tag(-t指定)为builder/first_image:1.0的镜像,上下文路径为/docker/docker_build:
docker bulid -t builder/first_image:1.0 /docker/docker_build
多步骤创建镜像:
从Docker 17.05+版本开始支持多步骤创建(Multi-stage build)镜像的特性,可以精简最终生成镜像的大小。

对于需要编译的应用(如C、Go或Java语言等)来说,通常情况下至少需要准备两个环境的 Docker镜像:

  • 编译环境镜像:包括完整的编译引擎、依赖库等,往往比较庞大。作用是编译应用为二进制文件;
  • 运行环境镜像:利用编译好的二进制文件,运行应用,由于不需要编译环境,体积比较小。
使用多步骤创建,可以在保证最终生成的运行环境镜像保持精简的情况下,使用单一的Dockerfile,降低维护复杂度。
以Go语言应用为例
先创建一个main.go程序:
package main
import "fmt"

func main(){
fmt.Println("Hello Docker!")
}
编辑Dockerfile文件:
使用golang:latest镜像作为编译环境,使用精简的镜像alpine:latest作为运行环境,来创建新镜像。
# define stage name as builder
FROM golang:latest as builder
RUN mkdir -p /go/src/test
WORKDIR /go/src/test
COPY main.go .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# copy file from the builder stage
COPY --from=builder /go/src/test/app .
CMD ["./app"]
创建镜像:
镜像标签(-t)为: builder/test_multistage:1.0,上下文路径为: /docker/docker_build
命令:docker build -t builder/test_multistage:1.0 /docker/docker_build
使用该镜像:
docker run builder/test_multistage:1.0

最佳实践

  • 精简镜像用途

    尽量让每个镜像的用途集中单一,避免构造大而复杂、多功能的镜像;

  • 选用合适的基础镜像

    容器的核心是应用。选择过大的父镜像(如 Ubuntu系统镜像)会造成最终生成应用镜像的臃肿,推荐选用瘦身过的应用镜像(如node:s1im),或者较为小巧的系统镜像(如 alpine、 busybox或 debian);

  • 提供注释和维护者信息

    Dockerfile也是一种代码,需要考虑方便后续的扩展和他人的使用;

  • 正确使用版本号

    使用明确的版本号信息,如1.0,2.0,而非依赖于默认的latest。通过版本号可以避免环境不一致导致的问题;

  • 减少镜像层数

    尽量合并RUN、ADD和COPY指令。通常情况下,多个RUN指令可以合并为一条RUN指令;

  • 恰当使用多步骤创建(17.05+版本支持)

    通过多步骤创建,可以将编译和运行等过程分开,保证最终生成的镜像只包括运行应用所需要的最小化环境。当然,用户也可以通过分别构造编译镜像和运行镜像来达到类似的结果,但这种方式需要维护多个;

  • 使用.dockerignore文件
    来配置需要忽略的非必要的路径和文件,不将其发送给Docker引擎,从而加快整个镜像的创建过程。

本文作者:孙长城(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129337.html

相关文章

  • Docker实战之入门Dockerfile详细分析:构建docker镜像(1)基础镜像cento

    摘要:如果有服务器需要维护重启时,也会重启,此时端口会发生变化,仍然会随机拿一个没有使用的端口号来和号端口做端口映射。除非该删掉后,端口号会被分配给其他使用。 Dockerfile Docker是软件工业上的集装箱技术。 通过以下文件制作Docker镜像 [root@Optimus docker-training]# cd centos7/ [root@Optimus centos7]# l...

    learn_shifeng 评论0 收藏0
  • 30 分钟快速入门 Docker 教程

    摘要:分钟快速入门教程一欢迎来到世界与虚拟化在没有的时代,我们会使用硬件虚拟化虚拟机以提供隔离。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库,国内的公开仓库也有很多选择,例如阿里云等。 30 分钟快速入门 Docker 教程 一、欢迎来到 Docker 世界 1. Docker 与虚拟化 在没有 Docker 的时代,我们会使用硬件虚拟化(虚拟机)以提供隔离。这里,虚拟机通过在操作系...

    LucasTwilight 评论0 收藏0
  • Docker实战之入门Dockerfile详细分析(5):ENTRYPOINT和CMD命令的区别

    摘要:用法在当中只有最后一条生效,其他都不生效第一种写法类似数组形式,推荐使用。第二章方法执行命令启动的进程,该进程的为执行完这个的。命令覆盖掉了中的命令,直接进入到了中。删除镜像前,先停止。 ENTRYPOINT用法showImg(https://segmentfault.com/img/bVXNu5?w=702&h=322); entrypoint在dockerfile当中只有最后一条生...

    JerryWangSAP 评论0 收藏0
  • Docker实战之入门Dockerfile详细分析:构建docker镜像(2)中间件镜像

    摘要:构建镜像时,首先要有一个基础镜像,然后有中间件镜像,最后生成一个应用镜像。现在作为基础镜像,下面来构建两个中间件镜像镜像具有和能力的镜像。同时,用文件覆盖默认的配置文件。构建镜像查看镜像以上镜像已经做好了。 以上已经构建好了一个基础的docker镜像centos7。 构建docker镜像时,首先 要有一个基础镜像,然后有中间件镜像,最后生成一个应用镜像。 现在centos7作为基础镜...

    neuSnail 评论0 收藏0
  • Docker实战之入门Dockerfile详细分析:构建docker镜像(2)中间件镜像

    摘要:构建镜像时,首先要有一个基础镜像,然后有中间件镜像,最后生成一个应用镜像。现在作为基础镜像,下面来构建两个中间件镜像镜像具有和能力的镜像。同时,用文件覆盖默认的配置文件。构建镜像查看镜像以上镜像已经做好了。 以上已经构建好了一个基础的docker镜像centos7。 构建docker镜像时,首先 要有一个基础镜像,然后有中间件镜像,最后生成一个应用镜像。 现在centos7作为基础镜...

    susheng 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<