详解 docker 镜像制作的两种方式

概要

制作Docker镜像一般有2种方法:

  1. 通过Dockerfile,完成镜像的创建
  2. 使用仓库中已有的镜像,安装自己使用的软件环境后完成新镜像创建

docker 常用命令

  1. docker build: 用于构建 Docker 镜像。该命令可以从 Dockerfile 构建镜像,也可以从 tar 包构建镜像。
  2. docker tag: 用于给镜像打上标签。该命令可以将镜像命名为指定的名称和标签,以便于在推送和使用镜像时进行识别和管理。
  3. docker push: 用于将本地的镜像推送到 Docker Hub 或其他 Docker 仓库。该命令需要先使用 docker login 命令进行登录认证。
  4. docker pull: 用于从 Docker Hub 或其他 Docker 仓库拉取镜像到本地计算机。该命令可以使用镜像名称和标签进行定位和拉取。
  5. docker history: 用于查看 Docker 镜像的历史记录。该命令可以查看镜像的创建过程、每一层的命令和大小等信息。
  6. docker inspect: 用于查看 Docker 容器和镜像的详细信息。该命令可以查看容器和镜像的元数据、配置、网络、存储等信息。
  7. docker save: 用于将 Docker 镜像保存为 tar 包。该命令可以将本地的镜像打包为 tar 包,以便于在其他计算机上部署和使用。
  8. docker load: 用于从 tar 包恢复 Docker 镜像。该命令可以将 tar 包中的 Docker 镜像恢复为本地镜像,以便于在本地计算机上使用。

通过Dockerfile制作镜像

制作 Docker 镜像的过程通常涉及编写一个 Dockerfile,它是一个文本文件,包含了一系列的指令,用来定义如何从一个基础镜像构建一个新的镜像。编写了 Dockerfile,就可以使用 docker build 命令来创建镜像。

以下是制作 Docker 镜像的基本步骤:

  1. 创建一个 Dockerfile
    在你的项目根目录下创建一个名为 Dockerfile 的文件(没有扩展名)。

  2. 定义基础镜像
    使用 FROM 指令开始你的 Dockerfile 来定义基础镜像。例如你正在创建一个 Python 应用的镜像,你可能会从官方的 Python 镜像开始:

    FROM python:3.8
    
  3. 设置工作目录
    使用 WORKDIR 指令设置容器内部的工作目录,所有后续的 RUNCOPYCMD 指令都会在这个目录下执行。

    WORKDIR /app
    
  4. 复制文件
    使用 COPY 指令将本地文件复制到镜像中。通常,你会复制应用代码和依赖文件(如 requirements.txt)。

    COPY . /app
    
  5. 安装依赖
    使用 RUN 指令安装应用所需的依赖。对于 Python 应用,你可能会需要运行 pip install

    RUN pip install --no-cache-dir -r requirements.txt
    
  6. 配置启动命令
    使用 CMD 指令设置容器启动时默认执行的命令。

    CMD ["python", "./your-app.py"]
    
  7. 构建镜像
    打开终端或命令行,导航到包含 Dockerfile 的目录,运行 docker build 命令,并为你的镜像设置一个标签(tag)。

    docker build -t your-image-name:tag .
    

    其中,. 表示当前目录,your-image-name:tag 是你给镜像设定的名字和标签。

  8. 运行容器
    构建完成后,你可以使用 docker run 命令来启动一个基于你新镜像的容器。

    docker run -d -p 5000:5000 your-image-name:tag
    

    这里 -d 表示后台运行,-p 5000:5000 表示将容器的 5000 端口映射到主机的 5000 端口。

在容器中安装软件制作新镜像

要在现有的 Docker 镜像基础上安装额外的软件,并创建一个新的镜像,你可以执行以下步骤:

  1. 启动一个容器
    从现有的镜像启动一个容器。这个镜像可以是你从 Docker Hub 或其他容器仓库中拉取的,也可以是你本地已有的镜像。使用 docker run 命令启动容器,并且进入交互式模式:

    docker run -it --name my_container existing_image_name bash
    

    其中 existing_image_name 是你要使用的现有镜像的名称,my_container 是新容器的名称,bash 是启动容器后运行的命令,它将提供一个 shell 给你。

  2. 安装软件
    在容器的命令行中,使用包管理器安装你需要的软件。对于基于 Debian 或 Ubuntu 的系统,你通常会使用 apt;对于基于 CentOS 的系统,你会使用 yum。例如:

    apt update
    apt install -y your_software
    

    其中 your_software 是你想要安装的软件包名。

  3. 退出容器
    安装完成后,你可以通过键入 exit 或按 Ctrl+D 来退出容器。

  4. 创建新镜像
    使用 docker commit 命令从修改过的容器中创建一个新的镜像:

    docker commit my_container new_image_name
    

    其中 my_container 是你之前创建的容器的名称,new_image_name 是你要创建的新镜像的名称。

  5. 测试新镜像
    启动一个基于新镜像的容器来测试你的软件环境是否如预期工作:

    docker run -it new_image_name bash
    

    现在你可以运行测试命令来确认软件包已正确安装。

  6. 推送镜像到仓库(可选)
    如果你想要将制作好的镜像推送到 Docker Hub 或其他 Docker 镜像仓库,你需要使用 docker tag 来标记镜像,并使用 docker push 来推送:

    docker tag new_image_name your_dockerhub_username/new_image_name:tag
    docker push your_dockerhub_username/new_image_name:tag
    

    确保你已登录到 Docker Hub(或其他仓库),并将 your_dockerhub_username 替换为你的用户名,tag 替换为你的镜像标签。

以上就是制作 Docker 镜像的基本步骤。制作镜像时,可能需要根据你的应用需求添加额外的配置,如环境变量、数据卷、网络配置等。请参考官方 Docker 文档以获取更多详细信息和最佳实践。

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

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

相关文章

2022年12月10日-2023年12月28日

好久没写文章了,也就是好久没写流水账了.今天写的,到底是生日,还是记录这一年的工作,比较模糊,时间上来讲,两个用意合一起吧. 这一年,是极其艰苦的一年,也是不堪回首的一年.3月份的时候设宴欢送朋友离开深圳,回住处上楼时跌倒入院,之后开刀.家人们都从老家赶来,照顾了我好几天.…

Debezium发布历史43

原文地址: https://debezium.io/blog/2018/12/05/automating-cache-invalidation-with-change-data-capture/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 通过更改数据捕获自动使缓存失效 2018 年…

文本表示模型简介

文本是一类非常重要的非结构化数据,如何表示文本数据一直是机器学习领域的一个重要研究方向。那么有哪些文本表示模型?以及它们各有什么优缺点? 1. 常见的文本表示模型 1.1. 词袋模型和N-gram模型 最基础的文本表示模型是词袋模型。顾名思…

QML —— RadioButton的两个经典示例(附完整源码)

示例1-效果 示例2-效果 实例1 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Text{id: classNametext: qsTr("--&quo…

CSS-5

移动端适配 屏幕分辨率 屏幕分辨率:纵横向上的像素点数,单位是px电脑常见分辨率:1920 * 10801336 * 768...硬件分辨率 -> 物理分辨率(出厂设置) 缩放调节后的分辨率 -> 逻辑分辨率(软件/驱动设置&a…

Web网页开发-CSS层叠样式表1-笔记

1.CSS的引入方式 (1)内嵌式:把style双标签写在head标签里面,可以影响同种标签 (2)行内式:把style写在标签内部,只能影响当前标签 (3)外链式:创建css文件,使用link将html文件和css文件连接起来 (4)导入式&am…

2024年美赛数学建模ABCDEF题思路选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间:北京时间2024年2月2日(周五&#xff…

关于java的方法及定义

关于java的方法及定义 我们在之前的文章中介绍了java的流程控制等内容,本篇文章,我们要介绍一下java中的方法,这个是非常关键的😀! 什么是方法 我们用之前我们最常见的System.out.println(); 来举例。 System是类&…

Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询

Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询 同样还是IModelCacheKeyFactory,不过这次要采用主动刷新的方式。 实现DbContext 动态实体,根据配置等生成动态类型来当作数据库实体使用,当配置修改时,可以调用DynamicMo…

Redis(二)数据类型

文章目录 官网备注十大数据类型StringListHashSetZSetBitmapHyperLogLog:GEOStreamBitfield 官网 英文:https://redis.io/commands/ 中文:http://www.redis.cn/commands.html 备注 命令不区分大小写,key区分大小写帮助命令help…

关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换

工作时遇到前端传的时间格式是"2023-12-3 17:41:52",和"2023-1-1 17:41:52"但是我想要的是"2023-12-03 17:41:52"和"2023-01-01 17:41:52"。下面给大家分享几个解决方法 方法一: 找前端!让他改&…

CSS属性的计算过程和层叠规则总结

✨ 专栏介绍 HTML/CSS专栏合集是一个涵盖HTML和CSS两个方面的栏目。HTML是一种标记语言,用于创建网页的结构和内容,而CSS是一种样式表语言,用于控制网页的外观和布局。 在HTML/CSS专栏合集中,我们将深入探讨HTML和CSS的基础知识…

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 总结 前言 曾经有拿cantools来解析过dbc,用得比较浅,不知道可以用来解析arxml。最近有个需求需要…

vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7

vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7 Sub Form1_Command1_BN_Clicked(ControlIndex As Long, hWndForm As hWnd, hWndControl As hWnd)MsgBox ("Command1 ControlIndex" & ControlIndex & ",Command1(x).Caption " & …

【纯java代码实现字符串运算符或公式计算,支持函数,不借助第三方依赖、工具】

纯java代码实现字符串运算符或公式计算,支持函数,不借助第三方依赖和工具 效果图代码 效果图 代码 import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import…

在 Oracle 数据库表中加载多个数据文件

在本文中,我将展示 SQL 加载器 Unix 脚本实用程序的强大功能,其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件。这在处理大量数据以及需要将数据从一个系统移动到另一个系统时非常有用。 它适合涉及大量历史数据的迁移项目。那么就不可能为每…

Elasticsearch:带有自查询检索器的聊天机器人示例

本工作簿演示了 Elasticsearch 的自查询检索器 (self-query retriever) 将问题转换为结构化查询并将结构化查询应用于 Elasticsearch 索引的示例。 在开始之前,我们首先使用 langchain 将文档分割成块,然后使用 ElasticsearchStore.from_documents 创建…

企业微信开发:自建应用:接收消息(企业内部服务器)/回调配置

概述 在企业微信的自建应用中,用户触发了某些行为(发送消息、进行菜单操作或者外部联系人变更等),要发送相关信息给企业内部服务器。 备注:接收消息 和 回调,在本文中指代相同的行为,即企业微信…

vs code导入excel文件并且解析excel文件数据

实习工作需要通过vs code导入excel文件并且解析excel文件数据,学习整理了一下相关方法分享给大家^_^ VS Code 中导入和解析 Excel 文件 要在 VS Code 中导入和解析 Excel 文件,你可以使用一些库和扩展来帮助你完成这个任务。以下是一种常用的方法&…

【PostgreSQL】表操作-表权限

【PostgreSQL】表操作快速链接 创建表及基础表命令 修改表 表权限 创建对象时,会为其分配所有者。所有者通常是执行创建语句的角色。对于大多数类型的对象,初始状态是只有所有者(或超级用户)才能对对象执行任何操作。要允许其他角…