docker 在 centos7.* 上的部署及问题解决

Posted 一 定 会 去 旅 行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 在 centos7.* 上的部署及问题解决相关的知识,希望对你有一定的参考价值。

  

最近尝试搭建docker 环境,其实个人是比较喜欢“菜鸟学习系列”的知识的,怎奈它的讲解是以Ubuntu为主的,最后找到一个搭建学习系列,感觉写的很好,主要是页面风格清晰明了,遂决定按照此教程学习搭建:https://www.cnblogs.com/ityouknow/p/8520296.html

但是该文章是2018年的,版本有点过时,跟着搭建过程中遇到了不少问题,记录下来:

 

第一章是基础介绍及安装docker,并初次运行docker。

此处直接运行第一章是没有问题的,但是运行下边第二章的时候开始报错,查了资料发现是版本不对,遂又找了别的文章安装最新的docker:https://www.cnblogs.com/zhya/p/10605750.html,最后记得设为开机启动 

systemctl enable docker  // 设为开机启动

按照新的版本安装后,初次运行 docker run hello-world 会查找本地是否有该镜像,没有会自动去服务器拉取,然后再运行,通过 docker ps -a 查看可以看到当前已运行的镜像容器;

多次执行 docker run hello-world 会生成多个 hello-world 容器(如下图)

 

第二章是根据 DockerFile搭建一个nginx服务。亲手搭建过程中遇到一些问题,遂记录下来:

1、Error response from daemon: Unknown instruction: VI。 

此处为不识别的 vi 命令,所以实例中语句错误,DockerFile 中只需写两行就行了,另外from和run 可以不区分大小写。

FROM nginx
RUN echo \'<h1>Hello, Docker!</h1>\' > /usr/share/nginx/html/index.html

# 本来想将/usr/share/nginx/html/index.html 改到自己的文件,发现不行,必须要nginx文件夹下。。。

运行 docker build -t nginx:v1 . 后通过 docker images查看会发现有两个nginx,一个是nginx的最新版本nginx:latest,一个是自定义的镜像 nginx:v1.

运行 docker run --name docker_nginx_v1 -d -p 80:80 nginx:v1,测试只能用80端口?其它端口无法访问,难道是端口被限制了?

 

第三章是DockerFile文件的详解。

第四章是尝试搭建一个 Spring-Boot 项目,并发布到docker。

案例的最下方有源码链接github或码云。先本地run跑通,然后按照教程上docker,一切正常。

但是有个不好的体验就是 linux系统会变得很卡顿,目前还不知道原因,先把这个服务停了,后续再找原因。

 

第五章介绍 docker-compose。

1、推荐的安装方法是一,linux下载的时候不要输入那个sudo,从 curl -L 开始。通过地址:https://github.com/docker/compose/releases 查看可知当前最新版本是1.25.0

#下载
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose version

 2、安装非常快,教程下面的实例可以不用测试~~

 

第六章尝试用 docker-compose 搭建一个 nginx + mysql + spring-boot 的项目发布到docker。

1、项目需要本地先跑起来,所以 application-dev.properties 需要先改成自己的本地测试数据库。

2、run 运行成功后迁移 docker。

3、有人说怎么没提供建库sql啊,实际上直接 docker-compose up -d 后会使用mysql 镜像自动创建数据库test,而且也创建表visitor,只不过这个mysql 访问提示不存在,但是通过工具确实能连接。

4、docker-compose down 会杀死当前目录下的所有镜像,然后数据库因为没有绑定volumes 参数,所以会被注销,重启 docker-compose up -d 后会覆盖原有数据库,所以推荐使用volumes 创建永久数据库磁盘。

 

------- 手动分界线 -------------------------------------------------------------------------------------------------------------

以下来自其他资料:

一、想在docker中配置以前的项目,但是以前的项目中没有使用 spring-boot,所以想直接 java -jar 会报错,没有 no main manifest attribute ******,意思是没有启动的main,原来这个是boot特有的,需要pom.xml添加如下:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.4.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>

 如果不添加以上,可以用 java -cp ***.jar 带有main函数的类名(不带.class)。

 

二、即使加了以上配置,运行后成功但没有效果,因为是web服务器,最终需要放到tomcat里,所以下面要docker安装tomcat。

学习文章:https://www.jianshu.com/p/d053573ffab1

1、docker search tomcat 查看版本总感觉不太直观,可以去官网查找想要的版本 https://hub.docker.com/_/tomcat?tab=tags&page=1

2、按照方法1完成后,访问 Manager App 也会有2中的问题,可以根据2中的方法解决,则可以访问Manager App。

3、上一步配置tomcat文件时用到vi,但docker中默认找不到vi,所以需要安装:https://blog.csdn.net/huangbaokang/article/details/98029026

3、上传自己的war文件以启动相应web服务,可以根据此文章上传 https://blog.51cto.com/4925054/2096995

 

三、由于项目前后分离开发,发布时最终需要通过nginx将两者联合在一起。

docker使用nginx上面的实例中有用到过,但太简单,现在要求可以自定义配置nginx,学习文章:https://www.jianshu.com/p/721d971c3cd7

1、文章说的其实挺对,但是说的有点简略,由于我之前的项目中有nginx配置文件,所以直接拿来用发现不行,docker run 会失败并停止。

2、首先以为是在启动的nginx容器中直接添加相应的文件夹来挂载,实验后发现会重新生成一个CREATED状态的新容器,然后docker start也并不能启动也不报错,只能docker rm将其删除。

3、后来找其它文章:https://www.cnblogs.com/fudonghai/p/11316118.html 才明白,是要在docker容器外的宿主机(物理机或虚拟机)上创建这些文件夹。

4、以上文章都介绍到要挂载conf.d文件夹,发现conf.d文件夹下的*.conf配置文件中只允许有server项,其它项都被认为是不允许的文件夹,于是转念一想直接替换nginx文件夹下的nginx.conf文件,里面可以包括所有字段,而且一定要挂载log文件夹,这样失败后能看到错误文件error.log。

5、最终运行语句为:(我是在/data/nginx中创建的对应挂载文件夹)

docker run --name mynginx -d -p 80:80 --restart=always -e TZ="Asia/Shanghai" -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/log:/var/log/nginx -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro nginx:v1

 

 

四、发布代码到服务器上,管理项目发布,希望用到jenkins,有的文章说不推荐用docker安装jenkins了,理由没说,猜测可能是因为要安装多次jdk,maven,甚至vi编辑文件不方便?个人感觉还是可以的,记录下来。https://www.jianshu.com/p/12c9a9654f83

1、刚开始看上面文章怎么拉取的是jenkins/jenkins:lts,但用docker search jenkins看第一个是jenkins啊,而且star最高,于是选择拉取镜像docker pull jenkins,拉取下来发现不是docker.io版本(安装后发现版本是2.60,当前版本已经是2.209,导致许多插件安装失败)最后才通过这篇文章 https://www.jianshu.com/p/9a3814c88bf2 发现原来jenkins已经不被更新了,现在更新维护的是jenkins/jenkins。。拉取安装一切正常。

2、以上安装完成并创建用户后,强烈建议重启一次jenkins对应的docker,然后重新登录创建的用户并选择底部的“保持登录状态”。

3、以上安装完成后如要配置maven项目,需要安装maven相关插件否则无法创建maven类项目,安装完jenkins默认jdk 会被安装,我的centos7.5默认是openjdk-8被安装在/usr/local/openjdk-8目录下,后续可以根据 https://www.cnblogs.com/ming-blogs/p/10903408.html 安装maven相关。在“系统设置 ——> 全局工具配置” 中点击安装JDK,自定义名称后取消自动安装,填写JAVA_HOME为默认安装的jdk路径 /usr/local/openjdk-8。点击安装Maven,选择自动安装,被安装3.6.*某版本并自定义保存名称后点击最底部的保存。(当然此处也非常推荐自己手动先安装maven自己需要的版本,比如3.6.*,然后填写maven配置跟上面JDK一样,取消自动安装,使用自己的maven安装路径)

4、在“系统管理 ——> 插件管理”中选择第二个标签“可选插件”,右上角过滤框输入 Maven Integration 筛选插件,找到 Maven Integration 后选中前面的多选框,点击“直接安装”。实例中最底部的“安装完成后重启Jenkins(空闲时)”不建议选择,否则会发现页面卡住不动了,实际是安装了某些插件后重启了,然后页面就不动了,所以这里我们不要选安装后重启。而是点击右上角的“允许自动刷新”,这样页面就会默认每隔10秒刷新一次。

5、当所有插件安装完后,手动重启下jenkins对应的docker容器。然后重新登录,发现此时可以创建maven项目了。

6、将自己的maven项目部署到jenkins,执行构建,正常是没有问题的。如果使用的是自动安装maven,则第一次会非常慢,如果是在第3 步手动安装过maven的,则会直接执行下载maven对应插件,会快许多。如果是使用的自动安装,耐心等待第一次构建完成吧,之后的maven便不再需要安装。

7、第一次构建完成会发现有些慢,想要替换为国内maven镜像,需要使用vi命令,但docker中默认找不到vi,所以需要:https://blog.csdn.net/huangbaokang/article/details/98029026

8、安装完vi,便可以编辑文件,找到maven对应的文件夹下的conf文件夹(我的3.6.3版本默认是安装在/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6.3/conf),编辑setting.xml文件,添加mirror参数,此处以国内阿里镜像为例:

   <!-- 阿里云中央仓库 -->
    <mirror>
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
        <mirrorOf>central</mirrorOf>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

 

9、有时候你可能需要手动安装某些maven插件,比如sqlserver.jar,众所周知默认sqlserver是无法通过镜像安装的,需要手动下载然后上传到服务器再手动执行添加到服务器本地镜像库,下载安装可以查看之前的文章:https://www.cnblogs.com/jying/p/11294615.html 第一步中的方式。本文重点介绍如何安装到docker中,首先需要将下载的sqlserver.jar上传到linux服务器,然后进入sqlserver.jar所在的目录并通过docker cp sqlserver.jar 镜像名称/或镜像id:/要存放的docker容器中的文件夹路径(此处以根目录下/data/tool_files为例);

10、此时你登录docker容器,执行mvn相关操作提示找不到mvn,但是jenkins却是可以执行maven相关操作的,说明maven已经安装,但没有绑定到环境变量,所以你需要绑定到环境变量,可以按照:https://www.cnblogs.com/chuijingjing/p/10430649.html 中的第二三步绑定。

11、如果提示错误,那应该是你执行的docker exec -it 镜像名称/或镜像id bash 登录进docker内部,此时登录后是默认以jenkins用户登录的,该用户角色没有系统权限,

,需要添加-u 0参数使用root用户登录才行,,然后便可以通过第10步绑定环境变量,并通过第9步中文章方式执行。

12、jenkins发布maven项目最后一步需要将war包放到tomcat中,点击增加构建步骤默认是没有Deploy war/ear to a container 的,需要在“系统管理——>插件管理”中第二个标签“可选插件”,右上角过滤“Deploy to container Plugin”,点击“直接安装”。安装完成后重启dokcer容器,再登录jenkins就可以选择了~如下图中,添加好凭证后,将tomcat对应的docker容器的接口地址填入,便可以将maven项目发布到tomcat对应的容器下的webapps啦~~

13、如果以上tomcat绑定后发布报错:

则是因为没有tomcat相应权限,需要添加权限:https://www.cnblogs.com/heiyexiaoguai/p/5162184.html,修改后可能需要重启下tomcat对应的docker容器。

 

 

至此,docker搭建 jenkins + tomcat +nginx  镜像容器全部完成(数据库用的是单独的服务器,没有用docker),下一步将会写一篇一步步完整的搭建过程~~

 

以上是关于docker 在 centos7.* 上的部署及问题解决的主要内容,如果未能解决你的问题,请参考以下文章

最新Docker在Centos7下安装部署(参考官方教程文档)

CentOS7.7下docker部署OpenWAF

CentOS7.3服务器内网离线部署docker和容器

Centos7.4下用Docker-Compose部署WordPress

微服务架构 - CentOS7离线部署docker

Centos7.3 Docker安装部署学习记录1