使用docker-compose部署springboot接口服务和数据库服务,并且实现数据卷挂载到容器外

1.安装docker,这个就不多说了,有很多方法,在网络正常下,最简单的方法就是:

yum install docker

2.安装docker-compose,这个可以参考官方文档https://docs.docker.com/compose/install/

3.安装好后把防火墙关了(防止网络原因导致网络不通),然后把docker加入开机启动

systemctl disable firewalld

systemctl stop firewalld

systemctl enable docker

systemctl start docker

4.准备工作做好后,就是编写docker-compose.yml文件,这一步是关键,下面是我写好的一个文件模板,这个文件的作用是自动部署postgresql10数据库,并将数据文件data挂载到/home/aoc/pg10目录下,挂载的原则是如果没有,则创建,如果有,则使用已有的,所以,挂载的作用有两个:

a)当容器销毁后,由于data是在容器外的,因此不会丢失

b)一般部署好数据库后,都要恢复一下数据,不然新部署的数据库是空的,系统仍然无法正常启动,而如果把包含了数据库的data文件挂载到postgresql的容器上,那么等到数据库容器服务启动后,数据库就会自动恢复,也就省去了恢复数据库的步骤,比如我的/home/aoc/pg10/data文件里面就包含了我开发用的数据库和里面基本数据,而我只需要创建一个pg10容器服务,整个数据库环境就会自动部署成和开发环境一致。

具体的这个文件的内容如下:

version: "3"
services:
  pg10:
    image: docker.io/postgres:10
    container_name: pg10
    privileged: true
    restart: always
    volumes:
      - "/home/aoc/pg10/data:/var/lib/postgresql/data"
    environment:
      POSTGRES_PASSWORD: sa
    ports:
      - "5432:5432"
    networks:
      - backend

  aoc:
    build: /home/aoc
    container_name: aoc
    restart: always
    network_mode: "host"
networks:
  backend:
这个文件在编辑的时候要注意,对于格式要求很严,每个缩进都是有讲究的,冒号后面的空格也是有用的。这里我部署了两个服务,一个是postgresql10的服务pg10,一个是我自己的springboot后台接口服务aoc,两个服务的部署方式不同,pg10是直接通过镜像来部署,使用的是docker.io/postgres:10这个镜像,如果本地没有,就从公共库拉取,volumes部分就是数据库挂载的部分,privileged: true是权限,如果要挂载,可能会出现权限问题,这里加上这句,是为了解决可能遇见的权限问题。aoc这个服务是用本地的Dockerfile文件来创建镜像,然后创建容器,这就要求你的当前目录下有Dockerfile文件,具体内容怎么写,参考我另外一篇博客https://blog.csdn.net/dap769815768/article/details/86561566,network_mode: "host"这一句的意思是aoc这个容器使用的主机的网络,这样,在容器内尝试请求127.0.0.1这个地址,其实就是调用主机的本地地址,而不再是容器的。

networks部分我没有仔细研究,有兴趣可以参考官方文档。

另外这里面还有很多其他的东西,比如depends_on,links等,有兴趣可以看下官方文档。这里我没有用到,所以就不多说了。

5.这个docker-compose目录写好后,和Dockerfile文件(springboot容器镜像生成文件),aoc.jar(springboot接口服务),pg10(数据库挂载文件),放到一个目录下,如下图:

然后进到这个aoc目录,执行:

docker-compose up

执行后,docker会自动创建pg10和aoc这两个服务,然后启动他们,启动后,使用你当前所在的机器的ip尝试调用你的接口,尝试连接下数据库,看看能不能正常使用。如果网络是通的话,服务器环境会自动搭建好,然后可以正常使用,如果想在后台调用docker-compose,就这样写:

docker-compose up -d

6.之后重启电脑,reboot,看看服务有没有跟着机器自动启动,前面我们已经把docker加入自启动了,所以正常来讲,这里面的两个容器会随着电脑启动后启动。

注:这里面有个坑,我暂时还没有找到好的解决方法,比如一般我们都要求pg的服务启动好之后,才让java程序启动,这样才能保证java程序可以正常启动起来,也就是涉及到容器服务的启动顺序问题。使用docker-compose up命令的时候,系统会自动按照顺序从上到下一个个构建容器,这个时候顺序是没有问题的,但是当机器重启后,由于我们设置了aoc和pg10这两个容器的重启策略是always,那么它们就会跟着docker自动重启,这个时候它们就脱离了docker-compose的管理了,而是各自管理自己,也就是说我们无法控制它俩的启动顺序了。同时官方有一个参数:depends_on,这个参数的作用是某个容器基于某个容器,但是它本身并不会因为你设置了这个参数就会帮你启动相关的容器,更不会等待这个容器启动好再启动,它只会检查有没有这个容器,一旦发现没有,就启动失败,所以,如果你在aoc里面设置了depends_on: - pg10,你会发现你的aoc总是自动重启失败,原因就是这个。针对这个问题,我目前知道两个解决方案:

1.把docker-compose up -d做成服务,具体做法参考我的另外一篇博文https://blog.csdn.net/dap769815768/article/details/86480551

然后通过systemctl enable命令,实现自动重启,这样,docker-compose.yml里面的restart: always就可以去掉了。

2.添加command命令,检查数据库服务有没有准备好,准备好了,再启动容器,具体如何做,你可以参考官方文档:

https://docs.docker.com/compose/startup-order/

当然了,解决这个问题,你还可以通过改写你的java代码,规避数据库没有及时启动起来造成程序出错的问题。

猜你喜欢

转载自blog.csdn.net/dap769815768/article/details/86573239
今日推荐