运维实践|Dockerfile自定义镜像

2023-11-28 12:06:34 浏览数 (2)

前言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

如何使用Dockerfile自定义镜像便成了我们的需求。下面开始动手实践下:

1 Dockerfile介绍

Dockerfile是用来构建Docker镜像的文本文件,其中包含了一条条构建镜像所需的指令和说明。通过使Dockerfile,我们可以自动化镜像的构建过程,并且可以自定义镜像的配置和依赖项。

使用Dockerfile制作镜像有很多好处,首先Dockerfile使得镜像的构建和部署过程更加简单和一致,其次Dockerfile使得镜像的版本管理更加容易,再者Dockerfile还可以屏蔽构建环境异构,基于相同的Dockerfile无论在哪里运行,构建结果都一致,无须考虑构建环境。

先来了解下两个概念:

❶ 脚本

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。

❷ 命令

Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

2 Dockerfile语法

  • From

FROM [基础镜像]:tag(指定版本)Eg:FROM ubuntu:16.04

  • RUN
代码语言:javascript复制
RUN <command> (shell模式])
RUN[“executeable”,”param1”,”param2”](exec模式)
Eg:RUN apt-get install –y nmon
Eg:RUN [“/bin/sh”,”-c”,”apt-get install –y nomn”]
  • MAINTAINERT
代码语言:javascript复制
MAINTAINER <name> 指定镜像作者信息
Eg: MAINTAINER Aion2023 “763999883@qq.com”
  • EXPOSE
代码语言:javascript复制
EXPOSE  <port> <…> 指定运行该镜像的容器使用的端口
Eg:EXPOSE  8080  3306
  • CMD
代码语言:javascript复制
RUN <command> (shell模式])
RUN[“executeable”,”param1”,”param2”](exec模式)
Eg:RUN apt-get install –y nmon
Eg:RUN [“/bin/sh”,”-c”,”apt-get install –y nomn”]
  • WORKDIR

指定工作空间

3 Dockerfile实例

上面已经解释了各个命令以及用法,下面开始一个简单的Dockerfile示例,用于构建一个基于Python的自定义镜像:

代码语言:javascript复制
# 使用官方的Python镜像作为基础镜像  
FROM python:3.8-slim-buster  
  
# 设置工作目录  
WORKDIR /app  
  
# 将当前目录下的所有文件复制到容器的/app目录下  
COPY . /app  
  
# 安装依赖项  
RUN pip install --no-cache-dir -r requirements.txt  
  
# 配置环境变量  
ENV NAME World  
  
# 运行应用程序  
CMD ["python", "app.py"]

我们首先指定了要使用的官方Python镜像作为基础镜像。然后,我们设置了工作目录,并将当前目录下的所有文件复制到容器的/app目录下。接下来,我们使用RUN指令安装了所需的依赖项。然后,我们配置了一个环境变量NAME,并将其设置为World。最后,我们指定了要运行的命令来启动应用程序。

通过使用Dockerfile,我们可以轻松地构建自定义的Docker镜像,并确保其包含所需的依赖项和配置。

4 Dockerfile的编译打包

Dockerfile是用来构建Docker镜像的文本文件,其中包含了一条条构建镜像所需的指令和说明。构建步骤如下:

  1. 编写Dockerfile文件。Dockerfile文件是用来定义镜像构建步骤的文本文件,它包含了构建镜像所需的指令和说明。
  2. 使用docker build命令构建称为一个镜像。这个命令会按照Dockerfile文件的指示,自动化地构建镜像。

具体的实践代码如下(注意所有的命令之间都是英文的空格,个数没有限制):

代码语言:javascript复制
# docker build 仓库/镜像名 .

# docker build 仓库/镜像名 .  --no-cache [不带缓存]


我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞