通过docker部署一个简单的web服务

前面把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通后。执行下面操作:

  1. 验证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就可以访问了~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值