实现docker run命令
基于宿主机来创建容器
执行命令
《自己动手写Docker》code-3.1
./mydocker run -ti /bin/bash
代码流程
1. 解析参数。
2. 通过clone来fork一个Namespace隔离的容器进程。
3. 调用自己/proc/self/exe初始化容器(挂载proc文件系统),容器内1号进程就是这个init进程。
4. 调用syscall.Exec来把init进程替换成用户指定的进程。
unshare:已有进程加入到新的namespace中。
setns:已有进程加入到已经存在的namespace中。
clone:创建新进程,该进程加入到新的namespace中。
效果

基于容器镜像来创建容器

没有使用容器镜像时,容器进程继承了父进程的所有挂载点,与宿主机共用rootfs。mount namespace没有隔离,会把宿主机上的proc挂载到容器里面,导致宿主机上的ps -ef命令无法执行。
获取容器快照镜像
docker pull busybox
docker run -d busybox top
docker export -o busybox.tar 容器ID
tar -xvf busybox.tar -C busybox/
修改关键流程
《自己动手写Docker》code-4.1
把pivotRoot函数修改成如下内容(通过chroot来切换根目录,而不是pivot_root,避免报错;Docker优先使用pivot_root,失败后使用chroot)
func pivotRoot(root string) error {
return syscall.Chroot("/root/busybox")
}
执行命令
./mydocker run -ti /bin/sh
效果
容器内的挂载点已经与宿主机不同,不存在宿主机上执行ps -ef报错的问题。

实现docker run命令的更多相关文章
- Docker run 命令的使用方法
[编者的话]在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍.中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Do ...
- Docker run 命令参数及使用
Docker run 命令参数及使用 Docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTI ...
- docker run命令运行以及参数详解
命令格式: -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-sh ...
- Docker(12)- docker run 命令详解
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...
- docker run命令指定GPU多个显卡不生效的问题解决和代码示例
问题描述:我有一个程序(app),需要用到显卡来跑.原本的部署方式 是直接修改程序的配置文件来指定要用到的显卡. 这是我服务器的显卡信息:总共3卡 分别是 0卡 ,1卡和2卡. [root@k8s-r ...
- Docker run命令详解 转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Usage: doc ...
- Docker run 命令
docker run -d -p 8084:80 --name weather --restart always --link fme-postgis 192.168.1.220:5000/weath ...
- Docker run命令参数整理
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...
- 执行docker run命令时报错Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
一.解决办法: 修改host 二.步骤如下 2.1 安装dig工具 sudo apt-get install dnsutils -y (ubuntu下的安装方法) 2.2 找到registry-1. ...
- Docker学习总结之Run命令介绍
Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...
随机推荐
- 解决npm安装时出现run `npm audit fix` to fix them, or `npm audit` for details
解决办法: 网上说遇到这种问题可能是npm需要升级,有些下载不下来, 这样就好使用: 1.删除已经安装的:node_modules 和 package-lock.json 2.在安装:npm inst ...
- Java第三讲动手动脑
1 以上代码无法通过编译主要是由于在Foo类中自定义了有参的构造函数,系统不在提供默认的构造函数(无参),而在上述的引用中并没有提供参数导致无法通过编译. 2. 运行结果 由运行结果分析可知,在运行时 ...
- idea代码格式xml
<code_scheme name="Default copy" version="173"> <option name="LINE ...
- 微信JS-SDK自定义分享接入的注意点
微信文档 ,https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html, 在用微信自定义分享,遇到了几个坑,记录一 ...
- x-sheet 开发系列教程:初始化配置
介绍 x-sheet 是一款高性能 Web JavaScript Canvas 电子表格,之前小编写过一篇 x-sheet 入门体验,简单介绍了一下如何使用 x-sheet.这次我们继续深入一下,了解 ...
- 高级讲师肖SIR _简历上 _金融类项目
================================ 项目名称:现金巴士 项目简介: 现金巴士是一家专注于消费金融的网络借贷信息中介服务平台,以大数据和互联网技术为基础,凭借自身风控系统和 ...
- 安装 deepin linux 系统、linux 使用记录
安装 deepin 深度linux系统 官网:https://www.deepin.org/zh/ 包含了下载ios镜像和安装教程: 最新版本:https://www.deepin.org/zh/do ...
- Unity 使整个UnityUI变成彩色的BUG
最近接手了一个两年前的老项目,在这个项目里碰到一个BUG ,每次运行到这个场景的时候,整个Unity 的所有UI包括Unity界面都会变成彩色. 后来发现是因为物体丢失,代码修改Image里的图片颜色 ...
- Mybatis 中传入List实现 批量插入、批量更新、批量删除
1. 批量插入: Mapper层: int insertList(List<UsersModel> list); 对应的mapper.xml: <!--批量插入信息--> &l ...
- SAR成像(四):多普勒频移的计算
雷达系统中,雷达与目标间的相互运动会使回波信号产生频移,称为多普勒效应,对应的频移称为多普勒频率. 假设雷达发射信号为单频连续波, f ( t ) = c o s ( 2 π f 0 t + ϕ ) ...