文章目录
本文介绍了如何容器化(Docker化)一个应用。
- 介绍了Dockerfile基本的工作机制,并用docker image build命令创建了一个新的镜像。镜像创建后,基于该镜像启动了一个容器。
- 多阶段构建提供了一种简单的方式,能够构建更加精简的生产环境镜像。
- Dockerfile是一个将应用程序文档化的有力工具:
首先编写应用代码,然后创建一个Dockerfile来定义这个应用,最后使用docker image build命令构建镜像。
一. 应用的容器化——简介
完整的应用容器化过程主要分为以下几个步骤。
- 创建Dockerfile,其中包括当前应用的描述、依赖以及该如何运行这个应用。
- 创建镜像:对Dockerfile执行docker image build命令构建镜像
- 应用容器化完成(即应用被打包为一个Docker镜像),就能以镜像的形式交付并以容器的方式运行了。
二. 单体应用容器化
1. 获取代码与分析Dockfile
代码地址:https://github.com/nigelpoulton/psweb.git 。如下代码结构:
$ cd psweb
$ ls -l
total 28
-rw-r--r-- 1 root root 341 Sep 29 16:26 app.js
-rw-r--r-- 1 root root 216 Sep 29 16:26 circle.yml
-rw-r--r-- 1 root root 338 Sep 29 16:26 Dockerfile
。。。
Dockerfile包含了对当前应用的描述,并且能指导Docker完成镜像的构建。在Docker当中,包含应用文件的目录通常被称为构建上下文(Build Context)。通常将Dockerfile放到构建上下文的根目录下
。
有一点是必须的:文件开头字母是大写D,这里是一个单词。像“dockerfile”或者“Docker file”这种写法都是不允许的。
$ cat Dockerfile
FROM alpine # 以alpine镜像作为当前镜像基础,
LABEL maintainer="nigelpoulton@hotmail.com" # 维护者(maintainer)
RUN apk add --update nodejs nodejs-npm # 安装Node.js和NPM,
COPY . /src # 将应用的代码复制到镜像当中,设置新的工作目录,安装依赖包,
WORKDIR /src
RUN npm install
EXPOSE 8080 # 网络端口
ENTRYPOINT ["node", "./app.js"] # 将app.js设置为默认运行的应用。
Dockerfile主要包括两个用途
- 描述当前应用
- 指导Docker完成应用的容器化(创建一个包含当前应用的镜像)
Dockerfile能实现开发和部署两个过程的无缝切换、帮助新手快速熟悉这个项目。如下Dockerfile配置描述:
配置 | 说明 |
---|---|
基础镜像层 | 1. 每个Dockerfile文件第一行都是FROM指令。FROM指定的镜像,会作为当前镜像的基础镜像层,当前应用的剩余内容会作为新增镜像层添加到基础镜像层之上。 2. 本例中的应用基于Linux操作系统,所以在FROM指令当中引用Linux基础镜像; |
label标签 | 1. 一种描述信息,沟通方式。每个标签是一个键值对(Key-Value),在一个镜像当中可以通过增加标签的方式来为镜像添加自定义元数据。 2. 通过标签(LABEL)方式指定了当前镜像的维护者为“nigelpoulton@hotmail. com”。 |
安装镜像层 | 1. RUN apk add --update nodejs npm 指令使用alpine的apk包管理器将nodejs和nodejs-npm安装到当前镜像之中 。2. RUN指令会在FROM指定的alpine基础镜像之上,新建一个镜像层来存储这些安装内容。 |
工作目录 | Dockerfile通过WORKDIR指令,为Dockerfile中尚未执行的指令设置工作目录。该目录与镜像相关,并且会作为元数据记录到镜像配置中,但不会创建新的镜像层。 |
安装相关依赖 | 1. run npm install指令会根据package.json中的配置信息,使用npm来安装当前应用的相关依赖包。 2. npm命令会在工作目录中执行,并且在镜像中新建镜像层来保存相应的依赖 |