在MacOS上利用docker构建buildroot
之前有听说过docker,但是一直没有使用过。最近终于下定决定使用了一下docker,感觉docker用于跨操作系统的软件工具使用还是比较友好的。
适用人群
本文忽略的部分Linux软件包安装的过程,需要读者有一定Linux操作基础,具有软件包查找与安装能力。
Docker的基本用法
在使用docker时,首先需要安装docker。安装完成后,通过从dockerhub上下载不同系统环境的image,然后运行相应的image,完成docker的运行操作。
在docker的运行的过程,是通过docker命令调用image进行的运行,image运行的实体叫做container。image和container的关系比较像网吧系统的关系,网吧系统开机会加载操作系统,并且用户可以在操作系统中进行操作和修改;当系统关机重启后,再次开机的系统不会保留用户的更改,会还原成原本最初的系统状态。docker的过程与之相同,在docker使用image启动的container中,用户在container所做的操作并不会保存下来,而是会在用户退出的时候清除。
如果用户希望保存下container中的修改,则需要将container保存成一个新的image,实现对修改的保存;或者使用共享磁盘的形式,将外部系统的目录共享到container内部,共享磁盘上的修改会被保留。
从Docker Hub上下载image
docker官方提供了image的下载渠道dockerhub,地址为:https://hub.docker.com。
以Ubuntu为例,在dockerhub上,可以找到Ubuntu的image下载页面【https://hub.docker.com/_/ubuntu】,在该页面中可以看到很多不同的Ubuntu的版本信息,通过
docker pull ubuntu
可以完成对Ubuntu最新image的下载,也可以通过tag页面中根据tag寻找到所需的image,对指定的image进行下载。例如下载Ubuntu 1804的image,命令如下:
docker pull ubuntu:18.04
下载完成后,本地通过docker images命令可以看到所下载的镜像了。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 7698f282e524 weeks ago .9MB
由于这个镜像只是一个最小的系统环境,包含了软件包安装命令apt,所以这个镜像很小。如果后续需要装更多的软件包,并且创建新的image,新的image的尺寸会变大。
运行image
使用docker运行image的命令如下:
docker run ubuntu:18.04 bash
上面的命令是通过docker调用了ubuntu:18.04image中的bash。但是该命令一闪而过,没有留下任何痕迹。这并不是运行错误,而是因为bash运行完成之后退出了。如果不希望运行后退出,而是留在终端里,可以通过下述命令来进行执行:
docker run -it ubuntu:18.04
上述命令运行完成后,可以停留在shell中,该shell是docker所运行的Ubuntu image的container的shell,可以看到命令提示如下:
root@7ab5341e698c:/#
进入container后,用户为root,容器编号为7ab5341e698c,停留的目录为“/”。接下来,就可以在容器内进行各种操作了,可以通过apt命令去安装自己所需的软件。
!!注意!!
退出容器时,如果直接使用exit命令会导致容器退出,所有容器内部的更改将会丢失。如果只是想离开窗口而不退出容器,需要使用“ctrl + p,ctrl + q”这组命令来离开容器,容器将会在后台保持运行。容器在后台运行的状态可以通过“docker ps”进行查看,例如:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ab5341e698c ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour vigilant_kapitsa
通过上述命令可以看到,容器在后台运行,命令的ID为“7ab5341e698c”。如果希望再次进入到容器中,则可以通过attach命令再次进入到容器中。例如:
docker attach 7ab5341e698c
再次返回容器中,会继续看到容器内部shell的执行状态。如果返回容器中时,容器内部的shell正在执行命令,则会在shell处卡住。在shell处卡住时,通过“ctrl + c”命令能够结束当前命令的运行,也可以通过“ctrl + z”命令将执行的程序挂起,需要时通过“fg”恢复挂起程序的运行。
需要注意的是,在容器运行时,多个窗口通过attach命令连接容器,会进入到同一个shell中,导致shell的抢占,所以要尽量使用多个attach操作连接同一个container。
保存container
在docker运行过程中,安装好所需的软件工具后,可以通过“docker diff containner”命令看到有哪些修改,例如:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ab5341e698c ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour vigilant_kapitsa $ docker diff 7ab5341e698c
C /root
C /root/.viminfo
A /root/.vimrc
通过上述命令,可以看出在容器中,新增了viminfo和vimrc文件。为了保存这些修改,可以通过commit命令将container保存成一个新的image。命令如下:
docker commit -m "Add vimrc and viminfo" 7ab5341e698c myubuntu_1804:v0.
通过上述命令,实现通过container 7ab5341e698c创建了一个名字为myubuntu_1804,tag为v0.1的image。下次运行docker的时候,可以直接运行该image。运行命令如下:
docker run -it myubuntu_1804:v0.
通过该image运行的container中,包含了之前对viminfo和vimrc的更改,实现了对原容器的保存。
MacOS
在MacOS上,默认使用的文件系统是不区分大小写的,这对于Linux编译来说会出现问题,所以需要创建一个区分大小写的扩展磁盘来存储buildroot项目文件。
在MacOS上,通过磁盘管理工具,可以在原有磁盘上新增一个添加到原磁盘上的卷宗。该卷宗可以与原磁盘共享存储空间,同时具有独立的磁盘格式。
新增卷宗时,将磁盘格式设置为“APFS区分大小写”,即可创建出一个新的区分大小写的卷宗。至此,MacOS上的磁盘准备工作就绪。
编译Buildroot
Buildroot是一个Linux平台上快速构建嵌入式Linux系统的框架,它可以使用menuconfig进行配置,实现快速构建Linux工具链、rootfs等环境的工具。
从Buildroot的官方网站上可以下载到Buildroot的源码包,网址在:https://buildroot.org/download.html。下载完成后进行解压缩,即可得到Buildroot的工作目录。
在该目录中,存在configs目录,其中包含了默认的config信息,可以通过默认配置快速实现构建。
下文中,将使用”qemu_mips64el_malta_defconfig”作为默认配置,来说明Buildroot的基本使用方法。
Docker共享磁盘
为了能够在docker内部使用Buildroot,可以通过使用共享磁盘的形式将Buildroot挂载到docker内部,而不用将Buildroot放在容器的文件系统内部。这样能够很方便的保留Buildroot的编译结果,而不用通过保存container的形式去保存变更。
由于使用了共享磁盘作为Buildroot的存储环境,所以需要注意的是:
该磁盘必须是区分大小写的,!!否则部分软件包编译会报错!!
该磁盘必须是区分大小写的,!!否则部分软件包编译会报错!!
该磁盘必须是区分大小写的,!!否则部分软件包编译会报错!!
可以通过以下命令将共享目录挂载到container内部:
docker run -it -v ${PWD}:/dockershare myubuntu_1804:v0.
上述命令中,${PWD}指的是当前目录(全路径),”/dockershare”指的是container内部可以看到的共享目录路径(全路径)。上述命令执行完成后,即可将当前目录挂载到docker container内部,也可以通过将${PWD}替换成其他全路径,实现指定路径的挂载。
需要注意的是,外部路径一定是存储了Buildroot的路径,并且该路径中可以存放区分大小写的文件。
配置
通过加载共享磁盘的方式进入容器后,可以进入”/dockershare/buildroot-2019.05”路径(本文下载的是2019.05版本的Buildroot),在该路径中,可以通过直接调用defconfig的形式进行快速配置,如:
make qemu_mips64el_malta_defconfig
配置完成后,需要调整部分选项信息,则可以通过”make menuconfig”进入菜单,进行修改。
这里可以将默认的软件包下载仓库调整为Buildroot的备份仓库,这样可以加快下载速度,避免部分软件包无法下载的情况。调整的配置路径如下:
│ Symbol: BR2_PRIMARY_SITE [=http://sources.buildroot.net] │
│ Type : string │
│ Prompt: Primary download site │
│ Location: │
│ -> Build options │
│ -> Mirrors and Download locations 将该值设置为“http://sources.buildroot.net”
修改完配置后,即可通过ecs进行后退,到最后一层退出时提示保存配置信息,保存即可。
编译
在配置完成后,即可进入编译步骤。编译命令如下:
make source # 提前将软件包全部下载,可省略
make # 进行编译
上述编译步骤中,”make source”是可以省略的。但是通过“make source”可以将编译所需的全部软件包进行下载,后续进行编译即可,减少了编译过程中由于软件包无法下载导致的编译暂停。“make source”可以不执行,这样在编译的过程中,需要编译某个软件包时再下载,也是可以的。
Buildroot可以“make”命令完成编译,编译完成后,在output目录下存放着编译结果。至此,全部操作结束。
在MacOS上利用docker构建buildroot的更多相关文章
- [转]利用Docker构建开发环境
利用Docker构建开发环境 Posted by makewonder on 2014 年 4 月 2 日 最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...
- 云服务器上利用Docker部署Django项目
转载别人的,请看下面链接 云服务器上利用Docker部署Django项目
- 利用Docker构建开发环境
最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...
- 如何利用docker 构建golang线上部署环境
公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
- 如何利用Docker构建基于DevOps的全自动CI
来自用户的DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量.私有代码库与私有镜像库的应用等. (一)容器服务的Rancher选型 1.为什么说是下 ...
- Centos7.6上利用docker搭建Jenkins来自动化部署Django项目
一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚. 整个过程相当复 ...
- 在阿里云Centos7.6上利用docker搭建Jenkins来自动化部署Django项目
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_84 一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更 ...
- 在macos上利用vmware fusion安装Ubuntu
1. 安装vmware fusion http://www.vmware.com/products/fusion 下载以后,可以在网上找注册码,最好下载最新的,这里下载的是7的版本 2. 下载ubun ...
随机推荐
- Django学习之路02
静态文件配置 html文件默认全都放在templates文件夹下 对于前段已经写好了的文件, 我们只是拿过来使用 那么这些文件都可以称之为叫"静态文件"静态文件可以是 bootst ...
- getshell技巧-phpMyAdmin的利用
生活就是泥沙俱下,鲜花和荆棘并存.--毕淑敏 1.明确目标2.信息收集3.漏洞挖掘和利用 信息收集 明确路径 利用目录扫描工具,对目标网站进行扫描,获取网站目录.常用工具有Kali中的DirBuste ...
- Kubernetes集群部署DNS插件
准备 kube-dns 相关镜像 准备 kube-dns 相关 yaml 文件 系统预定义的 RoleBinding 配置 kube-dns 相关服务 检查 kube-dns 功能 kube-dns ...
- Linux统计目录下文件个数及代码行数
1. 统计当前目录下,php文件数量 find ./ -name "*.php" | wc -l 2. 统计当前目录下所有php文件代码行数 find ./ -name " ...
- PyGame学习笔记之壹
新建窗口 代码 '''PyGame学习笔记之壹''' import pygame # 引入 PyGame 库 pygame.init() # PyGame 库初始化 screen = pygame.d ...
- 使用Lucene.Net做一个简单的搜索引擎-全文索引
Lucene.Net Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...
- 在线选题系统完善篇(PHP)
第一篇: 选题在线提交系统(html+JS+PHP) 这是当时根据需求做的一个简单的版本,只能适用于这一个场景,而且题目等一系列数据都不能改.然后结束后,我又对重新写了一个有后台管理的选题系统.相对于 ...
- Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...
- cmake引用包初探
应要求使用的是 mediastreamer2 库.以前开发是在tools下注册了一个新的tool,现在应该另行建立一个项目. 好像 CMake 写的项目叫package??? 项目名字是 mstest ...
- 有关js的date的相关知识
最近做项目,用了new Date().getTime()获取本地时间,但是如果用户篡改了手机时间,程序漏洞明显暴露.所以如果为保证程序的稳健安全性,应该是要使用网络时间的,也就是服务器时间.原理就是使 ...