一、准備docker swarm的集群環境
ip | 是否主節點 | |
192.168.91.13 | 是 | |
192.168.91.43 | 否 |
二、准備微服務
①eureka服務 application.yml配置
server: port: 8761 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8761/eureka instance: hostname: localhost
java代碼略...
②microserviceone服務 application.yml配置
spring: application: name: serviceone resources: static-locations: file:/home/front profiles: active: pro server: port: 8080 ribbon: eureka: enabled: true --- spring: profiles: dev eureka: client: service-url: defaultZone: http://localhost:8761/eureka fetch-registry: true instance: prefer-ip-address: true ---
# docker 環境下使用此配置
spring: profiles: pro cloud: inetutils: preferred-networks: 10.0.0 #正則匹配10.0.0開頭的網卡ip eureka: client: service-url: defaultZone: http://discovery:8761/eureka fetch-registry: true instance: prefer-ip-address: true
java代碼略...
③microservicetwo服務 application.yml配置
server: port: 8081 spring: application: name: servicetwo profiles: active: pro ribbon: eureka: enabled: true --- spring: profiles: dev eureka: client: service-url: defaultZone: http://localhost:8761/eureka fetch-registry: true instance: prefer-ip-address: true ---
# docker 環境下使用此配置
spring: profiles: pro cloud: inetutils: preferred-networks: 10.0.0 #正則匹配10.0.0開頭的網卡ip eureka: client: service-url: defaultZone: http://discovery:8761/eureka fetch-registry: true instance: prefer-ip-address: true
java代碼略...
重點配置:
preferred-networks: 指定向eureka注冊時使用的網卡地址(需要能夠被其他微服務訪問的ip,微服務間不能訪問很可能是注冊的網卡ip不對)
defaultZone: 使用服務的方式指定eureka地址,這里的discovery服務是在deploy.yml配置文件中指定的服務名
prefer-ip-address: eureka上使用ip地址注冊
應用間關系:
microserviceone、microservicetwo微服務向discovery服務進行注冊
microserviceone通過feign調用microservicetwo的接口
// Feign接口 @FeignClient("servicetwo") public interface DemoFeignService { @RequestMapping(method= RequestMethod.GET,value = "/userlist") @ResponseBody List getUserList(); } ---------------------------------------分割線---------------------------------------- //microserviceone中的controller方法 @Autowired private DemoFeignService demoFeignService; @RequestMapping(method = RequestMethod.GET,value = "invocation") public String testInvoke(){ List list = demoFeignService.getUserList(); String result = JSONObject.toJSONString(list); return "SUCCESS: " + result; }
三、編寫docker-compose配置文件
deploy.yml
version: "3" services: discovery: # 其他微服務可以通過服務名訪問此服務,如服務注冊http://discovery:8761/eureka image: registry.cn-hangzhou.aliyuncs.com/study1990/discovery:1.0 deploy: replicas: 1 #定義 replicated 模式的服務的復本數量 update_config: parallelism: 1 #每次更新復本數量 delay: 2s #每次更新間隔 restart_policy: condition: on-failure #定義服務的重啟條件 networks: - eureka-net ports: - "8761:8761" # environment: # - spring.profiles.active=peer1 serviceone: # 微服務1 image: registry.cn-hangzhou.aliyuncs.com/study1990/simple-microserviceone:1.0 deploy: replicas: 1 #定義 replicated 模式的服務的復本數量 update_config: parallelism: 1 #每次更新復本數量 delay: 2s #每次更新間隔 restart_policy: condition: on-failure #定義服務的重啟條件 networks: - eureka-net ports: - "8080:8080" environment: - spring.profiles.active=pro depends_on: - discovery #依賴服務 servicetwo: image: registry.cn-hangzhou.aliyuncs.com/study1990/simple-microservicetwo:1.0 deploy: replicas: 1 #定義 replicated 模式的服務的復本數量 update_config: parallelism: 1 #每次更新復本數量 delay: 2s #每次更新間隔 restart_policy: condition: on-failure #定義服務的重啟條件 networks: - eureka-net ports: - "8081:8081" environment: - spring.profiles.active=pro depends_on: - discovery networks: eureka-net: # 創建網絡 driver: overlay
四、部署
1、在docker swarm主節點上執行 docker stack deploy -c deploy.yml microservice 創建名為microservice的stack服務
2、docker stack ps microservice查看docker服務情況
3、其他相關命令
docker stack rm microservice 刪除名為microservice的stack服務
docker service ls 查看服務列表
五、常用中間件的容器部署
mysql
version: "3" services: mysql: image: mysql:5.7 deploy: replicas: 1 update_config: parallelism: 1 #每次更新復本數量 delay: 2s #每次更新間隔 restart_policy: condition: on-failure #定義服務的重啟條件 networks: - eureka-net ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: "111111" volumes: - "/root/docker/app/mysql/config:/etc/mysql/conf.d" #配置文件位置 my.cnf - "/root/docker/app/mysql/data:/var/lib/mysql" #數據文件位置 networks: eureka-net: # 創建網絡 driver: overlay
nginx
version: "3" services: nginx: image: nginx:1.12 deploy: replicas: 1 update_config: parallelism: 1 #每次更新復本數量 delay: 2s #每次更新間隔 restart_policy: condition: on-failure #定義服務的重啟條件 networks: - eureka-net ports: - "80:80" volumes: - "/root/docker/app/nginx/html:/usr/share/nginx/html" #掛載宿主機的html目錄覆蓋容器的html目錄 - "/root/docker/app/nginx/config/nginx.conf:/etc/nginx/nginx.conf" #掛載宿主機的nginx.conf覆蓋容器中的nginx.conf - "/root/docker/app/nginx/logs:/var/log/nginx" networks: eureka-net: # 創建網絡 driver: overlay
其他
1、查看docker swarm錯誤日志
docker service ps --no-trunc {service_name}
2、鏡像下載加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://1rght005.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker