以前有据说过docker,可是一直没有使用过。最近终于下定决定使用了一下docker,感受docker用于跨操做系统的软件工具使用仍是比较友好的。html
本文忽略的部分Linux软件包安装的过程,须要读者有必定Linux操做基础,具备软件包查找与安装能力。docker
在使用docker时,首先须要安装docker。安装完成后,经过从dockerhub上下载不一样系统环境的image,而后运行相应的image,完成docker的运行操做。shell
在docker的运行的过程,是经过docker命令调用image进行的运行,image运行的实体叫作container。image和container的关系比较像网吧系统的关系,网吧系统开机会加载操做系统,而且用户能够在操做系统中进行操做和修改;当系统关机重启后,再次开机的系统不会保留用户的更改,会还原成本来最初的系统状态。docker的过程与之相同,在docker使用image启动的container中,用户在container所作的操做并不会保存下来,而是会在用户退出的时候清除。macos
若是用户但愿保存下container中的修改,则须要将container保存成一个新的image,实现对修改的保存;或者使用共享磁盘的形式,将外部系统的目录共享到container内部,共享磁盘上的修改会被保留。ubuntu
docker官方提供了image的下载渠道dockerhub,地址为:https://hub.docker.com。vim
以Ubuntu为例,在dockerhub上,能够找到Ubuntu的image下载页面【https://hub.docker.com/_/ubuntu】,在该页面中能够看到不少不一样的Ubuntu的版本信息,经过api
docker pull ubuntu
能够完成对Ubuntu最新image的下载,也能够经过tag页面中根据tag寻找到所需的image,对指定的image进行下载。例以下载Ubuntu 1804的image,命令以下:bash
docker pull ubuntu:18.04
下载完成后,本地经过docker images命令能够看到所下载的镜像了。框架
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 7698f282e524 4 weeks ago 69.9MB
因为这个镜像只是一个最小的系统环境,包含了软件包安装命令apt,因此这个镜像很小。若是后续须要装更多的软件包,而且建立新的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。
在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.1
经过上述命令,实现经过container 7ab5341e698c建立了一个名字为myubuntu_1804,tag为v0.1的image。下次运行docker的时候,能够直接运行该image。运行命令以下:
docker run -it myubuntu_1804:v0.1
经过该image运行的container中,包含了以前对viminfo和vimrc的更改,实现了对原容器的保存。
在MacOS上,默认使用的文件系统是不区分大小写的,这对于Linux编译来讲会出现问题,因此须要建立一个区分大小写的扩展磁盘来存储buildroot项目文件。
在MacOS上,经过磁盘管理工具,能够在原有磁盘上新增一个添加到原磁盘上的卷宗。该卷宗能够与原磁盘共享存储空间,同时具备独立的磁盘格式。
新增卷宗时,将磁盘格式设置为“APFS区分大小写”,便可建立出一个新的区分大小写的卷宗。至此,MacOS上的磁盘准备工做就绪。
Buildroot是一个Linux平台上快速构建嵌入式Linux系统的框架,它可使用menuconfig进行配置,实现快速构建Linux工具链、rootfs等环境的工具。
从Buildroot的官方网站上能够下载到Buildroot的源码包,网址在:https://buildroot.org/download.html。下载完成后进行解压缩,便可获得Buildroot的工做目录。
在该目录中,存在configs目录,其中包含了默认的config信息,能够经过默认配置快速实现构建。
下文中,将使用”qemu_mips64el_malta_defconfig”做为默认配置,来讲明Buildroot的基本使用方法。
为了可以在docker内部使用Buildroot,能够经过使用共享磁盘的形式将Buildroot挂载到docker内部,而不用将Buildroot放在容器的文件系统内部。这样可以很方便的保留Buildroot的编译结果,而不用经过保存container的形式去保存变动。
因为使用了共享磁盘做为Buildroot的存储环境,因此须要注意的是:
该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!
该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!
该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!
能够经过如下命令将共享目录挂载到container内部:
docker run -it -v ${PWD}:/dockershare myubuntu_1804:v0.1
上述命令中,${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目录下存放着编译结果。至此,所有操做结束。