maven + docker 快速搭建项目镜像 2020-12-31 程序之旅,记录 暂无评论 1187 次阅读 ## maven + docker 快速搭建项目镜像 [TOC] ### 环境 - Ubuntu 16.04 - jdk 1.8 - maven 3.6 ### 安装docker 私人仓库-- registry ```shell $ docker pull registry $ docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest $ curl http://127.0.0.1:5000/v2/_catalog # 查找仓库中的所有的镜像 {"repositories":[]} ``` **参数说明** - -itd:船舰伪终端,并在后台运行 - -v:文件夹映射 [宿主机]:[容器] - -p:映射端口 - --restart=always:重启策略,容器异常退出或服务器重启,会自动启动容器 - --name:容器名称 - registry:latest:镜像名称 ### 测试私有仓库-- registry 修改镜像源 ```shell $ vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"] } ``` 服务重启 ```shell $ systemctl daemon-reload $ systemctl restart docker ``` 随便拉取一个镜像 ```shell $ docker pull nginx ``` 打包待会准备上传到registry的镜像文件 ```shell $ docker tag nginx:latest 192.168.22.117:5000/nginx:1.0 ``` **命令说明** docker tag [原镜像名] [ip:port/镜像名:版本] ip:port标识一会推送到镜像服务器使用的ip和port配置 由于docker与仓库之间必要https交互,所以需要在本地docker镜像服务地址 ```shell $ vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"], "insecure-registries": [ "192.168.22.117:5000" ] } $ systemctl daemon-reload $ systemctl restart docker $ docker info ``` ![image-20201230180143211](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201230180145.png) 推送镜像到镜像服务器 ```shell $ docker push 192.168.22.117:5000/nginx:1.0 ``` 查询镜像,有nginx说明成功 ```shell $ curl http://127.0.0.1:5000/v2/_catalog # 查找仓库中的所有的镜像 { repositories: [ "nginx" ] } $ curl http://192.168.22.117:5000/v2/nginx/tags/list { name: "nginx", tags: [ "1.0" ] } ``` 删除原有的镜像,拉取试试 ```shell $ docker rmi 192.168.22.117:5000/nginx:1.0 $ docker pull 192.168.22.117:5000/nginx:1.0 ``` 如果能拉取,说明第一步搭建私人仓库(registry)成功。 > registry 本身不带有图形界面,有需要可以自行安装 Docker-Registry-Frontend ### Maven 构建docker镜像 -- docker-maven-plugin 这里使用Dockerfile的形式打包,创建/src/main/docker文件夹。 #### 开启docker远程访问 这里需要注意的是,千万不要在云环境或生成环境开启docker的远程访问,很容易出事 ```shell $ find / -name docker.service # 找到docker启动文件地址 $ vim /etc/systemd/system/multi-user.target.wanets/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock $ systemctl daemon-reload $ systemctl daemon-reload $ systemctl restart docker $ ufw allow 2375 $ ufw reload 2375 $ curl http://192.168.22.117:2375/info # 查看是否开启成功 ``` ![image-20201231113052380](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231113053.png) #### maven pom.xml 配置 ```xml com.spotify docker-maven-plugin 1.2.2 http://192.168.22.117:2375 192.168.22.117:5000/${project.artifactId}:latest ${project.basedir}/src/main/docker / ${project.build.directory} ``` 在/src/main/docker文件夹中创建文件Dockerfile ``` FROM openjdk:8-jdk-alpine ADD iot-box-update.jar iot-box-update.jar EXPOSE 8090 ENTRYPOINT ["java", "-jar", "iot-box-update.jar"] CMD echo "升级项目项目开始运行!" ``` #### 构造镜像 使用命令或鼠标点击插件方法 ```shell $ mvn clean package docker:build -Dmaven.test.skip=true ``` ![image-20201231135236759](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231135238.png) #### 镜像推送 使用命令或执行docker:push的方法 ```shell $ mvn clean package docker:push -Dmaven.test.skip=true ``` ### 拓展--阿里云容器镜像服务 由于部分项目需要把镜像推送到阿里云的容器镜像仓库里,需要先在**容器镜像服务**创建命名空间和镜像仓库,当我们push镜像到容器镜像库时,需要安全认证,目前有两种方式可以对进行安全认证 方法一: 首先在docker服务中登录阿里云 Docker Registry,之后再执行push操作 ```shell $ sudo docker login --username=幕峰服务器 registry.cn-hangzhou.aliyuncs.com ``` 方法二: 打开maven中的配置文件setting.xml,添加配置,之后再执行push操作 ```xml docker-aliyun [账号] [密码] ****@outlook.com ``` > 这里需要注意的是,阿里云镜像仓库的密码不是登录密码,需要单独设置 ![image-20201231154128100](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231154129.png) 方法三: 如果使用idea的小伙伴可以直接配置docker的连接服务和registry的连接,settings->buil,Execution,Deployment->Docker ![image-20201231161713182](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231161714.png) ![image-20201231161852698](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231161853.png) 配置完成后可以在idea编辑器的下边找到Docker ![image-20201231161928158](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20201231161929.png) 打包的操作其实也可以使用idea自带的工具进行打包,包括push操作,感兴趣的可以自行研究 ### FAQ #### maven构建错误 事先说个问题,在构建镜像的时候需要使用到docker环境,所以需要连接dockers容器,否则会报 ` I/O exception (java.io.FileNotFoundException) caught when processing request to {}->npipe://localhost:80: \\.\pipe\docker_engine (系统找不到指定的文件。)`错误 解决方法有两种: 1. 如果是windows开发,使用maven构建镜像的人,可以在本地安装docker环境,安装步骤 [K8S入门系列(1)-Windows10安装Docker,配置阿里云加速器](https://blog.csdn.net/qq_43437874/article/details/104671495),貌似windows安装了docker之后虚拟机用不了,也可能存在兼容性问题 #### maven push 镜像 如果推送到云端或私有镜像库的时候没有安全认证会报错误 ` [ERROR] Failed to execute goal com.spotify: docker-maven-plugin:1.2.2:push (default-cli) on project realname-update: Exception caught: denied: requested access to the resource is denied -> [Help 1] ` PS:今天是2020年的最后一天,你2020年的目标完成了吗 打赏: 微信, 支付宝 标签: docker, ubuntu, 阿里云, 镜像容器 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。