最近在做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. @babel/preset-env使用polyfill遇到的坑

    场景还原 最近将一个项目由babel@6升级到babel@7,升级后最重要的两个包: @babel/preset-env: 提供代码的转换和API的polyfill的能力 @babel/plugin- ...

  2. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之配置环境-05

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之配置环境-05 欢迎加QQ群:1026880196 进行交流学习 #全部节点执行如下操作 1. 安装常 ...

  3. Manjaro 安装教程

    1 概述 本文讲述了如何在单硬盘下对Manjaro进行安装. 2 写U盘 首先第一步是下载镜像,官网下载地址戳这里,如果下载速度慢可以选择国内镜像,比如戳这里. 笔者选择的是XFCE桌面: 下载好后将 ...

  4. 手把手教你搭建自己的Angular组件库 - DevUI

    摘要:DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工 ...

  5. Alpine镜像

    Alpine Linux 是一个面向安全,轻量级的基于musl libc与busybox项目的Linux发行版. Alpine 提供了自己的包管理工具 apk,可以通过 https://pkgs.al ...

  6. hdu4807枚举费用流

    题意:      给你一个有向图,每条边上都有每一时刻的最大流量,有k个人在点0,他们要去点n-1,问你最晚到达的那个人最快要多久. 思路:      这个题目做了很多次,用过费用流,也用过最大流,结 ...

  7. Windows PE导出表编程3(暴力覆盖导出函数)

    今天要尝试的导出表相关编程内容是:覆盖函数地址部分的指令代码. 这种覆盖技术,是将AddressOfFunctions指向的地址空间指令字节码实施覆盖,这种技术又繁衍出两种: 暴力覆盖,即将所有的代码 ...

  8. Windows Pe 第三章 PE头文件(上)

    第三章  PE头文件 本章是全书重点,所以要好好理解,概念比较多,但是非常重要. PE头文件记录了PE文件中所有的数据的组织方式,它类似于一本书的目录,通过目录我们可以快速定位到某个具体的章节:通过P ...

  9. 浅谈持续集成(CI)、持续交付(CD)、持续部署(CD)

    CI/CD是实现敏捷和Devops理念的一种方法,具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的 整个生命周期(从集成和测试阶段,到交付和部署).这些关联的事务通常被统称为"CI ...

  10. 高性能MySQL-索引

    创建索引-高效索引 1.1 索引初体验 1.1.1 介绍 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 索引的作用是做数据的快速检 ...