Docker image的来源

日常使用中Python,Nginx,Tomcat,Mysql 这些镜像都是哪里来的? 来源于官方制作的镜像。

我们可以制作属于自己的自定义镜像吗? 可以。

假如我们自己做一个镜像,合并我们写的微服务项目打包上云部署,Docker 就是最方便的。

微服务打包成镜像,任何装了 Docker 的地方,都可以下载使用,极其方便。

流程:开发应用 => 编写 Dockerfile => 打包为镜像 => 上传到仓库(私有仓库公司内部,公有仓库 Dockerhub)=> 下载镜像 => 启动运行。

理论上这是最为便捷的执行途径。

[Docker]如何构建一个自定义Docker工程专属镜像(篇3)_ubuntu

Dockerfile是什么?

Dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于执行镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。

通过编写 Dockerfile,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。

Dockerfile 的基本结构包括以下几个部分

基础映像(Base Image):使用 FROM 指令指定基础映像,作为构建镜像的起点。基础映像通常包含了操作系统和一些预装的软件和工具。

构建过程指令:使用一系列指令来描述构建过程,例如 RUN 用于执行命令和安装软件包,COPY 用于拷贝文件和目录,ADD 用于拷贝和提取文件,WORKDIR 用于设置工作目录,等等。

容器启动指令:使用 CMD 或 ENTRYPOINT 指令来定义容器启动时要执行的命令,也就是默认的容器执行命令。

通过编写 Dockerfile,可以自定义构建过程,选择所需的软件和配置,以及设置环境变量、开放端口等。Dockerfile 的语法简单且易于理解,使得镜像的构建过程变得可重复和可维护。

综上所述,Dockerfile 是定义和构建 Docker 镜像的文本文件,通过编写指令和参数来描述镜像的构建过程和配置,以实现应用程序的打包和部署。它是使用 Docker 进行容器化开发和部署的重要工具。


核心步骤

  1. 编写 Dockerfile 文件
  2. Docker build 构建镜像
  3. Docker run 镜像

Dockerfile 构建过程

基础知识:

每条保留字指令都必须为大写字母且后面要跟随至少一个参数

指令按照从上到下,顺序执行

# 表示注释

每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:

Docker 从基础镜像运行一个容器

执行一条指令并对容器做出修改

执行类似 Docker commit 的操作提交一个新的镜像层

Docker 再基于刚提交的镜像运行一个新容器

执行 Dockerfile 中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,Dockerfile,Docker 镜像与 Docker 容器分别代表软件的三个不同阶段。

Dockerfile 是软件的原材料(代码)

Docker 镜像则是软件的交付品(.apk)

Docker 容器则是软件的运行状态(客户下载安装执行)

Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者构成一个闭环。

Dockerfile 指令

关键字:

FROM         # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER   # 镜像维护者的姓名混合邮箱地址
RUN          # 容器构建时需要运行的命令
EXPOSE       # 当前容器对外保留出的端口
WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV          # 用来在构建镜像过程中设置环境变量
ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY         # 类似ADD,拷贝文件和目录到镜像中!
VOLUME       # 容器数据卷,用于数据保存和持久化工作
CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

编写 Dockerfile

Dockerhub 中99%的镜像都是通过在 base 镜像(Scratch)中安装和配置需要的软件构建出来的。

我们在使用 Dockerfile 构建 docker 镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。

如果我们的需求是在构建一个符合我们实际业务需求的 Docker 镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?

思路是使用空镜像 scratch,可以说是真正的从零开始构建属于自己的镜像,镜像的第一层

发布一个自己编写的 Python3镜像

由于官方的 Python3镜像大约900多兆,需要自定义一个Python3镜像,减少体积,让它能够正常运行py

编写 dockerfile 如下:

# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04

# 设置环境变量,避免交互式配置
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG C.UTF-8

# 设置更新源
RUN sed -i 's@http://archive.ubuntu.com/ubuntu/@http://mirrors.aliyun.com/ubuntu/@g' /etc/apt/sources.list

# 更新包列表并安装必要的软件
RUN apt-get update \
   && apt-get install -y git curl wget python3.10 libpython3.10-dev python3-pip \
   && apt-get install -y libgl1-mesa-glx libglib2.0-0 \
   && ln -sf /usr/bin/python3.10  /usr/bin/python3 \
   && ln -sf /usr/bin/python3.10  /usr/bin/python \
   && apt-get autoclean && rm -rf /var/lib/apt/lists/*

# 创建一个工作目录
WORKDIR /myapp3

# 将当前目录内容复制到工作目录内
COPY . /myapp3

# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 设置默认命令,开机执行指定的bash
CMD ["bash"]

构建镜像

docker build -t python3:v1 .

参数:

  • -f:等价于--file,指定 dockerfile 文件
  • -t:等价于--tag,指定输出的镜像文件名:版本号

构建容器

docker -itd --name python-ss -w /usr/src/myapp python3:v1


显示layer层

docker image history python3:v1

[Docker]如何构建一个自定义Docker工程专属镜像(篇3)_python_02

执行命令

docker exec -it python-ss bash


查看ubuntu版本信息

cat /etc/os-release


至此,我们创建了一个属于自己 的Python3镜像文件和容器,可以执行后期工程所需步骤。