从设计 docker-compose 开始

现今因为容器的盛行,许多的企业都导入了容器解决方案,使得布署与开发都能加快速度。今天的内容是描述怎麽将专案的服务给进行容器化,并使用 docker-compose 进行服务布署。

专案内容有 DB、Spring boot、React 等服务,以下是原始的布署方式,但存在着许多问题

https://ithelp.ithome.com.tw/upload/images/20210902/20104688GcJq5lujJ1.png

以一个一台虚拟机内布署这些服务来看

  1. 不必要的 Port 映射出来(MongoDB、swiftStorage)
  2. 服务和服务之间的沟通应该可以使用内部的服务发现机制,而不是透过映射处来的 Port 进行存取
  3. Nginx 服务可以容器化,原本是没容器化
  4. 没必要在同一台机器上做 master、slave

於是做了整理

https://ithelp.ithome.com.tw/upload/images/20210902/20104688lGC93N6C0d.png

将不必要的 Port 拿掉,透过服务发现方式进行服务存取,可以减少透过 ens33 网卡那边的 NAT 转换,将 Nginx 容器化进行更版之类都方便许多。

整体存取过程是 Client -----> ens33 存取 80 Port 藉由 NAT 和 routing 将流量导入 docker0 -----> 到 Nginx 容器 -----> 反向代理到 -----> Spring boot Application + React 进行网页上的存取。

接下来是如何操作 docker ? 当时大四容器技术 docker 很红,因此在拿时有稍微自干一下这个东西,以下是常见操作

docker run 
docker images
docker ps
docker stop | start | restart
docker rm
docker logs -f 
docker exec

会了这些基本上一个服务就能跑起来使用了~。更体面一点使用 docker-compose 建构专案的服务,以下是一个 Spring boot 後端配 Nginx,Tomcat 预设 Port 是 8080 因此,nginx 在做反向代理时只要指定 web_server_be:8080,Client 到 Nginx 的流量都会被导到 web_server_be。

version: '3.7'
services: 
  backend: # 服务名称
    container_name: web_server_be # 容器名称
    image: Spring-boot:v1.2.3 # Image
    environment: # 环境变数
      - PROJECT_PROPERTIES={"db_username":"...","db_classname":"...","db_url":"..."}
    restart: always # 服务机制
  nginx_proxy:
    container_name: nginx
    image: nginx:latest
    volumes: # 挂载
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/cert:/etc/nginx/ssl/certs
      - ./nginx/sites-enabled:/etc/nginx/sites-enabled
    restart: always
    ports: # 映射到本机到容器的 Port
      - 80:80
      - 443:443
    depends_on: # 等待 backend 启动後才能启动
      - backend

启动方式,前提下是要在该 docker-compose yaml 档下执行否则要用 -f 指定该 yaml 路径

docker-compose up -d # 在背景启动服务
docker-compose stop
docker-compose ps

下个章节将会介绍使用前後端分离,当前的 Web 服务包含了前端和後端,其实在开发上会有一点不那麽适当,因为在做 CI/CD 的时候其实前端的改动跟後端其实关系不大,应当将他们分开,否则前端改动时连後端也要着做测试和建置。


<<:  Day02:空间复杂度

>>:  【Day02】错误范例的 RHS 和 LHS

Day 8 - 初探Vue Component

在Vue的世界中,是由一个又一个的元件所构成,而我们可以透过自订元件的方式量身打造客制化的元件并进行...

Day_28 Ad blocking

相信有许多人很讨厌网页广告,会在网页上安装广告拦截器如AdBlock、AdGuard等。但有很多装置...

Day37 ATT&CK for ICS - Impact(3)

T0837 Loss of Protection 攻击者攻击目的是针对设备的安全保护机制,所谓安全保...

.NET Core第23天_ImageTagHelper的使用

ImageTagHelper:是针对HTML原生<img>的封装。 使<img>具备hash val...

倒数第2天

最近在思考工具机在使用C#的图形化介面 因此来查一下看长的怎样 https://docs.micro...