最近在学《自己动手写docker》,然而,由于自己电脑上本身安装的go语言版本不是其指定的1.7.1版本,所以编译时,由于版本问题,经常编辑失败。但是我又不想在自己的电脑上搞那么多,加上这本书运行的程序中会调用很多linux系统底层函数,有点怕万一自己搞错了,就gg了。
所以安装虚拟机是最好的,还能符合这本书指定的系统ubuntu14.04以及内核版本3.13.0-83-generic。
但是吧,我忽然突发奇想,能不能用docker来实现呢。本身docker就有ubuntu的官方镜像, 而且在docker也完全可以实现虚拟机的功能,而且启动起来比vmware要快些。所以就弄了一下。下面是具体的配置流程。
1. 拉取ubuntu14.04的镜像,运行以下命令
docker pull ubuntu:14.04.4
docker run -i -t ubuntu:14.04.4 /bin/bash
2. 更新源(在docker中,ubuntu系统容器默认为root权限,所以不用加上sudo)
apt update
apt upgrade
3. 下载go安装包
https://golang.org/doc/install?download=go1.7.1.linux-amd64.tar.gz
4. 安装git 、vim
apt install git vim -y
5. 复制go1.7.1.linux-amd64.tar.gz到容器中
docker cp Downloads/go1.7.1.linux-amd64.tar.gz 88c:/root (88c为容器id,查看容器id的命令为:docker ps)
6. 解压到/usr/local, creating a Go
tree in /usr/local/go
tar -C /usr/local -xzf go1.7.1.linux-amd64.tar.gz
7. 编辑$HOME/.profile,将export PATH=$PATH:/usr/local/go/bin添加到文件中(),然后执行source $HOME/.profile,使得修改生效。
echo "export PATH=$PATH:/usr/local/go/bin" >> .profile
source $HOME/.profile
8. 配置GOPATH
这里以/go为GOPATH路径,编辑$HOME/.profile文件,将命令export GOPATH=/go添加到文件中,然后执行,使得修改生效。
echo "export GOPATH=/go" >> .profile
source $HOME/.profile
9. 保存容器为新镜像
docker commit 88c myubuntu14(88c为容器id,查看容器id的命令为:docker ps)
这里会有一个Bug:运行新镜像后,容器内的环境变量被重置,无法找到go的路径,需要重新执行source $HOME/.profile命令。
10. 安装必要的依赖
命令go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
需先安装gcc
apt install gcc -y
go get github.com/Sirupsen/logrus
go get github.com/urfave/cli
go get github.com/xianlubird/mydocker(这也是我们要学习的源码目录)
11. start.sh一键到达工作目录,并解决9中的bug
在容器外,我们的原主机中,
vim start.sh
将这两行写入start.sh文件中
source $HOME/.profile
cd /go/src/github.com/xianlubird/mydocker/
保存退出(:wq)
添加执行权限
chmod +x start.sh
复制到容器中
docker cp start.sh efe:/ ( efe为容器id,查看容器id的命令为:docker ps)
在docker容器中,运行命令即可
. ./start.sh
ps:此处注意,如果只有一个点(命令:./start.sh),是无法成功的,原因是这种方法是直接运行该脚本,会创建一个子shell,并在子shell中逐个执行脚本中的指令; 而子shell从父shell中继承了环境变量,但是执行后不会改变父shell的环境变量;可以这样理解:在子shell中的操作和环境变量不会影响父进程,在执行完shell后又回到了父进程。
所以我们要用source命令执行start.sh脚本(source ./start.sh),source命令是在当前shell环境下读取并执行脚本中的命令,通常用于重新执行刚修改过的初始化文件,使之立即生效,而不必注销并登录。其不会创建子shell,因而可以在shell中进入到指定目录中。
source命令又称为点命令,所以,我们上面的命令写为( . ./start.sh)
最后,保存容器为新镜像
docker commit efe myubuntu14-1.0(efe为容器id,查看容器id的命令为:docker ps)
- 内核降级,由于这个ubuntu容器的内核版本是5.0,对于一些底层函数的调用源码中的不同,会出问题,所以要降级。我这里暂时没有成功。。后面再更新。
参考资料:
有疑问加站长微信联系(非本文作者)