docker 基本用法及跨平台使用

news2024/10/6 5:57:49

一、Docker的优点

docker 主要解决的问题就是程序开发过程中编译和部署中遇到的环境配置的问题。

1.1 Docker与其他虚拟机层次结构的区别**

在这里插入图片描述
运行程序重点关注点在于环境。
VM虚拟机是基于Hypervisor虚拟化服务运行的。
Docker是基于内核的虚拟化技术实现的。

1.2 Docker的技术优势

二、Docker 架构

Docker 结构框图如下

Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行,如下图所示:

在这里插入图片描述

用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。

而Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

Docker 客户端和服务器间通讯实例

Docker Client可以通过以下三种方式和Docker Daemon建立通信:tcp://host:port,unix://path_to_socket和fd://socketfd。
Docker Client发送容器管理请求后,由Docker Daemon接受并处理请求,当Docker Client接收到返回的请求相应并简单处理后,Docker Client一次完整的生命周期就结束了。当需要继续发送容器管理请求时,用户必须再次通过docker可执行文件创建Docker Client。

查看docker的client+server架构

tn@itec:~$ docker version
Client:
 Version:           24.0.5
 API version:       1.43
 Go version:        go1.20.3
 Git commit:        24.0.5-0ubuntu1~20.04.1
 Built:             Mon Aug 21 19:50:14 2023
 OS/Arch:           linux/amd64
 Context:           default
Server:
 Engine:
  Version:          24.0.5
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.3
  Git commit:       24.0.5-0ubuntu1~20.04.1
  Built:            Mon Aug 21 19:50:14 2023
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.7.2
  GitCommit:
 runc:
  Version:          1.1.7-0ubuntu1~20.04.2
  GitCommit:
 docker-init:
  Version:          0.19.0
  GitCommit:

演示如下:
Linux下“一切皆文件”,这个也不例外,/var/run/docker.sock就是client和server交互的中间文件
我们可以向/var/run/docker.sock发送请求,也能达到docker ps、docker images这样的效果。

curl -s --unix-socket /var/run/docker.sock http://localhost/images/json |jq
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/json |jq

三、Docker的基本操作指令

指令交互流程图如下:
在这里插入图片描述
创建一个Dockerfile:

FROM ubuntu:16.04
# 防止在非交互模式下的TZ数据错误
ARG DEBIAN_FRONTEND=noninteractive

# 更新并安装基本工具
RUN apt-get update && apt-get install -y \
    lsb-release \
    gnupg2 \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 设置默认工作目录
WORKDIR /root

# 运行bash
CMD ["bash"]

创建一个镜像:

docker build -t i/ubuntu16.04:v1 .

创建一个容器并运行:

#!/bin/bash
docker run -it \
    --rm \
    -v $(pwd)/:/opt/ws/ \
    -v /home:/home \
    -v /etc/localtime:/etc/localtime:ro \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix$DISPLAY \
    -w /opt/ws/ \
    --hostname ubuntu16 \
i/ubuntu16.04:v1

停止容器:

docker stop $(NAME)

运行容器:

docker start $(NAME)

提交当前容器至镜像:

docker commit -a "i" -m "first commmit" upbeat_babbage i_ubuntu16.04:v1

给提交的docker镜像打tag:

docker tag i/ubuntu16.04:v1 hub.itec.com/embedded/release_test:v1

将打完的docker镜像提交到docker镜像仓库:

登录: docker login https://hub.itec.com/
docker push hub.itec.com/embedded/release_test:v1

从docker镜像仓库拉去镜像:

docker pull hub.itec.com/embedded/release_test:v1

将一个镜像导出为tar包:

docker save hub.itec.com/embedded/release_test:v1 -o release_test.tar

将tar包导入至docker镜像

docker load -i release_test.tar

tips:
docker run :根据镜像创建一个容器并运行一个命令,操作的对象是 镜像;
docker exec :在运行的容器中执行命令,操作的对象是 容器。

四、 Docker镜像跨平台使用

为什么在ARM64架构上打包的docker镜像能在X86上面能加载并运行。

1) 通过查看/proc/sys/fs/binfmt_misc/注册表,查询内核是否支持arm64架构。
2) 进一步确认使用的虚拟机解释器

tn@itec:~$ cat /proc/sys/fs/binfmt_misc/qemu-m68k
enabled
interpreter /usr/bin/qemu-m68k-static
flags: OCF
offset 0
magic 7f454c4601020100000000000000000000020004
mask ffffffffffffff00fffffffffffffffffffeffff
tn@itec:~$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64-static
flags: OCF
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff

从 Docker 19.03 开始,Docker 引入了对 QEMU 的支持,用于在容器中模拟其他架构的 CPU。

在之前的版本需要运行模拟镜像:

sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

在docker build和pull 中指定platform有什么意义?

1) 在build时指定平台的意义完全是构建什么架构的镜像。如果同时指定多个架构,那么将构建多个镜像。
2) 在pull中指定架构,是指在仓库中找到对应架构的镜像,pull到本地docker。

如果在arm64平台上还是不能运行X86的镜像,怎么办?

1) 加载驱动

insmod /usr/lib/modules/5.10.110-rockchip-rk3588/kernel/fs/binfmt_misc.ko

2)添加注册

echo ':qemu-x86:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-x86_64-static:OCF' > register

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

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

相关文章

深入分析并可视化城市轨道数据

介绍 中国城市化进程加速中,城市轨道交通的迅速扩张成为提升城市运行效率和居民生活品质的关键。这一网络从少数大城市延伸至众多大中型城市,映射了经济飞跃和城市管理现代化。深入分析并可视化城市轨道数据,对于揭示网络特性、评估效率、理…

计算机组成原理 | 数据的表示、运算和校验(3)数据处理与存储

移位 舍入和扩展 存储模式和对齐 不按边界对齐,访存次数会增加一次

大型语言模型在AMD GPU上的推理优化

Large language model inference optimizations on AMD GPUs — ROCm Blogs 大型语言模型(LLMs)已经改变了自然语言处理和理解,促进了在多个领域中的众多人工智能应用。LLMs在包括AI助手、聊天机器人、编程、游戏、学习、搜索和推荐系统在内的…

8个腾讯,18个阿里,104个百度

8个腾讯、18个阿里巴巴、104个百度!英伟达市值已经超越我的前司微软,成为全球第一,(虽然今天又被微软超越,但势头非常猛)达到了恐怖的3.34万亿美元!这是什么概念?相当于8个腾讯,18个…

ARM阻击高通:AI PC大战与芯片之争

引言 在AI PC领域,高通的X Elite芯片因为其高性能和低功耗,一度被认为是未来的主导者。然而,ARM公司却通过法律手段试图阻止高通的独大,这不仅可能拖慢AI PC的发展进程,还引发了业界的广泛关注。本文将深入探讨ARM和高…

php,python aes加密反解

1. python版本 import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpadclass AESUtilCBC:def __init__(self, key, iv):self.key key.encode(utf-8)self.iv iv.encode(utf-8)self.pad_length AES.block_sizedef encrypt(self, data):try…

C语言| 数组倒置II

数组倒置第二种方法:直接在数组内进行倒置 第一个元素和最后一个元素交换, 第二个元素和倒数第二个元素交换 第三个元素和倒数第三个元素交换...... 数组元素个数为偶数,每个元素都能交换一次; 数组元素个数为奇数,最…

IntelliJ IDE 插件开发 | (十)主题插件开发入门

系列文章 本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。 前言 在前面的章节中,我们介绍的都是功能性插件的开发内容,本文则会介绍一下主题类插件的开发方式。不过本文也只是带大家入个门&#xff…

HTML静态网页成品作业(HTML+CSS+JS)——动漫斗罗大陆介绍网页(3个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现图片轮播和tab切换,共有3个页面。 …

24.3K star!一个轻量级且高度可配置的现代化命令行文本编辑器

大家好,今天给大家分享的是一个轻量级且高度可配置的现代化命令行文本编辑器。 micro 是一个轻量级且高度可配置的命令行文本编辑器,以其简洁的设计和强大的插件系统著称。该项目强调速度与效率,适合那些追求快速编辑体验并希望保持系统资源占…

ISO14001认证:引领企业迈向绿色未来

在当今全球环境日益恶化的背景下,绿色发展已成为企业和社会共同追求的目标。ISO14001环境管理体系作为由国际标准化组织(ISO)制定的环境管理国际标准,为企业提供了系统和全面的环境管理框架,适用于各种类型和规模的组织…

TurboWarp简单介绍

1.为什么要下载TurboWarp? 2.下载TurboWarp 在线版:TurboWarp - Run Scratch projects faster 离线版下载:TurboWarp Desktop - Better offline editor for Scratch 3 3.使用 界面: 功能: 上方功能条:…

【办公技巧】如何编辑带有限制编辑密码的PDF文件?

PDF文件打开之后发现设置了限制编辑,功能栏中的编辑按钮都是灰色的,导致PDF文件里的内容无法编辑。那么带有限制编辑的PDF文件,如何编辑?今天分享两个方法。 方法一: 我们可以将PDF文件转换成其他格式,有…

御道源码(ruoyi-vue-pro)个人使用小结

御道源码(ruoyi-vue-pro)个人使用小结 一、Git地址 1、平台项目简介及地址 2、开发指南,如图所示,部分功能需要收费,可自行了解 二、项目文件夹结构示例: 三、技术介绍 1.基于 Spring Boot MyBatis P…

【CT】LeetCode手撕—415. 字符串相加

目录 题目1- 思路2- 实现⭐415. 字符串相加——题解思路 3- ACM 实现 题目 原题连接:415. 字符串相加 1- 思路 模式识别:字符串相加 逆向遍历过程模拟 数据结构 ① String res :记录res 、② carry 记录进位值① 定义两个整数遍历 nums1 …

算法篇-二叉树

二叉树的遍历 分为前序、中序和后续的遍历&#xff0c;思想就是利用递归。 前序遍历-中左右 代码&#xff1a; public void travelTree(TreeNode node, List<Integer> resulst) {if (node null){return;}// 中resulst.add(node.val);// 左travelTree(node.left, resul…

Hive笔记-4

240618-Hive笔记-4 4.2 Insert 4.2.1 将查询结果插入表中 1) 语法 INSERT (INTO | OVERWRITE) TABLE tablename [PARTITION (partcol1val1,partcol2val2 ...)] select_stamement; 关键字说明: (1) INTO: 将结果追加到目标表 (2) OVERWRITE: 用结果覆盖原有数据 2) 案例…

如何使用代理ip上网移动转电信

在一些特定的工作场景中&#xff0c;比如跨网办公、数据分析等&#xff0c;我们常常需要将网络IP从一种类型转换到另一种类型。如需将移动网络转电信IP代理。那么&#xff0c;如何使用代理IP上网移动转电信呢&#xff1f;接下来&#xff0c;将为您揭示一个便捷的方法&#xff0…

火车头采集器Typecho采集发布模块插件

火车头采集器发布数据到Typecho系统网站应该怎么操作&#xff1f; 1. 火车头采集器Typecho采集发布插件下载安装&#xff1a; 火车头采集器Typecho采集发布模块插件下载地址-CSDN 2. 在火车头采集器软件导Typecho采集发布模块插件&#xff1b; 3. 填写Typecho系统文章对应的…

【Java】已解决java.lang.FileNotFoundException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.lang.FileNotFoundException异常 在Java编程中&#xff0c;java.lang.FileNotFoundException是一个常见的异常&#xff0c;它通常表示程序试图打开一个不存在的文件、文…