Docker image的来源
日常使用中Python,Nginx,Tomcat,Mysql 这些镜像都是哪里来的? 来源于官方制作的镜像。
我们可以制作属于自己的自定义镜像吗? 可以。
假如我们自己做一个镜像,合并我们写的微服务项目打包上云部署,Docker 就是最方便的。
微服务打包成镜像,任何装了 Docker 的地方,都可以下载使用,极其方便。
流程:开发应用 => 编写 Dockerfile => 打包为镜像 => 上传到仓库(私有仓库公司内部,公有仓库 Dockerhub)=> 下载镜像 => 启动运行。
理论上这是最为便捷的执行途径。
Dockerfile是什么?
Dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于执行镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。
通过编写 Dockerfile,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。
Dockerfile 的基本结构包括以下几个部分:
基础映像(Base Image):使用 FROM 指令指定基础映像,作为构建镜像的起点。基础映像通常包含了操作系统和一些预装的软件和工具。
构建过程指令:使用一系列指令来描述构建过程,例如 RUN 用于执行命令和安装软件包,COPY 用于拷贝文件和目录,ADD 用于拷贝和提取文件,WORKDIR 用于设置工作目录,等等。
容器启动指令:使用 CMD 或 ENTRYPOINT 指令来定义容器启动时要执行的命令,也就是默认的容器执行命令。
通过编写 Dockerfile,可以自定义构建过程,选择所需的软件和配置,以及设置环境变量、开放端口等。Dockerfile 的语法简单且易于理解,使得镜像的构建过程变得可重复和可维护。
综上所述,Dockerfile 是定义和构建 Docker 镜像的文本文件,通过编写指令和参数来描述镜像的构建过程和配置,以实现应用程序的打包和部署。它是使用 Docker 进行容器化开发和部署的重要工具。
核心步骤
- 编写 Dockerfile 文件
- Docker build 构建镜像
- 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 exec -it python-ss bash
查看ubuntu版本信息
cat /etc/os-release
至此,我们创建了一个属于自己 的Python3镜像文件和容器,可以执行后期工程所需步骤。