buildah进阶

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: buildah进阶

学习本文要先大概了解dockerfile才行,部分基础命令会一带而过


我们昨天已经学习了buildah的安装和运行dockerfile,具体相关内容,可以翻看上一篇文章,今天我们来看看buildah的特性,大概会从以下2个方面来介绍buildah特性,第一个是buildah交互式构建镜像,第二个便是将容器的根目录挂载到宿主机上。 接着再介绍如何将制作好的镜像推送到私有仓库或则docker hub,最后再来讲一下如何删除镜像



buildah 交互式构建镜像


命令描述

介绍部分案例可能会用到的命令


buildah from

该命令是我们一般使用buildah from来基于镜像创建工作容器,我们尝试一下,基于centos创建工作容器,执行该命令后,会返回容器的名称,我们后面执行操作都将使用该容器名称

命令: buildah frm centos

image.png


我们查看buildah容器信息

命令: buildah containers

不仅如此,还可以以json信息输出,只需要添加--json即可

image.png


buildah config


该命令用于更新镜像配置,它包含很多子命令,我们分别来看


  • --cmd: 该命令用于设置容器启动的命令

语法: buildah config --cmd command containerID,其中 command 为执行的命令,containerID 为容器ID

  • --entrypoint:该命令用于基于镜像设置启动命令

语法: buildah config --entrypoint command containerID,其中command为执行的命令,containerID为容器ID

这里提及一下cmdentrypoint的区别

大概是这样的,cmd在启动容器是,会被替换掉,例如,我们使用buildah设置了buildah config --cmd ./redis-server containerID , 但是我们在run容器时候,使用了命令,例如: podman run -it redis /bin/bash,则 cmd命令会被替换为/bin/bash

entrypoint则不会,若run时指定了命令,它会附着在entrypoint后面,不会替换掉原有命令

  • --env: 该命令用于设置容器环境变量

语法: buildah config --env var=value containerID,其中var为变量名称,value为其值,containerID 为容器ID

  • --hostname: 该命令用于设置容器hostname

语法: buildah config --hostname domanhostname containerID, 其中domanhostnae为设置的主机名称

  • --port: 该命令用于设置容器开放的端口

语法: buildah config --port port containerID,其中port为要开放的端口

  • --workingdir设置容器工作目录

语法: buildah config --workingdir dir containerID,其中dir为新指定的工作目录





buildah copy

该命令用作拷贝文件进容器中


buildah add

该命令和buildah copy类似,不过add可以从网络上拷贝文件,若是压缩文件,还会自动解压


buildah run

该命令为容器执行命令,格式buildah run command containerID,其中command为容器中要执行的命令


buildah commit

从工作容器中创建镜像


使用buildah交互式构建镜像-栗子


执行命令

# 查看当前目录下文件
ls 
blogReader  Dockerfile  main.go
# 我们的目的是将blogReader拷贝进镜像中,并且制作为容器,现在我们开始吧
# 我们基于centos创建一个容器哈
buildah from centos
# 我们得到了该容器名称: centos-working-container-2
# 创建维护者信息
buildah config --label MAINTAINER="pdudo juejin buildah" centos-working-container-2
# 将blogReader可执行文件拷贝进容器中
buildah copy centos-working-container-2 blogReader ./blogReader 
# 赋予文件可执行权限
buildah run centos-working-container-2 chmod +x ./blogReader
# 将容器端口开放出去
buildah config --port 9091 centos-working-container-2
# 定义容器启动命令
buildah config --cmd ./blogReader centos-working-container-2
# 保持镜像到磁盘
buildah commit centos-working-container newblogreader
# 查看容器镜像
podman images | head -n 1; podman images | grep newblogreader


image.png



测试镜像

我们将刚刚制作的镜像运行起来,访问路由查看是否正常

image.png



将容器的根目录挂载到宿主机上


我们使用mountunount 来挂载和卸载目录,这个命令之前讲过,可以利用宿主机工具,在容器中操作具体命令,无需容器再构建工具,例如: targccmakego等,可以减少镜像的容量。


命令描述


buildah mount


使用buildah制作镜像时,若使用buildah mount能够将容器的根目录挂载到宿主机上,这个非常强大,能够向操作宿主机一样,操作容器文件。


例如: 我们启动一个centos容器,然后将该容器根目录挂载到宿主机上,我们尝试下

挂载命令: buildah mount containerID,其中containerID为容器ID


image.png


buildah umount

buildah mount相反,umount 是取消挂载的意思,我们一般在制作镜像时,若需要挂载,我们则将其挂载出来,处理完毕后,一定要记得umount回去哈,养成好的习惯。

image.png


使用buildah mount栗子

这次我们将源文件可执行文件都放在宿主机上,利用挂载,我们直接将宿主机文件编译并且放到容器中。


源文件

我们还是以上上天那个go程序作为栗子哈

image.png

脚本

我们将上述buildah命令整合为为脚本(要不要给shell脚本也挖一个坑,后面单独讲讲脚本?)应该是这样的

image.png


执行脚本查看过程

由于我们开启了“debug”,所以,我们执行脚本看下

image.png


我们查看一下镜像

image.png


测试镜像

我们将刚刚制作的镜像运行起来,访问路由查看是否正常

image.png




将制作好的镜像推送到镜像仓库

我们一般所谓的镜像仓库可以分为两大类,1. 私有仓库 2. 公共仓库

目前我们还没有私有仓库,所以我们直接推送到公用仓库,推送到共有仓库一般流程为,将容器打一个符合仓库的tag,然后将这个镜像推送到仓库即可。



命令描述


buildah login

我们一般使用buildah login登录仓库,然后再利用buildah push推送到远程仓库即可

例如我们想登录docker hub,则仅需要: buildah login docker.io即可

image.png


buildah logout

buildah logout则为退出登录,不多阐述

image.png


buildah pull

buildah pull为拉取远程镜像,我们尝试拉取一个redis下来看看

image.png


buildah push

buildah push则为上传镜像至远程仓库

image.png



删除镜像

删除镜像,我们一般使用podman rmi或则buildah rmi删除即可,例如我们删除nginxredis镜像

image.png

image.png




心得


我一开始并不怎么看好buildah交互式操作,直到遇到了buildah mount,试着写了一下,啊,真香,我写dockerfile不算少,或多或少被环境坑过一波,比如,我们想自己制作redis镜像,那么如果按照docker build的规则,则必须在容器中安装makegcc 等,徒增容器容量大小,后期又不会使用,很得不偿失,mount将目录挂出来,个人感觉撩到了我的G点了,真的很强,可以结合shell,来构建镜像,才会越来越得心应手。




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
1月前
|
定位技术 API Apache
|
1月前
|
Oracle Java 关系型数据库
Java编程之旅:从基础到进阶
Java,一种广泛使用的编程语言,因其平台无关性、面向对象的特性而备受推崇。本文旨在通过简明易懂的语言和实际代码示例,引导初学者了解Java的基本概念,并逐步深入到更复杂的编程技巧。我们将从Java的安装开始,经过变量、数据类型、控制结构等基础知识的学习,最后探讨异常处理和文件操作等进阶话题。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。
|
1月前
|
程序员 数据库 开发者
探索Python编程之旅:从基础到进阶
【9月更文挑战第34天】本文将引导你踏上Python编程的奇妙旅程,从最初的安装和运行第一个程序开始,逐步深入到面向对象编程、文件操作和网络编程等高级主题。我们将通过代码示例和清晰的步骤解释,帮助你构建起对Python语言的深刻理解,并鼓励你在遇到问题时主动寻找解决方案,培养解决问题的能力。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到有价值的内容和启发。
|
2月前
|
人工智能 数据挖掘 开发者
Python编程:从基础到进阶
【8月更文挑战第59天】本文将带你进入Python的世界,从基础语法到进阶技巧,让你轻松掌握Python编程。我们将通过实例讲解,让你在实际操作中提升技能。无论你是初学者还是有一定基础的开发者,都能在本文中找到适合自己的学习内容。让我们一起探索Python的魅力吧!
|
2月前
|
机器学习/深度学习 存储 人工智能
探索Python编程的魔法:从基础到进阶
【9月更文挑战第16天】本文将带领你进入Python编程的世界,无论你是初学者还是有一定经验的开发者。我们将一起揭开Python编程的神秘面纱,通过实际案例和代码示例,深入浅出地探讨Python的基础语法、数据结构、面向对象编程以及函数式编程等核心概念。文章旨在提供一条清晰的学习路径,帮助你构建坚实的编程基础,并逐步过渡到更高级的编程技巧。无论你的目标是数据分析、网络开发还是机器学习,这篇文章都将为你打下扎实的基础,让你在编程的道路上越走越远。
21 6
|
1月前
|
数据采集 机器学习/深度学习 数据处理
Python编程之魔法:从基础到进阶的代码实践
在编程的世界里,Python以其简洁和易读性而闻名。本文将通过一系列精选的代码示例,引导你从Python的基础语法出发,逐步探索更深层次的应用,包括数据处理、网络爬虫、自动化脚本以及机器学习模型的构建。每个例子都将是一次新的发现,带你领略Python编程的魅力。无论你是初学者还是希望提升技能的开发者,这些示例都将是你的宝贵财富。让我们开始这段Python编程之旅,一起揭开它的魔法面纱。
|
3月前
|
数据采集 存储 人工智能
掌握Python编程:从基础到进阶的实用指南
【8月更文挑战第17天】 本文旨在通过浅显易懂的语言和实际案例,为初学者和有一定基础的开发者提供一条清晰的Python学习路径。我们将从Python的基本语法入手,逐步深入到面向对象编程、数据科学应用及网络爬虫开发等高级主题。每个部分都配备了代码示例和实操建议,确保读者能够将理论知识转化为实际能力。无论你是编程新手,还是希望提升Python技能的开发者,这篇文章都将为你打开一扇通往高效编程世界的大门。
28 2
|
5月前
|
编译器 C++
C++模板进阶
C++模板进阶
24 1
|
5月前
|
存储 算法 开发者
掌握Python编程:从基础到进阶
【6月更文挑战第7天】本文将引导读者了解并掌握Python编程语言的基础知识和进阶技巧。我们将从Python的基本语法开始,逐步深入到更复杂的主题,如数据结构和算法、面向对象编程以及网络编程。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。

相关实验场景

更多