Docker 改变了我们部署网站的方式,从原先的手动编译打包上传,到现在的构建镜像然后推送部署,让我们在配置环境上所花费的时间大大减少了。不仅如此,通过一系列相关的工具配合,可以很轻松的实现 CI、CD。本文即将介绍的就是这么一款非常简便的工具——captainduckduck,使用 captainduckduck 只需要很少的 Docker 知识。

简介

原先,我们的部署流程可能是这样的:

拉取代码 -> 构建镜像 -> 启动容器

除此之外,还需要配置 HTTPS,配置反向代理,如果要更新应用的话,还需要手动去执行一遍部署流程,先不说一遍一遍执行这些个东西挺枯燥的,再一个,当同一台服务器上托管的网站多了,时间一长,可能反向代理的端口号都记不清,之后再部署新的网站,还得把 nginx 配置文件看一遍。

幸运的是,我无意间发现了 captainduckduck, 这是一个能够极大的简化我们使用 Docker 部署 Web 服务步骤的工具,完美的击中了上面提到的痛点,而且使用起来非常的简单。captainduckduck 是对 Docker swarm 技术一个较好的封装,提供了一个 Web 面板以及一个客户端命令行工具,即使用户完全没有接触过 Docker Swarm 甚至没怎么用过 nginx、Docker,也能够轻松的部署网站。

准备工作

首先需要准备这些东西:

  • 一个支持泛解析的域名
  • 一台安装好了 Docker 17.06.x 的 Linux 服务器(最低配置 1核1G)

在校大学生可以使用腾讯云或者阿里云提供的学生套餐,其中包含不少于 1G 内存的服务器跟一年的域名,也不贵,每月支出一两顿饭钱而已。

安装 Captain 服务端

mkdir /captain
docker run -v /var/run/docker.sock:/var/run/docker.sock dockersaturn/captainduckduck

运行上面的两条 shell 命令并等待执行结束,就完成了服务端的部署,啊,就是这么简单。然后你就可以在浏览器里访问:http://[IP_OF_YOUR_SERVER]:3000 Web 面板了。使用默认密码登陆后,就可以来配置服务端了。

配置服务端

首先在你的域名解析处添加一个 A 记录:*.something,IP 指向安装了 captainduckduck 的服务器。然后在 Web 面板的 Dashboard 页面设置 Captain Root Domainsomething.example.com。同时,你还可以启用 HTTPS,captainduckduck 会自动的使用 Let's Encrypt 给你的域名加上一个 HTTPS 证书。添加好根域名后,captainduckduck 会给 Web 面板分配一个用来直接访问的域名:captain.something.example.com

至此,captainduckduck 就已经部署完毕了,让我们测试一下,切换到 Apps 页面,点击 OneClick Apps/Databases,在下拉列表中选择 WordPress,然后按照表单填写数据库相关的信息,稍等几分钟,就可以一键部署一个 WordPress 站点了。这里是我运行好的:https://test-wp.app.gianthard.rocks/

部署 ASP.NET Core 网站

Dockerfile

captainduckduck 默认并不支持 ASP.NET Core 网站的一键部署,需要自己动手写一个 Dockerfile,不过好在微软已经给了标准样例:

# Sample contents of Dockerfile
# Stage 1
FROM microsoft/aspnetcore-build AS builder
WORKDIR /source # caches restore result by copying csproj file separately
COPY ./src/*.csproj .
RUN cd ./src && dotnet restore # copies the rest of your code
COPY ./src/ .
RUN cd ./src && dotnet publish --output /app/ --configuration Release # Stage 2
FROM microsoft/aspnetcore
WORKDIR /app
COPY --from=builder /app .
ENTRYPOINT ["dotnet", "myapp.dll"]

如果你的网站使用了现代前端框架的服务端渲染技术,你可以使用下面的 Dockerfile 样例:

# Sample contents of Dockerfile
# Stage 1
FROM microsoft/aspnetcore-build AS builder
WORKDIR /source # caches restore result by copying csproj file separately
COPY ./src/*.csproj .
COPY ./src/package.json .
# 如果你的服务器网络不好,请自行在这里修改 npm 仓库
RUN cd ./src && dotnet restore && npm i # copies the rest of your code
COPY ./src/ .
RUN cd ./src && dotnet publish --output /app/ --configuration Release # Stage 2
FROM microsoft/aspnetcore:2.0.5
ENV NODE_VERSION 9.3.0 RUN curl -SLO "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \
&& curl -SLO --compressed "https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/SHASUMS256.txt" \
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 --no-same-owner \
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs WORKDIR /app
COPY --from=builder /app .
ENTRYPOINT ["dotnet", "myapp.dll"]

captain-definition

虽然上面介绍了 Dockerfile,但最终要使用的是 captain-definition 这个文件,这个文件的详细说明请看:https://github.com/githubsaturn/captainduckduck/wiki/Captain-Definition-File,不过 captainduckduck 的作者提供了一个在线转换工具:https://githubsaturn.github.io/dockerfile-to-captain/

转换后的结果如下:

{
"schemaVersion": 1,
"dockerfileLines": [
"# Sample contents of Dockerfile",
"# Stage 1",
"FROM microsoft/aspnetcore-build AS builder",
"WORKDIR /source",
"# caches restore result by copying csproj file separately",
"COPY ./src/*.csproj .",
"COPY ./src/package.json .",
"# 如果你的服务器网络不好,请自行在这里修改 npm 仓库",
"RUN dotnet restore && npm i",
"# copies the rest of your code",
"COPY ./src/ .",
"RUN dotnet publish --output /app/ --configuration Release",
"# Stage 2",
"FROM microsoft/aspnetcore:2.0.5",
"ENV NODE_VERSION 9.3.0",
"RUN curl -SLO \"https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz\" \\",
" && curl -SLO --compressed \"https://mirrors.ustc.edu.cn/node/v$NODE_VERSION/SHASUMS256.txt\" \\",
" && grep \" node-v$NODE_VERSION-linux-x64.tar.gz\\$\" SHASUMS256.txt | sha256sum -c - \\",
" && tar -xf \"node-v$NODE_VERSION-linux-x64.tar.gz\" -C /usr/local --strip-components=1 --no-same-owner \\",
" && rm \"node-v$NODE_VERSION-linux-x64.tar.gz\" SHASUMS256.txt \\",
" && ln -s /usr/local/bin/node /usr/local/bin/nodejs",
"WORKDIR /app",
"COPY --from=builder /app .",
"ENTRYPOINT [\"dotnet\", \"myapp.dll\"]"
]
}

这里需要注意的是,即使 captain-definition 文件位于项目根目录,但在服务端构建的时候,项目文件夹的内容会被克隆到 ./src,而由 captainduckduck 生成的 Dockerfile 会位于 ./Dockerfile,所以在编写 Dockerfile 的时候,就应该考虑到这个情况。

客户端命令行工具

captainduckduck 命令行工具可以用来让我们不用打开 Web 面板就来部署网站,命令行工具安装起来也很简单:

npm i -g captainduckduck
# 或者
# yarn global add captainduckduck

接下来让我们连接到 captainduckduck 服务端:

captainduckduck login

部署一个试试

部署网站之前需要先创建一个 App,首先登陆 Web 面板,切换到 App 页面,输入 App 的名字:react,然后点击 Create A New App。这样,一个 App 就创建完成了,现在我们可以关掉网站,接着在本地创建一个样例项目:

mkdir myapp
cd myapp
dotnet new react
yarn # Or npm i

然后把上面的 caption-definition 文件添加到项目根目录。接着执行:

git init
git add .
git commit -m 'init commit'
captainduckduck deploy

稍等几分钟,你就可以打开 http://react.something.example.com 来访问这个样例网站了。这里给出我的例子:http://react.app.gianthard.rocks/

更多功能

captainduckduck 还能跟代码托管系统,例如:Github、Gitlab 通过 WebHook 集成,实现持续的部署,关于更详细的介绍,请看项目 Wiki:https://github.com/githubsaturn/captainduckduck/wiki


参考列表:

超级简便的容器化部署工具(使用 ASP.NET Core 演示)的更多相关文章

  1. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  2. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  3. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...

  4. elk 7.9.3 版本容器化部署

    ELK-V7.9.3 部署 为什么用到ELK? 平时我们需要进行日志分析的时候,可以直接在日志文件中 grep.awk 就可以过滤出自己想要的信息及关键字,但规模较大的场景中,此方法极大的减低了效率, ...

  5. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  6. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署

    1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...

  7. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  8. Ubuntu系统下容器化部署gitlab

    容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...

  9. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

随机推荐

  1. c++---天梯赛---查验身份证

    ★题目: ★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码.之后进行进一步的判断把错误的身份证号码输出.如果全部正确输出All passed. ★思路方法: ①按题目要求输入. ②对前1 ...

  2. 关于keil5使用注意事项(预定义、路径包含)

    2017.12.17  下午 终于在不用keil5自带添加库的基础上0 error的新建了一个工程.磕磕绊绊搞了快一个下午,各种小问题搞到崩溃. 首先是库文件添加路径的问题 ,只要是你工程中用到的头文 ...

  3. 织梦在服务器上面安装的时候一直提示data文件没有权限,可我已经写了权限,还是提示

    1.进入服务器,打开IIS,点击相应无权限的文件夹data,然后点击右上角的编辑权限. 2.勾选写入,然后确定即可. 3.织梦一直收到黑客的攻击,这里建议站长朋友设置下权限,来降低织梦系统的危险系数. ...

  4. Spring测试框架JUnit4.4 还蛮详细的

    TestContext 可以运行在 JUnit 3.8.JUnit 4.4.TestNG 等测试框架下. Spring的版本2.5+JUnit4.4+log4j1.2.12 @RunWith(Spri ...

  5. javaScript之jQuery

    一.jQuery简介   jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨 ...

  6. java面向对象的三大特性——多态

    多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底 ...

  7. yum错误,Cannot find a valid baseurl for repo: base 和 No more mirrors to try

    可能出错原因: 1. yum 配置错误 2. 虚拟机无法连接外网 3. 域名解析没有 如何解决这个错误? 1. 网上找 /ect/yum.conf 和 /etc/yum.repos.d/CentOS- ...

  8. ImmutableMap

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  9. linkin大话java

    青春不灭,理想犹存,linkin--勿忘初心! 不知不觉已经和java并肩作战将近了2年,在这2年之中模模糊糊研究了java2ee领域的好多东西,但是都没有做系统的整理.以前写的笔记也是零零散散不成一 ...

  10. 输入和输出--RandomAccessFile类

    RandomAccessFile 类 RandomAccessFile 类既可以读取文件内容,也可以向文件输出数据. RandomAccessFile 类支持 "随机访问" 的方式 ...