• docker 实战:安装配置


    之前项目使用tomcat部署,随着后期项目越来越多,同一个tomcat下启动N个项目,造成的问题就是更新其中某一个项目会导致整个tomcat重启,其他同一个tomcat下的项目导致暂时无法访问,非常影响工作效率。为了解决这一个痛点,所以目前想到使用docker容器部署配置项目,希望以此可以隔离不同项目环境,使之不互相影响。

    环境说明

    centos7(192.168.1.146,docker宿主机)

    jenkins服务器(192.168.1.143)


    docker安装

    docker安装命令:

    # yum install -y epel-release yum install docker-io
    

    image-20201110142253756

    安装完成之后,需要设置docker随机启动,命令如下

    [root@localhost ~]# systemctl enable docker
    

    截图如下

    image-20201110142728682

    然后启动docker

    [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配置文件

    #vi /etc/sysconfig/docker
    ******
    设置--selinux-enabled=false,如图
    

    image-20201112140245946

    修改保存之后再次启动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服务器中,如图

    image-20201112141208800

    记得要加上可执行权限!!!

    # chmod 777 apache-tomcat-7.0.103.tar.gz
    # chmod 777 jdk-8u152-linux-x64.tar.gz
    

    制作Dockerfile文件

    # touch Dockerfile
    # vi Dockerfile
    
    

    编辑Dockerfile文件,内容如下

    # 基础镜像
    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"]
    
    
    
    # 以当前目录下(.)的 Dockerfile 文件 构建镜像名为 chy/tomcat 的镜像
    # docker build -t chy/tomcat-70103:v1 .
    # 查看镜像
    # docker images
    
    

    启动项目

    使用docker启动项目有三种方式:

    第一种:把war包丢到宿主机 在丢到container里面丢到tomcat/webapps

    docker cp rcm_test.war 16c1d697bf43:/usr/local/tomcat/webapps
    

    这种方式的弊端据说是容器重启后项目就会不再了,可以尝试验证一下~

    第二种:挂载方式启动:

    #挂载方式启动项目
    # 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,如图

    image-20201112143621902

    搭建私库

    [root@localhost ~]# docker pull registry
    [root@localhost ~]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
    

    修改配置文件

     # vi /etc/docker/daemon.json 
    {"insecure-registries":["192.168.1.146:5000"]}
    # service docker restart
    

    docker常用命令

    # 启动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工具)如图

    image-20201113162915265

    shell脚本命令如下

    # 由于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/
    
    构建后操作

    如图:

    image-20201113163022261

    错误指引

    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方式提示同理

    如图

    image-20201112102505241

    排查过程:
    # 开启防火墙端口访问
    # firewall-cmd --permanent --zone=public --add-port=8081/tcp
    

    tomcat启动正常,没有任何报错信息!很头疼,从头排查查看启动容器配置

    #挂载方式启动项目
    # 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
    

    这里第一次启动的时候写错了img

    OPTIONS说明:

    -d: 后台运行容器,并返回容器ID;
    
    -P: 随机端口映射,容器内部端口随机映射到主机的端口
    
    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    
    --name="nginx-lb": 为容器指定一个名称;
    

    所以前一个"8081"是主机外部访问的端口,而后一个"8080"是内部容器的端口,这里很重要!!!

    tomcat中文显示

    启动的时候tomcat中文会显示"???",需要在Dockerfile文件中增加字符配置,如图

    image-20201112145500399

    致谢

    docker安装后启动不了

    Docker构建JDK+Tomcat镜像

    docker部署tomcat及web应用全过程和三种实现方式。

    Docker容器部署tomcat出现中文乱码

  • 相关阅读:
    RocketMQ学习笔记(9)----RocketMQ的Producer 顺序消息
    RocketMQ学习笔记(8)----RocketMQ的Producer API简介
    RocketMQ学习笔记(7)----RocketMQ的整体架构
    RocketMQ学习笔记(6)----RocketMQ的Client的使用 Producer/Consumer
    RocketMQ学习笔记(5)----RocketMQ监控平台rocketmq-console-ng的搭建
    RocketMQ学习笔记(4)----RocketMQ搭建双Master集群
    RocketMQ学习笔记(3)----RocketMQ物理结构和逻辑部署结构
    RocketMQ学习笔记(1)----RocketMQ的简介
    RocketMQ学习笔记(2)----Broker的集群四种方式
    Docker学习笔记(1)----认识Docker
  • 原文地址:https://www.cnblogs.com/LOVEYU/p/13964192.html
Copyright © 2020-2023  润新知