这几天在学习有关 Docker 相关的知识,百度各种搜,却越看越迷
索性先实战了一波,使用 Docker 部署了一下在本地搭建的 SpringBoot 项目
咦,感觉可还行
让我初步了解了一下
镜像怎么来的:可以使用 maven 把 SpringBoot 项目打包成一个 Docker 镜像
镜像如何变成容器的:使用 Docker run 方法启动镜像,就会生成一个容器
镜像和容器的关系:一个镜像可以被生成出多个容器,在同一个宿主机上,宿主机不同端口,容器中
可以有相同端口
镜像和仓库:可以把仓库中的镜像拉取下来使用,也可以把自己的镜像上传到仓库中
记录时间:2019-5-7 10:50
了解了这些,疑问又来了,为什么总是说 Docker 容器的隔离性强,相互直接没有任何接口,what!
那要是想让 SpringBoot 项目连接 MySQL 数据库或者 Redis 等等咋办
百度上看到
有的前辈是直接 docker pull mysql 或者 docker pull redis
有的前辈是使用的 docker-compose
不管使用哪种方式,docker ps 查看到启动的容器都会有好几个
不是说好的隔离吗,都隔离了它们之间咋相互合作把项目运行起来的
现在发现所说的隔离性强好像指的是
容器中的环境不会与宿主机的环境冲突,也就是每个容器中的环境是单独的
如我在宿主机上启动 MySQL 后我还可以运行一个甚至多个 MySQL 镜像,它们之间不会冲突,
达到这种隔离
那容器间如何相互访问呢
还在继续摸索中
记录时间:2019-5-7 11:16
疑问:
把本地的 SpringBoot 项目上传到服务器上,Dockerfile 文件配置基础镜像环境 JDK1.8
然后在服务器上使用 maven 打包成 Docker 镜像,这时 docker images 里面不仅有 SpringBoot 项目镜像
还有一个 JDK 镜像
但是我把这个打包后的 SpringBoot 镜像 push 到 Docker Hub 后,把服务器的镜像全部删除
紧接着把刚刚 push 上去的镜像 pull 下来,这时 docker images 里面仅有 SpringBoot 项目镜像,
没有 JDK 镜像了
记录时间:2019-5-7 14:01
上面的疑问解决了,在群里问了一个前辈给了思路
在服务器上使用 maven 把 SpringBoot 打包成 Docker 镜像时需要依赖 JDK,这时就会在 Docker 远程仓库中
获取 JDK 镜像,并且依赖到 SpringBoot 项目中去,所以这时是既可以看到 SpringBoot 项目镜像又可以看到
JDK 镜像;
把这个打包后的 SpringBoot 镜像 push 到 Docker Hub 后,紧接着把刚刚 push 上去的镜像 pull 下来的时候,
这个 SpringBoot 项目中已经依赖了 JDK 了,所以这时只会显示 SpringBoot 项目镜像。
前辈的原话是
依赖的jar包一样 maven引用要先下载到本地库 等你打包完了,就把依赖打到你的jar中了 是独立的了
记录时间:2019-5-7 20:28
容器之间如何访问好像也有点眉目了,但是思路还不清晰
一种是单独拉取镜像然后使用 --link
一种是使用 docker-compose
不急,一个一个来操作,从 Redis,到 MySQL,到 Nginx
好像还有数据存储的问题等等
更有 Linux 精简版镜像,在启动的容器中安装应用等等
记录时间:2019-5-7 20:35
今天从 Docker Hub 中拉取了 Redis 镜像
拉取了一个 4.0.14 版本的还有一个 4.0.14-alpine 版本的
带 -alpine 后缀的镜像是精简版的
启动镜像后,使用 docker exec -it CONTAINER ID bash 命令可以进入到 4.0.14 版本
同样的命令进入 4.0.14-alpine 版本会报错
OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"bash\":
executable file not found in $PATH": unknown
原来进入带 -alpine 后缀的镜像要使用 docker exec -it CONTAINER ID sh 命令
记录时间:2019-5-8 21:05
有进展了。
在本地搭建了一个 SpringBoot 项目,配置 Redis 连接,传输到服务器打包成 Docker 镜像
在服务器上拉取一个 Redis 镜像,挂载配置文件和数据文件启动
启动 SpringBoot 和 Redis 镜像
浏览器访问可以从 Redis 中存取值
明天记录一下部署过程
记录时间:2019-5-10 18:19
SpringBoot 项目中配置的 Redis 连接地址为服务器 ip,这样的话就可以直接成功连接 Redis 镜像
但是把配置的 Redis 连接地址更改为 127.0.0.1 后就连接失败了
但是服务器上安装的 Redis 应用中的 redis.cli 都可以连接 Redis 容器
查了一下,两个容器直接通信需要上面提到过的 --link,不过更改为 docker network 方式了
记录时间:2019-5-11 15:25
SpringBoot 镜像 + Redis 镜像 已经部署完毕,并记录了一下部署过程
总算是体验到了 Docker 的强大之处:① 拉取 Redis 镜像 ② 拉取 SpringBoot 镜像 ③ 创建网络
④ 启动 Redis 容器 ⑤ 启动 SpringBoot 容器 ⑥ 访问
全程一分钟左右就完成了
今天来学习一下 SpringBoot 镜像 + MySQL 镜像
记录时间:2019-5-12 10:43
结合 MySQL 折腾了整整一下午,终于还是成功了
启动 MySQL 容器的时候映射配置文件,映射数据,映射初始化 sql
MySQL 容器启动成功后使用 Navicat 连接时乱码,又配置了字符集编码
但是最后还是觉得使用初始化方案加载 sql 有些不靠谱,不过正好有 Flyway 管理 sql
SpringBoot 容器连接 MySQL 容器时又出现了问题,网上都是在项目中写 MySQL 容器的名称
这样 MySQL 容器的名称就受到了限制,最后突发奇想使用另一种方式解决了
还有在未启动 MySQL 时,打包 SpringBoot 项目报连接超时的错
添加了 -Dmaven.test.skip=true 解决了,打包时跳过测试
可以,这一下午收获很多,明天记录一下部署过程
记录时间:2019-5-12 18:27
今天使用 Nginx 镜像实现了负载均衡
也是使用的 --network 连接几个容器
其中遇到了一个知识盲点:我使用 -p 8090:8090 启动的 SpringBoot 镜像,为什么项目内还是显示的
8080 默认端口,想了一下,我的理解是:
8090:8090 -> 宿主机端口:容器端口,只是宿主机 8090 端口映射到容器的 8090 端口
至于容器里面那个端口对应什么应用,那就访问到对应的应用,
映射到容器的 8090 端口,容器内的项目是 8080 端口,这是对应不上的
明天有空记录一下部署过程
记录时间:2019-5-13 18:22
经过这一段时间的学习,对 Docker 还算有一点认识了解了
今后有空我会继续学习有关 Docker 的知识,更深一层次的知识
记录时间:2019-5-14 13:09
以上全是我自己的理解,肯定有不太正确的地方,如果你能指点一二,那真是太感谢了
over