Dokku和Docker的完美配合,一起来辩

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文讲的是Dokku和Docker的完美配合,一起来辩,【编者的话】本文作者介绍了如何在单机上将Dokku和Docker结合。Dokku是一个小型的PaaS平台,只需使用Git将代码push到对应的仓库上就能自动触发部署,构建过程非常简单。

本文讲的是Dokku和Docker的完美配合,一起来辩,【编者的话】本文作者介绍了如何在单机上将Dokku和Docker结合。Dokku是一个小型的PaaS平台,只需使用Git将代码push到对应的仓库上就能自动触发部署,构建过程非常简单。但是Dokku对于用户来说,相当于黑盒PaaS,作者想更多的控制部署流程,所以做了一番折腾。不过在我看来,作者的思路却不是那么容易理解,虽然解决了问题,但却也违背了初衷,你觉得了?欢迎一起讨论。


Docker允许你以统一的方式来部署任何类型的应用。而Dokku是一个基于Docker的小型PaaS平台。你可以简单的将代码仓库push到服务器上,然后让Dokku来自动构建并部署应用。

尽管Dokku的自动构建能力非常强大而且很酷,但有时候你想要更多的控制应用的部署。例如,你可能想将应用部署到一个容器里面,然后访问另一个运行着数据库的容器。或者你想使用Docker registry上丰富的Docker镜像。

Dokku有很多社区贡献的插件,这些插件可以很好的帮助你实现这些需求。但是,你可能仍然会觉得这工具不是很适合你要做事情。毕竟,Docker的最大优势之一就是它可以让你在的生产环境和开发环境运行相似或者完全一样的容器,这也就减少了部署的痛苦。使用Dokku意味着你要放弃了对应用部署的控制。这对于简单的应用或者测试场景来说可以接受,但是对于比较重要的生产环境来说,你可能就需要夺回这个控制权。

现在我有一些项目需要部署,并且我觉得单台服务器应该足够了。我使用预定义好的Docker镜像在生产环境的服务器上部署这些项目,同时,我又想使用Dokku,因为它支持快速推送代码到服务器。为此,我们专门研究了如何在单台服务器上高效的结合Dokku和Docker。

配置服务器

我在DigitalOcean上用预先定义好的Dokku镜像创建了一个VPS。令人欣喜的是其版本十分的新,Docker和Dokku都是最新的稳定版本。如果你有自己的服务器,你可以像这样安装最新的Docker,然后跟着安装说明安装Dokku。

使用Dokku来部署一个简单的应用

在安装好Dokku后,你需要指定应用部署的域名,并将域名如mydomain.com写到/home/dokku/VHOST

现在Dokku运行起来了,我们需要注册开发机上的SSH key,这样我们才好将代码push到Dokku上。在我们的开发机器上运行下面的命令:

cat .ssh/id_rsa.pub| ssh root@mydomain.com sshcommand acl-add dokku myname


(myname可以用来追踪你的ssh key,方便之后你想删除)

现在我们可以开始使用Dokku了。要试试是否正常可以检出(check out)在本地开发环境的一个Node.js的项目,然后将其push到Dokku:

git clone git@github.com:heroku/node-js-sample.git
cd node-js-sample
git remote add dokku dokku@mydomain.com:test
git push dokku master


现在你应该能看到如下输出:

Counting objects: 381, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (308/308), done.
Writing objects: 100% (381/381), 210.18 KiB | 0 bytes/s, done.
Total 381 (delta 49), reused 373 (delta 44)
-----> Cleaning up ...
-----> Building test ...
-----> Adding BUILD_ENV to build environment...
-----> Node.js app detected
-----> Requested node range: 0.10.x
-----> Resolved node version: 0.10.35
-----> Downloading and installing node
-----> Exporting config vars to environment
-----> Installing dependencies

...

-----> Running post-deploy
-----> Creating new /home/dokku/test/VHOST...
-----> Configuring test.mydomain.com...
-----> Creating http nginx.conf
-----> Running nginx-pre-reload
   Reloading nginx
=====> Application deployed:

http://test.mydomain.com


正如输出中说的一样,你的应用现在部署到了http://test.mydomain.com

用Docker来部署一个WordPress博客

现在我们已经知道了如何使用Dokku构建应用。现在让我们来试试部署一个预先定义好的Docker镜像:我们将要用官方的WordPress Docker镜像来部署一个博客。但在我们搭建一个新的博客之前,你首先需要搭建好一个MySQL数据库服务器,我是这么做的:

docker run --name mysql --restart=always \
   -e MYSQL_ROOT_PASSWORD=some-secret-string -d mariadb


命令中的--restart=always选项是用来保证Docker守护进程在容器出错或者重启后自动启动容器。

如果WordPress容器有访问数据库服务器的root权限,那它就可以自己设置数据库,但是我想自己来配置。我并没有直接在另外一个容器中安装MySQL客户端,而是直接在服务器上安装:

apt-get install -qqy mysql-client
mysql -h`docker inspect --format "{{ .NetworkSettings.IPAddress }}" mysql` \
  -uroot -p


之前的代码是用来获取指派给数据库服务容器的IP地址,以便连接。现在我可以手动为我的新博客搭建好一个数据库:

CREATE DATABASE myblog;
CREATE USER 'myblog'@'%' IDENTIFIED BY 'another-password';
GRANT ALL ON myblog.* TO 'myblog'@'%';
FLUSH PRIVILEGES;


现在我们可以开始部署WordPress博客了:

docker run --name myblog --link mysql:mysql \
   -e WORDPRESS_DB_USER=myblog -e WORDPRESS_DB_PASSWORD=another-password \
   -e WORDPRESS_DB_NAME=myblog -e VIRTUAL_HOST=blog.mydomain.com \
   --restart=always -d wordpress


现在我们的容器已经开始运行,我们可以用docker ps来确认。然而,我们只能在服务器上直接访问80端口,VIRTUAL_HOST的环境变量显示了我们真正想要访问的地址,但是这还不能用。

用docker-gen来做Nginx的反向代理

在服务器上已经有Nginx运行了,因为Dokku的运行依赖它。现在找到我们博客容器的IP,然后在Nignx中配置好域名和IP的对应关系,这应该不难。问题在于如果博客容器重启了,例如服务器重启之后,其IP地址就可能改变,然后我们又需要手动更新Nginx的配置。

幸运的是,有人曾经走过一步,经历过这样的折磨,然后弄出了解决方法:docker-gen。这是一个自动构建然后更新所有运行着的容器的配置文件的工具。

让我们安装这个神奇的工具吧:

cd /tmp
wget https://github.com/jwilder/docker-gen/releases/download/0.3.6/docker-gen-linux-amd64-0.3.6.tar.gz
tar xzf docker-gen-linux-amd64-0.3.6.tar.gz
mv docker-gen /etc/nginx/docker-gen


现在我们需要为我们想生成的Nginx配置文件创建一个模板。我的配置文件基于jwilder的nginx-proxy,将配置写到/etc/nginx/docker.template。现在,我们可以运行docker-gen,但是如果我们需要在服务器重启的时候自动执行此命令,那我们需要将docker-gen安装成一个service。要做到这一点,我们可以将以下脚本写到/etc/nginx/docker-gen-service:

#!/bin/bash
/etc/nginx/docker-gen -only-exposed -watch -notify "service nginx reload" \
  /etc/nginx/docker.template /etc/nginx/sites-enabled/docker_containers


然后让其可执行:chmod +x /etc/nginx/docker-gen-service。现在我们需要添加upstart配置到/etc/init/docker-nginx.conf:

# docker-nginx - Nginx config generator for Docker containers

description "Nginx config generator for Docker containers"
author "Somebody "

When to start the service

start on filesystem and started docker

When to stop the service

stop on runlevel [016]

Automatically restart process if crashed

respawn

Send output to logfile

console log

Run before process

pre-start script [ -d /etc/nginx/certs ] || mkdir -p /etc/nginx/certs end script

Start the process

exec /etc/nginx/docker-gen-service


现在我们可以启动我们的新服务:initctl start docker-nginx。docker-gen会看着我们所有的Dockder容器,然后更新Nginx文件。它会检查每一个容器的VIRTUAL_HOST环境变量,还记得我们在的启动WordPress容器的时候,我们指定了-e VIRTUAL_HOST=blog.mydomain.com选项(如果你想将多个域名指向同一个容器,你可以用逗号分隔:VIRTUAL_HOST=blog.a.com,test.b.com)。因而假设我们的DNS配置是正确的,我们现在可以访问http://blog.mydomain.com,然后看到熟悉的WordPress的初始化配置界面。

原文链接:Dokku and Docker on the same server: power and control(翻译:钟最龙 校对:李颖杰)


原文发布时间为: 2015-02-06

本文作者:kurtzhong

本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Dokku和Docker的完美配合,一起来辩

目录
相关文章
|
C++ UED
C/C++ 性能优化思路
C/C++ 性能优化思路
340 0
真正解决办法:FTP 执行命令时500 Illegal PORT command
真正解决办法:FTP 执行命令时500 Illegal PORT command
3584 0
|
5月前
|
人工智能 网络协议 Java
一文带你玩转 WebSocket 全链路可观测
在 AI 实时交互爆发的时代,WebSocket 成为核心协议。但其双向、长连接、流式传输特性,让传统链路追踪频频失效。阿里云 LoongSuite 基于 OpenTelemetry 标准,结合探针增强与自定义扩展,首次实现 WebSocket 全链路可观测,支持 Span 粒度控制、上下文透传、异步衔接与关键性能指标采集。
751 85
|
NoSQL 安全 测试技术
接口测试用例设计的关键步骤与技巧解析
该文介绍了接口测试的设计和实施,包括测试流程、质量目标和用例设计方法。接口测试在需求分析后进行,关注功能、性能、安全等六项质量目标。流程包括网络监听(如TcpDump, WireShark)和代理工具(Charles, BurpSuite, mitmproxy, Fiddler, AnyProxy)。设计用例时,需考虑基本功能流程、输入域测试(如边界值、特殊字符、参数类型、组合参数、幂等性)、线程安全(并发和分布式测试)以及故障注入。接口测试用例要素包括模块、标题、优先级、前置条件、请求方法等。文章强调了保证接口的幂等性和系统健壮性的测试重要性。
|
监控 数据可视化 前端开发
17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!
Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署。通过其直观的界面和丰富的功能,开发者可以在几分钟内构建和部署复杂的应用程序。Dokploy 提供了灵活的架构和多样的功能,适合各种规模的项目。
842 3
|
机器学习/深度学习 人工智能 计算机视觉
【CVPR小目标检测】- ISNet红外小目标检测
【CVPR小目标检测】- ISNet红外小目标检测
1381 1
|
JavaScript Android开发 开发者
Mac搭建安卓模拟器(支持M1/M2/M3/M4)
Mac搭建安卓模拟器(支持M1/M2)
13406 50
|
JavaScript 前端开发 数据安全/隐私保护
JavaScript实现MD5 加密的6中方式
JavaScript实现MD5 加密的6中方式
823 0
|
Unix Linux Apache
【Linux必知必会】五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 最初来自:http://www.sinoprise.com/read.php?tid-662-page-e-fpage-1.html (遗憾的是这个链接已经打不开了),我基本未改动,只是进行了一些排版和整理。
2422 0
|
SQL 存储 大数据
从0到1介绍一下开源大数据服务平台dataService
从0到1介绍一下开源大数据服务平台dataService
1428 1