Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html .

资源规划

这一步要区分传统资源和Docker资源, 为后面的细节定好基础. 因为Docker的特性, 适合于占CPU和MEM资源, 但是对HDD资源要求不高的应用. 不适合用于对数据有持久化要求以及安全性要求较高的应用, 例如MySQL和日志系统.

在开发和测试环境, 你可以随手启动一个MySQL来配合开发, 但是在生产环境目前还是不太现实的, 需要整套运维工具跟进对Docker的配合后才能实现足够的安全性.

生产环境涉及的资源如下:

  • 堡垒机, VPN, 网关, 用于生产环境的底层访问控制, >= 1
  • 存档备份, 低性能大容量带冗余的存储, >=1
  • CI工具, Jenkins, 用于在生产环境进行自动部署, =1
  • RMDB 数据库, MySQL等, >=2
  • NoSQL 数据库, MongoDB, Redis 等, >=2
  • 缓存服务, Ehcache, Redis等, >=1
  • 文件服务, FastDF等, >=1
  • 配置和服务注册服务, Zookeeper, EurekaServer等, >=3
  • 日志服务, Kafka等, >=1
  • 搜索服务, Elasticsearch等, >=1
  • JVM节点, 这是用于运行jar项目的节点, =N
  • WEB服务, Nginx等, >=2

其中与业务开发关系最大, 适合用Docker进行部署的就是JVM节点部分, 还有缓存服务, WEB服务, 日志服务, 配置和注册服务, 也是适合通过Docker管理的. 这边假定仅仅使用Docker配置JVM节点.

网络划分

三类网络的私有地址范围

10.0.0.0       - 10.255.255.255
172.16.0.0   - 172.31.255.255
192.168.0.0 - 192.168.255.255

与环境现有子网综合考虑. 需要达到的目标是

  • 每个容器有独立的 IP,运维就可以像连接虚机一样通过ssh连接容器
  • 需要跨宿主机之间的容器通信
  • 访问控制, 安全性和隔离性
  • 性能损失尽量小

如果是在IDC自建机房的规划, 网络的实现方案可以参考这一篇 http://www.cnblogs.com/sammyliu/p/5926343.html ,

方案一: 基于bridge

将默认的docker bridge网桥替换为 linuxbridge, 把 linuxbridge 网段的 ip 加入到容器里, 实现容器与传统环境应用的互通.

首先在宿主机上添加一个linux bridge, 把宿主机网卡(可以是物理机的, 也可以是虚拟机的), 把这个网卡加入bridge里面, bridge配上网卡原本的管理IP. 
然后创建一个新的docker bridge网络, 指定bridge子网, 并将该网络的网桥绑定到上一步创建的网桥上.

docker network create --gateway 10.199.45.200 --subnet 10.199.45.0/24 -o com.docker.network.bridge.name=br-oak --aux-address "DefaultGatewayIPv4=10.199.45.1" oak-net

容器启动时候指定网络为第二步中创建的bridge网络, 同时为容器指定一个该网络子网内的IP. 容器启动后网络IP默认即可与外界互通.

这是最容易实现的方式, 如果要实现Docker在网络内跨宿主机迁移, 需要宿主机位于同一VLAN, 并且为了避免IP冲突, 要实现整个VLAN的IP的统一管理.

方案二: 基于Calico, 这个还没有仔细研究, 不介绍了.

安全组配置

如果是在公共云服务例如阿里云上, 并且docker数量也比较小的情况下, 就直接用宿主机端口映射就好了. 可以创建子网, 可以配置阿里云的安全组进行访问控制. 根据 对不同目标(外网, 安全组)的访问许可, 设置不同的安全组. 安全组的设置原则是, 1) 全局禁止安全组之间互访, 2) 设置资源组 + 此资源的授权组. 例如

全局组: 全部虚机
可访问全局组的: 堡垒机, VPN

外网: 默认
可访问外网的: 如公共接口模块, CI工具, 可分为一组

DB组: 只允许从特定组访问的, 分为一组
可访问DB组的: 如公共接口模块, 备份计划模块等, 可分为一组

COMMON组:
可访问COMMON组的: 下游边界业务模块等

部署Spring Cloud Jar

编写Dockerfile. 因为java:8默认不带vi, nano, ifconfig这些命令, 建议基于java:8制作一个自己的image, 把nano和net-tools装上, 这样方便运维查看容器环境信息.

FROM java:8
ADD target/scot-eureka.jar scot-eureka.jar
ENTRYPOINT ["java", "-jar", "/scot-eureka.jar"]

一个更完整的Dockerfile例子

FROM openjdk:8-jre-alpine
VOLUME ./mysql:/var/lib/mysql
ADD /build/libs/application.jar app.jar
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

or

FROM openjdk:8-jre
RUN echo "Europe/Berlin" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
RUN mkdir /data
WORKDIR /data
ADD myapp.jar /data/myapp.jar ENV springprofiles="" \
MAXRAMIFNOLIMIT=4096 ENTRYPOINT MAXRAM=$(expr `cat /sys/fs/cgroup/memory/memory.limit_in_bytes` / 1024 / 1024) && \
MAXRAM=$(($MAXRAM>$MAXRAMIFNOLIMIT?$MAXRAMIFNOLIMIT:$MAXRAM))m && \
echo "MaxRam: $MAXRAM" && \
java -XX:MaxRAM=$MAXRAM -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active="$springprofiles" myapp.jar #when "-XX:+UseCGroupMemoryLimitForHeap" isn't experimental anymore, you can use the following
#ENTRYPOINT java -XX:+UseCGroupMemoryLimitForHeap -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active="$springprofiles" myapp.jar EXPOSE 8080

制作Docker Image

docker build -t scot-eureka .

启动Docker container

docker run -d --name eureka -p : scot-eureka
# or
docker run -m 1024MB -d --name container-name -p 9100:9100 -e JAVA_OPTS="-Xmx512M -Xms512M -XX:MaxRAM=1024M" imagename:tag

其中8761是jar本身打开的端口, 8762是从外部(容器IP或者本机IP)去访问的端口, 可以通过 docker ps 或者 docker port [docker-name | container-id] 查看映射关系

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ea7392a8b51 scot-eureka "java -jar /scot-eur…" minutes ago Up minutes 0.0.0.0:->/tcp eureka

这时候就可以通过容器或本机的 IP:8762 端口去访问eureka.jar启动的服务了.

在实际环境中, 需要事先配置好IP信息, package时写入jar, 给docker创建自定义的network, 在run的时候--net 指定network, --ip指定IP. 或者使用zookeeper提供的配置服务, 在启动时实时获取IP配置.

对JVM内存参数的要求

在docker容器中可以查看默认的heap size, 这个和docker run -m 指定的内存大小是无关的, 只和宿主机内存容量有关, 一般为这个容量的1/4 (参考  https://blog.csanchez.org/2017/05/31/running-a-jvm-in-a-container-without-getting-killed/ )

$ java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 1.67G
Ergonomics Machine Class: server
Using VM: Java HotSpot(TM) 64-Bit Server VM java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

在容器中

$ docker run -m 100MB openjdk:8u121 java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 444.50M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM

在Java8之前, Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]   在Java8之后用Metaspace代替了PermGen, 而Metaspace仅受主机实际内存限制. 仅仅使用-Xmx限制内存大小是不够的, 需要用-XX:MaxRAM限制实际使用的内存大小, 才能避免被Docker Daemon关闭. 在8u131+之后, 可以用 UseCGroupMemoryLimitForHeap 参数进行检测

$ docker run -m 2G -ti --rm openjdk:8-jdk java -XshowSettings:vm -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -version
Max. Heap Size (Estimated): 1.74G

It turns out that Java VisualVM doesn't know anything about OffHeap, and, as a result, it can be very tricky to investigate your Java application's memory consumption using this tool. Also, it's crucial to understand the JVM options you use. As for me, it was the discovery that specifying -Xmx=512m tells the JVM to allocate a 512mb heap. It’s not telling the JVM to limit its entire memory usage to 512mb. There are code caches and all sorts of other off heap data.

For specifying total memory, you should use the -XX:MaxRAM parameter. Be aware that with MaxRam=512m your heap will be approximately 250mb. Be careful and pay attention to your app JVM options.

Spring Cloud开发实践 - 04 - Docker部署的更多相关文章

  1. Spring Cloud开发实践 - 01 - 简介和根模块

    简介 使用Spring Boot的提升主要在于jar的打包形式给运维带来了很大的便利, 而Spring Cloud本身的优点不是那么明显, 相对于Dubbo而言, 可能体现在跨语言的交互性上(例如可以 ...

  2. Spring Cloud开发实践 - 03 - 接口实现和下游调用

    接口实现 Scot Commons Impl 接口实现模块 scot-commons-impl, 一方面实现了 scot-commons-api 的接口, 一方面将自己暴露为 REST 服务. 有4个 ...

  3. Spring Cloud开发实践 - 02 - Eureka服务和接口定义

    服务注册 EurekaServer Eureka服务模块只有三个文件, 分别是pom.xml, application.yml 和 EurekaServerApplication.java, 内容如下 ...

  4. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  5. Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)

    一.背景 在我上一篇文章<Spring Cloud开发人员如何解决服务冲突和实例乱窜?>中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一 ...

  6. Spring cloud项目实践(一)

    链接地址:http://sail-y.github.io/2016/03/21/Spring-cloud%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B5/ 什么是Spring ...

  7. spring/spring boot/spring cloud开发总结

    背景        针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...

  8. Spring Cloud开发人员如何解决服务冲突和实例乱窜?

    一.背景 在我们开发微服务架构系统时,虽然说每个微服务都是孤立的可以单独开发,但实际上并非如此,要调试和测试你的服务不仅需要您的微服务启动和运行,还需要它的上下文服务.依赖的基础服务等都要运行:但如果 ...

  9. 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!

    Spring Cloud实战电商项目mall-swarm地址:转发+关注 私信我获取地址 系统架构图   系统架构图 项目组织结构 mall├── mall-common-- 工具类及通用代码模块├─ ...

随机推荐

  1. SQL:Oracle 目录

    ylbtech-Miscellaneos-SQL:Oracle 目录 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据 ...

  2. [转]vue Element UI走马灯组件重写

    https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...

  3. Windows10系统.NET Framework 3.5离线安装方法

    Win10技术预览版给用户们带来很多新功能的同时,也给用户们带来了不害臊的麻烦与问题.其中.NET Framework 4.5是系统预装的,但是在Win10技术预览版中的部分应用需要.NET Fram ...

  4. 简短介绍 C# 6 的新特性

    几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...

  5. Windows10 安装Jupyter

    官方文档:https://jupyter-notebook.readthedocs.io/en/stable/ https://github.com/jupyter/jupyter/wiki/A-ga ...

  6. tail -f 然后grep,处理缓存的问题

    学习了:http://www.quwenqing.com/read-134.html 对日志记录做多次grep过滤输出,格式如下: tail -f log | grep xxx | grep yyy ...

  7. OpenNebula学习第三节之虚拟机管理

    一.背景 已经安装好OpenNebula-Front-end 已经安装好OpenNebula Node 已经把Node注册到Front-end 二.目标 看过第一.二节的同学们可能已经知道我的整个环境 ...

  8. (NGUI)UISprite 切换图集

    UISprite是可以使用代码动态切换图集的 using UnityEngine; using System.Collections; public class SpriteAtlasTest : M ...

  9. SharePoint 2010/2013: List view Lookup threshold uncovered

    SharePoint with Large lists is common scenario in any Sharepoint deployment. While there are Several ...

  10. java 流媒体服务器Red5 FQA

    原文链接:http://www.cnblogs.com/zhuzhao/archive/2008/08/12/1265661.html red5 FQA   red5 FQA 引自:http://hi ...