容器能够简化应用的构建、部署和运行过程。
实践
单机应用容器化
获取应用代码
$ git clone https://github.com/nigelpoulton/psweb
.....
$ ls -l
总用量 28
-rw-rw-r-- 1 oceanstar oceanstar 341 7月 1 2021 app.js
-rw-rw-r-- 1 oceanstar oceanstar 216 7月 1 2021 circle.yml
-rw-rw-r-- 1 oceanstar oceanstar 336 7月 1 2021 Dockerfile
-rw-rw-r-- 1 oceanstar oceanstar 403 7月 1 2021 package.json
-rw-rw-r-- 1 oceanstar oceanstar 455 7月 1 2021 README.md
drwxrwxr-x 2 oceanstar oceanstar 4096 7月 1 2021 test
drwxrwxr-x 2 oceanstar oceanstar 4096 7月 1 2021 views
分析Dockerfile
- 上面可以看到,有关叫做Dockerfile的文件。这个文件包含了对当前应用的描述,并且能够指导Docker完成镜像的构建
- 在Docker当前,包含应用文件的目录通常被称为构建上下文(build context)。通常将Dockerfile放到构建上下文的根目录下
其内容如下:
# Test web-app to use with Pluralsight courses and Docker Deep Dive book
# Linux x64
FROM alpine
LABEL maintainer="nigelpoulton@hotmail.com"
# Install Node and NPM
RUN apk add --update nodejs npm curl
# Copy app to /src
COPY . /src
WORKDIR /src
# Install dependencies
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
(1)FROM alpine
-
指定alpine作为当前镜像基础
-
每个Dockerfile文件第一行都是FROM指令
-
它指定镜像作为当前镜像的一个基础镜像层,当前应用的剩余内容会作为新增镜像层添加到基础镜像层之上
(2)`LABEL maintainer=“nigelpoulton@hotmail.com” -
通过标签方式指定指定维护者为nigelpoulton@hotmail.com
-
每个标签其实是一个键值对,在一个镜像中可以通过增加标签的方式来为镜像自定义元数据
(3)RUN apk add --update nodejs npm curl
- apk 是alpine的包管理器,将会使用apk安装nodejs npm curl
- RUN指令会在FROM指定的alpine基础上,新建一个镜像层来存储这些安装内容
(4)COPY . /src
- 将应用的代码从构建上下文复制到镜像当中,并新建一个镜像层来存储
(5)WORKDIR /src
- 设置新的工作目录
- 这个目录与镜像有关,并且会作为元数据记录到镜像配置中,但是不会创建新的镜像层
(6)RUN npm install
- 会根据package.json中的配置信息,使用npm来安装当前应用的相关依赖包,并在在镜像中新建镜像层来保存相应依赖文件
(7)EXPOSE 8080
- 因为当前应用需要通过TCP端口8080对外提供一个web服务,所以在dockerfile中通过
EXPOSE 8080
来完成这个端口的设置 - 这个配置信息会作为镜像的元数据被保存下来,并不会产生新的镜像层
(8)ENTRYPOINT [“node”, “./app.js”]
- 指定当前镜像的入口程序:将
app.js
设置为默认运行的应用 - 这个配置信息也会作为镜像的元数据被保存下来,并不会产生新的镜像层
问题:什么时候会创建新镜像层,什么时候不会
构建具体的镜像
$ docker image build -t web:latest .
可以使用如下命令来看构建镜像的过程中执行了哪些命令:
docker image history web:latest
(4)确认是否只有4个层被创建了
docker image inspect web:latest
推送镜像到仓库
(1)登录Docker login
(2)为镜像打标签
(3)推送镜像
什么是dockerfile
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 来快速创建自定义的镜像。
基本结构
Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。
一般而言, Dockerfile 主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。