# baloneo-docker **Repository Path**: baloneo/baloneo-docker ## Basic Information - **Project Name**: baloneo-docker - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-01-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # baloneo mydocker 根据《自己动手写Docker》自己跟着写了一遍的源码。 OS: Mint 19.1 tessa Kernel: x86_64 Linux 4.15.0-74-generic #### 运行 1 ``` cd /path/to/this/project mkdir -p /home/baloneo/baloneo-docker cp busybox.tar /home/baloneo/baloneo-docker ``` 2 ``` export GOPATH=$PWD cd src/github.com/xianlubird/mydocker/ go build . ``` ### chapter4.1 增加busybox ``` docker pull busybox docker run -d --name mybusybox top -b docker export -o busybox.tar mybusybox tar -xvf busybox.tar -C busybox # 不能使用unar等软件直接解压 会导致无法解压出链接文件指向的文件导致mydocker执行失败 ``` ### chapter4.2 增加aufs #### aufs文件系统特点 当尝试向 mnt/image-layer4.txt 文件进行写操作的时候 , 系统首先在 mnt 目录下 查找名为 image-layer4.txt 的 文件 ,将其拷贝到 read-write 层的 container-layer 目录中,接着对 container-layer 目录中的 image-layer4.txt 文件进行写操作 。当文件系统卸载之后,变化的只有容器变化(container-layer) ``` sudo ./mydocker run -ti sh touch /tmp/hello.txt echo "hello world" >> /tmp/hello.txt ``` 再查看`/home/baloneo/baloneo-docker/mnt/tmp/`和`/home/baloneo/baloneo-docker/writeLayer/`两个文件夹都会有相同的操作 ### chapter 4.3 增加数据卷 ``` sudo ./mydocker run -ti -v /tmp/aaa:/home/sss sh ``` 目前只能创建一级目录 多级会报错 ### chapter 4.4 增加镜像打包 主要使用tar命令对mnt目录进行打包 ### chapter 5.1 容器后台运行 利用linux操作系统中,父进程fork一个子进程,父进程提前结束,子进程会被init进程收养的原理。 如果执行sh 命令的时候没有stdio、stdin、stderr 那么sh直接执行完导致看不到执行效果 ### chapter 5.2 查看运行中的容器 在运行容器的时候把信息存贮到指定文件 ### chapter 5.3 查看容器日志 ``` sudo ./mydocker run -d --name testcontainer top sudo ./mydocker logs testcontainer ``` 运行完之后需要手动删除挂载的文件 ``` sudo umount mnt sudo rm -rf info mnt writeLayer ``` ### chapter 5.4 进入容器NameSpace 主要使用`setns`进入命名空间,go语言用来创建进程 设置环境变量。当c代码检查到有环境变量,会自动进入某个进程的命名空间,再调用system创建一个子进程再用exec族函数替换当前进程空间的内容为用户指定要运行的指令。 ### chapter 5.5 停止容器 需要使用kill -9 才能杀死sh ### chapter 5.6 删除容器 这里删除容器只是删除info信息