之前项目使用tomcat部署,随着后期项目越来越多,同一个tomcat下启动N个项目,造成的问题就是更新其中某一个项目会导致整个tomcat重启,其他同一个tomcat下的项目导致暂时无法访问,非常影响工作效率。为了解决这一个痛点,所以目前想到使用docker容器部署配置项目,希望以此可以隔离不同项目环境,使之不互相影响。
环境说明
centos7(192.168.1.146,docker宿主机)
jenkins服务器(192.168.1.143)
docker安装
docker安装命令:
代码语言:javascript复制# yum install -y epel-release yum install docker-io
安装完成之后,需要设置docker随机启动,命令如下
代码语言:javascript复制[root@localhost ~]# systemctl enable docker
截图如下
然后启动docker
代码语言:javascript复制[root@localhost system]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
第一次启动的时候提示"Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.",这里需要禁用禁用selinux,如图修改docker配置文件
代码语言:javascript复制#vi /etc/sysconfig/docker
******
设置--selinux-enabled=false,如图
修改保存之后再次启动docker成功!
tomcat镜像
此前曾尝试拉去docker官网的tomcat7镜像来进行项目部署,但是发现获取的镜像文件jdk不符合项目需求,所以这里改为使用本地的jdk和tomcat制作镜像。
下载jdk和tomcat包
准备需要的jdk版本和tomcat版本,版本要可以一起配合使用;这里使用的是之前项目中用到的jdk-8u152-linux-x64.tar.gz和apache-tomcat-7.0.103.tar.gz,将两个tar包上传到docker服务器中,如图
记得要加上可执行权限!!!
代码语言:javascript复制# chmod 777 apache-tomcat-7.0.103.tar.gz
# chmod 777 jdk-8u152-linux-x64.tar.gz
制作Dockerfile文件
代码语言:javascript复制# touch Dockerfile
# vi Dockerfile
编辑Dockerfile文件,内容如下
代码语言:javascript复制# 基础镜像
FROM centos
# 作者
MAINTAINER chy
# 把jdk与tomcat添加到容器中
ADD jdk-8u152-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.103.tar.gz /usr/local/
# 配置环境变量
# 设置编码字符
ENV LC_ALL en_US.UTF-8
# 留意jdk(tomcat)文件夹的名称,此处必须和jdk(tomcat)解压后的文件名一致,否则无法启动tomcat
ENV JAVA_HOME /usr/local/jdk1.8.0_152
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.103
ENV CATALINA_BASE /usr/local/apache-tomcat-7.0.103
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
#配置容器启动后执行的命令
ENTRYPOINT /usr/local/apache-tomcat-7.0.103/bin/startup.sh && tail -f /usr/local/apache-tomcat-7.0.103/logs/catalina.out
#启动时运行tomcat
CMD ["/usr/local/apache-tomcat-7.0.103/bin/catalina.sh","run"]
代码语言:javascript复制# 以当前目录下(.)的 Dockerfile 文件 构建镜像名为 chy/tomcat 的镜像
# docker build -t chy/tomcat-70103:v1 .
# 查看镜像
# docker images
启动项目
使用docker启动项目有三种方式:
第一种:把war包丢到宿主机 在丢到container里面丢到tomcat/webapps
代码语言:javascript复制docker cp rcm_test.war 16c1d697bf43:/usr/local/tomcat/webapps
这种方式的弊端据说是容器重启后项目就会不再了,可以尝试验证一下~
第二种:挂载方式启动:
代码语言:javascript复制#挂载方式启动项目
# docker run -d -v /docker_file/rcm_test.war:/usr/local/apache-tomcat-7.0.103/webapps/rcm_test.war -p 8081:8080 --name rcm chy/tomcat-70103:v1
第三种方式:使用Dockerfile文件
这种方式暂时没有尝试,后期验证~
这个时候就可以正常访问网站了http://192.168.1.146:8081,如图
搭建私库
代码语言:javascript复制[root@localhost ~]# docker pull registry
[root@localhost ~]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
修改配置文件
代码语言:javascript复制 # vi /etc/docker/daemon.json
{"insecure-registries":["192.168.1.146:5000"]}
# service docker restart
docker常用命令
代码语言:javascript复制# 启动docker服务
# systemctl start docker
# 重启docker 容器
# docker restart id/name
# 查看镜像&删除镜像
# docker image ls
# docker image rm 容器id/容器name
# 查看启动的所有的进程以及历史记录,docker ps查看的是运行的容器
# docker ps -a
# 关掉容器
# docker stop e307e884417f(容器id或name)
# 删除容器
# docker rm e307e884417f(容器id或name)
# 启动
# docker start bdfa03a03a68(容器id或name)
# 查看容器内部的全部细节:
# docker inspect 容器id
# 进入容器
# docker exec -it jolly_poincare /bin/bash
# cd /usr/local/apache-tomcat-7.0.103/logs
# 查看tomcat日志信息
# tail -f catalina.out
CI集成
由于目前暂无介入私库,所以在shell脚本中执行命令进行持续构建。
构建
jenkins新建自由风格的项目,增加构建配置(使用centos系统安装的maven工具) shell脚本命令如下
代码语言:javascript复制# 由于war需要替换jdbc和licens文件,所有需要解压war包替换文件重新打包
cd /docker_file/war/target/
mv *.war rcm_test.war
mv rcm_test.war /docker_file/rcm_test
cd /docker_file/rcm_test
jar -xvf rcm_test.war
rm rcm_test.war
cp -rf /docker_file/jdbc.properties /docker_file/rcm_test/WEB-INF/classes/jdbc.properties
cp -rf /docker_file/license.lic /docker_file/rcm_test/WEB-INF/classes/license.lic
cd /docker_file/
./timestamps_local.sh > release.properties
cp -rf /docker_file/release.properties /docker_file/rcm_test/WEB-INF/classes/release.properties
cd /docker_file/rcm_test/
jar -cvf rcm_test.war .
ls | grep -v *.war | xargs rm -rf
mv rcm_test.war /docker_file/war/target/
构建后操作
错误指引
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details
如果启动docker提示此错误,需要禁用selinux,方法参考之前配置
docker启动正常,访问提示"拒绝访问",使用curl方式提示同理
排查过程:
代码语言:javascript复制# 开启防火墙端口访问
# firewall-cmd --permanent --zone=public --add-port=8081/tcp
tomcat启动正常,没有任何报错信息!很头疼,从头排查查看启动容器配置
代码语言:javascript复制#挂载方式启动项目
# docker run -d -v /docker_file/rcm_test.war:/usr/local/apache-tomcat-7.0.103/webapps/rcm_test.war -p 8081:8080 --name rcm chy/tomcat-70103:v1
这里第一次启动的时候写错了
OPTIONS说明:
代码语言:javascript复制-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="nginx-lb": 为容器指定一个名称;
所以前一个"8081"是主机外部访问的端口,而后一个"8080"是内部容器的端口,这里很重要!!!
tomcat中文显示
启动的时候tomcat中文会显示"???",需要在Dockerfile文件中增加字符配置