【DevOps】Dockerfile详解,做自己的docker镜像

66 篇文章 3 订阅
57 篇文章 0 订阅

学会使用DockerHub找自己想要的镜像以后,我们会很方便的使用一些公用镜像仓库的Docker镜像。但是开发和部署的过程中,能找到的镜像可能并不能满足我们需要,这样我们就需要自己制作Docker镜像。我们通过需要编写一个 Dockerfile,然后来生成一个Docker镜像。Dockerfile 是一个文本文件,包含了从基础镜像构建新镜像所需的一系列命令和参数。这些命令涵盖了复制文件、安装软件、设置环境变量等多种操作,它们在 Docker 镜像构建过程中按顺序执行。

一、Dockerfile 基本结构和常用指令

  1. FROM - 指定基础镜像

    FROM ubuntu:20.04
    

    这条指令设置了使用 Ubuntu 20.04 作为基础镜像。

  2. RUN - 执行命令

    RUN apt-get update && apt-get install -y nginx
    

    运行命令来更新包管理器的索引并安装 Nginx。

  3. CMD - 提供容器启动时的默认执行命令

    CMD ["nginx", "-g", "daemon off;"]
    

    设置容器启动时默认运行 Nginx。

  4. EXPOSE - 声明端口

    EXPOSE 80
    

    告知 Docker 镜像意图在运行时开放 80 端口。

  5. ENV - 设置环境变量

    ENV NGINX_VERSION 1.14
    

    设置环境变量 NGINX_VERSION

  6. COPY 和 ADD - 复制文件/目录

    COPY . /app
    

    将当前目录下的所有文件复制到镜像的 /app 目录中。

  7. WORKDIR - 设置工作目录

    WORKDIR /app
    

    设置后续的 RUN、CMD、ENTRYPOINT 命令的工作目录。

  8. ENTRYPOINT - 设置容器启动时执行的命令

    ENTRYPOINT ["python3", "-m", "http.server"]
    

    设置容器启动时运行 Python3 的 HTTP 服务器。

  9. USER - 设置运行用户

    USER myuser
    

    指定接下来的 RUN、CMD 以及 ENTRYPOINT 命令的运行用户。

  10. ARG - 定义构建参数

    ARG version
    

    定义一个名为 version 的参数,可在构建时提供。

  11. VOLUME - 定义匿名卷

    VOLUME /var/log/nginx
    

    在容器中创建一个点 /var/log/nginx,可以用来存储数据。

二、构建和运行 Docker 镜像

1、编写 Dockerfile:根据需要创建一个包含上述指令的 Dockerfile。假设文件内容如下:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY . /var/www/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

以下是 Dockerfile 的详细解释:

  • FROM ubuntu:20.04:指定基础镜像为 Ubuntu 20.04。这意味着构建的 Docker 镜像将基于 Ubuntu 20.04 镜像。
  • RUN apt-get update && apt-get install -y nginx:执行命令,更新软件包列表和安装 Nginx。这里使用了 && 符号,表示在更新软件包列表后再安装 Nginx。-y 参数表示在安装过程中自动回答 yes。
  • COPY . /var/www/html:将当前目录中的所有文件复制到容器的 /var/www/html 目录中。这里的 . 表示当前目录,/var/www/html 是 Nginx 的默认网站目录。
  • EXPOSE 80:声明容器将监听 80 端口。这里的 80 端口是 Nginx 的默认端口。
  • CMD ["nginx", "-g", "daemon off;"]:指定容器启动时执行的命令。这里的命令是启动 Nginx,并使用 daemon off; 参数以前台模式运行。

 这个 Dockerfile 构建了一个简单的 Nginx 服务器,它基于 Ubuntu 20.04,安装了 Nginx,并配置了服务器以运行你提供的网站内容。当构建并运行这个镜像时,它将启动 Nginx 并使其能够提供静态内容,监听在容器的 80 端口上。这种配置非常适合托管静态网站或作为 Web 应用的前端服务器。

2、构建镜像:在 Dockerfile 所在目录执行以下命令:

docker build -t my-nginx-image .

这将构建一个新的镜像,并标记为 my-nginx-image

命令的参数说明如下:

  • docker:Docker 命令行工具的名称。
  • build:构建 Docker 镜像的命令。
  • -t:指定镜像的标签(tag)。这里的标签为 my-nginx-image,表示构建的 Docker 镜像的名称为 my-nginx-image
  • .:指定 Dockerfile 所在的路径。这里的路径为 .,表示 Dockerfile 位于当前目录。

执行 docker build -t my-nginx-image . 命令后,Docker 会在当前目录中查找 Dockerfile,然后根据 Dockerfile 中的指令,构建 Docker 镜像。构建完成后,镜像会被存储在本地,可以使用 docker images 命令查看。

3、运行容器

docker run -p 8080:80 my-nginx-image

这会启动一个容器实例,使用该镜像,并将本地的 8080 端口映射到容器的 80 端口。

命令的参数说明如下:

  • docker:Docker 命令行工具的名称。
  • run:运行 Docker 容器的命令。
  • -p:指定端口映射。这里的端口映射是将容器的 80 端口映射到宿主机的 8080 端口。这意味着当访问宿主机的 8080 端口时,会被转发到容器的 80 端口。
  • my-nginx-image:指定要运行的 Docker 镜像。这里的镜像名称为 my-nginx-image,是之前构建的 Docker 镜像。

通过这些步骤,你可以创建几乎任何类型的 Docker 镜像,以满足各种应用场景和需求。

三、基础镜像选择

基础镜像(Base Image)是构建 Docker 镜像的起点,所有 Docker 镜像都是从一个基础镜像开始构建的。基础镜像包含了操作系统的最小化安装或特定应用的运行环境,从中可以添加更多的层次(Layer)来创建最终的镜像。

常见的基础镜像
  • Ubuntu

    • 描述:Ubuntu 是一个基于 Debian 的开源操作系统,广泛用于云和服务器环境中。
    • 优点:广泛的社区支持,丰富的包库,频繁的更新。
    • 使用场景:适用于需要稳定、多功能和易于使用的 Linux 环境的应用。
  • Alpine Linux

    • 描述:Alpine Linux 是一个面向安全的轻量级 Linux 发行版,使用 musl libc 和 busybox。
    • 优点:非常小的镜像大小(通常在 5MB 左右),提高了安全性和资源效率。
    • 使用场景:非常适合创建小型、安全的容器化应用。
  • CentOS

    • 描述:CentOS 是一个基于 Red Hat Enterprise Linux 的开源操作系统,具有企业级的稳定性和安全性。
    • 优点:长期支持,企业级部署的好选择。
    • 使用场景:适用于需要企业级支持和广泛兼容性的应用。
  • Debian

    • 描述:Debian 是一个极其稳定的操作系统,它是 Ubuntu 和许多其他 Linux 发行版的基础。
    • 优点:稳定性强,支持周期长,包管理系统成熟。
    • 使用场景:适合需要长期稳定支持的服务器和应用。
  • Scratch

    • 描述:在 Docker 的上下文中,scratch 是一个空白的镜像,不包含任何文件或内容。
    • 优点:可以从零开始构建镜像,完全控制镜像内容。
    • 使用场景:适合需要极致轻量化的专用容器,或者构建基于 C/C++ 等不依赖于操作系统发行版的应用。
  • BusyBox

    • 描述:BusyBox 结合了多个 UNIX 实用工具的单个小型可执行文件,经常用在嵌入式环境中。
    • 优点:非常小巧,适合嵌入式系统和资源受限环境。
    • 使用场景:适用于需要最小化 Linux 系统的简单容器。
如何选择基础镜像

选择基础镜像时,应考虑以下因素:

  1. 镜像大小:选择更小的基础镜像可以减少构建时间和提高容器启动速度。
  2. 安全性:一些基础镜像如 Alpine Linux 专注于提供最小化的安全风险。
  3. 兼容性:某些应用可能依赖于特定的系统库或环境,选择兼容这些需求的基础镜像是关键。
  4. 社区和支持:广泛使用的基础镜像通常有较大的社区和更好的支持。
  5. 更新和维护:选择活跃维护和定期更新的基础镜像以保证安全和最新。

通过这些考虑,你可以选择最适合你的项目需求的基础镜像。在 Dockerfile 中使用基础镜像非常简单,只需在文件顶部使用 FROM 指令指定即可。

  • 72
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论
Docker镜像下载是在使用Docker技术时的一个重要步骤。当我们想要在本地运行容器时,必须先下载对应的镜像。默认情况下,Docker会尝试从默认的镜像仓库(通常是Docker Hub公共仓库)下载镜像。用户也可以自定义配置要下载的镜像仓库。\[1\] Docker镜像具有分层、按内容寻址和体积小等优点,并且可以通过镜像仓库方便地进行分发。然而,在下载Docker镜像的过程中,也存在一些安全风险,例如镜像篡改和非法镜像。为了能够正常使用Docker镜像并享受Docker技术带来的便利,我们需要正确实施足够的安全措施。\[2\] 如果你想在不使用Docker的情况下从Docker Hub下载镜像,你可以参考一些指南和教程,例如在DevOps Stack Exchange上的一个问题中提到的方法。根据这些指引,你可以编写一个小程序来实现这个目标。\[3\] #### 引用[.reference_title] - *1* [Docker 下载镜像](https://blog.csdn.net/weixin_30488085/article/details/96641320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Docker镜像下载初探](https://blog.csdn.net/YiAnSociety/article/details/115747928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [直接下载docker镜像包](https://blog.csdn.net/baijiafan/article/details/129077647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder加油!

感谢您的认可和支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值