内网环境下的docker安装使用

背景

通常对于公司的服务器来说,为了做到方便的安全管控,需要与外部网络进行隔绝,内部服务器想要跟外部通讯,只能通过DMZ区的权限放通才行,否则你永远想不到一个你不熟悉的程序猿会往github上丢什么奇奇怪怪的东西。

github上的数据库连接信息

比如18年的华柱用户数据泄露事件,这口大锅就绝对得运维人员来背。不过有的时候隔绝倒是隔绝了,但内网的配套设施没跟上,都已经0202年yum、apt遍布横行的时代了,总归不能还倒退回源码编译安装的方式吧。又比如docker离线安装好了,但是需要连接到特定的第三方镜像服务器,如何通过DMZ区的机器代理出去?

解决方案

Docker离线安装

这里以国内公司占用率比较高的CentOS系统为例
1、 确认内网机器的系统版本

1
2
lsb_release -a
cat /etc/os-release

2、下载对应版本的CentOS镜像,并在可以联网的环境中安装一台虚拟机,这个镜像地址可以找到大部分Linux发行版本的安装文件。

3、 特别的,如果是Oracle Linux版本,安装好后需要手动更新源文件

1
2
3
4
5
6
cd /etc/yum.repos.d
mv public-yum-ol7.repo public-yum-ol7.repo.bak
wget http://yum.oracle.com/public-yum-ol7.repo
# 编辑public-yum-ol7.repo文件,确保[ol7_last] [ol7_UEKR4] [ol7_optional_latest] [ol7_addons]下的enabled=1
yum clean all
yum makecache

4、 检测docker依赖项

1
repoquery -R docker-engine

5、 下载docker相关软件包

1
yumdownloader --resolve  docker-engine

6、 将下载得到的软件包打包压缩,并上传至内网机器。

7、 解压安装软件包,使用rpm命令进行安装

1
rpm -ivh --replacefiles --replacepkgs *.rpm

8、 注册docker服务

1
systemctl enable docker

9、启动docker服务

1
systemctl start docker

Docker镜像离线拉取

如果说公司政策不允许连接公共镜像服务器进行镜像的拉取,可以进行手工拉取进行离线安装:
1、 在虚拟机中首先拉取到目标镜像,然后导出,这里以jenkins为例

1
2
docker pull jenkins/jenkins
docker save -o jenkins.docker jenkins/jenkins

2、 人肉将导出的镜像上传至内网机器进行加载

1
docker load -i jenkins.docker

Docker Compose离线安装

Docker Compose相对简单,只有一个二进制文件
1、 在虚拟机环境中下载二进制包

1
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o docker-compose

2、 上传至内网机器 /usr/local/bin 目录,并添加执行权限

1
chmod +x /usr/local/bin/docker-compose

Docker代理配置

如果说你所在的内网环境允许开通部分目标网络的访问,只是需要通过代理出去,那么就涉及到docker代理的配置了,这里的代理又分为守护进程代理(比如docker loing命令),跟docker容器代理。

Docker Daemon代理配置

1、 新建配置文件目录

1
mkdir -p /etc/systemd/system/docker.service.d

2、 新建配置文件[/etc/systemd/system/docker.service.d/http-proxy.conf],并写入如下内容:

1
2
[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxx/"

这里的 xxx.xxx.xxx.xxx:xxx 替换为对应的内网代理服务器地址,更多说明可以参考官方文档

3、 重启服务,并检查代理配置是否生效

1
2
3
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker

Docker Container代理配置

1、编辑配置文件[~/.docker/config.json],加入如下配置

1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://xxx.xxx.xxx,xxx:xxxx/",
"httpsProxy": "http://xxx.xxx.xxx,xxx:xxxx/",
"noProxy": "*.xxx.com"
}
}
}

如果你还没有内网代理

Brook是一个不错的选择,最大的特点是单文件,无需root运行。
1、 下载执行文件并添加执行权限

1
2
wget -O brook "https://github.com/txthinking/brook/releases/download/v20200102/brook_linux_386"
chmod +x brook

2、 启动http代理

1
2
nohup ./brook socks5 -l :1080 -i 128.192.182.202  >> trace.log 2>&1 &
nohup ./brook socks5tohttp -l 128.192.182.202:9999 -s 128.192.182.202:1080 >> trace.log 2>&1 &

如果你的一些古董程序不支持代理配置

proxychains是通过hook你的libc网络通讯库来实现让程序通过代理出去的开源软件,理论上只要你的程序基于libc的库都好使。
1、下载源码并进行编译安装

1
2
3
4
5
6
7
8
wget "https://codeload.github.com/rofl0r/proxychains-ng/zip/master" -O proxychains-ng-master.zip
unzip proxychains-ng-master.zip
yum -y install gcc automake autoconf libtool make
cd proxychains-ng-master
./configure
make && make install
/usr/local/lib/libproxychains4.so (644) , (755)
cp ./src/proxychains.conf /etc/proxychains.conf

2、 拷贝[/usr/local/lib/libproxychains4.so]跟[/usr/local/bin/proxychains4]至内网机器,并添加对应权限

1
2
chmod 644 /usr/local/lib/libproxychains4.so 
chmod 755 /usr/local/bin/proxychains4

3、拷贝配置文件[./src/proxychains.conf]至内网机器的[/etc]目录下,并在最后根据注释添加对应的代理配置

4、使用,这里以curl为例(当然,新版本的curl是支持-x参数来指定代理的)

1
proxychains4 curl  "http://xxx.test.com/“