原创头条号:码农code之路,作者:潘吉祥,转载请标明出处
上一篇我们学习了如何使用Dockerfile制作自己的镜像,不过这种方式更像纯粹的运维方式,作为开发者来说,未免有些小繁琐,一个不小心写错些命令就执行失败,我们还不知道错误在哪,这着实有些……
放心,今天的东西会帮你解决这个问题!再次之前,我觉得有必要先对之前的东西稍微做一下回顾,以免混淆:
查看镜像:docker images查看正在运行的容器:docker ps查看所有的容器:docker ps -a删除镜像:docker rmi 镜像名(id)删除容器:docker rm 容器名(id)
我们可以创建自己的镜像,也可以从公共仓库下载现成的镜像;
容器的创建依赖对应的镜像(我们可以把镜像比作一个安装包,把容器看做运行的对应的软件)
下面进入今天的正题:
为了跟切近真实开发场景,笔者使用了自己开发的一个小项目来进行演示
事实上在企业开发中,我们都会把自己的微服务镜像打包到我们自己的docker的私有仓库,所以这里还要简单地介绍关于私有仓库呦:
1. 私有仓库也很简单,操作都是基本的,首先拉取私有仓库镜像,有了它就可以创建私有仓库容器:
docker pull registry
2.创建启动私有仓库容器:
docker run -id --name=my_registry -p 5000:5000 registry
![d930726f37bd79af71919c8d3ca6803f.png](https://i-blog.csdnimg.cn/blog_migrate/81dfa9d7f2f79bf9a052a29bf4c80f0f.jpeg)
可以看到,我们使用下载到的registry创建并运行了my_registry容器!
此时我们可以使用浏览器查看我们的私有仓库:
格式:http://docker宿主机ip:5000/v2/_catalog
![9a3bbbaf612b92f217ff9d0f3d38af48.png](https://i-blog.csdnimg.cn/blog_migrate/32f5e2a87897444e049ca8e81f21e66e.jpeg)
我们可以看到json格式的输出:表示我们现在的私有仓库没有任何镜像。
注意:ip是虚拟机的ip,不是物理机的ip。
3. 此时我们的私有仓库只是启动了,但是并没有与我们的docker建立联系,我们还需要修改配置文件:
vim /etc/docker/daemon.json添加以下配置,让docker与我们的私有仓库建立联系。"insecure-registries":["192.168.1.23:5000"]
![baf0ae6106f13925222686ebc72a987b.png](https://i-blog.csdnimg.cn/blog_migrate/b6bb5884da037ff9d8c23a70921474c8.jpeg)
这个配置文件是不是有点熟悉?没错,之前是用来配置docker下载镜像加速的,注意,多个配置之间以逗号分隔。
4. 然后重启docker服务:
我们可以测试一下我们的私有仓库是否可以使用了,上传一个镜像我们试试:
标记为此私有仓库的镜像:docker tag 镜像名(id) 私有仓库ip端口/自定义名字
此操作只是标记这个镜像要上传到的私有仓库,push的时候docker能识别它要上传到定义的仓库。
![7ace5410792de589cba6128124266a47.png](https://i-blog.csdnimg.cn/blog_migrate/fdc44c5af661d51aab3f13afc03ae286.jpeg)
5. 可以看到我们标记的镜像,这样我们就可以把它上传到我们的私有仓库了,不过刚才我们重启了docker,因此registry容器需要重新运行起来
docker start my_registrydocker push 我们标记的镜像
![37eb49181b7a1e58ac37a59276230adb.png](https://i-blog.csdnimg.cn/blog_migrate/604b631e5a9b577b5f3a5291d650e3f6.jpeg)
可以看到,上传了哈!
![cda7036e699d26f7ced86efc27747650.png](https://i-blog.csdnimg.cn/blog_migrate/159a91fecc73fd3a194032f290e7ff22.jpeg)
好了,前奏工作完成之后进入今天的重点环节。
DockerMaven
我们部署微服务的方式有两种:
第一种:通过源码打包之后手动上传到虚拟机然后再复制到jdk容器里;
第二种:也是开发使用的方式,避免上面太过繁琐的方法,采用更加自动化的maven插件部署。
下面来看具体的步骤:
1. 修改docker配置,让它可以让程序远程访问:
vim /lib/systemd/system/docker.service找到ExecStart,在它后面添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
这是没修改之前的配置
![93cac413274ff29c3a50f4f6d36d5efe.png](https://i-blog.csdnimg.cn/blog_migrate/42f5d747db84d25c3c2fb527fbf733ea.jpeg)
修改之后:
![c559aaa7d0b2fbb7f1f98a753f57c322.png](https://i-blog.csdnimg.cn/blog_migrate/78bc7cbe6e36d7f7848d3232d16c8e00.jpeg)
2. 修改之后,刷新配置,重启docker即可:
systemctl daemon-reloadsystemctl restart dockerdocker start registry
![2a9595dd3374c5e3cf3f61b8cb843412.png](https://i-blog.csdnimg.cn/blog_migrate/95f5bb3ae1fe29f604dab01054935088.jpeg)
3. 在服务工程pom文件里添加插件配置
app org.springframework.boot spring-boot-maven-plugin com.spotify docker-maven-plugin 0.4.13 192.168.1.23:5000/${project.artifactId}:${project.version} jdk1.8 ["java", "-jar","/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar http://宿主机ip:2375
其实插件的本质也是使用Dockerfile,以上插件生成的Dockerfile文件如下:
FROM jdk1.8ADD app.jar /ENTRYPOINT ["java","‐jar","/app.jar"]
4. 使用maven命令打包并上传:
在服务工程目录下执行:
mvn clean package docker:build -DpushImage
![d8078e202a144abb8a7c477092503a42.png](https://i-blog.csdnimg.cn/blog_migrate/53a6bb4a1770d0e8255e6581b2c4472d.jpeg)
过程可能会下载一些依赖,然后就可以看到上传了:
![4ee9fee5158e9c0c891f16258ae962a0.png](https://i-blog.csdnimg.cn/blog_migrate/9f7ba2077970225b02811bc538b25662.jpeg)
此时再查看私有仓库和我们的docker镜像:
![97e8e4d11cda9491ca1455f992bf0d2d.png](https://i-blog.csdnimg.cn/blog_migrate/9a1ab0f30ec6a6115531657393f13243.jpeg)
![3ab9adfa96284dff9b6840fd828f799d.png](https://i-blog.csdnimg.cn/blog_migrate/ca5b3bcfb866e75b15b8b15a764b90db.jpeg)
5.这时就可以创建容器了:
这里的端口是server:port
docker run -id --name=literature -p 9000:9000 192.168.1.23:5000/literature:1.0-SNAPSHOT
![1719e234747f1b0762deb0f1883587c8.png](https://i-blog.csdnimg.cn/blog_migrate/e5e179b1d328d3a772e83eaff5d748f2.jpeg)
我们的服务已经成为容器运行起来的!
![d6b0fbb082d9760971dedff6729f6b78.png](https://i-blog.csdnimg.cn/blog_migrate/38d376e379222601a77536e8dfc7ca67.jpeg)
可以访问哦!
注意:如果是自己的测试环境,服务的数据库配置文件连接的是localhost,要改成本机的真实在打包上传;
还有我这里是一个非常耦合的工程,没有依赖工程,如果是在微服务开发,MySQL和中间件等服务制成了容器运行在docker,那么在打包上传私有仓库之前打包的工程所依赖的服务都开启了。
至此,docker入门教程已经结束了!初学者还是要自己亲自动手实践才好啊!