docker运行datax实现数据同步方案 -- docker build 篇

上一篇纪录了datax及其docker commit测试方法,这里我推荐使用自动构建docker build构建一个带jdk+maven+python的docker镜像。

docker build基础理论就是先获得一个基础镜像,然后对镜像做的每一步骤操作都封装,一步一步的得到一个多重操作封装过的功能镜像。其中在封装的过程中有几个指定的命令参数,具体可以自行百度,这里分享下用docker build构建datax的镜像。

 

我的方案是:

拉去centos基础镜像,下载jdk、maven、datax等解压好(python在centos中自带,所以不需要再单独下载一个),

进行docker build,先把解压的文件copy到基础镜像中,再设定镜像中的jdk、maven的环境变量,最后update镜像的yum。

 

在git上,有人直接拉去基础镜像后在里面镜像apt-get jdk、maven等方式,这种方法也是可以的,前提条件是安装的机器能连上网络,而我是下载安装包进行copy,可以在无网络的情况下进行docker build。

git中datax地址:https://github.com/beginor/docker-datax

 

我的dockerfile代码(已经下载并解压好了jdk、maven):

FROM centos
MAINTAINER [email protected]

COPY jdk1.8 /data/jdk1.8
COPY maven3.6 /data/maven3.6
COPY datax /data/datax
#这里copy前面是宿主机的目录,该目录不能指定绝对路径,只能在同dockerfile一个文件夹内,
#否则build的时候copy指令会报错,后面的文件夹是docker镜像的文件夹,如果镜像内没有该地址,
#build会自动创建一个,copy的时候只会copy宿主机文件夹里面的数据,即例如jdk1.8,
#只会复制文件夹内的数据,不会复制jdk1.8文件夹,所以在后面的docker镜像路径中,
#我们要指定并新建一个jdk1.8

ENV JAVA_HOME=/data/jdk1.8
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV MAVEN_HOME /data/maven3.6
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
#注意,path环境变量必须要带上系统$path,由于dockerbuild是覆盖的形式,
#如果不带上$path,会导致build出来的镜像运行的时候会没有centos的基本操作命令

RUN yum update -y

编辑好了dockerfile,接下来执行docker build命令进行镜像构建:

docker build -t centos:datax-update --no-cache --rm=true .

#-t 接后面的centos:datax-update 代表我要给我构建的镜像取得REPOSITORY名字和tag名字
#--no-cach 代表执行成功后不保存构建过程中得缓存 
# --rm 代表构建成功得话,删除构建过程中得中间镜像
# . 代表当前路径,docker build 指令是要加【参数】+【dockerfile路径】的,
#由于我的当前目录就是在dockerfile下,所以我用 . 代表我的dockerfile的路径位置

下面是我的build执行情况:

#查看我dockerfile路径位置的情况,有datax、jdk1.8、maven3.6等文件已解压并放在该目录
[root@service docker]# ls
datax  dockerfile  jdk1.8  maven3.6

#编辑dockerfile文件,把dockerfile的代码放进去
[root@service docker]# vi dockerfile 

#执行docker build命令,让docker自动构建镜像
[root@service docker]# docker build -t centos:datax-update --no-cache --rm=true .
Sending build context to Docker daemon  1.306GB
Step 1/10 : FROM centos   #第一步执行过程中docker先获取了centos基础镜像
 ---> 1e1148e4cc2c
Step 2/10 : MAINTAINER [email protected]  #第二步它写入了镜像构建者的联系方式并生成一个新的镜像
 ---> Running in b86cb05ab158
Removing intermediate container b86cb05ab158 
 ---> 18bb1d66f8b9
Step 3/10 : COPY jdk1.8 /data/jdk1.8  #第三步复制了jdk文件夹到第二步的镜像中,并生成一个新的镜像
 ---> dc10cb28dbfb
Step 4/10 : COPY maven3.6 /data/maven3.6 #第四步它复制了maven到第三步的镜像中并生成一个镜像
 ---> d0b50d52efbb
Step 5/10 : COPY datax /data/datax   #同理,生成一个新的镜像5
 ---> d37e75d540d0
Step 6/10 : ENV JAVA_HOME=/data/jdk1.8 #同理,基于镜像5,生成一个新的镜像6
 ---> Running in 722382b94473
Removing intermediate container 722382b94473
 ---> b32d8c90a5b5
Step 7/10 : ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in a93ef0e9aa30
Removing intermediate container a93ef0e9aa30
 ---> f7df4255b761
Step 8/10 : ENV MAVEN_HOME /data/maven3.6
 ---> Running in 1f2a2a602cfa
Removing intermediate container 1f2a2a602cfa
 ---> 0d57e64c3f3e
Step 9/10 : ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
 ---> Running in 6611598a61e7
Removing intermediate container 6611598a61e7
 ---> 4f2d068bcfc7
Step 10/10 : RUN yum update -y  #一直到这里,生成最后镜像10
 ---> Running in 5eb492ecb5e9
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirror.scalabledns.com
 * extras: repos-tx.psychz.net
 * updates: repos.lax.quadranet.com
No packages marked for update
Removing intermediate container 5eb492ecb5e9
 ---> 810decb2b8ad
Successfully built 810decb2b8ad
Successfully tagged centos:datax-update
[root@service docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              datax-update        810decb2b8ad        20 minutes ago      1.58GB
centos              datax               de2c4dc5fe8a        34 minutes ago      609MB
centos              latest              1e1148e4cc2c        4 weeks ago         202MB
centos7             latest              688353a31fde        2 years ago         447MB

 如果我没有build命令中加入 --no-cache --rm=true参数,那么实际上在构建过程中产生的10个镜像都不会被删除,且都能够按照docker生成的image id进行启动,所以,建议大家在第一次的时候不要带删除中间镜像的操作,如果在build中出现错误了,我们可以docker run 启动一下上一个成功的镜像进行排错操作。

最后docker images查看我的镜像,生成了一个1.5G的新镜像,这个镜像就是已经打包好maven、jdk、python、datax的新镜像


启动打包好的镜像查看情况:

#启动容器
[root@service docker]# docker run -it --name datax  810decb2b8ad /bin/bash

#这里已经是容器内,切换到根目录查看是否自动新建了data文件夹
[root@8ec3fabb3594 /]# cd /
[root@8ec3fabb3594 /]# ls
anaconda-post.log  bin  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@8ec3fabb3594 /]# cd /data
[root@8ec3fabb3594 data]# ls
datax  jdk1.8  maven3.6

#查看java、maven版本,环境变量是否生效
[root@8ec3fabb3594 data]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@8ec3fabb3594 data]# mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /data/maven3.6
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /data/jdk1.8/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "3.10.0-862.2.3.el7.x86_64", arch: "amd64", family: "unix"

到这里我们就成功的制作了一个datax镜像,之后就可以直接运行了,关于datax的操作,会单独再做一篇进行纪录。

你可能感兴趣的:(datax,linux,docker)