1、準備docker swarm的集羣環境html
ip | 是否主節點 | |
192.168.91.13 | 是 | |
192.168.91.43 | 否 |
2、準備微服務java
①eureka服務 application.yml配置mysql
server: port: 8761 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8761/eureka instance: hostname: localhost
java代碼略...nginx
②microserviceone服務 application.yml配置spring
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代碼略...sql
③microservicetwo服務 application.yml配置docker
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代碼略...json
重點配置:網絡
preferred-networks: 指定向eureka註冊時使用的網卡地址(須要可以被其餘微服務訪問的ip,微服務間不能訪問極可能是註冊的網卡ip不對)app
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; }
3、編寫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
4、部署
一、在docker swarm主節點上執行 docker stack deploy -c deploy.yml microservice 建立名爲microservice的stack服務
二、docker stack ps microservice查看docker服務狀況
三、其餘相關命令
docker stack rm microservice 刪除名爲microservice的stack服務
docker service ls 查看服務列表
5、經常使用中間件的容器部署
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
其餘
一、查看docker swarm錯誤日誌
docker service ps --no-trunc {service_name}
二、鏡像下載加速
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