超级简便的容器化部署工具(使用 ASP.NET Core 演示)

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



参考列表:

原文地址:https://www.cnblogs.com/JacZhu/p/8463663.html

时间: 2024-10-01 21:07:21

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

Kubernetes 集群的两种部署过程(daemon部署和容器化部署)以及glusterfs的应用!

ClusterIp:通过VIP来访问, NodePort: 需要自己搭建负载据衡器 LoadBalancer:仅仅用于特定的云提供商 和 Google Container Engine https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/ port:相当于服务端口(对及集群内客户访问) targetPort: 相当于pods端口 nodePort: 宿主机端口(也是服务端口,只不过是对集群外客户访问)

Spring Boot Tomcat 容器化部署实践与总结

在平时的工作和学习中经常会构建简单的web应用程序.如果只是HelloWorld级别的程序,使用传统的Spring+SpringMVC框架搭建得话会将大部分的时间花费在搭建框架本身上面,比如引入SpringMVC,配置DispatcheherServlet等.并且这些配置文件都差不多,重复这些劳动似乎意义不大.所以使用Springboot框架来搭建简单的应用程序显得十分的便捷和高效. 前两天在工作中需要一个用于测试文件下载的简单web程序,条件是使用Tomcat Docker Image作为载体

Kolla 容器化部署Openstack

1.集群架构  其中e1,e2,e3 表示网卡. e1 所在网络为管理网. e2 为vm对外通信网卡,无需配置网络协议和ip地址: BOOTPROTO=none DEVICE=eth1 HWADDR=fa:16:3e:38:20:88 ONBOOT=yes TYPE=Ethernet USERCTL=no .... e3所在网络为osd集群通信网络 备注:操作系统为centos7.4 最小化安装 2. kolla容器化部署openstack及ceph集群 2.1 基础环境 以下操作在部署机执行

Flask容器化部署原理与实现

本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Flask开发初探 WSGI到底是什么 Flask源码分析一:服务启动 Flask路由内部实现原理 部署方案 在开发时,我们使用flask run命令启动的开发服务器是werkzeug提供的,但是这种方式目的是为了开发,不能很好的扩展,不适合生产部署.生产部署,我们需要一个更强健,性能更高的WSGI服务器

【巨杉数据库SequoiaDB】巨杉 Tech | 几分钟实现巨杉数据库容器化部署

随着业务负载的不断加重,容器化.虚拟化也成为各类在线应用必须要具备的能力.对于分布式数据库,容器化也是提升快速部署.提高运维效率的一个很好的路径. 我们重新优化了 Docker部署的方式,帮助大家更快的上手SequoiaDB集群,本文就将介绍基于 Docker 的SequoiaDB分布式集群快速部署. 1.集群配置 我们将在六个容器中部署一个多节点,高度可用的 SequoiaDB 集群,如下所示: (本文以 SequoiaDB v3.2.3 版本为例) ? 该集群包括一个协调器节点.一个目录节点

品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署

部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享一下经过实践验证的操作步骤: 一.创建与配置集群 1)首先创建一个 Swarm Mode 的集群(注意创建时不要选择“自动创建负载均衡”,因为我们部署的是内网服务,自动创建的是公网负载均衡,需要手动创建内网负载均衡并绑定到集群): 2)集群创建成功后,会在集群列表中显示下面的信息: 3)接着创建一个

在IIS上部署你的ASP.NET Core项目

概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等).而配置文件和过程都会由些许调整,中间最重要的角色便是AspNetCoreModule,

jenkins的容器化部署以及k8s应用的CI/CD实现

1. 使用Helm安装Mysql: ??上一篇博文谈到了如何使用Helm安装Redis和RabbitMQ,下来我们来聊聊如何用Helm安装mysql. ??本人对于Mysql数据库不是非常熟悉,因为我们公司的分工比较明确,数据库这块的工作主要由DBA负责,运维同学只负责应用的维护. ??按照我们前面博文的描述,首先是在官方文档查看helm安装mysql的书名: https://github.com/helm/charts/tree/master/stable/mysql ??我根据官方文档的描述

容器化部署Cassandra高可用集群

前提: 三台装有docker的虚拟机,这里用VM1,VM2,VM3表达(当然生产环境要用三个独立物理机,否则无高可用可言),装docker可参见Ubuntu离线安装docker. 开始部署: 部署图 如上图所示,三台VM的IP分别为: 192.168.0.101 192.168.0.102 192.168.0.103 客户端将使用这三个IP来连接集群,每个VM通过端口映射由docker网桥myBridge来与Cassandra容器通信,容器的IP会在启动容器时指定 部署步骤: 1. 建docke