最近尝试搭建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 --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.* 上的部署及问题解决的更多相关文章

  1. Docker(2)--Centos7 上安装部署

    Centos7 上安装docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比 ...

  2. 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】

    要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...

  3. CentOS7上手动部署入门级kubernetes

    前言 翻看了很多的kubernetes的安装教程,也反复做了一些实验,深感教程之复杂,所以决定写一个极简版本的安装教程,目标在于用尽可能少的参数启动服务,并且剖析各组件关系,然后再在此基础上逐步添加参 ...

  4. 【Docker】CentOS7 上无网络情况下安装

    自建虚拟机,但是连接不上网络,只能通过下载rpm包进行安装docker 环境:CentOS 7.3.1611 x64 rpm镜像下载地址用的阿里的https://mirrors.aliyun.com/ ...

  5. 【docker 入门 - 01】- Docker 在 Centos7 上安装与测试

    一.学习文档 官网网站: https://www.docker.com 中文网站:http://www.docker-cn.com 官方安装文档:https://docs.docker.com/ins ...

  6. 在centos7上安装部署hadoop2.7.3和spark2.0.0

    一.安装装备 下载安装包: vmware workstations pro 12 三台centos7.1 mini 虚拟机 网络配置NAT网络如下: 二.创建hadoop用户和hadoop用户组 1. ...

  7. 【docker】centos7 上拉取docker镜像,一直拉取不到,报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while w

    镜像拉取一直报错: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cancel ...

  8. Spring Boot框架开发的Java项目在CentOS7上的部署

    需求:上级拿来一份Spring Boot框架开发的Java项目代码让我在服务器上运行起来,只说了一句该框架是自带了Tomcat(不用重新安装Tomcat),一份代码下有两个项目(一个管理端项目,一个用 ...

  9. 密码管理平台ratticdb的部署,在centos7上的部署

    一,前言 一直想用ratticdb这个有web界面的密码管理工具,百度了一下居然没有找到中文的部署文档,访问官网也是notfound.找到了官方的部署指南:https://github.com/til ...

随机推荐

  1. bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制

    比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...

  2. Zabbix 邮件报警示例

     Zabbix 邮件报警示例: 1.编辑 mail.rc 文件添加默认的邮箱配置 # vi /etc/mail.rc set from=1234567@qq.com set smtp=smtp.qq. ...

  3. 洛谷 P1901 发射站 题解

    P1901 发射站 题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的 ...

  4. 安装vs code之后,win+e快捷键打开的是vs code,而不是文件管理器,解决方法

    安装vs code之后,win+e快捷键打开的是vs code,而不是文件管理器,解决方法 xdg-mime default dde-file-manager.desktop inode/direct ...

  5. 利用JDK方式和GuavaAPI方式实现观察者模式

    1.JDK方法实现案例需求: 去餐厅吃饭有时候需要排队,进行排队叫号.假如所有等待的人都是观察者,叫号系统就是一个被监听的主题对象.当叫号系统发出叫号通知后,所有等待的人,都会收到通知,然后检查自己的 ...

  6. java中快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

    一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除.修改),则会抛出Concurrent Modification Exceptio ...

  7. php-浮点数计算,double类型数加减乘除必须用PHP提供的高精度计算函数

    一.前方有坑 php在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,给不少工程师惹了很多的麻烦.比如今天工作终于到的一个案例: $a = 2586; $ ...

  8. Learning Conditioned Graph Structures for Interpretable Visual Question Answering

    Learning Conditioned Graph Structures for Interpretable Visual Question Answering 2019-05-29 00:29:4 ...

  9. QEMU支持的网络模式

    网络是现代计算机系统不可或缺的一部分,QEMU也对虚拟机提供丰富的网络支持.qemu-kvm中主要给客户机提供了如下4种不同模式的网络. (1)基于网桥(Bridge)的虚拟网卡 (2)基于NAT(N ...

  10. [转]eclipse常用设置

    原文:https://www.cnblogs.com/wangmingshun/p/5675857.html Eclipse重新设置workspace Window—>Preferences—& ...