合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
作为一个程序员,如果你想安装一个 vim 编辑下文本,在不同环境里你得执行不同的命令。在 ubuntu,你需要执行 apt-get install vim,在 centos 里,你需要执行 yum install vim.
装个小软件尚且如此,要是你想将自己写的代码部署到各个不同操作系统的服务器上,那依赖的软件和配置就更多了,需要针对每个环境单独写一套部署脚本。难受,太难受了。
那么问题就来了,有没有更好的解决方案?当然有,没有什么是加一层中间层不能解决的,如果有,那就再加一层,这次我们要加的中间层是 Docker。
Docker是代码和操作系统之间的中间层
哦不,准确来说是 Docker容器。
我们经常能听到程序员说"这个程序在我环境里明明是好的啊,怎么到你这就不行了呢"?注意这里的关键词,程序和环境。程序是跑在操作系统上的,而操作系统上又装了各种不同版本的依赖库和配置,这些被程序所依赖的信息,我们统称为"环境"。
程序和环境
程序依赖环境,环境不同,程序就可能跑不起来。如果我们能将环境和程序一起打包,给到对方运行,那问题不就解决了吗。Docker 就是这样一款可以将程序和环境打包并运行的工具软件。我们来看下它是怎么做的?
既然上面提到环境不同,会导致程序运行结果不同,那么我们首先要做的最重要的事情,就是统一环境。而环境中,最最重要的就是操作系统。比如 centos 还是 ubuntu,我们得选一个,让所有程序都跑在同一个操作系统上。并且我们知道操作系统分为用户空间和内核空间,应用程序运行在用户空间。因此,我们可以阉割操作系统,只需要利用操作系统的用户空间部分,就能构建出应用所需的环境。其次就是统一程序语言依赖,比如要跑 python 应用,你得装个 python 解释器,要跑个 java 应用,得装个 JVM,要跑 go 应用,那就。。什么都不需要装。选中一个基础操作系统和语言后,我们将它们对应的文件系统,依赖库,配置等放一起打包成一个类似压缩包的文件,这就是所谓的基础镜像(Base Image)。
基础镜像是什么
有了基础镜像之后还不够,我们经常还需要安装一些依赖,比如yum install gcc,甚至还要创建一些文件夹。最后才是运行我们的目标应用程序。我们知道 linux 中,所有工作都可以通过命令行完成,所以我们可以将要做的事情以命令行的形式一行行列出来。就像一份 todo list。意思是要求在基础镜像的基础上按着 todo list 挨个执行命令。这份 todo list 长下面这样。
# 指定基础镜像
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 复制依赖文件到容器中
COPY requirements.txt .
RUN yum install gcc
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 将当前目录下的所有文件复制到容器的 /app 目录下
COPY . /app
# 设置容器启动时执行的命令
CMD ["python", "app.py"]
TOP