工作中我们需要 k8s 集群中使用一些 docker 服务,或者是利用一个 docker 容器,做一些镜像的拉取、制作、上传。如果使用集群的 docker,长时间会积累大量的废弃镜像,占用磁盘,导致集群无法正常使用。另一方面,用户可能利用 docker 做一些违规操作,直接把 k8s 集群服务搞挂。
为了避免以上问题,我们使用远程 docker 服务,这样让 docker 服务于集群完全脱离。制作一个 docker 服务镜像,远程连接到远程的 docker 服务。
普通的远程服务都需要添加-h 远程服务 IP,这篇文章将让你 docker 命令不添加-H ,用户无感知使用的是远程 docker 服务。
按照如下配置
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375
ExecStart 开头的行换成这个
重启 docker 服务
systemctl daemon-reload
service docker restart
也就是制作一个 centons 或者 Ubuntu 镜像,启动后安装 docker 环境。当然也可以使用 dockerfile 去制作。
下面是我制作好的 centos 镜像并里面安装了 docker。
1. 进入容器
docker exec -it d52ee6cc718b /bin/bash
2. 查看 docker 文件位置
将/usr/bin 中传入以下三个文件
docker(这个文件需要修改添加如下内容)是文件 docker 客户端执行命令前需要添加的参数,其内容如下
/usr/bin/docker-client -H 192.168.0.58 $@
192.168.0.58 远程 docker 服务器的 IP 地址
/usr/bin/docker-client:传入的 docker-client 路径
docker-client(直接传入不用做修改):docker 客户端
docker-entrypoint.sh(直接传入不用做修改):功能覆盖镜像默认命令,本来远程执行 docker 需要添加-h 远程 docekr 服务器 ip,通过这个脚本,就会把这个命令重写,用户无感知,在容器中使用远程 docker 服务,也就是执行 docker 命令就好像是执行本地 docker 一样。其实是用的远程的 docker
docker-entrypoint.sh
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- docker "$@"
fi
# if our command is a valid Docker subcommand, let's invoke it through Docker instead
# (this allows for "docker run docker ps", etc)
if docker help "$1" > /dev/null 2>&1; then
set -- docker "$@"
fi
# if we have "--link some-docker:docker" and not DOCKER_HOST, let's set DOCKER_HOST automatically
if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then
export DOCKER_HOST='tcp://docker:2375'
fi
if [ "$1" = 'dockerd' ]; then
cat >&2 <<-'EOW'
📎 Hey there! It looks like you're trying to run a Docker daemon.
You probably should use the "dind" image variant instead, something like:
docker run --privileged --name some-overlay-docker -d docker:stable-dind --storage-driver=overlay
See https://hub.docker.com/_/docker/ for more documentation and usage examples.
EOW
sleep 3
fi
exec "$@"
3. 创建新的 docker 镜像
将上面三个文件传入容器中的 docker 所在路径后,将这个容器重新打一个镜像,这个镜像就包含了支持远程构建镜像的功能。无论在什么地方启动这个镜像并使用 docker 服务,其实都是使用的远程机器的 docker 服务。(前提是要与远程 docker 服务器要通)
退出容器
exit
查看容器
docker ps
将以上容器重新创建为一个新的镜像。
docker commit -a "peishunwu" -m "add docker and tools" d5884406725a dockerubuntu
查看新创建的镜像
docker images
新的镜像就具备了,启动容器后执行 docker 命令其实是在远程 docker(192.168.0.58)服务器
备注:当然不光是容器中可以这么做,自己本地机器的 docker 也可以这样修改配置去使用远程的 docker 镜像。
对于通常的添加-h 的方式使用远程 docker 服务,这种方式,可以让用户无感知,完全像是在使用本地的 docker。这样对于集群来说,更加的保护了集群的安全和稳定。同时对于远程的 docker 服务可以单独做一些特殊的配置,与当前集群或者机器隔离开来。