Docker stack 使用演示案例一

环境准备

  • 安装好docker swarm(本文以1manager+3worker为例)
  • spring boot demo演示项目
  • 通过NFS实现共享目录访问
  • 资源文件 docker-stack.zip(访问密码: 9987)

实现结果

  • 同一个docker swarm集群中不通主机之间可以网络互通(通过overlay网络方式);
  • docker stack部署服务并能实现共享文件访问
程序简单架构
程序简单架构
 

compose文件配置

version: '3.5'
networks:
  stackDemoNetwork:
    #网络类型必须是overlay
    driver: overlay
    external: false
services:
  mysql:
    image: mysql:5.7
    networks:
      - stackDemoNetwork
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=demo
      - MYSQL_ROOT_PASSWORD=YOUR_PWD
    command:
      --lower_case_table_names=1
      --character-set-server=utf8
      --collation-server=utf8_general_ci
      --explicit_defaults_for_timestamp=true
      --sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
    volumes:
      #先创建本机目录(这里指定的本机为swarm的manager节点,只部署1个)
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    deploy:
      placement:
        constraints: [node.role == manager]
      mode: replicated
      replicas: 1
  web:
    image: nginx:1.13-alpine
    ports:
      - "80:80"
    networks:
      - stackDemoNetwork
    volumes: 
       #注意:主机目录必须手动先创建
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/html:/usr/share/nginx/html
    deploy:
      placement:
        constraints: [node.role == manager]
  app:
    image: openjdk:8-alpine
    volumes:
      #sudo mount -t nfs 192.168.79.129:/nfs /share
      #先将demo.jar应用程序拷贝到共享目录
      - /share/demo.jar:/demo.jar
    networks:
      - stackDemoNetwork
    command: ['java','-Xms256M','-Xmx256M','-Duser.timezone=Asia/ShangHai', '-jar', '/demo.jar',"--spring.profiles.active=test"]
    deploy:
      mode: replicated
      replicas: 3

nginx 配置 nginx/conf/default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

	location / {
		proxy_set_header Host $http_host;
		proxy_pass  http://app_upstream;
	}
	
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

upstream app_upstream{
	server app:8080;
}
 
文件结构参考
文件结构参考
 

先将NFS挂载到每一个主机的/share目录下,作为共享目录,并创建compose.yml配置的/share开头的文件夹,必须预先创建,否则通过docker stack命令执行失败

 

启动/更新服务

 
docker 部署结构图
docker 部署结构图

提示,app123的顺序不一定是图中的顺序。

 
sudo docker stack deploy -c docker-compose.yml demo

启动和更新命令一致


启动完成后查看启动结果:
查看启动的stack


查看某个服务的日志:
sudo docker service logs -f  demo_app

查看某个服务日志

 

访问演示

 
访问演示1
访问演示1
 
多次访问
多次访问

通过多次访问可以看到,ip地址变化等于访问了不通的容器,每次变化还都能访问到数据库中名字

 

提示:
官方不建议使用NFS作为MySQL的数据挂载目录,建议直接使用宿主机目录



 

评论区域