最近在做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. Ubuntu安装docker/docker-compose(在全新系统状态下的安装)

    设置仓库 更新 apt 包索引. $ sudo apt-get update 安装 apt 依赖包,用于通过HTTPS来获取仓库: $ sudo apt-get install \ apt-trans ...

  2. Java【线程池、Lambda表达式】

    见pdf 等待唤醒机制 wait和notify 第二章 线程池 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁 ...

  3. Latex的使用(Ctex+TeXstudio)

    1.下载 CTEX Latex 本来是只支持英文的,但是实在太好用了,遂结合中国的团队以及有识之士,开发了这个 CTEX , CTEX 有 TexLive( TexLive 为 Latex 安装包的名 ...

  4. kubectl cp 从k8s pod 中 拷贝 文件到本地

    请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...

  5. OOP-面向对象(一)

    一图描述面向对象 类 - 相关参考 定义一个类 # 在定义类名的时候推荐使用大陀峰 class Car: pass # 推荐这么定义 class Car(): pass class Car(objec ...

  6. SpringCloud(四)GateWay网关

    GateWay网关 概述简介 Gateway是在 Spring生态系统之上构建的AP网关服务,基于 Spring5, Spring Boot2和 Project Reactor等技术. Gateway ...

  7. 1.人工智能解读与Python简介

    人工智能解读 Python解读 Python 简介 1.程序员: 程序设计人员. 2.程序: 一组计算机能识别和执行的指令,是实现某种需求的软件. 3.操作系统: 管理和控制计算机软件与硬件资源的程序 ...

  8. 【接口设计】用户积分排行榜功能-Redis实现

    一.排行榜功能简介 排行榜功能是一个很普遍的需求.使用 Redis 中有序集合(SortedSet)的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如交通数据流中的路口/路段的车流量 ...

  9. Python小游戏 -- 猜单词

    Python初学者小游戏:猜单词 游戏逻辑:就像我们曾经英语学习机上的小游戏一样,电脑会从事先预置的词库中抽取单词,然后给出单词的字母数量,给定猜解次数,然后让玩家进行猜测,并给出每次猜测的正确字母与 ...

  10. Win64 驱动内核编程-5.内核里操作文件

    内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...