docker系列:dockerfile学习

大家好~我是小方,欢迎大家关注「笋货测试笔记」体完记得俾个「like」

前言

之前介绍了用docker手动构建镜像部署pity,今天我们来使用dockerfile自动构建镜像并部署无敌鸽的pity。「pity项目地址」https://github.com/wuranxu/pity

前期准备

在服务器上需下载好pity项目,这里方式挺多的,譬如直接上传pity项目、git clone项目等等。本期暂时先不介绍,大家自行通过某度某歌某bing搜索教程即可。

什么是Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用Dockerfile定制镜像

这里先介绍如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解可继续往下看,这里你只要知道构建的流程即可。

下面以定制pity镜像为例子

去到项目的根目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

# 使用基础镜像
FROM python:3.9.9-buster
# 创建服务运行的目录
RUN mkdir /opt/server
#拷贝宿主机上下文目录到容器的/opt/server下
COPY . /opt/server
#cd命令进入到/opt/server,执行pip命令安装项目所需的包
RUN cd /opt/server && pip3 install -r requirements.txt -i https://pypi.douban.com/simple
#切换到/opt/server工作目录下
WORKDIR /opt/server
#容器启动时运行项目启动命令
CMD python3 main.py

FROM和RUN指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 python:3.9.9-buster就是定制需要的基础镜像。后续的操作都是基于 python:3.9.9-buster RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

  • shell 格式
RUN <命令行命令>等同于,在终端操作的 shell 命令。
RUN mkdir /opt/server 意思是新建/opt/server目录
  • exec 格式
RUN ["可执行文件", "参数1", "参数2"]
RUN ["./demo.sh", "age", "name"] 等价于 RUN ./demo.sh age name

「新手警告⚠️」

  • Dockerfile 的指令每执行一次都会在 docker 上新建一层,相当于叠罗汉一样
  • 每次commit,都会构成新的镜像。所以过多无意义的层,会造成镜像膨胀过大
  • 最好使用&& 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

构建之前,我们设置一下docker的国内镜像源

# 编辑daemon文件
vim /etc/docker/daemon.json
# 文件底下添加
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 重启docker服务
systemctl restart docker
# 查看docker信息
docker info
docker系列:dockerfile学习

去到项目的根目录下,通过项目目录下的 Dockerfile 构建一个 pity:v2(镜像名称:镜像标签)

docker系列:dockerfile学习
docker images

docker系列:dockerfile学习看到这里是不是有点疑惑了,build指令最后一个 . 是什么意思呢?很多人学习 Dockerfile 的时候,都会误以为 .  为 Dockerfile 所在的目录(包括我)其实这种理解是错误的,  . 其实就是上下文路径,上下文路径是什么?先来了解下Docker的架构和docker build的工作原理

Docker知识小课堂

理解Docker的架构

  1. Docker 是一个典型的 C/S 架构的应用,分为 Docker 客户端(平时敲的 docker 命令) Docker 服务端(dockerd 守护进程)
  2. Docker 客户端通过 REST API 和服务端进行交互,docker 客户端每发送一条指令,底层都会转化成 REST API 调用的形式发送给服务端,服务端处理客户端发送的请求并给出响应。
  3. Docker 镜像的构建、容器创建、容器运行等工作都是 Docker 服务端来完成的,Docker 客户端只是承担发送指令的角色。
  4. Docker 客户端和服务端可以在同一个宿主机,也可以在不同的宿主机,如果在同一个宿主机的话,Docker 客户端默认通过 UNIX 套接字(/var/run/docker.sock)和服务端通信。
docker系列:dockerfile学习

理解Docker build工作原理

理解了 Docker 的架构就很容易理解 docker build 构建镜像的工作原理了。docker build 构建镜像的流程大概如下:

  • 执行 docker build -t imageName:imageTag .
  • Docker 客户端会将构建命令后面指定的路径(.)下的所有文件打包成一个 tar 包,发送给 Docker 服务端
  • Docker 服务端收到客户端发送的 tar 包,然后解压,根据 Dockerfile 里面的指令进行镜像的分层构建

理解Docker构建上下文

  1. Docker 构建上下文就是 Docker 客户端上传给服务端的 tar 文件解压后的内容,也即 docker build 命令行后面指定路径下的文件。
  2. Docker 镜像的构建是在远程服务端进行的,服务端以客户端发送的文件为上下文,也就是说 Dockerfile 中指令的工作目录就是服务端解压客户端传输的 tar 包的路径。

「新手注意⚠️」

  • 如果构建镜像时没有明确指定 Dockerfile,那么 Docker 客户端默认在构建镜像时指定的上下文路径下找名字为 Dockerfile 的构建文件
  • Dockerfile 可以不在构建上下文路径下,此时需要构建时通过 -f 参数明确指定使用哪个构建文件
  • 上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢

测试启动

docker系列:dockerfile学习发现无法启动,排查定位问题,发现没有修改数据库配置,导致无法启动服务

# 查看容器日志
docker logs -f e2ac36137683

docker系列:dockerfile学习修改后,重新打包镜像并创建容器docker系列:dockerfile学习curl http://119.91.144.214:8888/ 访问成功

常用Dockerfile命令简略介绍

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

ADD 源 目标
ADD /opt/app /opt/app

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

# 第一种写法
CMD "python3" "main.py"
# 第二种写法
CMD [ "python3","main.py" ]
# 第三种写法,该写法是为ENTRYPOINT指令指定的程序提供默认参数
CMD ["<param1>","<param2>",...]

ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT python3
CMD "main.py"
ENTRYPOINT python3

ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。

ENV SERVER_WORKS 4

EXPOSE

这里仅仅只是声明端口,帮助镜像使用者理解这个镜像服务的守护端口,如果运行时使用随机端口映射时(docker run -P 大写注意!)自动随机映射 EXPOSE 的端口。

EXPOSE 8888

FROM

FROM命令是最重要的Dockerfile命令。此命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

FROM nginx:alpine

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

RUN pip3 install -r requirements.txt -i

「课外小知识⚠️」

  • Dockerfile 中每一个指令都会建立一层,RUN也一样,每一个RUN的行为就会新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。如果多条RUN命令依次执行,会产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。
  • 综上所述,RUN命令最好使用’&&’连接

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

WORKDIR /opt/server

总结

今天介绍了dockerfile构建pity镜像、相关的docker知识和dockerfile命令,大家看完回去记得实操一下,牢固知识点~ 下期我们来进行实战,dockerfile构建pity前端镜像,并部署在Nginx里。


原文始发于微信公众号(笋货测试笔记):docker系列:dockerfile学习

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/281633.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!