maven + docker 快速搭建项目镜像
环境
-
Ubuntu 16.04
-
jdk 1.8
-
maven 3.6
安装docker 私人仓库-- registry
$ 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
修改镜像源
$ vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
服务重启
$ systemctl daemon-reload
$ systemctl restart docker
随便拉取一个镜像
$ docker pull nginx
打包待会准备上传到registry的镜像文件
$ docker tag nginx:latest 192.168.22.117:5000/nginx:1.0
命令说明
docker tag [原镜像名] [ip:port/镜像名:版本]
ip:port标识一会推送到镜像服务器使用的ip和port配置
由于docker与仓库之间必要https交互,所以需要在本地docker镜像服务地址
$ 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
推送镜像到镜像服务器
$ docker push 192.168.22.117:5000/nginx:1.0
查询镜像,有nginx说明成功
$ 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"
]
}
删除原有的镜像,拉取试试
$ 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的远程访问,很容易出事
$ 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 # 查看是否开启成功
maven pom.xml 配置
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<!-- docker容器的地址 -->
<dockerHost>http://192.168.22.117:2375</dockerHost>
<imageName>192.168.22.117:5000/${project.artifactId}:latest</imageName>
<!-- 指定Dockerfile所在的路径 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
</resource>
</resources>
</configuration>
</plugin>
在/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 "升级项目项目开始运行!"
构造镜像
使用命令或鼠标点击插件方法
$ mvn clean package docker:build -Dmaven.test.skip=true
镜像推送
使用命令或执行docker:push的方法
$ mvn clean package docker:push -Dmaven.test.skip=true
拓展–阿里云容器镜像服务
由于部分项目需要把镜像推送到阿里云的容器镜像仓库里,需要先在容器镜像服务创建命名空间和镜像仓库,当我们push镜像到容器镜像库时,需要安全认证,目前有两种方式可以对进行安全认证
方法一:
首先在docker服务中登录阿里云 Docker Registry,之后再执行push操作
$ sudo docker login --username=幕峰服务器 registry.cn-hangzhou.aliyuncs.com
方法二:
打开maven中的配置文件setting.xml,添加配置,之后再执行push操作
<server>
<id>docker-aliyun</id>
<username>[账号]</username><!--登录阿里云镜像仓库的用户名-->
<password>[密码]</password><!--登录阿里云镜像仓库的密码-->
<configuration>
<email>****@outlook.com</email><!--阿里云镜像仓库的注册邮箱-->
</configuration>
</server>
这里需要注意的是,阿里云镜像仓库的密码不是登录密码,需要单独设置
方法三:
如果使用idea的小伙伴可以直接配置docker的连接服务和registry的连接,settings->buil,Execution,Deployment->Docker
配置完成后可以在idea编辑器的下边找到Docker
打包的操作其实也可以使用idea自带的工具进行打包,包括push操作,感兴趣的可以自行研究
FAQ
maven构建错误
事先说个问题,在构建镜像的时候需要使用到docker环境,所以需要连接dockers容器,否则会报 I/O exception (java.io.FileNotFoundException) caught when processing request to {}->npipe://localhost:80: \\.\pipe\docker_engine (系统找不到指定的文件。)
错误
解决方法有两种:
- 如果是windows开发,使用maven构建镜像的人,可以在本地安装docker环境,安装步骤 K8S入门系列(1)-Windows10安装Docker,配置阿里云加速器,貌似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年的目标完成了吗 🤣