最近在做jenkins的持续集成构建,其中一项是要实现docker容器化部署。项目本身是maven项目,我对于maven和docker都没有什么认知基础,于是求助百度和官网,从头开始啃起。遇到了不少的坑,所幸没有放弃,一点一点地填上来了,在这里把学习过程简单记录一下。

什么是maven?

看了不少的解释,大同小异,但如果你没接触,只会觉得抽象和不可理喻。还是把官网的解释翻译过来,毕竟这是最权威的。Maven,是一个犹太语词汇,意思是知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。由此产生了一个现在可以被用于构建和管理任何基于java的工程的工具。

简单地说,Maven是一个工具,用来管理java工程中众多的依赖jar包,由此简化java工程的构建和发布。在maven中最重要的就是pom.xml文件,全称是项目对象模型(Project Object Model),它用来描述具体的项目。maven的生命周期在运行mvn install的时候被调用,然后maven执行一系列有序的步骤,运行许多默认的插件目标,这些目标完成了像编译和创建一个jar文件这样的工作。

由此看来,maven并不神秘和复杂,常用的命令也就那么几个。很多时候maven项目和docker结合在一起使用,一起作为容器发布。

什么是docker?

docker可以说是现今IT行业最热门的概念了。各行各业都在以容器化部署为目标,它使用方便、高效、轻巧又可靠。引用百度百科的定义:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

我用到的docker常用命令有以下:

查看已有的docker镜像

这个非常好用,可以确认镜像是否生成成功。

删除镜像

docker rmi image_name

使用dockerfile打包镜像

docker build --no-cache -t image_repository:imageTag .

no-cache表示创建镜像的过程中不使用缓存,-t表示镜像的名称和标签,注意最后的.一定要有,否则会报错

push镜像

#把制作好的docker镜像推送至指定harbor仓库
docker push image_repository:dockerTag

docker登录

docker login -u harbor_username --password harbor_pwd harbor_ip

重启docker守护进程

systemctl daemon-reload

重启docker服务

systemctl restart docker

需要注意的是,在每次docker配置信息变更时,都需要刷新,也就是重启docker守护进程或docker服务。

知识点梳理完毕,说一下这次打包过程中遇到的坑:

1.使用mvn build和mvn push镜像和docker 的build和push有什么区别?

两种方法我都试了一下,对比感受是没有区别,mvn命令打包和push貌似也是调用了docker的打包和push,当然前提是你要安装maven的docker插件,否则会报错,类似这样

这种情况下,可以直接用docker的build和push命令,同样可以产生镜像并推送到仓库成功。

2.在push镜像时,报错提示443端口号connection refused

网上百度了很久,解决方案基本上没有能用的,有说服务端没有监听端口,导致连接被拒绝,用netstat -an |grep 443查询后,结果发现并不是,也有说这个监听端口被其他的ip占用,如127.0.0.1,结果发现也并不是。最后还是只能去看官网https://docs.docker.com/config/daemon/systemd/,这里提到了docker守护进程的配置,主要的推荐方法是使用/etc/docker/路径下的daemon.json文件去配置,打开这个文件,发现这里面有一项insecure-registries,网上查了一下,dockerfile上传镜像必须通过https的方式,因此这里需要把要上传的仓库地址写到这一项里面。

设置完了之后需要重启docker服务生效。

3.在push镜像时,报错提示unauthorized: authentication required

同样的是在官网中提示了,这是由于未添加https代理的环境变量,按照官网的方法,创建这个文件

sudo mkdir -p /etc/systemd/system/docker.service.d

然后添加https代理的配置文件

touch /etc/systemd/system/docker.service.d/https-proxy.conf

增加以下环境信息

[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:443/"

最后重启docker守护进程和docker服务

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

搞定!终于迎来了期盼中的画面

这次的经历很宝贵,从无知到了解,需要的只是不懈的努力而已。在软件测试的300条忠告中(具体名字不记得了,很好的一本书),提到对于一个很复杂的概念,不要被吓到,一点点地熟悉它,等你慢慢熟悉后,你会有新的思路,新的认识,新的理解。这是一个不断靠近的过程,就像敏捷,谁也没有上帝视角,我们只能做一个不断提升自己认知的普通人。

maven build和push image中遇到的坑(学习过程记录)的更多相关文章

  1. eclipse中的maven build、maven clean、maven install和maven test的区别

    eclipse中的maven build.maven clean.maven install和maven test的区别 https://www.cnblogs.com/Marydon20170307 ...

  2. Eclipse中配置Maven build打包

    Eclipse中配置Maven build打包 clean package

  3. eclispe中使用 maven build启动maven项目和打包项目

    1.右键项目2.点击run as按钮 3.点击run configurations 4.配置如下: =============================加油加油加油加油加油加油========= ...

  4. Eclipse中 Run as --->Maven build 命令详解

    Maven Build  Goals: clean  清除编译,compile  编译,test  编译并测试,install 打包并发送到本地仓库,package 只是打成jar包,并不会发送到本地 ...

  5. 在Myeclipse中将maven程序部署到tomcat中

    用新版的m2e插件就可以了,而且发布后修改jsp是不需要重新发布的.MyEclipse10.6自带新版m2e,只需在Run Configuration的Maven Build中new一个输入confi ...

  6. maven:log4j:WARN No appenders could be found for logger (loggerInfo).或者maven build error:org.apache.maven.lifecycle.LifecycleExecutionExceptio

    maven在build构建时,加载资源文件时需要配置资源文件插件: 1,在pom.xml文件中加入 <build> <finalName>${project.build.tar ...

  7. 在eclipse如何删除无效的maven build

    在Eclipse的maven项目中,点击一次“maven build...”明明没有配置,它也就会产生一个maven build,那么如何删除这些无效的配置呢?

  8. Spring Boot-右键maven build成功但是直接运行main方法出错的解决方案

    1.代码就一个Controller,从官网复制过来的,如下 package com.springboot.controller; import org.springframework.boot.Spr ...

  9. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(七)——eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -&g ...

随机推荐

  1. Dynamics CRM开发参考资料

    Developer Guide for Dynamics 365 Customer Engagement https://docs.microsoft.com/en-us/dynamics365/cu ...

  2. Java(100-113)【类与对象、封装、构造方法】

    1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...

  3. php 操作 redis 常用命令

    原文地址: https://www.cnblogs.com/zhanghanwen16/p/9510481.html 1.redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回tr ...

  4. Windows新建选项排序

    运行输入:regedit 然后找到:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\P ...

  5. 缓冲区溢出分析第10课:Winamp缓冲区溢出研究

    前言 Winamp是一款非常经典的音乐播放软件,它于上世纪九十年代后期问世.与现在音乐播放软件行业百家争鸣的情况不同,当时可以说Winamp就是听音乐的唯一选择了,相信那个时代的电脑玩家是深有体会的. ...

  6. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  7. Linux中grep工具的使用

    Grep grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,是 ...

  8. Intel汇编程序设计-整数算术指令(下)

    7.5  扩展加法和减法 扩展精度的假发和减法是指任意尺寸大小数字的加法和减法.例如要求你写一个C++程序,把两个1024位的整数相加,解决方案可不是那么简单!但在汇编语言中,ADC(带进位加)指令和 ...

  9. 谷歌浏览器安装Vue.js devtools

    第一步:访问谷歌商店 在之前的博客中已经谈到了这一点的实现方式 https://www.cnblogs.com/10134dz/p/13552777.html 第二步:下载Vue.js devtool ...

  10. 【插件篇】前段bootstrap-table-treegrid试手,解决无法显示树形列表或者图标不显示问题。

    说明:具体代码操作我就不贴了.官方有正规的例子!bootstrap-table-examples传送 使用注意事项: 传入的id和pid可以是string类型的(我后台返回的是Long类型转换成str ...