docker in docker使用方式

连接宿主机docker引擎

方式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

docker remote api方式

参考: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操作与在主机节点直接执行docker命令没有区别。

docker dind方式有所不同,所有的docker操作真正在容器内部进行,包括创建的容器、拉取的镜像都保留在容器内部。

docker in docker的原理是挂载cgroup、tmpfs、securityfs、cgroup的SUBSYS、关掉不需要的文件描述符、最后启动dockerd。

官方提供了2种类型的docker in docker镜像

  • docker:latest 只包含docker客户端
  • docker:dind 包含docker客户端和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

你可能感兴趣的:(docker,docker)