基于宿主机来创建容器

执行命令

《自己动手写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命令的更多相关文章

  1. Docker run 命令的使用方法

    [编者的话]在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍.中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Do ...

  2. Docker run 命令参数及使用

    Docker run 命令参数及使用 Docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTI ...

  3. docker run命令运行以及参数详解

    命令格式: -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-sh ...

  4. Docker(12)- docker run 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...

  5. docker run命令指定GPU多个显卡不生效的问题解决和代码示例

    问题描述:我有一个程序(app),需要用到显卡来跑.原本的部署方式 是直接修改程序的配置文件来指定要用到的显卡. 这是我服务器的显卡信息:总共3卡 分别是 0卡 ,1卡和2卡. [root@k8s-r ...

  6. 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 ...

  7. Docker run 命令

    docker run -d -p 8084:80 --name weather --restart always --link fme-postgis 192.168.1.220:5000/weath ...

  8. Docker run命令参数整理

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  9. 执行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. ...

  10. Docker学习总结之Run命令介绍

    Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...

随机推荐

  1. Word 表格对文字、图文进行排版

    在以前,Web 前端工程师利用 <table /> 元素对网页布局进行排版,但是如今却不推荐此元素排版了,而是改用 <div /> 元素和 CSS 弹性布局(或网格布局)对网页 ...

  2. ASP和jq实现url传递参数乱码的escape编码和unescape解码

    <% Function vbsEscape(str)    dim i,s,c,a    s=""    For i=1 to Len(str)        c=Mid(s ...

  3. WGCMS 奇迹网站系统 介绍[V2023.2.2]

    智鹏网站系统,请勿用作非法用途 权利和义务: 程序仅限学习技术使用,未经官方许可不得用于商业! 程序售价500元一套,绑定域名,不限制端口.如绑定:xx.com,则www.xx.com.mu.xx.c ...

  4. org.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active解决办法

    解决办法 在配置elasticsearch.yml中加上 ingest.geoip.downloader.enabled: false

  5. UniApp学习-多端兼容 & 跨域

    多端兼容配置 标签 <!-- 一般标签 --> body ---- page div,ul, li, table,tr,td ---- view span,b,i,font ---- te ...

  6. error Unnecessary return statement no-useless-return

    语法错误 原本是 addUser() {       this.$refs.addFormRef.validate((valid) => {         if (!valid) return ...

  7. 有关谷歌下载PDF文件而不是直接打开预览的问题

    找了很多帖子,都不行, 解决方法把链接处理成blob文件再调用下载. 但是仍然不行,最终原因找到: 缺少了这一部创建,需要把二进制数据重新用 Blob对象申明下 let data = new Blob ...

  8. JAVA的注释和变量名称

    1.注释 (1)单行注释为//..... 例://这是一行注释 (2)多行注释是/*.......... .............*/ 例:/*我是第一行注释 我是第二行注释 我是第三行注释*/ ( ...

  9. Web学习篇—Http协议

    Http协议简介 h3 { background: rgba(0, 154, 205, 1); color: rgba(255, 255, 255, 1); border-radius: 6px; f ...

  10. toast简介

    PostgreSQL数据库不允许元组(行,记录)跨越多个页面(page)存储,所以,它不能直接存储非常大的字段值.对于大字段值,它将被压缩且(或)分解为多个物理行,该技术称为"TOAST&q ...