之前有听说过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的更多相关文章

  1. [转]利用Docker构建开发环境

    利用Docker构建开发环境 Posted by  makewonder on 2014 年 4 月 2 日   最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...

  2. 云服务器上利用Docker部署Django项目

    转载别人的,请看下面链接 云服务器上利用Docker部署Django项目

  3. 利用Docker构建开发环境

    最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...

  4. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

  5. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  6. 如何利用Docker构建基于DevOps的全自动CI

    来自用户的DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量.私有代码库与私有镜像库的应用等. (一)容器服务的Rancher选型 1.为什么说是下 ...

  7. Centos7.6上利用docker搭建Jenkins来自动化部署Django项目

    一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚. 整个过程相当复 ...

  8. 在阿里云Centos7.6上利用docker搭建Jenkins来自动化部署Django项目

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_84 一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更 ...

  9. 在macos上利用vmware fusion安装Ubuntu

    1. 安装vmware fusion http://www.vmware.com/products/fusion 下载以后,可以在网上找注册码,最好下载最新的,这里下载的是7的版本 2. 下载ubun ...

随机推荐

  1. 吴裕雄--天生自然 python数据分析:健康指标聚集分析(健康分析)

    # This Python 3 environment comes with many helpful analytics libraries installed # It is defined by ...

  2. Struts2获取request的几种方式汇总

    Struts2获取request三种方法 struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC机制注入Request对象. 在Action中 ...

  3. AQS总结

    前言 AQS(Abstract Queued Synchronizer)是JUC并发包中的核心基础组件,作者是大名鼎鼎的Doug Lea.通过AQS可以实现大部分的同步需求. 宏观架构 AQS包括一个 ...

  4. Tp5安全篇入门

    输入安全 设置public目录为唯一对外访问目录,不能把资源文件放入到应用目录: 使用框架提供的请求变量获取方法(Request类的param方法及input助手函数)而不是原生系统变量获取用户输入的 ...

  5. Allenmind's Blog

    听说,Sass和Compass更配哟.来看看Compass的基本用法! 目录 Compass和Sass 安装Compass 项目初始化 编译 Compass的模块 Compass的Helper函数 一 ...

  6. 爬虫cookies详解

    cookies简介 cookie是什么? Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 ...

  7. Java程序员考研失败后的面试经历,oppo、VIVO、等面经

      温馨提示:有些可能会遗漏个别问题,都是最近一周的面试,有点忘了. 浪潮(一面挂) 你是网络工程的?对网络很了解? 解释一下什么是广播域 怎么划分子网 说一下CSS的几种分类器 数据库中有哪些聚集函 ...

  8. Spring的工作原理

    一.什么是Spring (1).Spring真正的精华是它的Ioc模式实现的BeanFactory和AOP,它自己在这个基础上延伸的功能有些画蛇添足. (2). Spring它是一个开源的项目,而且目 ...

  9. Failed to open the key database file. c;\\User\\w\\Destop\\SecureCRT_FX6.5.3\\Config\\KnowHosts\\Hostsmap.txt这个问题的解决方法

    1.首先将这段错误在百度翻译上面查询一下,是什么意思,查询结果如下: 打开密钥数据库文件失败.C:\用户\ w \平台\ securecrt_fx6.5.3 \\ \\ \\ hostsmap.txt ...

  10. Ubuntu中VMware tools的安装步骤

    按照下面的步骤,轻松解决!! 1.点击导航栏中的虚拟机,下面的安装VMware tools 2.点击桌面上的光盘,进入后,将tar.gz文件复制到桌面,然后右击提取到此处: 3.在桌面打开终端,cd到 ...