构建镜像

[toc]

镜像

是打包好的软件,由程序代码、基础系统、依赖关系open in new window的软件包、系统库和工具组成 。

  • Dockerfile:是制作镜像的文件

base 镜像

base 镜像有两层含义:

不依赖其他镜像,从 scratch 构建。

  • scratch:是最基础的docker镜像,相当于一个地基。

其他镜像可以在此基础上进行扩展。

用别的镜像做基础镜像 ➡️ 站在巨人的肩膀

rootfs和bootfs

bootfs和rootfs里面就是一些程序和文件

bootfs:容器启动的时候需要的内容,是 linux kernel 提供了bootfs

注意

内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。

即我们的容器全部用宿主机的内核kernel,而容器提供的只是不同的系统文件。bootfs,容器启动的时候需要的内容;rootfs,容器内部的操作系统

base 镜像提供的是最小安装的 Linux 发行版

下面是 CentOS 镜像的 Dockerfile 的内容:

FROM scratch
ADD centos-7-docker.tar.xz /
CMD ["bin/bash"]

镜像分层

Docker 支持通过扩展现有镜像,创建新的镜像。

docker pull debian  # 下载一个debian的镜像

编写 dockerfile:

FORM debian
RUN apt-get install emacs
RUN apt-get install apache2
CMD ["bin/bash"]

① 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建。 ② 安装 emacs 编辑器。 ③ 安装 apache2。 ④ 容器启动时运行 bash。

编译:

docker build -t mydebian .

制作镜像过程

使用 sealer 制作一个集群镜像,和 dockerfile 同也不同。

FROM python
# 我们在docker容器的工作目录。即进入docker容器的时候,所在的目录
WORKDIR /app 
 
# 复制当前目录下的所有内容到容器里边/app目录下
ADD . /app 
 
# 定义一个数据卷
VOLUME ["/data_flask"]
 
# requirements.txt会写明我这个项目会需要一些什么python库;\
# 这条命令是告诉容器把requirements.txt里需要的库到pypi.python.org这个网站里边下载
# 这条命令是在制作镜像的时候要运行的,而不是在启动容器的时候运行的,这个要记住很容易混淆
RUN pip install  --trusted-host pypi.python.org -r requirements.txt
 
# 暴露我们的端口号,即容器对外开放哪个端口
EXPOSE 80
 
# 定义环境变量
ENV NAME World
ENV AUTHOR fan
 
# 容器起来之后运行的第一个程序,这个是容器启动的时候运行,要和上边区分开来

构建生成:

# -t,打个标记,等于给这个镜像取个名字
docker build -t friendlyhello_1 .

生成镜像的时候,背后会自动生成临时的容器去执行Dockerfile里的命令,检测这个命令是否可以运行

运行:

docker run -d -p 5080:80 --name hello-1 friendlyhello_1