一、提出问题

二、解决方案

三、解决步骤

一、提出问题

 

大多数据的生产项目都是可以与互联网互通的,但是也存在很多情况我们无法与互联网进行通信,所以在这种情况下我们有可能无法使用docker,原因如下:

(1)在生成自己的docker镜像过程中,我们需要下载基础镜像

(2)在生成自己的docker镜像过程中,我们需要更新系统

(3) 在生成自己的docker镜像过程中,我们需要为我们将要生成的镜像安装自己的工具(如时间同步、vim等)

 

二、解决方案

 

既然问题来,我们如何处理无互联网环境(如公安网、视频网或者私有网络)的正常运行我们的docker?我们很可能会这么做:

(1)首先,将机器暴露在互联网环境下安装docker、下载基础镜像、根据Dockerfile生成需要的镜像(包括下载工具)(注意我说的暴露是指与互联网连接但同时不与视频网连接,否则将视频网与互联网打通那就出大问题了)

(2)将安装好的生产环境需要的镜像生成之后,在断开互联网接入私有网络,然后运行我们的镜像

是的,上述方法确实能解决问题,但是存在如下缺点:

(1)每次更新或升级包都需要断开私网连接互联网。

(2)每次镜像生成都需要安装你都需要连接互联网并重复以上步骤(如更新docker镜像系统、下载镜像依赖的工具、时间同步等等),耗费很长时间,特别是docker仓库是国外仓库的情况下。

 

那么,如何避开以上问题,在不联网的情况下,不需要重复安装依赖工具,但仍可以快速的生成自己镜像并运行起来?我的解决方法是:

在互联网环境下将系统更新、依赖工具包全部在基础镜像一次搞定,然后导出基础镜像即可!

 

解决方法的优点:

(1)系统更新只需要在基础镜像更新,依赖的其他镜像不需要每次都更新系统源(这是很漫长的一个过程)。

(2)依赖安装只需要在基础镜像安装,依赖的其他镜像不在需要逐个安装,节省时间

(3)非互联网环境下经过(1)和(2)步骤之后,就不在需要连接互联网

(4)后续所有的升级只需要在私网中进行即可,不需要断网重连互联网

 

三、解决步骤

 

我们知道,拉取下来的镜像,是一个阉割的操作系统,很多东西都没有的,其实我们只需要定制我们自己的东西,然后将订制后的容器打包成我们需要的镜像拿到其他地方用就可以了。总的来说,实时步骤如下。

(1)在互联网环境下载基础镜像比如openjdk(或Java:8)

(2)运行基础镜像openjdk

(3)在运行的基础镜像的容器中更新容器镜像源、安装需要的工具库等

(4)通过容器生成新镜像

(5)导出新镜像为tar包

(6)将新生成的基础镜像包拷贝到私网环境进行镜像导入操作

(7)其他进行直接依赖新导入的基础镜像生成镜像即可(Dockerfile删除更新镜像源、工具包安装等操作)

 

下面,我们就根据上面我列举的步骤一步一步实现:

 

(1)在互联网环境下载基础镜像比如openjdk(或Java:8)

这里我需要的是openjdk:8(java:8可能比较老,生成镜像可能会出错)

docker pull openjdk:8

 

  1. 运行基础镜像

docker run -it -d openjdk:8

docker离线打镜像 docker离线镜像最佳实践_vim

 

 

查看运行的容器

docker ps

docker离线打镜像 docker离线镜像最佳实践_镜像源_02

 

 

(3)在运行的基础镜像的容器中更新容器镜像源、安装需要的工具库等

进入容器(docker ps所得容器id)

docker exec -it f1c34d2b5e27 /bin/bash

更新系统

apt-get update

 

安装工具

apt-get -y install vim

apt-get -y install net-tools

apt-get -y install netcat

apt-get -y install dos2unix

apt-get -y install tzdata

下面这一步如果dickerfile里面写了这里就不用执行。如果重复镜像不能生成成功

ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

这里解释一下,vim是编辑工具,net-tools是查看容器中系统网络工具,netcat是ping工具,dos2unix是window换行转linux换行工具,tzdata是时间同步工具

         

docker离线打镜像 docker离线镜像最佳实践_docker_03

 

 

安装完成后,最后ctrl+d退出容器

(4)通过容器生成新镜像

使用docker commit创建镜像容器

 

docker commit -m "镜像的描述信息" -a "镜像作者" 容器id  镜像名称

 

此处,我们只需要打包容器为自己的镜像即可,注意因为本地已经有openjdk:8镜像,我们得换一个名字,以免冲突

docker commit -m "dys base images" -a "lixx2048@163.com" f1c34d2b5e27 openjdk-jj:8

docker离线打镜像 docker离线镜像最佳实践_镜像源_04

 

查看我们我们新生成的镜像

docker images

docker离线打镜像 docker离线镜像最佳实践_vim_05

 

可以看到安装部分组件之后,系统大小也发生了变化。

 

(5)导出新镜像为tar包

创建导出目录(会导出到当前目录)

mkdir images

cd images

 

导出镜像到当前目录images

docker save > openjdk-lixx.tar openjdk-jj:8

 

其中openjdk-lixx.tar为导出tar包,openjdk-lixx:8为我们上一步骤生成的镜像

获取改tar包保存到磁盘或u盘(sz openjdk-lixx.tar发送到windows系统)

 

 

(6)将新生成的基础镜像包拷贝到私网环境进行镜像导入操作

创建镜像目录

mkdir images

cd images

 

拷贝上一步骤导出的镜像压缩tar包,上传到对应的linux环境

导入镜像压缩tar包

 

docker images

docker load < openjdk-lixx.tar

docker离线打镜像 docker离线镜像最佳实践_vim_06

 

 

再次查看本地镜像

docker images

 

可以看到新的镜像已经导入且与生成后的镜像大小一致

docker离线打镜像 docker离线镜像最佳实践_镜像源_07

 

(7)其他进行直接依赖新导入的基础镜像生成镜像即可(Dockerfile删除更新镜像源、工具包安装等操作)

如果本地有openjdk:8,则删除老的

docker rmi openjdk:8

 

重命名镜像为openjdk即可

docker tag openjdk-jj:8 openjdk:8

docker离线打镜像 docker离线镜像最佳实践_docker离线打镜像_08

 

再删除改名字之前的openjdk

docker离线打镜像 docker离线镜像最佳实践_docker离线打镜像_09

 

基础镜像生成后,在哪需要依赖的jar包,直接运行既可以