首页 > 其他分享 >实现docker run命令

实现docker run命令

时间:2023-02-25 17:25:14浏览次数:36  
标签:容器 run busybox 宿主机 命令 进程 docker

基于宿主机来创建容器

执行命令

《自己动手写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报错的问题。

标签:容器,run,busybox,宿主机,命令,进程,docker
From: https://www.cnblogs.com/WJQ2017/p/17154818.html

相关文章

  • linux 中awk命令 制定 输入行分隔符、列分割符的几种方法
     ……………………     ......
  • linux 中 sed命令中的q选项
     001、  https://blog.csdn.net/weixin_33838310/article/details/117348155  ......
  • Windows wsl2安装Docker
    wsl2的Ubuntu安装好后,就可以安装Docker了。由于众所周知的原因,国内访问国外的某些网站会访问不了或者访问极慢,Docker的安装网站就在其中。所以推荐使用阿里的镜像进行安......
  • Maven常用命令 生命周期
    我们可以在cmd中通过一系列maven命令来对我们的maven-helloworld工程进行编译测试运行打包安装部署compilecompile是maven工程的编译命令作用是将src/main/java下......
  • 转:修改当前docker的shm-size
    修改当前docker的shm-size (推荐)共享内存简介及docker容器的shm设置与修改 ......
  • Docker 自动启动和容器自动启动
    一、docker 服务启动启动#开启docker自启动systemctlenabledocker.service#关闭docker自启动systemctldisabledocker.service二、docker容器自动启动#......
  • git常用命令
    GitCommonCommand​​gitmerge​​​和​​gitrebase​​​的区别1.两者都可以合并分支2.区别是:​​​merge​​​合并分支会产生很多merge的文件使代码管理看起来很......
  • Podman 和 Docker 区别对比
    1.docker需要在我们的系统上运行一个守护进程(dockerdaemon),而podman不需要2.启动容器的方式不同:dockercli命令通过API跟DockerEngine(引擎)交互告诉它我想创建一个c......
  • docker基础与概念
    什么是dockerDocker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿......
  • git提交命令
    链接:https://www.waimaiguai.com/technology/article/5425017来源:外卖怪 外卖怪技术学习git更新代码命令2022-08-1702:56:11gitgit常使用的命令1、gitinit—在当前目......