docker api 是直接通过请求docker darmon来与docker交互,即docker命令的底层实现
https://blog.csdn.net/qq_29999343/article/details/78294604
docker 配置文件位置 /etc/docker/daemon.json
启动daemon
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:5678
1 获取镜像列表
docker命令 docker images
endpoint get /images/json
curl -XGET http://localhost:5678/images/json | python -mjson.tool
2 拷贝容器中的文件
docker命令 docker cp
endpoint post /containers/containerid/copy
curl -k -X POST http://localhost:5678/containers/3dede0a58623/copy -H “Content-Type: application/json” -d ‘{“Resource”:”/dockerapifile”}’ > cpfile
3 使用Dockerfile构建镜像
docker命令 docker build
endpoint post /build
curl -v -XPOST -H “Content-Type: application/tar” –data-binary @Dockerfile.tar http://localhost:5678/build?t=myimage:mytag
4 重新给镜像命名
docker命令 docker tag
endpoint post /images/name/tag
curl -XPOST http://localhost:5678/images/myimage:mytag/tag?repo=myimage
删除容器 docker rm containerid
删除镜像 docker rmi image
5 创建容器
docker命令 docker create
endpoint post /containers/create
curl -XPOPST -H “Content-Type: application/json” http://localhost:5678/containers/create -d ‘{
“Hostname”:”cybertan”,
“User”:”root”,
“Image”:”myimage”}’
6 运行容器
docker命令 docker start
endpoint post /containers/id/start
curl -XPOST http://localhost:5678/containers/9ba220effbb4/start
7 查看容器
docker命令 docker inspect
endpoint get /containers/id/json
curl -s -XGET http://localhost:5678/containers/9ba220effbb4/json | python -mjson.tool
8 打开容器log
docker命令 docker logs
endppoint get /containers/id/logs
curl -XGET http://localhost:5678/containers/9ba220effbb4/logs?stderr=1&stdout=1
namespace 6项隔离
UTS | CLONE_NEWUTS | 主机名与域名 |
---|---|---|
IPC | CLONE_NEWIPC | 共享内存 |
PID | CLONE_NEWPID | 进程号 |
NETWORK | 网络 | |
MOUNT | CLONE_NEWNS | 挂载点 |
USER | CLONE_NEWUSER | 用户与用户组 |
namespce API
clone()在创建新进程的同时创建namespace
setns()加入一个已存在的namespace
unshare()在原先进程上进行namespace隔离
fork()调用
docker daemon的server启动和初始化在1.6版本之前使用了一种复杂的job机制并依赖专门的docker engine来管理和运行这些job 1.7版本之后使用新的server初始化流程,server会与daemon对象绑定来接收并处理完成client请求
1 | /var/lib/docker/ |
UFS创建容器文件系统的过程
启动容器的时候:
1创建只读层(busybox)
2创建容器读写层(writeLayer)
3创建挂载点(mnt)并把只读层和读写层挂载到挂载点
4将挂载点作为容器根目录
容器退出的时候:
1卸载挂载点(mnt)的文件系统
2删除挂载点
3删除读写层(writeLayer)
docker exec 进入容器实现
基于setns系统调用可以根据提供的PID再次进入指定Namespace
go每启动一个程序都会进入多线程状态这使得Mount Namespace无法使用setns
使用Cgo调用C
go标准库中没有c的包,Cgo会创建一个特殊的命名空间与C命名空间交流
使用构造函数导入C模块在go运行环境启动之前执行
Deamon命令
Deamon网络配置:
Deamon有三种途径实现监听:
- 通过socket文件 /var/runDocker.socket
- 通过tcp协议
- 通过fd文件
Deamon存储驱动配置:
- AUFS,Devicemapper,btrfs,zfs,overlay
Deamon执行驱动配置:
- cgroups,systemd
获取容器内部信息有三个参数:attach logs enevts
docker三剑客
docker-machine用于在多节点安装docker服务
docker-compose用于自动部署容器
docker-swarm用于管理集群
golang官方提供的flag.Parse()包可以完成参数解析
docker attach挂载命令行到容器中主要实现IO流共享绑定