构建镜像
[toc]
镜像
是打包好的软件,由程序代码、基础系统、依赖关系的软件包、系统库和工具组成 。
- 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