玩轉 docker 遠端服務

語言: CN / TW / HK

工作中我們需要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。

01

進入容器

docker exec -it d52ee6cc718b /bin/bash

02

檢視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'

        :paperclip: 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 "$@"

03

建立新的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服務可以單獨做一些特殊的配置,與當前叢集或者機器隔離開來。