docker原理介绍

创建容器

挂载a目录到b目录(b目录的子目录被隐藏,所有的对b的修改都作用a上)

mount –bind a b

切换根目录
privot_root new_root old_root

aufs创建容器层

将pathA和pathB挂载到mount_path目录;默认只有最上面一层是可读写的也就是pathB,其他是只读
mount -t aufs -o dirs=pathA:pathB none mount_path
删除容器信息
umount mount_path
rm -rf mount_path

volume实现

-v a:b
mount -t aufs -o dirs=a none none b

镜像打包

commit imageName
tar -xzf imageName.tar -C mount_path .

容器后台运行

原理:容器实际就是一个进程,当前运行命令的是主进程,容器是被当前主进程fork出来的子进程。子进程的结束和父进程的运行是一个异步过程。如果创建的子进程的父进程退出,那么子进程就会成为孤儿进程。为了避免孤儿进程退出时无法释放所占用的资源而僵死,进程号为1的进程init就会接受这些孤儿进程
run -d
docker代码:如果是非"-d"模式,父进程等待子进程执行完成即可:parent.wait()

查看运行中的容器

ps
原理:将容器的信息写入一个日志文件中,当执行ps的时候,读取文件中的信息,使用fmt.Fprintf格式化输出到标准输出流缓存区

查看容器日志

logs
原理:如果是-d模式,将标准输出的信息写入到一个文件中,执行logs的时候,读取文件信息,使用fmt.Fprint输出

进入容器

exec
原理:使用setns可以根据提供的pid进入指定的namespace中,需要先打开指定文件

停止容器

stop
原理:kill pid

删除容器

rm
原理:删除所有文件(容器文件,日志文件)

容器制作镜像

commit
原理:将指定的容器的文件,打包到固定的image.tar
run --name container imageName
原理:将指定的imageName解压,创建可写文件,挂载

提前准备

ubuntu14.04下载

ubuntu14.04下载地址

软件安装
apt-get install bridge-utils
apt-get install gcc
apt-get install -y linux-tools-$(uname -r)
apt-get install stress
apt-get install cgroup-bin
依赖包下载
go get github.com/Sirupsen/logrus
go get github.com/urfave/cli
go get github.com/vishvananda/netlink
go get github.com/vishvananda/netns
go get github.com/vishvananda/netlink/nl        
golang.org/x包下载脚本(log)
#!/usr/bin/env bash
#为了兼容windows下的bash
cd $GOPATH;
#创建 $GOPATH/src/golang.org/x 目录
mkdir -p $GOPATH/src/golang.org/x;

echo "已经安装的golang.org/x package";
ls;
echo "下面一行 for in 中包的名字您可以自己来定义"
for name in "glog" "image" "perf" "snappy" "term" "sync" "winstrap" "cwg" "leveldb" "text" "net" "build" "protobuf" "dep" "sys" "crypto" "gddo" "tools" "scratch" "proposal" "mock" "oauth2" "freetype" "debug" "mobile" "gofrontend" "lint" "appengine" "geo" "review" "arch" "vgo" "exp" "time";do
   cd $GOPATH/src/golang.org/x;
   if [ -d "$name" ]
   then
     cd $name;
     echo $name "包已经存在,使用git pull来更新源码";
     git pull;
   else
     git_url="https://github.com/golang/${name}.git";
     echo "开始clone golang.org/x 在github.com上的镜像代码:${git_url}";
     git clone --depth 1 "$git_url";
     cd $name;
   fi
   #go install;
done
坚持原创技术分享,您的支持将鼓励我继续创作!