1 使用docker-compose搭建开发环境

我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了。

首先使用Nginx代理所有的Web程序,这样只需要在主机上监听一个端口就可以了,不污染主机。再组合各Web程序、Redis/Memcached、SqlServerOnLinux。

新建一个目录sites,所有和集群相关的都放在这里,目录结构如下所示

sites
nginx
sites-enabled
default
Dockerfile
redis
Dockerfile
redis.conf
docker-compose.yml

新建docker-compose.yml

version: "2"
services:
redis:
build: ./redis/
restart: always
container_name: mac-redis
identity:
build: ~/identity/src/Web/ #identity项目的Dockerfile所在的目录
restart: always
volumes:
- ~/identity/src/Web/bin/Debug/netcoreapp1.1/publish:/app #把编译好的序集添加到数据卷中
links:
- 'ucenter:api.ucenter.com' #因为identity项目依赖ucenter项目,identity目内部通过url:api.ucenter.com调用ucenter的webapi,所以这里要给设置一个和ur一样的别名,这样identity项目访问`api.ucenter.com`就会被转发到ucenter容器。
- redis
extra_hosts:
- "dbserver:192.168.199.143" #之前搭建了一个sqlserver容器,那个是单独放在个Linux机器里面,所以这里就直接通过地址调用,注意要开启远程访问。
container_name: identity
logging:
driver: "json-file"
options:
max-size: "50k" #因为随着程序的运行,日志会越来越多,导致每次加载时间越越长,所以规定日志文件大小,节省时间
max-file: "10"
ucenter:
build: ~/UCenter/src/WebAPI #ucenter项目的Dockerfile所在的目录
restart: always
volumes:
- ~/UCenter/src/WebAPI/bin/Debug/netcoreapp1.1/publish:/app
links:
- redis
extra_hosts:
- "dbserver:192.168.199.143"
container_name: ucenter
nginx-host:
build: ./nginx #nginx的Dockerfile所在的目录
restart: always
ports:
- "80:80" #监听主机的80端口,或者其它的端口都可以
links:
- identity
- ucenter
volumes:
- ./nginx/sites-enabled:/etc/nginx/sites-enabled #nginx的配置文件放在据卷中,以后需要改动的时候,重启nginx就可以了,不用重新build
- /WebCommon:/www/data #各个项目共用的静态文件,一般走cdn的,在开发环境里就nginx代理
container_name: nginx-host
logging:
driver: "json-file"
options:
max-size: "50k"
max-file: "10"

上面在集群中配置了4个服务,一个nginx负责监听主机的80端口,并转发到相应的服务中去。

identity是我开发的项目,依赖于ucenter项目

项目中都依赖redis缓存,还有通过host解析的数据库服务dbserver。

2 下面先搭建nginx服务

sites->nginx目录下面,新建sites-enabled目录,再新建一个名为default的配置文件

server {
listen 80;
server_name account.xxx.com; #identity项目的域名
location / {
proxy_pass http://identity; #转发到identity服务处理
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128;
}
} server {
listen 80;
server_name ucenter.xxx.com; #ucenter项目的域名
location / {
proxy_pass http://ucenter; #转发到ucenter服务处理
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128;
}
} server {
listen 80;
server_name cdn.xxx.com; #这里把静态文件打包成一个服务,替代cdn
root /www/data;
location / {
}
}

这个是nginx的配置文件,主要配置Nginx的代理方式。下面编写生成Nginx的Dockerfile,sites->nginx下面新建Dockerfile

FROM tutum/nginx
VOLUME /etc/nginx/sites-enabled

通过这个Dockerfile就可以创建Nginx了,

3 安装redis

  1. 再sites下新建目录:mkdir redis

  2. vim Dockerfile

    FROM redis
    COPY redis.conf /usr/local/etc/redis/redis.conf
    CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
  3. vim redis.conf, 复制粘贴redis的配置,这是redis的官方默认配置。

  4. docker build -t mac-redis .我给它起了个名字叫mac-redis

  5. 镜像创建好之后,先测试一下能不能用,docker run -d --name mac-redis mac-redis。这时候mac-redis的容器已经在后台跑起来了,我们再用redis-cli测试这个redis服务,docker run -it --link mac-redis:redis --rm redis redis-cli -h redis -p 6379使用--rm参数,用完就清除这个容器。测试如下:

    redis:6379> set key1 value1
    OK
    redis:6379> get key1
    "value1"

    看来redis服务没问题,exit退出。再把测试用的redis服务容器也删除掉docker rm -f mac-redis

4 使用docker跑aspnetcore程序

这个是最简单的了,根据微软的镜像来就行了,园子里也有大量的教程。

在这里我把它们放在集群中,只要在docker-compose.yml中配置各个aspnetcore程序的Dockerfile所在的路径即可,在我们的yml文件中有

build: ~/identity/src/Web/  #identity项目的Dockerfile所在的目录

identity的源代码所在的目录为~/identity/,Dockerfile在其中的src/web里面,如下:

FROM microsoft/aspnetcore:1.1.1

LABEL Name=identity Version=0.0.1 

ENV ASPNETCORE_ENVIRONMENT Development

ENTRYPOINT ["dotnet", "Identity.Web.dll"]

如果有多个Dockerfile,可以在yml中指定Dockerfile的名称。

另外一个ucenter的Dockerfile如下:

FROM microsoft/aspnetcore:1.1.1

LABEL Name=ucenter Version=0.0.1 

ENTRYPOINT ["dotnet", "UCenter.WebAPI.dll"]

代码修改了之后,dotnet publis && docker restart xxx(xxx就是容器的名称)就生效了。

使用chrome浏览器访问

最后进入sites目录,docker-compose up启动集群,由于nginx监听的是主机的80端口,所以需要把绑定的url指向主机的80端口,一种方法是直接在hosts中加解析,但是不推荐这样做,因为如果要访问线上的项目的话,又要改hosts。为了不污染主机环境,推荐使用chrome浏览器,chrome有多用户功能,因此新建一个用户,使用SwitchyOmega插件,将所需要的URl代理到主机的80端口,这样以后开发的时候用这个chrome的这个用户就可以了,完全不影响主机环境。



在开发环节中,debug是必不可少的需求,所以下篇介绍如何用VSCode在Docker中debug。

使用docker-compose搭建AspNetCore开发环境的更多相关文章

  1. PyCharm使用之利用Docker镜像搭建Python开发环境

      在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装 ...

  2. 使用Docker快速搭建PHP开发环境

    最近有个同事找过来,希望我对在很早之前写的一个PHP网站上增加一些功能,当时开发使用xampp构建的本地开发环境,但是现在我的笔记本电脑已经更新,没有当时的开发环境.本着尽量不往电脑上装无用软件的原则 ...

  3. 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)

    0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...

  4. 五分钟用Docker快速搭建Go开发环境

    挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...

  5. 二、使用docker-compose搭建AspNetCore开发环境

    1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ...

  6. 在win10下使用docker快速搭建ruby开发环境

    docker在windows下发力的时候必将取代各种虚拟机,并改变程序员的开发习惯,或许还会改变infra的工作. 概要: 在Windows下搭建开发环境一直是infra(我)头疼的事情.为了解决这个 ...

  7. Docker 快速搭建 MySQL8 开发环境

    使用 Docker 快速搭建一个 MySQL8 开发环境 步骤 获取镜像 docker pull mysql:8 启动容器,密码 123456,映射 3306 端口 docker run --name ...

  8. 使用Docker快速搭建Tensorflow开发环境

    当我刚开始学习使用scikit-learn时,总是会出现各种各样的包依赖问题,兜兜转转了一遍才全部安装好,现在的机器学习算法开发者大都使用tensorflow.pytorch来实现自己的想法,但依然会 ...

  9. Win7+Docker(boo2docker)搭建php开发环境简略

    之所以称谓简略 是不准备配图的意思 嘿嘿! 步骤1: 到docker官网下载Docker Toolbox,并完全安装 步骤2: 安装完成后,运行在桌面新生成的快捷方式:Docker Quickstar ...

随机推荐

  1. QBC查询

    1.基本语法 session.beginTransaction(); Criteria criteria = session.createCriteria(Person.class); SimpleE ...

  2. vue-router 中router-view不能渲染

    最近在做一个vue的项目,其中使用了vue2.0,vue-router2.0.在使用vue-router的时候跳了一个很大的坑,router-view不能渲染,花费了好多时间终于发现了原因. 项目目录 ...

  3. 027 hibernate查询语言(HQL)

    概述:数据查询与检索是Hibernate中的一个亮点,相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制. 标准化对象查询(Criteria Query):以对象的方式进行查询,将查询 ...

  4. SharePoint 服务器端对象迁移文件夹

    最近有个需求,写个定时迁移文件夹的小程序,因为计时器任务比较繁琐,所以选择了控制台程序.然后,用windows的计划任务执行,也许,会有广大朋友需要类似的功能,简单的分享一下代码逻辑,功能非常简单,希 ...

  5. Spring Mvc 用Demo去学习

    1:首先大体知道 SpringMVC 框架的 运行原理(图片来自网络 ) 2:SpringMVC 是依照DispatcherServlet 展开的 这里可以约Structs2对比,structs2 是 ...

  6. 偏最小二乘回归分析建模步骤的R实现(康复俱乐部20名成员测试数据)+补充pls回归系数矩阵的算法实现

    kf=read.csv('d:/kf.csv') # 读取康复数据kfsl=as.matrix(kf[,1:3]) #生成生理指标矩阵xl=as.matrix(kf[,4:6]) #生成训练指标矩阵x ...

  7. CSS小技巧-两个盒子之间的间距问题

    1.水平排放的盒子,水平间距是两个margin的累加 2.垂直排放的盒子,垂直间距是合并的取最大值

  8. JVM-5.字节码执行引擎

    一.概述 二.栈帧结构 三.方法调用 四.方法执行       一.概述 虚拟机与物理机 虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件. ...

  9. 一天搞定CSS(扩展):CSS Hack

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  10. Unity3d: 资源释放时存储空间不足引发的思考和遇到的问题

    手机游戏第一次启动基本上都会做资源释放的操作,这个时候需要考虑存储空间是否足够,但是Unity没有自带获取设备存储空间大小的 接口,需要调用本地方法分别去android或ios获取,这样挺麻烦的.而且 ...