{"id":13694234,"url":"https://github.com/pibigstar/go-docker","last_synced_at":"2025-08-21T09:32:46.735Z","repository":{"id":43671487,"uuid":"234545418","full_name":"pibigstar/go-docker","owner":"pibigstar","description":"用go写一个docker","archived":false,"fork":false,"pushed_at":"2020-02-11T10:20:04.000Z","size":60,"stargazers_count":183,"open_issues_count":5,"forks_count":51,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-12T06:11:37.756Z","etag":null,"topics":["docker","go-docker"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pibigstar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-17T12:36:36.000Z","updated_at":"2024-11-09T15:06:05.000Z","dependencies_parsed_at":"2022-08-29T05:41:12.221Z","dependency_job_id":null,"html_url":"https://github.com/pibigstar/go-docker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fgo-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fgo-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fgo-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pibigstar%2Fgo-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pibigstar","download_url":"https://codeload.github.com/pibigstar/go-docker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230507050,"owners_count":18236944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","go-docker"],"created_at":"2024-08-02T17:01:27.355Z","updated_at":"2024-12-19T22:07:29.157Z","avatar_url":"https://github.com/pibigstar.png","language":"Go","funding_links":[],"categories":["开源类库","Open source library"],"sub_categories":["容器技术","Container Technology"],"readme":"# go-docker\n\u003e 用go写一个docker\n\n## 环境配置\n- 开发环境： windows\n- 运行环境： CentOS\n\n### windows中goland配置\n\u003e windows下要修改goland的OS环境为 linux,不然只会引用`exec_windows.go`而不会引用`exec_linxu_go`\n\u003e 在Setting-\u003eGo-\u003eBuild Tags \u0026 Vendoring -\u003e OS=linux\n\n### 设置CentOS支持aufs\n查看是否支持\n```bash\ncat /proc/filesystems\n```\n安装aufs\n```bash\ncd /etc/yum.repo.d\n# 下载文件\nwget https://yum.spaceduck.org/kernel-ml-aufs/kernel-ml-aufs.repo\n# 安装\nyum install kernel-ml-aufs\n# 修改内核启动\nvim /etc/default/grub\n## 修改参数\nGRUB_DEFAULT=0\n\n# 重新生成grub.cfg\ngrub2-mkconfig -o /boot/grub2/grub.cfg\n\n# 重启计算机\nreboot\n```\n### 配置busybox\n```bash\n# 下载 busybox\ndocker pull busybox\n# 运行\ndocker run -d busybox top -b\n# 导出\ndocker export -o busybox.tar (容器ID)\n# 解压到 /root文件夹下\ncd /root\nmkdir busybox\ntar -xvf busybox.tar -C busybox/\n```\n\n## 使用指南\n```bash\n# 编译\ngo build .\n\n# 启动一个容器, busybox为镜像名，存放在 /root/busybox.tar\n./go-docker run -ti --name test busybox sh\n\n# 后台启动\n./go-docker run -d --name test busybox sh\n\n# 挂载文件\n./go-docker run -d -v /root/test:/test --name test busybox sh\n\n# 进入容器\n./go-docker exec test sh\n\n# 查看容器日志\n./go-docker logs test\n\n# 查看容器列表\n./go-docker ps\n\n# 停止容器\n./go-docker stop test\n\n# 删除容器\n./go-docker rm test\n```\n\n## docker核心技术\n### namespace\n- uts : 隔离主机名\n- pid : 隔离进程pid\n- user : 隔离用户\n- network : 隔离网络\n- mount : 隔离挂载点\n- ipc : 隔离System VIPC和POSIX message queues\n\n### cgroup\n\u003e 主要是使用三个组件相互协作实现的，分别是：subsystem, hierarchy, cgroup,\n\n- cgroup: 是对进程分组管理的一种机制\n- subsystem: 是一组资源控制的模块\n- hierarchy: 把一组cgroup串成一个树状结构(可让其实现继承)\n\n#### 实现方式\n\u003e 主要实现方式是在`/sys/fs/cgroup/` 文件夹下，根据限制的不同，创建一个新的文件夹即可，kernel会将这个文件夹\n\u003e 标记为它的`子cgroup`, 比如要限制内存使用，则在`/sys/fs/cgroup/memory/` 下创建`test-limit-memory`文件夹即可，将\n\u003e 内存限制数写到该文件夹里面的 `memory.limit_in_bytes`即可\n\n## 指令小记\n\n- 查看Linux程序父进程\n```bash\npstree -pl | grep main\n```\n- 查看进程id\n```bash\necho $$\n```\n- 查看进程的uts\n```bash\nreadling /proc/进程id/ns/uts\n```\n- 修改hostname\n```bash\nhostname -b 新名称\n```\n- 常看当前用户和用户组\n```bash\nid\n```\n- 创建并挂载一个hierarchy\n\u003e 在这个文件夹下面创建新的文件夹，会被kernel标记为该`cgroup`的子`cgroup`\n```bash\nmkdir cgroup-test\nmount -t cgroup -o none,name=cgroup-test cgroup-test ./cgroup-test\n```\n- 将其他进程移动到其他的`cgroup`中\n\u003e 只要将该进程的ID放到其`cgroup`的`tasks`里面即可\n```bash\necho \"进程ID\" \u003e\u003e cgroup/tasks \n```\n\n- 导出容器\n```bash\ndocker export -o busybox.tar 45c98e055883(容器ID)\n```\n- 移除mount\n```bash\nunshare -m\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpibigstar%2Fgo-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpibigstar%2Fgo-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpibigstar%2Fgo-docker/lists"}