从空白镜像创建Docker hello world

文章目录

  • 写在前面
  • 基础知识
  • 方法一:使用echo工具
  • 方法二,使用c语言程序
  • 方法三,使用汇编语言
  • 小结

写在前面

尝试搞了下docker,网上的教程大多是让下载一个ubuntu这种完整镜像,寥寥几篇从空白镜像开始创建的,也要去下载一个文件系统;我的天,就一个hello world,不至于吧
本篇会以三种方法,从空白镜像创建一个迷你的docker hello world镜像

基础知识

# 使用当前目录作为根目录构建镜像
docker build -t myimage .
# 查看镜像列表
docker images
# 导出镜像
docker save myimage > myimage.tar
# 加载镜像
docker load < myimage
# 启动镜像
docker run -it myimage

Dockerfile中的指令

FROM:指定基础镜像
COPY:将文件或目录复制到镜像中
CMD:容器创建时的默认命令

注意:docker构建的时候会以当前目录为根目录,也就是说,比如我在/home/arco/docker目录下创建镜像,想从/bin目录下拷贝个文件到镜像中,是拷不了的,要先把这个文件拷贝到/home/arco/docker/bin目录下

方法一:使用echo工具

linux系统中最简单的打印命令就是echo了,直接弄个echo过来输出一下多方便呢?
那就搞个如下的Dockerfile试试

FROM scratch
COPY /bin/echo /bin/echo
WORKDIR /
CMD ["/bin/echo", "hello docker"]

看似没啥问题,实则运行不了,报错如下:
在这里插入图片描述
原因:echo是个链接了动态库的可执行文件,只拷个echo能执行才怪了
执行ldd命令查看echo依赖的库:
在这里插入图片描述
嗯,依赖c库和链接器,那就把它们都拷过来,在当前目录下新建lib64目录,如下所示:
在这里插入图片描述

修改Dockerfile如下:

FROM scratch
COPY /bin/echo /bin/echo
COPY /lib64/libc.so.6 /lib64/libc.so.6
COPY /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
WORKDIR /
CMD ["/bin/echo", "hello docker"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小3.4兆
在这里插入图片描述

方法二,使用c语言程序

这次不用echo,自己写程序打印
c源代码如下:

#include<stdio.h>
int main()
{
    printf("hello docker!\n");
    return 0;
}

ldd查看编译出的可执行文件:
在这里插入图片描述
嗯,和echo的依赖一样,那么目录结构就是:
在这里插入图片描述
Dockerfile内容如下:

FROM scratch
COPY /a.out /a.out
COPY /lib64/libc.so.6 /lib64/libc.so.6
COPY /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
WORKDIR /
CMD ["/a.out"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小也是3.4兆(比echo那个小了几十kb
在这里插入图片描述

方法三,使用汇编语言

x86平台AT&T入门汇编请参考:AT&T hello world 有对下面汇编代码的解释

汇编源码如下:

.data
	strr:   .string  "hello docker~\n"
	len = .-strr
.text
	.global _start
_start:
	movq    $1,    %rax    # syscall number of write
	movq    $1,    %rdi    # param1: stdout
	movq    $strr, %rsi    # param2: str address
	movq    $len,  %rdx    # param3: out length
	syscall

	movq    $60,   %rax    # syscall number of exit
	syscall

汇编代码写的hello world并不依赖c库,直接通过write系统调用输出hello world
Dockerfile内容如下(hello是汇编代码编译出的可执行文件)

FROM scratch
COPY /hello /hello
WORKDIR /
CMD ["/hello"]

创建-执行:
在这里插入图片描述
导出镜像查看,大小仅有12kb
在这里插入图片描述

小结

以上方法任选其一即可

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle VM VirtualBox安装Ubuntu桌面版

背景&#xff1a;学习Docker操作 虚拟机软件&#xff1a;Oracle VM VirtualBox 7.0 系统镜像&#xff1a;ubuntu-20.04.6-desktop-amd64.iso 在Oracle VM VirtualBox新建一个虚拟电脑 选择好安装的目录和选择系统环境镜像 设置好自定义的用户名、密码、主机名 选择一下运行内…

执行除法运算返回浮点数结果operator.truediv()返回商的整数部分operator.floordiv()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 执行除法运算 返回浮点数结果 operator.truediv() 返回商的整数部分 operator.floordiv() 下列选项可以执行除法运算并得到浮点数结果的是&#xff08;&#xff09; import operator print(&…

凌鲨微应用架构

微应用是静态网页加上凌鲨提供的扩展能力而形成的一种应用&#xff0c;主要特点是开发便捷&#xff0c;安全。 微应用架构 组件说明 名称 说明 微应用 webview窗口&#xff0c;显示web服务器上的页面 接口过滤器 根据权限配置,屏蔽非授权接口访问 接口提供者 tauri注入…

文件操作上(c语言)

目录 1. 文件的作用2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开与关闭4.3.1 文件的打开模式4.3.2 实例代码 1. 文件的作用 使用文件可以将数据进行持久化的保…

P1958 上学路线

难度&#xff1a;普及- 题目描述 你所在城市的街道好像一个棋盘&#xff0c;有 a 条南北方向的街道和 b 条东西方向的街道。南北方向的 a 条街道从西到东依次编号为 1 到 a&#xff0c;而东西方向的 b 条街道从南到北依次编号为 1 到 b&#xff0c;南北方向的街道 i 和东西方…

【期刊】ACM Transactions on Privacy and Security

首页截图 subject areas 混合模式 根据官网介绍&#xff0c;本期刊不在金OA行列&#xff0c;可以自主选择出版模式。 出版方向 Topics of interest include 发文量 季刊&#xff0c;发文量很小 图像安全领域 未在今年发表图像安全领域论文。

ARM基础----STM32处理器操作模式

STM32处理器操作模式 Cortex-M处理器操作模式、特权等级和栈指针操作模式栈指针CONTROL寄存器异常压栈时的SP指针 Cortex-A 处理器运行模型寄存器组 Cortex-M处理器操作模式、特权等级和栈指针 操作模式 处理模式&#xff1a;执行中断服务程序等异常处理&#xff0c;处理器具有…

SpringBoot自定义banner,自定义logo

SpringBoot自定义banner&#xff0c;自定义logo 在线网站 http://www.network-science.de/ascii/?spma2c6h.12873639.article-detail.9.7acc2c9aSTnQdW https://www.bootschool.net/ascii?spma2c6h.12873639.article-detail.8.7acc2c9aSTnQdW https://patorjk.com/softwa…

继承杂谈。

内容一览 前言继承的概念及定义继承的意义继承关系及访问限定符父类和子类对象之间的转化继承后的作用域继承与有元继承与静态成员多继承继承和组合的区别&#xff1a;继承的总结和反思 前言 面向对象的三大特性&#xff1a;封装继承和多态&#xff0c;这三种特性优者很紧密地联…

基于神经网络的偏微分方程求解器再度取得突破,北大字节的研究成果入选Nature子刊

目录 一.引言:神经网络与偏微分方程 二.如何基于神经网络求解偏微分方程 1.简要概述 2.基于神经网络求解偏微分方程的三大方向 2.1数据驱动 基于CNN 基于其他网络 2.2物理约束 PINN 基于 PINN 可测量标签数据 2.3物理驱动(纯物理约束) 全连接神经网路(FC-NN) CN…

C++特殊类设计【特殊类 || 单例对象 || 饿汉模式 || 懒汉模式】

目录 一&#xff0c;特殊类设计 1. 只在堆上创建的类 2. 只允许在栈上创建的类 3. 不能被继承的类 4. 不能被拷贝的类 5. 设计一个类&#xff0c;只能创建一个对象&#xff08;单例对象&#xff09; 饿汉模式 懒汉模式 C11静态成员初始化多线程安全问题 二&#xff…

Android14 Handle机制

Handle是进程内部, 线程之间的通信机制. handle主要接受子线程发送的数据, 并用此数据配合主线程更新UI handle可以分发Message对象和Runnable对象到主线程中, 每个handle实例, 都会绑定到创建他的线程中, 它有两个作用,: (1) 安排消息在某个主线程中某个地方执行 (2) 安排…

工作纪实46-关于微服务的上线发布姿势

蓝绿部署 在部署时&#xff0c;不需要将旧版本的服务停掉&#xff0c;而是将新版本与旧版本同时运行&#xff0c;新版本测试无误之后再将旧版本停掉。这样可以避免再升级的过程中如果失败服务不可用的问题&#xff0c;因为同时部署了两个版本的程序&#xff0c;使得硬件资源是…

算法设计.

文章目录 1. 贪心算法&#xff1a;只看当前1.1 零钱兑换问题&#xff1a;力扣322 2. 活动选择问题3. 动态规划3.1 不同路径&#xff1a;3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列6. 最长递增子序列7. 打家劫舍8. 全排…

分销商城小程序怎么做_打造高效分销商城小程序的秘诀

在数字化浪潮席卷全球的今天&#xff0c;小程序成为了连接线上线下的重要桥梁。其中&#xff0c;分销商城小程序因其独特的裂变传播能力和低门槛的创业模式&#xff0c;受到了越来越多创业者和商家的青睐。那么&#xff0c;如何打造一个高效、吸引人的分销商城小程序呢&#xf…

数据库(一)初步认识数据库系统

什么是数据库&#xff1f; 表&#xff1a;以按行按列形式组织及展现的数据 如下便是一个表&#xff0c;也叫关系&#xff0c;描述了一批相互有关联关系的数据 数据库&#xff1a;起源于规范化表&#xff08;如成绩单&#xff09;的处理&#xff0c;简称DB&#xff0c;是相互有…

基于鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)的无人机三维路径规划

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

童装WP模板

童装WP模板 https://www.wpniu.com/moban/6359.html

JDBC和连接池

JDBC和连接池 大纲 JDBC连接数据库的方式 具体案例 JDBC 需求&#xff1a;满足Java程序能对多个不同的数据库进行操作&#xff0c;而创建了一种接口&#xff0c;实现对数据库的规范 连接数据库的方式 1.方法1 先创建一个Driver对象&#xff0c;然后设置连接到的数据…

微信小程序提示确认框

如图所示&#xff0c;如何弹出微信小程序自带默认弹框&#xff1f; 代码如下&#xff1a; wx.showModal({ title: 确认, content: 确定要删除吗&#xff1f;, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用…