首页 > 其他分享 >docker跨平台构建镜像

docker跨平台构建镜像

时间:2023-09-23 11:04:31浏览次数:35  
标签:8080 -- 注册表 buildx 跨平台 linux 镜像 docker

我们在开发环境构建的镜像在生产环境大多不可用,我们在开发中一般使用 Windows 或者 MAC 系统,部署多半是 linux 环境。那么这篇文章能帮到你。

首先

首先你需要有一个 Dockerfile 文件。

举例:这里以一个 python 项目举例

FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "bin/run.py" ]

在这里插入图片描述

构建环境

前置环境设置,创建了一个 mybuilder 环境,

docker buildx create --name mybuilder --bootstrap --use

查看支持的环境

docker buildx ls

在这里插入图片描述

上传镜像的你的 repo,这里举例上传到 阿里云的 repo:

编译打包上传

docker buildx build --platform linux/amd64 --tag registry.cn-beijing.aliyuncs.com/xxx/xxx:heloworldjavapub --push  .  

进阶

以上是一个简单的案例,接下来适合高阶玩家

Buildx是对 Docker 工具的一个很好的补充。我认为它是“完整的 BuildKit”。出于我们的目的,它可以指定同时构建多个平台并将它们全部打包为多平台标签。它甚至会将它们推送到您的注册表,所有这些都只需一个命令。

我们首先需要设置 buildx。

% docker buildx create
whimsical_sanderson

我们现在可以为我们的应用程序构建多平台映像。

% docker buildx build --pull -t aspnetapp -f Dockerfile.alpine-non-root --platform linux/arm64,linux/arm,linux/amd64 .

在这里,我们正在构建三种架构。在某些环境中,您还可以仅指定体系结构作为简写,避免重复“linux”。

使用该命令,您将看到以下警告。

WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load

如果要将映像推送到注册表,则需要添加参数并为参数使用完全指定的注册表名称。或者,您可以使用将图像导出到 Docker 缓存。然而,仅当一次针对一种架构时才有效。--push-t--load--load

让我们尝试一下(使用我的注册表;您需要切换到您自己的注册表)。--push

% docker buildx build --pull --push -t dotnetnonroot.azurecr.io/aspnetapp -f Dockerfile.alpine-non-root --platform linux/arm64,linux/arm,linux/amd64 .

该命令将 3 个图像和 1 个标签推送到注册表。

我现在可以尝试在我的 Apple 笔记本电脑上提取图像。它在我的 Raspberry Pi 上也能发挥同样的作用。

% docker run --rm -d -p 8080:8080 dotnetnonroot.azurecr.io/aspnetapp
08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354
% curl http://localhost:8080/Environment
{"runtimeVersion":".NET 8.0.0-preview.2.23128.3","osVersion":"Linux 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022","osArchitecture":"Arm64","user":"app","processorCount":4,"totalAvailableMemoryBytes":4124512256,"memoryLimit":0,"memoryUsage":29548544}%
% docker exec 08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354 uname -a
Linux 5d4a712c32b9 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022 aarch64 Linux
% docker kill 08968dcce418db4d6f746bfa3a5f2afdcf66570bc8a726c4f5a4859e8666e354

我现在将在 x64 机器上尝试相同的图像。

$ docker run --rm -d -p 8080:8080 dotnetnonroot.azurecr.io/aspnetapp
6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2
$ curl http://localhost:8080/Environment
{"runtimeVersion":".NET 8.0.0-preview.2.23128.3","osVersion":"Linux 4.4.180+ #42962 SMP Tue Sep 20 22:35:50 CST 2022","osArchitecture":"X64","user":"app","processorCount":8,"totalAvailableMemoryBytes":8096030720,"memoryLimit":9223372036854771712,"memoryUsage":94019584}
$ docker exec 6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2 uname -a
Linux 6dac425acc32 4.4.180+ #42962 SMP Tue Sep 20 22:35:50 CST 2022 x86_64 Linux
$ docker kill 6dac425acc325da1c085608d503d6c884610cfa5b2a7dd93575f20355daec1a2

结果看起来不错,过程也很简单。

标签:8080,--,注册表,buildx,跨平台,linux,镜像,docker
From: https://blog.51cto.com/wangshiyu/7576641

相关文章

  • Docker概念及操作
    1.镜像相关命令:查看本地镜像:dockerimages搜索镜像仓库:dockersearch<名称关键字>下载镜像:dockerpull<镜像名:tag版本>上传镜像:dockerpush <镜像名:tag版本>删除镜像:dockerrmi <镜像名:tag版本>打包本地镜像文件:dockersave-o<输出文件路径>导入本地......
  • Docker Swarm 与高可用性
    什么是DockerSwarm?DockerSwarm是Docker官方提供的容器编排工具,它可以将多个Docker节点组成一个集群,实现容器的自动化部署和管理。DockerSwarm采用了Raft算法来保证集群的一致性,同时支持多种调度策略,如随机调度、最少使用调度、节点标签调度等。DockerSwarm的高可用......
  • Kubernetes中的镜像安全性扫描与漏洞管理
    介绍Kubernetes是一个流行的容器编排平台,它可以帮助我们管理和部署容器化应用程序。在Kubernetes中,镜像是应用程序的核心组件,因此镜像的安全性非常重要。在本文中,我们将深入探讨Kubernetes中的镜像安全性扫描与漏洞管理。镜像安全性扫描在Kubernetes中,我们可以使用多种工具来扫......
  • CentOS 镜像
    简介CentOS,是基于RedHatLinux提供的可自由使用源代码的企业级Linux发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。下载地址: https://mirrors.aliyun.com/centos/相关仓库:CentOS过期源(centos-vault):https://developer.aliyun.com/mirror/centos-vault......
  • Docker缓存占有太大的磁盘空间
    Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。查出占用磁盘较大的文件Docker的日志文件存在/var/lib/docker/containers目录中,通过下面的命令可以将日志文件夹根据升序的方式罗列出来。sudodu-d1-h/var......
  • docker-compose简介
    1.docker-compose简介  实现docker容器集群的快速编排。管理分成三层:工程(project)、服务(service)、容器(container)  没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如Consul  工程配置文件默认文件docker-compose.yml,也可自定义(通过环境变量COMP......
  • docker推送镜像到私仓
    1.私仓搭建和上传镜像  参考链接:https://blog.csdn.net/xiaoyu070321/article/details/130871703  dockerpullregistry//下载镜像  运行私有库registry(相当于本地有个是有dockerhub)  dockerrun-d-p5000:5000-v/huchao/myregistry/:/tmp/registry......
  • Docker - Expose a port
    Inordertoaccessthenginxfromourworkstation,wewould needtoexposetheport80fromwithinthenginxcontainertoourworkstation.Let usfirststopthecontainerandrecreateittoexposethecontainertoourworkstation:%dockerstopvigorous_......
  • docker安装jira
    阅读目录 1.下载镜像2.运行容器3.在MySQL中创建数据库4.在页面上访问jira并设置 回到顶部1.下载镜像#dockerpullxujianflying/jira:9.0.0#dockerpullxujianflying/mysql57:5.7回到顶部2.运行容器#运行jira,第一个8082为宿主端口,第二个为容器端口(不可修......
  • 如何设置SSH远程连接docker容器
    @https://blog.csdn.net/hwijew/article/details/88171749@https://blog.csdn.net/lhyhaiyan/article/details/128546411安装sshserverapt-getupdateapt-getinstallopenssh-server启动SSH服务sshstart查看SSH服务的状态servicesshstatus设置root密码和配置文件......