前面把redis、oracle都部署好了,还有最后两步:
- 1)docker镜像制作和启动
- 2)redis和oracle都在vitualbox中,防火墙问题等等
docker 镜像及制作
首先安装好docker服务后。创建我的bddts目录,将我需要的jar包和配置文件等,都拷贝到该目录下:
编辑 Dockerfile 文件,如下:
FROM java:8
MAINTAINER Yueping Zhuo "jocelyn"
ENV KETTLE_HOME='/myapp/appsystems/data-integration'
ADD BD_DTS.jar /myapp/appsystems/apps/
ADD *.sh /myapp/appsystems/apps/
ADD data-integration /myapp/appsystems/data-integration
EXPOSE 8080
CMD java -Djava.io.tmpdir=/myapp/appsystems/tmp -Xbootclasspath/a:/myapp/appsystems/config: -jar -Dfile.encoding=UTF-8 /myapp/appsystems/apps/BD_DTS.jar
~
~
1)从java8的镜像上开始创建我们的web服务器镜像。
2)我们的web启动需要的环境变量
3)将jar文件、脚本文件、kettle环境加入到我们的image中
4)暴露端口8080
5)CMD 命令后面跟的是,当镜像制作好后,启动镜像使用的命令。
启动容器
docker run -it -v /docker/bddts/config:/myapp/appsystems/config -v /docker/bddts/logs:/myapp/applogs -v /docker/bddts/ktrs:/myapp/etlfile/ktrs/ bddts:latest
其中:-v 是指定挂载点,这样容器内的地址就能映射到宿主机的实际地址上,我们的conf、logs等都可以写到宿主机上。
VOLUM 也可以指定挂载点,但是在Dockerfile内通过VOLUMN指定的挂载点不同于启动容器通过-v指定的挂载点。通过 VOLUM 指定的挂载点,是指容器内会产生这一地址,但是这一地址会挂载到宿主机的一个随机目录下,一般在/var/docker目录下生产一个目录。 具体可以参考:宿主机与容器里文件共享 -v和 VOLUMEdocker
初看觉得 dockerfile 内的 VOLUM 没什么用,直接在外部指定就可以了。但是当我有个kettle home目录,下面的.kettle,pwd两个目录都需要挂载的时候,如果适用-v 必须写两次,不能通过指定他们的父目录就级联挂载上子目录。 这点可以通过 指定 -v /docker/kettle:/myapp/kettle 后,进入容器查看,发现确实没有看到他们子目录下的东西。这时必须在Dockerfile内通过 VOLUM /myapp/kettle 将该目录变为挂载点,再通过启动的时候 -v /docker/kettle:/myapp/kettle 就可以在容器中看到子目录下的东西了。
启动正常了,但是却无法连接另外一个虚拟机上的oracle库, 从宿主机是可以telnet通的,同时我的物理机Mac也是能正常连接数据库。
Oracle 网络连接
首先关掉了oracle服务器的防火前,保证docker的宿主机能telnet通后。执行下面操作:
- 验证docker 能不能ping 通oracle 服务器:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e91b01e1b2a3 bddts:latest "/bin/sh -c 'java -D…" 2 minutes ago Up 2 minutes 8080/tcp musing_mayer
$ sudo docker exec -it e91b01e1b2a3 /bin/bash
root@e91b01e1b2a3:/# ping 192.168.6.105
PING 192.168.6.105 (192.168.6.105): 56 data bytes
64 bytes from 192.168.6.105: icmp_seq=0 ttl=63 time=0.720 ms
64 bytes from 192.168.6.105: icmp_seq=1 ttl=63 time=0.893 ms
64 bytes from 192.168.6.105: icmp_seq=2 ttl=63 time=0.811 ms
通过docker exec进入容器内,发现能ping通宿主机。
如果能ping通,即可通过重建docker0网络恢复
先停掉宿主机上运行的docker容器,然后执行以下命令
在宿主机执行:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
systemctl restart docker
网上全是这种方法。。我还是不通哎。最后的解决方案是
使用了 --net host 作为启动参数,这样docker的虚拟机完全使用宿主机的网络了,docker连外网问题也一并解决了:
docker run -it -v /docker/bddts/config:/myapp/appsystems/config -v /docker/bddts/logs:/myapp/applogs -v /docker/bddts/ktrs:/myapp/etlfile/ktrs/ --net host bddts:latest
关于docker的网络模式,参考:Docker之网络配置
web页面访问
等到了访问页面我才想起来我没有映射宿主机和虚拟机的端口。。于是去用了-p准备映射端口的时候,发现了这么一句话:
WARNING: Published ports are discarded when using host network mode
好吧这么我也不用再去port端口了,原来在springboot配置文件中指定的8080就可以访问了~