Docker简介
历史的演化
1)物理机时代:资源浪费,部署成本高,难以扩展和迁移 等
2)虚拟化:是物理资源层面的隔离 通过Hypervisor为制定VM分配资源,达到 多部署,资源隔离,容易扩展,但是VM需要安装操作系统。
3)容器化技术:可以看做成一个不用安装操作系统的虚拟化技术,是APP层面的隔离,
容器化技术也提供了标准化的部署方案,将所有网站需要运行的资源, 同时将运行资源所需要的底层硬件的需求 都放到容器中 ,一键发布,以后给运维交付是一个镜像(jar+ redis MySQLjdk ES)pull之后之间run就可以 项目带上环境安装打包,而不是一个jar包
Docker是一个开源的应用容器引起,基于Go语言开发,
Docker完全使用沙箱机制,容器开销很低
Docker也具备一定虚拟化功能:Docker不仅可以创建容器,还可以像本地的虚拟机申请相应的资源。
Docker 集装箱(也就是镜像)提供了标准的应用打包方式
Docker 镜像和容器解释
Docker镜像—Docker资源库(只读),类似Win7操作系统中的光盘
docker Pull [OPTIONS] NAME[:TAG] 从资源库拉取一个镜像到我们本地,但是镜像是只读的,相当于安装文件,
如果想提供服务,还需要docker run命令
docker run [OPTIONS] IMAGE [:TAG] [COMMAND][ARG...] 创建对应的容器,并启动服务
Docker容器—是镜像的实列,由Docker容器创建,类似我们的PC机,每一个PC机安装了Win7的操作系统之后 都可以称为Win7的实列
所有的镜像和容器默认存放在宿主机的 cd /var/lib/docker 目录中
Docker快速部署Tomcat
1)docker pull tomcat 拉取镜像
作为tomcat 只有镜像,只是死的文件,需要将其创建对应的容器才能提供服务
2)docker run tomcat 启动容器
此时浏览器访问ip:8080是访问不了的,因为浏览器访问的是宿主机而不是容器
3)docker run --name tomcat01 -p 8080:8080 -d tomcat 宿主机端口和容器端口绑定
--name tomcat01: 容器的名字
-p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口。
-d :表示后台运行容器
补充命令:
docker ps -a 查找所有容器
docker stop <容器ID> 停止容器
docker start <容器ID> 启动一个停止的容器
docker rm -f <容器ID> 删除一个容器
docker exec -it <容器ID> /bin/bash 进入容器后台
it 采用交互的命令执行 /bin/bash 开启一个接收命令的终端
exit 退出容器
tomcat容器内部结构
上面的docker run命令包括了了三个组件
1.Apache Tomcat/8.5.46
2.jdk(1.8.0_222) 进入容器之后 java-version可以查看
3.Linux(Red Hat 4.8.5-28) min版本的操作系统 进入容器之后 cat/proc/version可以查看
使用Dockerfile构建镜像
1)当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以使用 Dockerfile 指令来创建一个新的镜像
Dockerfile是一个包含用于组合镜像命令的文本文档(也就是一个脚本)—其中包含一组指令来告诉 Docker 如何构建我们的镜像
Docker通过读取Dockerfile中的指令按步自动生成镜像
简单点来说:它可以让用户个性定制化Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际中的要求。
docker build -t 镜像名 <:tags> DockerFile 目录(.表示当前目录) 使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
举例:使用Dockerfile部署:在原有tomcat安装完的基础上,将我们名为docker-web的应用发布到tomcat镜像中
#设置基准镜像 FROM tomcat:latest #当前镜像是哪个机构的 MAINTAINER sunkun # 切换目录 不存在则创建 cd /user/local/tomcat/webapps 原有镜像中将工作目录切换置tomcat/webapps下 WORKDIR /user/local/tomcat/webapps # 复制目录(dockerfile同级目录下的文件夹)下所有文件到容器目录中 ADD docker-web ./docker-web
cd 到dockerfile文件
构建镜像:docker build -t sunkun/mywebapp:1.0 . (因为在dockerfile当前目录下 可以用.表示dockerfile文件的目录)
sunkun/mywebapp:1.0 是我们镜像的名字(机构名+镜像名+版本组成)
运行镜像:docker run -d -p 8080:8080 sunkun/mywebapp:1.0
此时在访问ip:port/docker-web就可以通过tomcat访问到我们部署的项目了
如果可以访问tomcat欢迎页(ROOT目录),但不了可以访问webapps下的目录
更改conf下的server.xml配置(增加下面加粗的配置 让tomcat可以直接访问webapps下面的路径)
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="" debug="0" reloadable="true"/>
2)镜像分层
镜像构建时,会一层层构建,前一层是后一层的基础。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Dockerfile文件
FROM centos RUN ["echo","aaa"] RUN ["echo","bbb"] RUN ["echo","ccc"] RUN ["echo","ddd"]
更改Dockerfile文件,重新build
FROM centos RUN ["echo","aaa"] RUN ["echo","bbb"] RUN ["echo","ccc"] RUN ["echo","ddd"]
可以看到 前面三步因为命令没有变化,使用了已有的临时镜像,只会对发生变化的语句命令进行重新处理,生成对应的容器
这样可以极大的加快镜像的构建速度
容器间通信
link单向通信
启动容器的时候 docker run -d --name tomcat01 --link mysql tomcat 此时tomcat01就可以和mysql容器单向通信了
Bridge网桥双向通信(docker每创建一个网桥就会在宿主机上安装一个虚拟网卡)
docker network create -d bridge my-bridge 所有通过这个网桥(my-bridge)内外进行通信的容器 彼此之间默认都是互联互通的
docker network connect my-bridge tomcat01 此时tomcat01就和网桥绑定成功了
docker network connect my-bridge mysql 此时mysql就和网桥绑定成功了
此时tomcat01和mysql之间就互联互通了
容器间数据共享
原理:在宿主机上开辟一块空间,这块空间会被其他容器共享
通过设置-v 挂载宿主机目录
docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
docker run --name tomcat01 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
/usr/webapps 代表宿主机的user/webapps目录
/usr/local/tomcat/webapps 挂载到容器内部的 webapps目录下
tomcat01 容器运行的名称
tomcat 镜像名
如:docker run --name tomcat03 -p 8888:8080 -d -v /usr/webapps:/usr/local/tomcat/webapps tomcat
Docker-compose容器编排工具
一个项目上线,需要Nginx Tomcat MySQL,通过Docker-Compose 的yml脚本可以帮助我们先安装MySQL容器,在安装Tomcat容器,在安装Nginx容器,同时彼此形成依赖关系
Docker-Compose单机多容器部署工具,通过yml文件定义多容器如何部署
Docker-compose通过yml文件帮助我们部署了多个容器,并且将这些容器彼此之间进行有效的配置和互通互联
Docker私有仓库Harbor
把我们本地的Docker镜像传到Harbor上面需要以下两步
1)给镜像打上标签 docker tag eureka:v1 ip:port/projectname/eureka
2)推送镜像 docker push ip:port/projectname/eureka
3)把Harbor地址加到docker信任列表
4)再次推送 提示权限不足—>登录
推送成功后 另外的主机可以从Harbor下载镜像
使用SonarQube进行代码审查
Publish Over SSH可以远程拉取镜像和发布应用
普通的Jenkins+Docker+SpringCloud微服务持续集成存在以下问题:
1)一次只能选择一个微服务部署
2)只有一台生产者部署服务器
3)每个服务器只有一个实列,容错率低
优化方案:
1)在一个Jenkins工程中可以选择多个微服务同时发布
2)在一个Jenkins中可以选择多台生成服务器同时部署
3)每个服务都是以集群高可用的方式部署