从空白镜像创建Docker hello world

news2024/11/18 11:32:41

文章目录

  • 写在前面
  • 基础知识
  • 方法一:使用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
在这里插入图片描述

小结

以上方法任选其一即可

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

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

相关文章

网络原理初识(2)

目录 一、协议分层 1、分层的作用 2、OSI七层模型 3、TCP / IP五层&#xff08;或四层&#xff09;模型 4、网络设备所在分层 5、网络分层对应 二、封装和分用 发送过程&#xff08;封装&#xff09; 1、应用层(应用程序) QQ 2、传输层 3、网络层 4、数据链路层 5、物理…

jvisualvm 工具的使用

文章目录 Visual GC 插件下载代码示例说明spaces 区域PermHeap Graphs 区域Compile Time&#xff08;编译时间&#xff09;Class Loader Time&#xff08;类加载时间&#xff09;GC TimeEden Space&#xff08;Eden 区&#xff09;Survivor 0 / Survivor 1&#xff08;S0 和 S1…

23.复习

1.设置输出数字宽度 #include <iostream>using namespace std;int main(){int a123456789,b0,c-1;printf("%8d %8d %8d",a,b,c);return 0; }2.保留小数点位数 #include <iostream>using namespace std;int main(){double a;cin>>a;printf("…

SpringBoot整合MyBatisPlus实现增删改查

1.前言☕ 大家好&#xff0c;我是Leo哥&#x1fae3;&#x1fae3;&#x1fae3;&#xff0c;今天给大家带来关于精品SpringBoot专栏&#xff0c;暂且就给他起名为循序渐进学SpringBoot&#xff0c;这里我参考了我上一个专栏&#xff1a;循序渐进学SpringSecurity6。有需要的朋…

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候&#xff0c;都是通过Ajax在规定时间内轮询调用web api&#xff0c;这样简单省事&#xff0c;但是当看板多了&#xff08;并发量上来&#xff09;以后&#xff0c;比较消耗服务器的性能&#xff0c;所以最近研究了websocket&#xff0c;希望使用…

[Flutter]自定义等待转圈和Toast提示

1.自定义样式 2.自定义LoadingView import package:flutter/material.dart;enum LoadingStyle {onlyIndicator, // 仅一个转圈等待roundedRectangle, // 添加一个圆角矩形当背景maskingOperation, // 添加一个背景蒙层&#xff0c; 阻止用户操作 }class LoadingView {static f…

十堰网站建设公司华想科技具有10年的网站制作经验

2018年已经结束了。 华翔科技收到了很多客户的咨询&#xff0c;他们都有一个共同的问题&#xff1a;建一个网站需要多少钱&#xff1f; 但是&#xff0c;我们都会问&#xff1a;您有什么具体需求吗&#xff1f; 大多数人的答案是否定的&#xff0c;他们只是想打听一下价格。 十…

3款免费又实用的良心软件,功能强大到离谱,白嫖党的最爱

闲话不多说&#xff0c;直接上硬货&#xff01; 1、酷狗概念版 这款正版音乐APP可谓是“良心之作”。不论你是新用户还是老用户&#xff0c;只要踏入概念版的门槛&#xff0c;即可获得3个月VIP作为见面礼。更令人惊喜的是&#xff0c;每天只需轻松一点播放歌曲&#xff0c;即…

VideoDubber时长可控的视频配音方法

本次分享由中国人民大学、微软亚洲研究院联合投稿于AAAI 2023的一篇专门为视频配音任务定制的机器翻译的工作《VideoDubber: Machine Translation with Speech-Aware Length Control for Video Dubbing》。这个工作将电影或电视节目中的原始语音翻译成目标语言。 论文地址&…

【XR806开发板试用】新鲜出炉的蓝牙配网Demo

今天收到了极术社区寄来的礼物&#xff0c;非常感谢。为此今天突击贡献一份蓝牙配网的小Demo&#xff0c;由于我对BLE通信不是很熟&#xff0c;此Demo仅供演示&#xff0c;存在几个问题尚未解决&#xff1a; 无法实现广播名没有修改GATT表&#xff0c;直接套用例程的了没有实现…

【自动驾驶系列丛书学习】2.《自动驾驶汽车环境感知》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;甄先通、黄坚、王亮、夏添 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.自动驾驶环境感知概述…

Python从0到100(三):Python中的变量介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

Day31-计算机基础1

Day31-计算机基础1 1. 网络基础介绍1.1 什么是网络&#xff1f;1.2 为什么要有网络&#xff1f;1.3 运维人员需要学习哪些网络知识&#xff1f;1.4 按作用范围对网络分类 2.网络设备知识2.1 网络传输介质及传输信号2.2 网卡设备2.3 中继器&#xff08;RP repeater&#xff09;2…

海思Hi3403V100方案双目视频融合模组测试

Hi3403V100是海思面向高端市场应用推出的专业 Ultra-HD Smart IP Camera SOC&#xff0c;该芯片最高支持四路sensor输入&#xff0c;支持最高4K60的ISP图像处理能力。 海思Hi3403V100方案双目视频模组采用了海思Hi3403V100方案核心板双目视频融合IMX334 Sensor板测试&#xff…

neo4j 删除从一个node开始的所有数据。

##一、 需求 删除红线右边重复的数据 二、 删除与中心点1的右边连线 2.1 中心点1橙色&#xff1a; <elementId>: 4:fbde4fa1-3453-4e00-91ce-92b16aec22e3:425 <id>: 425 fileName: /Users/guibing.gao/Desktop/lib2.2 与中新点1右边链接的node <elementId>…

助力头部银行10倍提升数据化运营效率,NoETL的破局之道丨爱分析活动

在数字化飞速发展的今天&#xff0c;企业经营者们逐渐认识到数据平台对于企业生产经营所不可或缺的价值。随着数据平台不断发展和进化&#xff0c;数据量、数据源、用数人群也日益增加&#xff0c;对于业务用数敏捷和数据管理有序同样带来了全新的挑战。数据应用层面&#xff0…

安卓studio安装

安卓studio安装 2024.3.11官网的版本&#xff08;有些翻墙步骤下载东西也解决了&#xff09; 这次写的略有草率&#xff0c;后面会更新布局的&#xff0c;因为截图量太大了&#xff0c;有需要的小伙伴可以试着接受一下哈哈哈哈 !(https://gitee.com/jiuzheyangbawjf/img/raw/ma…

【C++】关键字:auto

文章目录 1. 介绍2. 如何使用 1. 介绍 从C11开始&#xff0c;auto变成了类型指示符&#xff08;之前auto并不是这个作用&#xff09;。使用auto定义变量时必须对其进行初始化&#xff0c;在编译阶段编译器自动推导auto变量的实际类型。因此auto并非是一种“类型”的声明&#…

在 Python 中从键盘读取用户输入

文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…

【Idea】八种Debug模式介绍

1.行断点 在对应的代码行左侧边栏点击鼠标左键&#xff0c;会出现一个红色圆圈&#xff0c;以debug模式执行时当代码运行到此处则会停止&#xff0c;并可以查询相关上下文参数 2.方法断点 在方法左侧点击创建断点,在方法进入时会停止&#xff0c;同时可以右键断点&#xff0c;…