本文主要介绍通过 Docker 来部署通过. Net Core 开发的微服务架构, 部署的微服务主要包括统一网关 (使用 Ocelot 开发), 统一认证 (IdentityServer4), 应用服务 (ASP.NET core web API);
本文不针对微服务进行说明, 后续会针对我对微服务的理解在做记录.
一, Docker 原理
对 Docker 最简单并且带有一定错误的认知就是 "Docker 是一种性能非常好的虚拟机".
但是这是有一定错误的说法. Docker 相比于传统虚拟机的技术来说先进了不少, 具体表现在 Docker 不是在宿主机上虚拟出一套硬件后再虚拟出一个操作系统, 而是让 Docker 容器里面的进程直接运行在宿主机上 (Docker 会做文件, 网络等的隔离), 这样一来 Docker 会 "体积更轻, 跑的更快, 同宿主机下可创建的个数更多".
Docker 中有三个核心概念: Image,Container,Repository.
Image: 大家对 镜像 的概念不会陌生. 但和 Windows 的那种 iso 镜像相比, Docker 中的镜像是分层的, 可复用的, 而非简单的一堆文件迭在一起 (类似于一个压缩包的源码和一个 Git 仓库的区别).
Container: 容器的存在离不开镜像的支持, 他是镜像运行时的一个载体 (类似于实例和类的关系). 依托 Docker 的虚拟化技术, 给容器创建了独立的端口, 进程, 文件等 "空间",Container 就是一个与宿机隔离 "容器". 容器可宿主机之间可以进行 port,volumes,network 等的通信.
Repository: Docker 的仓库和 Git 的仓库比较相似, 拥有仓库名, tag. 在本地构建完镜像之后, 即可通过仓库进行镜像的分发. 常用的 Docker hub 有 https://hub.docker.com/(docker 官方) , https://cr.console.aliyun.com/(阿里云) 等.
二, Windows 系统中 Docker 的安装
1, 启用 Hyper-V
打开控制面板 - 程序和功能 - 启用或关闭 Windows 功能, 勾选 Hyper-V, 然后点击确定即可, 如图:
2, 下载并安装 Docker
下载地址:, 需要注册一个 Docker 账号才能下载
下载完成后直接安装
通过命令查看 Docker 版本号:
3, 修改镜像地址
由于 Docker 官方镜像会非常慢, 我是修改的阿里云的镜像
4, 测试
万能的 HelloWorld, 通过 PowerShell 运行 Docker run hello-world
docker ps -a // 查看运行的容器
以上就是整个 Windows 中安装 Docker 环境的过程
三, Ubuntu 中安装 Docker 环境
我是在 AWS 申请了一台免费的服务器, 是用的 Ubuntu 系统. 如果需要申请 AWS 的服务器, 可以通过 AWS 官网注册账号进行申请, 需要填写信用卡账号,
本文 Ubuntu 中安装 Docker 是直接参考官方教程:
安装的时候最好切换到 root 账号进行安装
Ubuntu 的远程是通过 putty, 具体怎么用可以百度
四, 发布并部署服务
1, 创建 Dockerfile, 发布应用程序
这是我的工程目录, 构建镜像是通过 Dockerfile 来构建的.
VS2017 是支持自动构建 Dockerfile 文件, 工程右键 - 添加 - Docker 支持
下面是我的 Dockerfile 的内容
- FROM microsoft/aspnetcore:2.1 // 基础镜像, 这里是. net core 的基础运行环境
- WORKDIR /publish // 创建工程目录
- COPY . /publish // 将当前目录拷贝到镜像中, 注意 COPY . 后面又空格
- EXPOSE 80 // 容器对外暴露 80 端口
- ENTRYPOINT ["dotnet", "ZY.Gateway.dll"] // 启动容器内的服务
- // 这里相当于构建镜像的命令, 是逐行执行
需要设置 Dockerfile 的编译为输出到发布目录
以上都设置好以后, 通过 VS 发布程序
发布成功后, 在工程目录的 bin/release 目录下找到我们的发布后的文件
其他服务的发布跟以上发布类似
2, 上传到 Ubuntu 中
通过 WinScp 工具进行上传, 将三个服务都上传到服务器, WinScp 怎么用, 可以百度一下
3, 构建镜像
- docker build -t apigateway . // 构建网关镜像
- docker build -t identityserver -f /home/Ubuntu/dockerapp/identityserver/publish/Dockerfile . // 构建认证服务镜像
- docker build -t testserver -f /home/Ubuntu/dockerapp/testserver/publish/Dockerfile . // 构建测试服务镜像
- -t // 镜像名称
- -f //dockerfile 文件路径
docker images // 查看镜像
4, 运行容器
镜像已经在前面构建完成, 这一步会根据构建的镜像来运行容器, 将我们的服务跑起来
- docker run -d -p 5000:80 --name apigateway_container apigateway
- docker run -d -p 6000:80 --name identityserver_container identityserver
- docker run -d -p 7000:80 --name testserver_container testserver
- // 分别将网关服务, 认证服务, 测试服务容器跑起来
- //-d 保持后台进程运行 -p 端口映射,{
- 主机端口
- }:{
- 容器端口
- }
通过命令查看容器运行情况
docker ps -a
在配置网关服务的时候会涉及到容器与容器之间的网络访问, Docker 在安装的时候会创建一个 172.17.0.1 的 IP 网关, 可以通过 172.17.0.1 来做端口的转发.
通过命令可以查看 docker0 的网关
API 网关的路由转发配置
5, 调用服务
通过 Postman 来调用通过 Docker 运行的服务, 通过 API 网关访问认证服务获取 Token
整个 Docker 的安装, 服务的发布, 镜像的打包, 容器的运行就全部完成.
整个过程不是一气呵成的, 踩了不少坑, 在踩坑的过程中也学到和理解了很多东西.
下一篇会介绍通过 docker-compose 进行发布, 通过 docker-compose 可以实现一行命令将完成所有服务的构建镜像和运行镜像过程.
- https://www.cnblogs.com/zyrmb/p/10509524.html // 这是我记录的关于 Docker 相关的命令, 可以参考
- https://yeasy.gitbooks.io/docker_practice/content/ // 这是针对 Docker 的整体介绍
来源: https://www.cnblogs.com/zyrmb/p/10496934.html