当前位置: 首页 > 编程日记 > 正文

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-reloadReloading 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:

/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 containersdescription "Nginx config generator for Docker containers"
author "Somebody <somebody@example.com>"
When to start the servicestart on filesystem and started docker
When to stop the servicestop on runlevel [016]
Automatically restart process if crashedrespawn
Send output to logfileconsole log
Run before processpre-start script
[ -d /etc/nginx/certs ] || mkdir -p /etc/nginx/certs
end script
Start the processexec /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
译文原文:Dokku和Docker的完美配合,一起来辩
(翻译:钟最龙 校对:李颖杰)

相关文章:

iOS封装分页效果

#import <UIKit/UIKit.h> interface WPageTitleView : UIView property (nonatomic,assign) NSInteger selectedIndex; //添加参数数组 property (nonatomic,strong) NSArray *titles; property (nonatomic,copy) void (^buttonSelected)(NSInteger index); end #impo…

Windows/Linux TCP Socket网络编程简介及测试代码

典型的网络应用是由一对程序(即客户程序和服务器程序)组成的&#xff0c;它们位于两个不同的端系统中。当运行这两个程序时&#xff0c;创建了一个客户进程和一个服务器进程&#xff0c;同时它们通过从套接字(socket)读出和写入数据在彼此之间进行通信。开发者创建一个网络应用…

《评人工智能如何走向新阶段》后记(再续3)

由AI科技大本营下载自视觉中国35.阿里巴巴旗下芯片公司平头哥在乌镇互联网大会上宣布开源低功耗微控制芯片&#xff08;MCU&#xff09;设计平台&#xff0c;这一平台面向 AIoT 时代的定制化芯片设计需求&#xff0c;目标群体包括芯片设计公司、IP 供应商、高校及科研院所等&am…

ffmpeg 基本用法大全

FFmpegFFmpeg 基本用法本课要解决的问题1.FFmpeg的转码流程是什么&#xff1f;2.常见的视频格式包含哪些内容吗&#xff1f;3.如何把这些内容从视频文件中抽取出来&#xff1f;4.如何从一种格式转换为另一种格式&#xff1f;5.如何放大和缩小视频&#xff1f;6.如何旋转&#x…

快过年了,为过完年跳槽的人准备一份面试题

设计模式是什么&#xff1f; 你知道哪些设计模式&#xff0c;并简要叙述&#xff1f; 设计模式是一种编码经验&#xff0c;就是用比较成熟的逻辑去处理某一种类型的事情。 1). MVC模式&#xff1a;Model View Control&#xff0c;把模型 视图 控制器 层进行解耦合编写。 2). MV…

Ubuntu上Vim安装NERDTree插件操作步骤

NERDTree是Vim的文件系统浏览器&#xff0c;使用此插件&#xff0c;用户可以直观地浏览复杂的目录层次结构&#xff0c;快速打开文件以进行读取或编辑&#xff0c;以及执行基本的文件系统操作。NERDTree源码在https://github.com/preservim/nerdtree。 这里通过Vundle安装NERD…

《评人工智能如何走向新阶段》后记(再续4)

由AI科技大本营下载自视觉中国41. 在人工智能感知阶段&#xff0c;依靠数据驱动的深度学习算法。目前5种最流行的深度学习架构: ① 递归神经网络&#xff08;RNN&#xff09;② 长短期记忆 &#xff08;LSTM&#xff09;/门控递归单元&#xff08;GRU&#xff09;③卷积神经网络…

电视游戏会是未来客厅娱乐的主角吗?

在时下流行的多屏生态概念中&#xff0c;电视虽为最大屏幕&#xff0c;但与智能手机、平板等小屏相比&#xff0c;属于相对较弱的一环。无移动性、自身交互性不足&#xff0c;在一定程度上影响着它在移动时代的发展。而作为最能体现其“吸睛能力”的——大屏娱乐功能&#xff0…

王爽著的《汇编语言》第3版笔记

王爽著的《汇编语言》(第3版)于2013年出版&#xff0c;虽然是2013年出版的&#xff0c;但书中部分内容感觉已过时&#xff1a; (1). 基于intel 8086 CPU介绍&#xff0c;intel 8086是英特尔公司上个世纪生产的芯片&#xff0c;是16位的&#xff0c;早已停产&#xff1b; (2).…

iOS 倒计时方法

//启动计时器 double delayInSeconds 10.0; dispatch_time_t popTime dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ //执行事件 NSLog("计时器结束了"); UIAlertController …

《评人工智能如何走向新阶段》后记(再续5)

由AI科技大本营下载自视觉中国51.今年发表的由俄罗斯“脑机接口”公司&#xff08;Neurobotics&#xff09;和莫斯科物理技术学院&#xff08;MIPT&#xff09;研究的一种全新“脑机接口”算法。利用“脑机接口”将人脑&#xff08;EEG&#xff09;神经元与脑外深度学习网络连接…

不说12306你会Die啊?当然不会,但会憋死

别嫌这标题话粗啊&#xff0c;只是突然想起了某小品中的一句台词儿而已。又是一年春运时&#xff0c;几十亿人口开始了兴奋着、痛苦着的大迁徙。12306开通有几年了吧&#xff0c;我今年才第一次用。因为父母要回老家&#xff0c;不想排队那么辛苦&#xff0c;所以才尝试一把网络…

汇编程序设计与计算机体系结构软件工程师教程笔记:处理器、寄存器简介

《汇编程序设计与计算机体系结构: 软件工程师教程》这本书是由Brain R.Hall和Kevin J.Slonka著&#xff0c;由爱飞翔译。中文版是2019年出版的。个人感觉这本书真不错&#xff0c;书中介绍了三种汇编器GAS、NASM、MASM异同&#xff0c;全部示例代码都放在了GitHub上&#xff0c…

iOS 发布APP关于IDFA的相关内容

您的 App 正在使用广告标识符 (IDFA)。您必须先提供关于 IDFA 的使用信息或将其从 App 中移除&#xff0c;然后再上传您的二进制文件。 如果出现下边这两张图&#xff0c;你就会感到蛋蛋的忧伤 还有这个 怎么解决&#xff1f; 1&#xff0c;查看你所集成的SDK&#xff0c;看看…

《评人工智能如何走向新阶段》后记(再续6)

由AI科技大本营下载自视觉中国61. 在2019深度学习开发者峰会上&#xff0c;百度发布基于飞桨的图学习框架&#xff08;PaddleGraphLearning&#xff0c;PGL&#xff09;。近年来深度神经网络推动了人工智能的发展&#xff0c;但在实际场景中有大量数据是在非欧式空间的&#xf…

Android APP测试的日志文件抓取

1 log文件分类简介 实时打印的主要有&#xff1a;logcat main&#xff0c;logcat radio&#xff0c;logcat events&#xff0c;tcpdump&#xff0c;还有高通平台的还会有QXDM日志 状态信息的有&#xff1a;adb shell cat /proc/kmsg &#xff0c;adb shell dmesg&#xff0c…

汇编程序设计与计算机体系结构软件工程师教程笔记:指令

《汇编程序设计与计算机体系结构: 软件工程师教程》这本书是由Brain R.Hall和Kevin J.Slonka著&#xff0c;由爱飞翔译。中文版是2019年出版的。个人感觉这本书真不错&#xff0c;书中介绍了三种汇编器GAS、NASM、MASM异同&#xff0c;全部示例代码都放在了GitHub上&#xff0c…

IOS视频编辑功能详解上篇-添加水印

前言 用代码在简单视频编辑中&#xff0c;主要就是加美颜、水印&#xff08;贴图&#xff09;、视频截取、视频拼接、音视频的处理&#xff0c;在美颜中&#xff0c;使用GPUImage即可实现多种滤镜、磨皮美颜的功能&#xff0c;并且可以脸部识别实时美颜等功能&#xff0c;这个…

《评人工智能如何走向新阶段》后记(再续7)

由AI科技大本营下载自视觉中国66. 谷歌近来研发用于基因科学的人工智能AlphaFold&#xff0c;根据基因序列预测生命基本分子一蛋白质的三维结构&#xff08;AlphaFold与下国际围棋的AlphaGo似孪生兄弟&#xff09;&#xff0c;这是用来预测蛋白质折叠结构的能力或设计新的蛋白质…

Linux多线程实践(6) --Posix读写锁解决读者写者问题

Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_r…

iOS-直播开发(开发从底层做起)

代码链接: Github: https://github.com/jessonliu/JFLivePlaye 技术部分------ ⬇️ 脑涂: ![ 直播思维导图.png ] 视频直播的大概流程就上脑涂上所画的, 还有一些没列出来, 比如, 聊天, 送礼, 踢出, 禁言, 等等一系列功能, 但本文只是针对视频直播的简单实现! 下边来说一下以…

汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算

《汇编程序设计与计算机体系结构: 软件工程师教程》这本书是由Brain R.Hall和Kevin J.Slonka著&#xff0c;由爱飞翔译。中文版是2019年出版的。个人感觉这本书真不错&#xff0c;书中介绍了三种汇编器GAS、NASM、MASM异同&#xff0c;全部示例代码都放在了GitHub上&#xff0c…

《庆余年》值得一看吗?Python告诉你谁在关注 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | A字头来源 | 数据札记倌庆余年电视剧终于在前两天上了&#xff0c;这两天赶紧爬取数据看一下它的表现。庆余年《庆余年》是作家猫腻的小说。这部从2007年就开更的作品拥有固定的书迷群体&#xff0c;也在文学IP价值榜上有名。期待已久的影视版的…

《C语言及程序设计》实践项目——画分支结构流程图

返回&#xff1a;贺老师课程教学链接 【单分支结构流程图-大值】问题&#xff1a;画流程图&#xff0c;输入两个整数a和b&#xff0c;输出其中的大值。提示&#xff1a;当a<b时&#xff0c;交换a和b&#xff0c;最后输出的a一定是其中的大值。流程图中可以直接给出交换a和b…

汇编程序设计与计算机体系结构软件工程师教程笔记:内联汇编与宏

《汇编程序设计与计算机体系结构: 软件工程师教程》这本书是由Brain R.Hall和Kevin J.Slonka著&#xff0c;由爱飞翔译。中文版是2019年出版的。个人感觉这本书真不错&#xff0c;书中介绍了三种汇编器GAS、NASM、MASM异同&#xff0c;全部示例代码都放在了GitHub上&#xff0c…

无需标注数据,利用辅助性旋转损失的自监督GANs,效果堪比现有最好方法

作者 | Ting Chen译者 | 王红成出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;本文作者提出了一种自检督方式的生成对抗网络&#xff0c;通过辅助性的旋转损失来达到目的。因为通常主流方法来生成自然图像都是通过条件GAN来完成&#xff0c;但是这就需要很多的标签数…

iOS环信聊天界面中点击头像和消息的几种状态

/*环信自带头像点击事件*/ - (void)messageViewController:(EaseMessageViewController *)viewControllerdidSelectAvatarMessageModel:(id<IMessageModel>)messageModel {内容可以根据需要自己添加 }/*!methodbrief 点击了简历消息 (lyq添加)discussion 点击了简历消息,…

ASP.NET将Session保存到数据库中

因为ASP.NET中Session的存取机制与ASP相同&#xff0c;都是保存在进行中&#xff0c; 一旦进程崩溃&#xff0c;所有Session信息将会丢失&#xff0c;所以我采取了将Session信息保存到SQL Server中&#xff0c;尽管还有其它的几个方式&#xff08;本文不作介绍&#xff09;&…

iOS App上架流程

一、前言&#xff1a;作为一名iOSer&#xff0c;把开发出来的App上传到App Store是必要的。下面就来详细讲解一下具体流程步骤。 二、准备&#xff1a; 一个已付费的开发者账号&#xff08;账号类型分为个人&#xff08;Individual&#xff09;、公司&#xff08;Company&#…

不止Markov决策过程,全景式分析强化学习研究内容

作者 | 肖智清编辑 | 刘静来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;强化学习作为通用人工智能的希望&#xff0c;吸引了很多人工智能爱好者学习和研究。Markov决策过程是最知名的强化学习模型&#xff0c;强化学习教程也常以Markov决策过程作为起点。但是&am…