方式1:挂载主机上的docker.sock以及docker二进制文件
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
centos docker version
方式2:挂载主机docker.sock并在容器中安装docker客户端
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
centos bash
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-cli
docker version
方式3:使用官方docker客户端
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock docker \
docker version
参考:https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd
配置docker.service启用remote api
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/override.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2376
EOF
或者配置daemon.json
vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}
重启服务使配置生效
systemctl daemon-reload && systemctl restart docker.service
查看dockerd进程
# ps aux | grep dockerd
root 2471 0.8 1.7 723016 67808 ? Ssl 09:38 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2376
远程主机docker客户端执行命令验证
docker -H tcp://192.168.93.9:2375 version
curl命令验证
curl -XGET http://192.168.93.9:2376/version
变量方式使用示例
docker run -it \
-e DOCKER_HOST=tcp://192.168.93.9:2376 \
docker version
以上方式本质上还是连接到主机节点上的docker引擎执行docker命令,实际容器中执行docker操作与在主机节点直接执行docker命令没有区别。
docker dind方式有所不同,所有的docker操作真正在容器内部进行,包括创建的容器、拉取的镜像都保留在容器内部。
docker in docker的原理是挂载cgroup、tmpfs、securityfs、cgroup的SUBSYS、关掉不需要的文件描述符、最后启动dockerd。
官方提供了2种类型的docker in docker镜像
参考:https://hub.docker.com/_/docker
运行docker dind容器
docker run -it --privileged --name docker-dind -d docker:dind
docker exec -it docker-dind docker version
#使用带有docker客户端的容器连接到dind容器
docker run -it --link docker-dind:docker docker version
docker dind启用TLS
docker network create dind
docker run --privileged --name docker-dind -d \
--network dind --network-alias docker \
-e DOCKER_TLS_CERTDIR=/certs \
-v docker-certs-ca:/certs/ca \
-v docker-certs-client:/certs/client \
docker:dind
查看进程
[root@harbor ~]# docker exec -it docker-dind sh
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376 --tlsverify --tlscacert /certs/server/ca.pem --tlscert /certs/server/cert.pem --tlskey /certs/server/key.pem
52 root 0:01 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
212 root 0:00 sh
217 root 0:00 ps -ef
使用方式1
docker run --rm --network dind \
-e DOCKER_TLS_CERTDIR=/certs \
-v docker-certs-client:/certs/client:ro \
docker:latest version
使用方式2
docker run -it --rm --network dind \
-e DOCKER_TLS_CERTDIR=/certs \
-v docker-certs-client:/certs/client:ro \
docker:latest sh
/ # docker version
使用方式3
docker run -it --rm --network dind \
-e DOCKER_HOST=tcp://docker:2376 \
-e DOCKER_TLS_CERTDIR=/certs \
-v docker-certs-client:/certs/client:ro \
docker:latest version
定义daemon参数
docker run --privileged --name some-docker -d \
--network some-network --network-alias docker \
-e DOCKER_TLS_CERTDIR=/certs \
-v some-docker-certs-ca:/certs/ca \
-v some-docker-certs-client:/certs/client \
docker:dind --storage-driver overlay2