《自己动手写docker》运行环境配置

肄_ · · 1178 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近在学《自己动手写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)
  1. 内核降级,由于这个ubuntu容器的内核版本是5.0,对于一些底层函数的调用源码中的不同,会出问题,所以要降级。我这里暂时没有成功。。后面再更新。

参考资料:

  1. 关于shell脚本中执行cd命令无效的分析

  2. docker中宿主机与容器(container)互相拷贝传递文件的方法


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:肄_

查看原文:《自己动手写docker》运行环境配置

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1178 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传