目录
用途及原理
- 用途
docker基于容器化,将一系列应用看作一个个容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个Docker,而MySQL运行在另外一个Docker,另外还可将该容器背后支持的镜像发布仓库储存,例如以后扩展其它业务或新增服务器部署环境只需用docker下载镜像直接发布项目无痛使用。
- 原理(摘抄)
Docker利用Linux中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。
本章需求实现与准备
准备
- jdk1.8(linux)
- mysql(一般都是另外一台服务器上安装的,提前准备好数据库)
- linux(ubuntu)服务器一台,用于实践
- 微服务jar包(就是你后台打包的jar)
- 我的环境:ubuntu16.14,mysql5.7,微服务架构(SpringBoot/cloud),注册中心采用eureka,网关为zuul转发服务~~~
实现
使用docker容器化技术部署后台服务
搭建jdk镜像
准备jdk(linux)压缩包
注:如果没有的,下面地址下载即可
链接:https://pan.baidu.com/s/13QLACLI64X3lxGvvuM8hcg 提取码:l9p3
编辑Dockerfile配置文件
注:里面jdk就是我的压缩包文件
#指定当前镜像在于centos虚拟服务器里面存在的(相当于linux服务器一样,虚拟化了)
FROM centos:7
#2、指明该镜像的作者和电子邮箱
MAINTAINER xwl "250964....@@.com"
#3、在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/docker
#4、一个复制命令,把jdk安装文件复制到镜像中,语法 ADD SRC DEST ,ADD命令具有自动解压功能
ADD jdk /usr/local/docker
#5、配置环境变量,此处目录为tar.gz包解压后的名称,需提前解压知晓:
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_91
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
生成JDK镜像
执行命令
注:后面的.不能省略,必须存在
docker build -t myjdk:1.0 .
执行命令查看创建的镜像
docker images
验证jdk镜像是否成功
- 基于jdk镜像启动容器
执行命令
docker run -itd --name testjdk myjdk:1.0 /bin/bash
执行命令查看是否启动成功
docker ps
执行命令查看该容器的唯一id标识
docker ps -aq
- 测试镜像内置jdk是否配置成功
docker exec -it testjdk /bin/bash
- 测试
java -version
jdk镜像就OK了,关闭容器即可
- 退出容器:exit
- 删除容器:docker stop testjdk
- 删除历史:docker rm -f 你创建容器的唯一标识ID
搭建eureka镜像
注:eureka工程我就不说了,默认你存在工程环境,如果你没有,这里有我的一篇文章供参考~
编辑Dockerfile
这里的From是引用的意思,因为jar的运行是需要jdk的环境支持,所以这里直接引用之前创建的jdk镜像就OK了
说明:jdk镜像内置有了jdk,引过来之后就相当于我当前的镜像也有了jdk,理所当然就可以运行jar包了~
From myjdk:1.0
RUN mkdir /jars
ADD eureka-server-0.0.1-SNAPSHOT.jar /jars/eureka.jar
ENTRYPOINT ["java","-jar","/jars/eureka.jar"]
打包eureka镜像并运行
docker build -t myeureka:1.0 .
docker images
运行容器
–name:起一个容器名称
-p:对外开放的端口号为8761,对应容器内部的eureka端口号8761
docker run -d --name eurekas -p:8761:8761 myeureka:1.0
docker ps
查看运行日志
docker logs -f eurekas
浏览器访问ip+端口
OK,eureka注册中心就运行成功了
搭建zuul(网关镜像)
注:网关zuul我的文章供你参考搭建如下
SpringCloud Zuul网关搭建及运行
注意:网关是要注册到eureka上面去的,那么配置文件注册的时候实际注册到eureka的地址就不能写localhost了,因为docker里面宿主机每个容器的IP地址不同,这里注册的时候就要写成eureka容器的名称或者容器的地址,以下是我的配置文件供参考
server:
port: 5555
spring:
application:
name: zuul-server
#mysql基础配置
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/myxue?characterEncoding=utf-8
eureka:
instance:
hostname: localhost
#指定访问本机IP
prefer-ip-address: true
client:
#被注册中心eureka发现并注册
fetch-registry: true
register-with-eureka: true
service-url:
#eurekas就是注册中心刚才容器的名称
defaultZone: http://eurekas:8761/eureka
zuul:
prefix: /api
#转发服务
routes:
other:
path: /other-server/**
serviceId: other-server
show:
path: /show-server/**
serviceId: show-server
#配置mybatis-plus打印sql语句于控制台
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#开启驼峰命名转换
map-underscore-to-camel-case: true
#错误响应配置时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 #熔断响应时间
#ribbon超时配置 读取和等待时间都设置6秒
ribbon:
#熔断读取时间
ReadTimeout: 60000
#连接等待时间
ConnectTimeout: 60000
编辑Dockerfile镜像
From myjdk:1.0
RUN mkdir /jars
ADD zuul-server-0.0.1-SNAPSHOT.jar /jars/zuul.jar
ENTRYPOINT ["java","-jar","/jars/zuul.jar"]
打包镜像并运行
docker build -t myzuul:1.0 .
查看网关zuul镜像
docker images
基于镜像运行容器并注册到eureka上
–link:打通与eureka注册中心的互连
说明:docker是容器化部署,那它的每个容器运行都是在虚拟化环境中运行,那么就是在不同的主机运行,ip肯定不一致,所以docker提供了一个link参数桥接容器与容器之间的连接,以达到高可用的效果
docker run -d --name zuuls -p:5555:5555 --link eurekas:eurekas myzuul:1.0
可以看到目前已经启动了两个容器分别是eureka和网关zuul
测试网络是否互通
进入网关容器
docker exec -it zuuls /bin/bash
查看eureka是否和它互连
cat /etc/hosts
在网关容器内部我去pingeureka的ip
ping eureka的ip
上图所示,可以ping通,OK~~
查看效果
搭建其它服务
微服务业务服务很多,我这里就举例一个了~其它的大同小异,和我这个类似,自行发挥就行
编辑Dockerfile
From myjdk:1.0
RUN mkdir /jars
ADD other-server-1.0-SNAPSHOT.jar /jars/other.jar
ENTRYPOINT ["java","-jar","/jars/other.jar"]
打包镜像并运行
注意:其它服务是通过网关进行转发的,那么其它服务就不能默认localhost了,就要给它分发一个ip,让网关根据我们设置的ip去找容器,这样就可以转发成功,必须设置我设置的为172.18.0.4,这个是根据刚才的网关和eureka的ip自己随便弄一个就行,至于为了是172.18.0.4因为这是我服务器上这几个容器运行的网段,~~
#端口
server:
port: 8111
spring:
application:
name: other-server
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/myxue?characterEncoding=utf-8
jpa:
show-sql: true
hibernate:
ddl-auto: update
cloud:
inetutils:
default-ip-address: 172.18.0.4
eureka:
instance:
hostname: localhost
prefer-ip-address: true
instance-id: ${spring.cloud.inetutils.default-ip-address}:${spring.application.name}:${server.port}
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eurekas:8761/eureka
#配置mybatis-plus打印sql语句于控制台
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#开启驼峰命名转换
map-underscore-to-camel-case: true
docker build -t myother:1.0 .
docker images
运行容器
–link:这里互通两个,一个是eureka,一个是网关zuul
说明:普通服务要注册到eureka上,并且也要和zuul互通,因为网关的转发都是基于其它服务的所以这是必然的~
docker run -d --name other-server -p:8111:8111 --link eurekas:eurekas --link zuuls:zuuls myother:1.0
docker ps
查看注册中心服务列表,成功!
结语
自此,docker就算入门了,还有其它更优秀的知识能够更简洁的部署服务,这里是我学到docker的入门阶段自己实践成功之后发布的文章,供大家参考学习~,循序渐进,完事儿。
有问题?联系我
如果你没有实践成功,或者文章有不理想的地方,欢迎一起交流
微信:x331191249
QQ:2509647976