专栏文章 玩转 docker 远程服务

opentest-oper@360.cn · 2022年07月07日 · 最后由 Andy 回复于 2022年07月15日 · 7200 次阅读

一、说明

工作中我们需要 k8s 集群中使用一些 docker 服务,或者是利用一个 docker 容器,做一些镜像的拉取、制作、上传。如果使用集群的 docker,长时间会积累大量的废弃镜像,占用磁盘,导致集群无法正常使用。另一方面,用户可能利用 docker 做一些违规操作,直接把 k8s 集群服务搞挂。
为了避免以上问题,我们使用远程 docker 服务,这样让 docker 服务于集群完全脱离。制作一个 docker 服务镜像,远程连接到远程的 docker 服务。
普通的远程服务都需要添加-h 远程服务 IP,这篇文章将让你 docker 命令不添加-H ,用户无感知使用的是远程 docker 服务。

二、使用远程 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

三、制作 docker 镜像

也就是制作一个 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 服务可以单独做一些特殊的配置,与当前集群或者机器隔离开来。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

是否可以考虑 docker in docker 来 build&push 镜像, 用完即抛, 部署时 k8s 从镜像仓库直接拉取就可以了

Andy 回复

这种就是 docker in docker 的高级形态

不怎么喜欢用 docker 环境来打 java 包,每次下载依赖都好久。有能力维护私仓的估计会好点

但是感觉像是起个容器远程操作固定的打包机做打包动作, 有理解错误地方望指正

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册