制作ARM架构 docker镜像

本文详细介绍了如何在ARM架构上创建和管理Docker镜像,包括使用docker commit、基于本地模板和Dockerfile生成镜像的方法。特别讨论了Dockerfile的使用,包括COPY指令和工作目录的设置。此外,还涵盖了在X86架构上构建ARM Docker镜像的过程,涉及docker buildx、打包环境和多架构镜像的编译。最后,文章提到了镜像的导出、导入、运行和管理,以及与宿主机的交互注意事项。

docker简介

docker客户端

Docker 客户端有两种替代选项:名为 docker 的命令行应用程序或名为 Docker Desktop 的基于图形用户界面 (GUI) 的应用程序。 CLI 和 Docker Desktop 均与 Docker 服务器交互。 来自 CLI 或 Docker Desktop 的 docker 命令使用 Docker REST API 将指令发送到本地或远程服务器,并作为用于管理容器的主要接口。

docker服务器

Docker 服务器是一个名为 dockerd 的守护程序。 dockerd 守护程序通过 Docker REST API 响应来自客户端的请求,并且可以与其他守护程序进行交互。 此外,Docker 服务器还负责跟踪容器的生命周期。

客户端和服务器通信

Docker 客户端和 Docker 守护进程之间的通信是通过 Unix socket 进行的。Docker 守护进程会在 /var/run/docker.sock 路径下创建一个 Unix socket 文件,Docker 客户端可以通过连接到该 socket 文件来与 Docker 守护进程通信。

Docker 客户端在与 Docker 守护进程通信时,可以通过使用 Docker Remote API 进行各种操作,例如启动和停止容器、创建镜像和获取容器和镜像的信息。Docker Remote API 可以通过 HTTP 或 HTTPS 协议进行通信,也可以通过 Unix socket 进行通信。使用 Unix socket 进行通信可以提高性能并提供更好的安全性,因为数据不需要通过网络传输,并且 Unix socket 文件默认只能被本地用户访问。

在 Docker 中,可以通过在 Docker 客户端中指定 -H unix:///var/run/docker.sock 参数来连接到 Docker 守护进程的 Unix socket。例如,以下命令将使用 Unix Domain socket 连接到 Docker 守护进程:

docker -H unix:///var/run/docker.sock ps

Unix Domain socket 主要用于同一主机上的进程间通信。与主机间的进程通信不同,它不是通过 “IP地址 + TCP或UDP端口号” 的方式进程通信,而是使用 socket 类型的文件来完成通信,因此在稳定性、可靠性以及效率方面的表现都很不错。

Unix Domain socket和 localhost

Unix Domain socket 的 IPC 看起来与使用环回接口(localhost或127.0.0.1)的常规 TCP 套接字的 IPC 非常相似,但有一个关键区别:性能。虽然 TCP 环回接口可以跳过完整 TCP/IP 网络堆栈的一些复杂性,但它保留了许多其他(ACK、TCP 流量控制等)功能。这些复杂性是为可靠的跨机器通信而设计的,但在单个主机上它们是不必要的负担。、

还有一些额外的区别。例如,由于 Unix Domain socket使用文件系统中的路径作为其地址,我们可以使用目录和文件权限来控制对套接字的访问,从而简化身份验证。

当然,与 TCP 套接字相比,Unix Domain socket的一大缺点是单主机限制。对于为使用 TCP 套接字而编写的代码,我们只需将地址从本地更改为远程,一切都会继续工作。也就是说,Unix Domain socket的性能优势足够显着,而且 API 与 TCP 套接字非常相似,因此很可能编写同时支持两者的代码(单个主机上的 Unix Domain socket,用于远程 IPC 的 TCP),而且难度很小。

docer创建镜像的创建方法

创建docker镜像的三种方法,分别是基于已有的容器创建、基于本地模板创建、以及dockerfile创建。

基于以有容器创建镜像

基于已有的容器创建主要是使用docker commit命令。实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
命令:docker commit 选项 容器ID/名称 仓库名称:标签
常用的选项:
-m:说明信息
-a:作者
-p:生成过程中停止容器的运行(一般不会使用)

docker commit -m "this is a test image" -a "duzhe" mytomcat testimg:1.0

sha256:aa675b1e538c0463c4d0df45e8be34c7cfe71225ec896009b0ee7a754b3db283

基于本地模板镜像创建

通过导入操作系模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为:

https://wiki.openvz.org/Download/template/precreated

Cat 镜像包 | docker import - 生成的镜像名:标签

cat ubuntu-12.04-x86_64-minimal.tar.gz | docker import - myubuntu:1

sha256:17dccdf9e0a761de3eb582d5ca370377aa602e0881e58ce07c76cf6223904bcd

用dockerfile生成镜像

Dockerfile结构的四个部分:基本镜像信息维护者信息镜像操作指令容器启动执行指令

建立工作目录

mkdir dockerdir
cd dockerdir

创建并编写dockerfile文件

FROM centos:7
MAINTAINER duzhe
ENV PATH $PATH:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

编写执行脚本文件

vim run.sh

#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

COPY
### ARM架构下通过Docker安装openGauss镜像的方法 要在ARM架构下通过Docker安装openGauss数据库镜像,可以按照以下方法操作: #### 准备工作 确保目标机器已正确配置并运行支持ARM架构Docker环境。如果尚未安装Docker,请先完成安装,并验证其正常运行。 #### 下载必要的文件 从官方仓库获取`buildDockerImage.sh`脚本及相关依赖文件。该脚本可以从两个不同的仓库下载: - Server仓库地址:[https://gitee.com/opengauss/openGauss-server/tree/master/docker/dockerfiles](https://gitee.com/opengauss/openGauss-server/tree/master/docker/dockerfiles)[^2] - Container仓库地址:[https://gitee.com/opengauss/openGauss-container](https://gitee.com/opengauss/openGauss-container) 建议优先选择Container仓库中的资源,因为它是专门为容器化设计的版本。 #### 修改Dockerfile以适配ARM架构 由于默认的Dockerfile可能未针对ARM架构优化,在某些情况下可能会遇到依赖缺失的问题。例如,缺少`findutils`工具可能导致构建失败。此时可以在Dockerfile中加入如下命令以解决问题: ```dockerfile RUN yum install -y findutils ``` 此修改能够有效避免因工具链不全而导致的错误[^3]。 #### 构建Docker镜像 执行`buildDockerImage.sh`脚本来创建自定义的openGauss Docker镜像。为了提高网络稳定性,尤其是在Yum源下载较慢的情况下,可尝试在脚本内的`docker build`命令后附加参数`--network host`,从而利用宿主机的网络连接[^1]。 完整的构建过程大致如下所示: ```bash ./buildDockerImage.sh --arch arm64v8 --version latest ``` 其中选项说明: - `--arch`: 指定目标硬件平台(此处为arm64v8)。 - `--version`: 定义要拉取的基础镜像标签名(这里设为latest表示最新版)。 #### 启动容器实例 成功生成镜像之后,即可基于它启动一个新的容器用于承载openGauss服务。下面是一条典型的启动指令示例: ```bash docker run -d \ --name opengauss-instance \ -p 5432:5432 \ -e GAUSSDB_INIT_USER=gaussadmin \ -e GAUSSDB_INIT_PASSWORD=mysecretpassword \ openGauss:latest ``` 上述命令解释: - `-d`: 表明以后台模式运行容器; - `--name`: 给新创建的容器赋予名称opengauss-instance; - `-p`: 将本地端口映射到容器内部的服务监听端口中去; - `-e`: 设置初始化所需的用户名密码等环境变量值; #### 验证部署成果 最后一步就是确认整个流程顺利完成与否。可以通过访问指定IP加端口号组合的方式测试连通性以及登录功能是否可用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值