使用dockerfile创建镜像

1.什么是Dockerfile

Dockerfile 是一个用于指导 Docker 镜像构建过程的脚本文件。它通过一系列指令来详细描述了构建镜像所需的步骤和配置细节。利用 Dockerfile,我们可以精确地设定容器的运行环境,安装必要的软件,复制项目文件,以及配置环境变量等。

Dockerfile 的优势在于其可重复性和自动化,使得应用程序的容器化过程既高效又可靠。通过将构建过程代码化,我们能够对构建步骤进行版本控制,并在不同的环境中复现相同的镜像。

Dockerfile 的组成通常包括以下几个方面:指定基础镜像、提供维护者信息、执行镜像构建指令以及定义容器启动时要运行的命令。

在 Dockerfile 中,指令是按照从上到下的顺序执行的,且首个非注释指令必须是 FROM,用以指定基础镜像。Dockerfile 中的注释以“#”开头。

Dockerfile 支持多种指令,例如 RUN、CMD、FROM、EXPOSE、ENV 等,这些指令帮助我们定义镜像的操作系统、安装软件、设置环境变量等。

编写完 Dockerfile 后,我们可以通过执行 docker build 命令并指定 Dockerfile 的位置来构建镜像。Docker 引擎将按照 Dockerfile 中的指令逐步构建,最终生成一个新的镜像。

综上所述,Dockerfile 是一个关键工具,它通过简洁明了的文本指令,帮助我们自动化和标准化 Docker 镜像的构建过程,从而简化了容器化应用程序的部署工作。

2.Dockerfile 中常用的指令

指令说明
FROM指定基础镜像
MAINTAINER设置维护者信息
RUN在镜像中执行命令
CMD指定容器启动时要执行的命令
ENTRYPOINT与 CMD 类似,但不会被 docker run 命令行参数覆盖
COPY复制文件或目录到镜像中
ADD复制文件或目录到镜像中,支持远程 URL 和解压缩功能
ENV设置环境变量
ARG定义构建时的变量,可以通过 --build-arg 参数传递
WORKDIR设置工作目录
USER指定运行容器时的用户名或 UID
EXPOSE声明容器运行时需要监听的端口
HEALTHCHECK定义容器的健康检查命令
VOLUME声明容器中的挂载点
LABEL为镜像添加元数据

注意事项:

FROM

  • 尽量使用官方镜像作为基础镜像,以确保稳定性和安全性。
  • 指定镜像时,最好使用具体标签(例如 ubuntu:20.04 而不是 ubuntu:latest),以避免构建时的不一致性。

MAINTAINER(已废弃,推荐使用 LABEL)

  • 请注意,MAINTAINER 指令已被废弃,现在推荐使用 LABEL 指令来设置维护者信息。

RUN

  • 为了保持 Dockerfile 的可读性和可维护性,尽量使用 && 来链式执行命令,并使用 \ 来换行。
  • 尽可能使用 RUN apt-get clean 来清理缓存,减少镜像大小。

CMD

  • CMD 指令的目的是为执行容器提供默认值,如果 docker run 指定了命令,CMD 会被覆盖。
  • 当 Dockerfile 中有多个 CMD 指令时,只有最后一个 CMD 会生效。

ENTRYPOINT

  • ENTRYPOINT 与 CMD 结合使用可以设置容器启动时要执行的默认命令和参数。
  • 使用 ENTRYPOINT ["executable", "param1", "param2"] 的形式可以确保 docker run 的参数被追加到 param1param2 后面。

COPY 和 ADD

  • 尽可能使用 COPY 而不是 ADD,除非你需要 ADD 的额外功能(如解压缩)。
  • 为了提高可读性,请明确指定源路径和目标路径。

ENV

  • 使用 ENV 来设置环境变量,可以在后续的指令中使用这些变量。
  • 尽量将环境变量设置在 Dockerfile 的顶部,以便于其他指令引用。

ARG

  • ARG 指令定义的变量只在构建时有效,容器运行时不可用。
  • 使用 ARG 定义的变量可以在 docker build 时通过 --build-arg 传递。

WORKDIR

  • 使用 WORKDIR 而不是多个 RUN 指令中的 cd,以确保路径的清晰性和一致性。

USER

  • 使用 USER 指令来指定运行容器的用户,以减少安全风险。

EXPOSE

  • EXPOSE 指令只是声明容器将监听指定的端口,并不会自动映射端口到宿主机。

HEALTHCHECK

  • 使用 HEALTHCHECK 来检测容器的健康状态,这对于自动重启失败的容器很有用。

VOLUME

  • 使用 VOLUME 来管理容器的数据持久化,避免数据丢失。

LABEL

  • 使用 LABEL 来添加元数据,便于组织镜像和记录版本信息。

这些指令可以根据需要灵活组合,构建出符合需求的 Docker 镜像。请注意,Dockerfile 中的指令顺序很重要,因为每个指令都会创建一个新的镜像层,而后续的指令将基于前面的镜像层进行操作。

更详细的指令说明和用法,请参考 Docker 官方文档:

Dockerfile reference | Docker Docs

3.dockerfile基本结构和构建镜像原则

3.1 基本结构

3.2 构建基本原则

dockerfile构建镜像需要遵循一下原则:

  • 单一职责:每个层级只做每个层级的事
  • 提供注释信息:最好提供注释信息,以便他人理解
  • 保持容器最小化
  • 合理选择基础镜像:基础镜像的选择很重要,尽量选择成熟易用的基础镜像版本
  • 最小化镜像层数:镜像层数不宜过多,尽量精简,否则容易出错,也可能会影响加载速度

通过上面的示例图可以看出,每多一行命令,镜像的内容就多一层。

其他注意事项:

  • 尽量减少镜像层数,可以通过合并 RUN 指令来实现。
  • 使用 .dockerignore 文件排除不必要的文件和目录,减少构建上下文的大小。
  • 保持 Dockerfile 的简洁性,避免在其中执行复杂的操作,尽可能在构建上下文中准备数据。
  • 定期更新基础镜像以包含最新的安全补丁。

4.Dockerfile使用示例

4.1 基于centos8镜像构建nginxWeb服务镜像

以下是一个简单的 Dockerfile示例,以构建一个基于 centos 的配置web服务的镜像:

1.创建构建上下文目录:

[root@open-Euler3 ~]# mkdir dockerfile_test

2.本地添加nginx测试界面用于COPY

[root@open-Euler3 ~]# echo "nginx test" > dockerfile_test/index.html

3.编写Dockerfile文件

[root@open-Euler3 dockerfile_test]# cat Dockerfile
# 1. 第一行必须指定基础镜像信息
ARG VER=8
FROM centos:${VER}# 2. 作者信息
LABEL maintainer="openlab <openlab@123.com>"# 3. 安装 nginx
RUN mkdir -p /etc/yum.repos.d/bak_repo && \mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak_repo/ 2>/dev/null || true && \curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo && \dnf clean all && \dnf makecache && \dnf install -y nginx# 4. 复制静态文件
COPY index.html /usr/share/nginx/html# 5. 暴露端口
EXPOSE 80 443# 6. 启动服务
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

4.docker build 构建镜像

注意:-t  选项指定构建出镜像的标签 最后的 "." 指定的是当前目录,也就是构建上下文目录,Dockerfile所在的目录

5.查看构建的镜像

[root@open-Euler3 dockerfile_test]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
centos_nginx                 latest    7ca95c53855e   2 minutes ago   342MB
ubuntu                       18.04     f9a80a55f492   21 months ago   63.2MB
reg.yym.com/openlab/ubuntu   18.04     f9a80a55f492   21 months ago   63.2MB
centos                       8         5d0da3dc9764   3 years ago     231MB

6.启动容器并进行测试:

4.2 基于ubuntu镜像配置SSH服务

要求:
    1、基础镜像ubuntu:18.04。
    2、替换为国内的安装源(比如阿里或163)。
    3、安装openssh-server。
    4、允许root用户远程登录。
    5、暴露端口22。
    6、服务开机自启动。

1.创建构建上下文目录:

[root@open-Euler3 dockerfile_ssh]# pwd #这是我的构建上下文位置
/root/dockerfile_ssh

2.文件准备

1)apt源:

[root@open-Euler3 dockerfile_ssh]# cat 163.list
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

2)客户端公钥文件

[root@open-Euler3 dockerfile_ssh]# ssh-keygen -f ~/.ssh/id_rsa -P '' -q #生成公私钥
[root@open-Euler3 dockerfile_ssh]# cp ~/.ssh/id_rsa.pub ./authorized_keys

3)准备启动脚本文件

[root@open-Euler3 dockerfile_ssh]# cat run.sh
#!/bin/bash
/usr/sbin/sshd -D
[root@open-Euler3 dockerfile_ssh]# chmod +x run.sh

4)编写Dockerfile文件

[root@open-Euler3 dockerfile_ssh]# vim Dockerfile
FROM ubuntu:18.04MAINTAINER "kongd <kongd@11.com>"RUN mv /etc/apt/sources.list /etc/apt/sources.bak
COPY aliyun.list /etc/apt/sources.list.d/aliyun.list
RUN apt update && apt install -y openssh-server && mkdir -p /var/run/sshd
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/' /etc/pam.d/sshd
COPY run.sh /run.sh
RUN chmod +x /run.sh
RUN mkdir /root/.ssh
COPY authorized_keys /root/.ssh/authorized_keysEXPOSE 22/tcpCMD ["/run.sh"]

docker build 构建镜像)

查看镜像:

[root@open-Euler3 dockerfile_ssh]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED         SIZE
ssh1_image                   latest    98ea77f917f0   4 minutes ago   248MB
centos_nginx                 latest    fb1d61ed3b60   3 hours ago     342MB
ubuntu                       18.04     f9a80a55f492   21 months ago   63.2MB
reg.yym.com/openlab/ubuntu   18.04     f9a80a55f492   21 months ago   63.2MB
centos                       8         5d0da3dc9764   3 years ago     231MB

通过构建的镜像启动一个容器:

[root@open-Euler3 dockerfile_ssh]# docker run -itd --name ssh1_c1 -p 10022:22 ssh1_image
cfec71666b634dfbfea43427cf1846d9516bcc3a9806f923a6391e560a721319
[root@open-Euler3 dockerfile_ssh]# docker ps -a
CONTAINER ID   IMAGE        COMMAND     CREATED         STATUS         PORTS                                     NAMES
cfec71666b63   ssh1_image   "/run.sh"   3 seconds ago   Up 3 seconds   0.0.0.0:10022->22/tcp, :::10022->22/tcp   ssh1_c1

测试ssh免密登录:

可以看到直接通过映射后的宿主机IP+端口登录到容器的shell上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在CentOS系统上安装Conda的详细指南

前言 Conda 是一个开源的包管理系统和环境管理系统&#xff0c;广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda&#xff0c;帮助您快速搭建开发环境。 准备工作 在开始安装之前&#xff0c;请确保您的 CentOS 系统已经满足以下条件&#x…

大脑宏观结构中的富集俱乐部:图论分析视角

摘要 大脑是一个高度复杂的网络。越来越多的证据支持大脑网络中一组重要脑区的关键作用&#xff0c;这些脑区通常被称为大脑的“核心”或“枢纽”区域。这些区域不仅能量消耗较高&#xff0c;而且在神经信息传递方面的效率也极高&#xff0c;因此被称为“富集俱乐部”。富集俱乐…

Redis7——进阶篇(五)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

Reflect.get和target[key]有何不同?

主要区别在this指向不同&#xff0c;下面输出张三还是李四?&#xff1a; const person{name:张三,get FullName(){return this.name;},};let personProxynew Proxy(person,{get(target,key){return Reflect.get(target,key)//或者return target[key]}});const p1{__proto__:pe…

rust语言match模式匹配涉及转移所有权Error Case

struct S{data:String, }//注意&#xff1a;因为String默认是移动语义&#xff0c;从而决定结构体S也是移动语义&#xff0c;可采用(1)或(2)两种方法解决编译错误&#xff1b;关键思路&#xff1a;放弃获取结构体S的字段data的所有权&#xff0c;改为借用。fn process(s_ref:&a…

光谱相机检测肉类新鲜度的原理

光谱相机通过分析肉类样本在特定波长范围内的光谱反射特性&#xff0c;结合化学与生物指标的变化规律&#xff0c;实现对其新鲜度的无损检测。其核心原理可概括为以下方面&#xff1a; 一、光谱特征与物质成分的关联性 ‌物质特异性吸收/反射‌ 不同化学成分&#xff08;如水分…

c#面试题整理9

1.遍历xml文档 2.解释一下这段 String s new String("xyz"); 这段在C#平台中&#xff0c;编译失败 3.说明一下抽象类 抽象类可以有构造函数 抽象类不能是静态和密封的类&#xff0c;密封的类表示无法继承&#xff0c;抽象类本身就不可实例化&#xff0c;加不好…

《React 属性与状态江湖:从验证到表单受控的实战探险》

属性初识 属性能解决两个大问题&#xff1a;通信和复用 props.js: import React, { Component } from react import Navbar from ./Navbarexport default class App extends Component {state {a:100}render() {return (<div><div><h2>首页</h2>&l…

Qwen/QwQ-32B 基础模型上构建agent实现ppt自动生成

关心Qwen/QwQ-32B 性能测试结果可以参考下 https://zhuanlan.zhihu.com/p/28600079208https://zhuanlan.zhihu.com/p/28600079208 官方宣传上是该模型性能比肩满血版 DeepSeek-R1&#xff08;671B&#xff09;&#xff01; 我们实现一个 使用Qwen/QwQ-32B 自动生成 PowerPoi…

Javascript基础语法详解

面向对象的语言.脚本语言,不需要编译,浏览器解释即可运行 .用于控制网页的行为.浏览器的source可以打断点调试, console输入代码可以执行 use strict指令: 在“严格模式”下运行js代码, 防止意外创建全局变量等, 提高代码安全性和执行效率. 使用: 全局严格模式&#xff1a;…

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点&#xff1a; 面向连接&#xff0c;可靠性高&#xff0c;全双工&#xff0c;面向字节流udp特点&#xff1a;无连接&#xff0c;不…

JAVASE(五)

目录 一、成员变量和局部变量 1.定义 2.区别 &#xff08;1&#xff09;相同 &#xff08;2&#xff09;不同 二、方法和构造方法 1.定义 2.构造方法细节 3.方法重载 一、成员变量和局部变量 1.定义 &#xff08;1&#xff09;成员变量是…

Matlab中快速查找元素索引号

1、背景介绍 在算法设计过程中&#xff0c;有时候需要从一维/二维数组中&#xff0c;快速查找是否某个元素&#xff0c;以及该元素所在的位置。如一维矩阵[1 2 3 4 5 6 6 7 8]所示&#xff0c;元素6所在的位置为6 7。 2、函数测试 matlab中函数find()可以快速查找到指定元素所…

【DuodooTEKr 】多度科技 以开源之力,驱动企业数字化转型

多度科技 背景 / Background 在全球产业链重构与国内经济双循环的浪潮下&#xff0c;中国制造业与贸易企业正面临数字化升级的迫切需求。开源技术作为数字化转型的基石&#xff0c;不仅能打破技术壁垒、降低企业成本&#xff0c;更能通过协作创新加速产业智能化进程。 多度科技…

【HarmonyOS Next】鸿蒙应用故障处理思路详解

【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象&#xff1a; 常见的崩溃问题表现为&#xff0c;应用操作后白屏闪退&#xff0c;或者应用显示无响应卡死。 2.定位问题&#xff1a; 发现崩溃后&#xff0c;我们首先需要了解复现步骤&#x…

linunx ubuntu24.04.02装libfuse2导致无法开机进不了桌面解决办法

osu.appimage运行需要libfuse2 然后我就下了fuse,打了两把第二天无法开机 这样是不能开机的 这样是可以开机的 解决办法一&#xff1a;玩星火商店的osu&#xff0c;好了问题解决 解决办法二&#xff1a; 在这个页面 ctrl alt f2进入tty6 sudo apt install ubuntu-desktop 进…

Maven 的常用指令

一、核心构建指令 mvn clean 作用&#xff1a;删除 target 目录&#xff08;清理编译/打包生成的文件&#xff09;。 场景&#xff1a;确保从头开始构建&#xff0c;避免残留文件干扰。 mvn compile 作用&#xff1a;编译项目源代码。 场景&#xff1a;快速检查代码是否能编…

llvm数据流分析

llvm数据流分析 1.数据流分析2.LLVM实现2.1.常量传播2.2.活跃性分析 相关参考文档&#xff1a;DataFlowAnalysisIntro、ustc编译原理课程、南大程序分析课程1、南大程序分析课程2。 1.数据流分析 数据流分析在编译优化等程序分析任务上都有重要应用。通常数据流分析可被抽象为…

C++ MySQL 常用接口(基于 MySQL Connector/C++)

C MySQL 常用接口&#xff08;基于 MySQL Connector/C&#xff09; 1. 数据库连接 接口&#xff1a; sql::mysql::MySQL_Driver *driver; sql::Connection *con;作用&#xff1a; 用于创建 MySQL 连接对象。 示例&#xff1a; driver sql::mysql::get_mysql_driver_insta…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…