使用docker-compose搭建AspNetCore开发环境
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
再sites下新建目录:
mkdir redisvim DockerfileFROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
vim redis.conf, 复制粘贴redis的配置,这是redis的官方默认配置。docker build -t mac-redis .我给它起了个名字叫mac-redis镜像创建好之后,先测试一下能不能用,
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开发环境的更多相关文章
- PyCharm使用之利用Docker镜像搭建Python开发环境
在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装 ...
- 使用Docker快速搭建PHP开发环境
最近有个同事找过来,希望我对在很早之前写的一个PHP网站上增加一些功能,当时开发使用xampp构建的本地开发环境,但是现在我的笔记本电脑已经更新,没有当时的开发环境.本着尽量不往电脑上装无用软件的原则 ...
- 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)
0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...
- 五分钟用Docker快速搭建Go开发环境
挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...
- 二、使用docker-compose搭建AspNetCore开发环境
1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ...
- 在win10下使用docker快速搭建ruby开发环境
docker在windows下发力的时候必将取代各种虚拟机,并改变程序员的开发习惯,或许还会改变infra的工作. 概要: 在Windows下搭建开发环境一直是infra(我)头疼的事情.为了解决这个 ...
- Docker 快速搭建 MySQL8 开发环境
使用 Docker 快速搭建一个 MySQL8 开发环境 步骤 获取镜像 docker pull mysql:8 启动容器,密码 123456,映射 3306 端口 docker run --name ...
- 使用Docker快速搭建Tensorflow开发环境
当我刚开始学习使用scikit-learn时,总是会出现各种各样的包依赖问题,兜兜转转了一遍才全部安装好,现在的机器学习算法开发者大都使用tensorflow.pytorch来实现自己的想法,但依然会 ...
- Win7+Docker(boo2docker)搭建php开发环境简略
之所以称谓简略 是不准备配图的意思 嘿嘿! 步骤1: 到docker官网下载Docker Toolbox,并完全安装 步骤2: 安装完成后,运行在桌面新生成的快捷方式:Docker Quickstar ...
随机推荐
- 关于html表格单元格宽度的计算规则
* { margin: 0; padding: 0 } body { background: #fafafa } ul,li { list-style: none } h1 { margin: 20p ...
- UITextView 实现链接点击事件
UILabel通过富文本可以实现图文混排,但是想要实现文字的点击效果好像不容易实现,这里有2种方法可以达到效果 YYLabel -->YYText框架 参考我之前的博客:http://www.c ...
- Java基础知识二次学习--第八章 流
第八章 流 时间:2017年4月28日11:03:07~2017年4月28日11:41:54 章节:08章_01节 视频长度:21:15 内容:IO初步 心得: 所有的流在java.io包里面 定 ...
- MySql学习笔记(一) —— 正则表达式的使用
前面介绍利用一些关键字搭配相应的SQL语句进行数据库查找过滤,但随着过滤条件的复杂性的增加,where 子句本身的复杂性也会增加.这时我们就可以利用正则表达式来进行匹配查找. 1.基本字符匹配 ' o ...
- vue-cli+webpack在生成的项目中使用bootstrap
在也个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-vli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...
- 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN
序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...
- $(obj).index(this)与$(this).index()异同讲解
$(this).index()在使用jQuery时出镜率非常高,在编写选项卡及轮播图等特效时经常用到,但$(obj).index(this)似乎有点陌生. 为便于理解,以下分两个使用场景加以分析. 场 ...
- [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)
前言:基于百度地图javascript版本开发,百度地图中所用的key已承诺仅用于测试,不用于商业用途 注:本文所有代码可以到github上进行下载,github地址:http://map.eguid ...
- python socketserver监听多端口多进程
多进程监听多端口 # 多线程socket # 程序监听两个端口,端口逻辑相同其中一个端口放在子进程下 # 每次请求会在产生一个进程处理请求 import SocketServer from multi ...
- log4j 在项目中的详细配置
1.添加log4j 包 2.首先在src目录下添加log4j.properties文件 log4j.rootLogger=debug, stdout, R log4j.appender.stdout= ...