- 浏览: 31431 次
最新评论
### 一直YY着想有一个基于web的docker管理器,市面上的都比较重,我只想要轻量一点的,于是想着自己做一个,直接部署在nginx里面,不占内存
先说说原理,其实很简单,docker提供了一套socket接口,基于unix套接字,只要实现nginx能通过socket访问docker基本就上就OK了。
于是想到了nginx + lua,由于服务器上有openresty,直接就拿来用了,通过lua-resty-http 模块,使用unix套接字访问docker的接口,没想到还真可以
代码很简单
docker.lua
```
local http = require "resty.http"
local _M = {}
-- 运行docker remote api,
function do_docker_cmd(uri, is_post)
local httpc = http.new()
local method = "GET"
if is_post == true then
method = "POST"
end
httpc:connect('unix:/var/run/docker.sock')
local res, err = httpc:request({
path = 'http://localhost' .. uri,
method = method,
headers = {
["Host"] = "localhost",
["Accept"] = "application/json",
["Accept-Encoding"] = "utf-8"
}
})
if err then
return nil, err
end
httpc:set_keepalive(60)
if res.status == 500 then
ngx.log(ngx.ALERT, res.body)
end
return res, nil
end
-- 获取所有容器
function _M.index()
local resp, err = do_docker_cmd('/containers/json');
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
-- 停止容器
function _M.stop()
local id = ngx.var.arg_id
local resp, err = do_docker_cmd('/containers/' .. id .. '/stop', true);
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
-- 重启容器
function _M.restart()
local id = ngx.var.arg_id
local resp, err = do_docker_cmd('/containers/' .. id .. '/restart', true);
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
```
如果连不上,那可能是docker.sock文件没有权限,chmod 给一下权限就行了,或者把nginx 的用户改一下也行
剩下的就是写一个简单的页面 html + angular1,把容器都读出来,显示容器信息了,效果图如下:
![这里写图片描述](http://img.blog.csdn.net/20161227000547675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXEzNjIyMjg0MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我这里,只有两个操作,一个是停止 一个是重启,看日志功能没时间做
angularjs
```
function loadContainer() {
$http.get('/app/docker').then(function (res) {
$scope.containers = res.data
})
}
$scope.stopContainer = function(item) {
$http.get('/app/docker/stop', {params: {id: item.Id}}).then(function(res) {
loadContainer();
})
}
$scope.restartContainer = function(item) {
$http.get('/app/docker/restart', {params: {id: item.Id}}).then(function(res) {
loadContainer();
})
}
$scope.showContainers = function() {
var views = document.getElementsByClassName('ui-view');
for (var i = 0; i < views.length; i++) {
views[i].setAttribute('class', 'ng-hide ui-view');
}
document.getElementById('containers').setAttribute('class', 'ui-view')
loadContainer();
}
```
html
```
<div id="containers" class="ng-hide ui-view">
<div ui-view="list-c" class="console-container ng-scope" ng-animate="{enter:'fade-enter'}">
<div class="console-title ng-scope">
<div class="pull-left">
<h5>容器列表</h5>
<ul class="nav nav-pills">
<!-- ngRepeat: item in vm.region -->
<li ng-repeat="item in vm.region" ng-class="{'active':vm.selectedRegion==item.region}"
class="ng-scope active">
</li><!-- end ngRepeat: item in vm.region -->
</ul>
</div>
</div>
<!-- ngIf: !vm.initial -->
<div class="ng-isolate-scope">
<div>
<div class="searchSection inline-block"></div>
<div class="tagSearchSection inline-block margin-left"></div>
</div>
<div class="gridSection">
<table class="table table-hover">
<thead>
<tr>
<th>镜像名</th>
<th>容器名</th>
<th>创建时间</th>
<th>运行时间</th>
<th>状态</th>
<th>IP</th>
<th>暴露端口</th>
<th class="text-right">操作</th>
</tr>
</thead>
<tbody>
<!-- ngRepeat: item in store --><!-- ngIf: !loadingState -->
<tr text-editor-trigger-target="" data-ng-if="!loadingState" bindonce=""
data-ng-repeat="item in containers" class="ng-scope">
<td><span ng-bind="item.Image"></span></td>
<td><a ng-href="{{'http://' + item.Names[0] + '.test.com/'}}" target="_blank" ng-bind="item.Names"></a></td>
<td><span>{{(item.Created * 1000) | date: 'yyyy-MM-dd HH:mm:ss'}}</span></td>
<td><span ng-bind="item.Status"></span></td>
<td><span ng-bind="item.State"></span></td>
<td><span ng-bind="item.NetworkSettings.Networks.bridge.IPAddress"></span></td>
<td><span ng-bind="item.Ports[0].PrivatePort"></span></td>
<td class="text-right">
<div image-list-actions="" config="item" table-handler="item.tableHandler"
class="ng-isolate-scope">
<a ng-show="item.State == 'running'" ng-click="stopContainer(item)">停止</a>
<span class="text-explode">|</span>
<a ng-click="restartContainer(item)">重启</a>
</div>
</td>
</tr>
<!-- end ngRepeat: item in store -->
</tbody>
</table>
</div>
</div>
</div><!-- end ngIf: !vm.initial -->
</div>
```
基本就是这个样子啦,不用登录服务器,就能管理docker容器了,然后简单的在nginx成配置一个 basic auth ,使用用户名密码登陆,成本很低,几乎没有什么内存消耗。是不是很轻量。
先说说原理,其实很简单,docker提供了一套socket接口,基于unix套接字,只要实现nginx能通过socket访问docker基本就上就OK了。
于是想到了nginx + lua,由于服务器上有openresty,直接就拿来用了,通过lua-resty-http 模块,使用unix套接字访问docker的接口,没想到还真可以
代码很简单
docker.lua
```
local http = require "resty.http"
local _M = {}
-- 运行docker remote api,
function do_docker_cmd(uri, is_post)
local httpc = http.new()
local method = "GET"
if is_post == true then
method = "POST"
end
httpc:connect('unix:/var/run/docker.sock')
local res, err = httpc:request({
path = 'http://localhost' .. uri,
method = method,
headers = {
["Host"] = "localhost",
["Accept"] = "application/json",
["Accept-Encoding"] = "utf-8"
}
})
if err then
return nil, err
end
httpc:set_keepalive(60)
if res.status == 500 then
ngx.log(ngx.ALERT, res.body)
end
return res, nil
end
-- 获取所有容器
function _M.index()
local resp, err = do_docker_cmd('/containers/json');
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
-- 停止容器
function _M.stop()
local id = ngx.var.arg_id
local resp, err = do_docker_cmd('/containers/' .. id .. '/stop', true);
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
-- 重启容器
function _M.restart()
local id = ngx.var.arg_id
local resp, err = do_docker_cmd('/containers/' .. id .. '/restart', true);
if err then
ngx.say(err);
return
end
ngx.say(resp:read_body());
end
```
如果连不上,那可能是docker.sock文件没有权限,chmod 给一下权限就行了,或者把nginx 的用户改一下也行
剩下的就是写一个简单的页面 html + angular1,把容器都读出来,显示容器信息了,效果图如下:
![这里写图片描述](http://img.blog.csdn.net/20161227000547675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXEzNjIyMjg0MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我这里,只有两个操作,一个是停止 一个是重启,看日志功能没时间做
angularjs
```
function loadContainer() {
$http.get('/app/docker').then(function (res) {
$scope.containers = res.data
})
}
$scope.stopContainer = function(item) {
$http.get('/app/docker/stop', {params: {id: item.Id}}).then(function(res) {
loadContainer();
})
}
$scope.restartContainer = function(item) {
$http.get('/app/docker/restart', {params: {id: item.Id}}).then(function(res) {
loadContainer();
})
}
$scope.showContainers = function() {
var views = document.getElementsByClassName('ui-view');
for (var i = 0; i < views.length; i++) {
views[i].setAttribute('class', 'ng-hide ui-view');
}
document.getElementById('containers').setAttribute('class', 'ui-view')
loadContainer();
}
```
html
```
<div id="containers" class="ng-hide ui-view">
<div ui-view="list-c" class="console-container ng-scope" ng-animate="{enter:'fade-enter'}">
<div class="console-title ng-scope">
<div class="pull-left">
<h5>容器列表</h5>
<ul class="nav nav-pills">
<!-- ngRepeat: item in vm.region -->
<li ng-repeat="item in vm.region" ng-class="{'active':vm.selectedRegion==item.region}"
class="ng-scope active">
</li><!-- end ngRepeat: item in vm.region -->
</ul>
</div>
</div>
<!-- ngIf: !vm.initial -->
<div class="ng-isolate-scope">
<div>
<div class="searchSection inline-block"></div>
<div class="tagSearchSection inline-block margin-left"></div>
</div>
<div class="gridSection">
<table class="table table-hover">
<thead>
<tr>
<th>镜像名</th>
<th>容器名</th>
<th>创建时间</th>
<th>运行时间</th>
<th>状态</th>
<th>IP</th>
<th>暴露端口</th>
<th class="text-right">操作</th>
</tr>
</thead>
<tbody>
<!-- ngRepeat: item in store --><!-- ngIf: !loadingState -->
<tr text-editor-trigger-target="" data-ng-if="!loadingState" bindonce=""
data-ng-repeat="item in containers" class="ng-scope">
<td><span ng-bind="item.Image"></span></td>
<td><a ng-href="{{'http://' + item.Names[0] + '.test.com/'}}" target="_blank" ng-bind="item.Names"></a></td>
<td><span>{{(item.Created * 1000) | date: 'yyyy-MM-dd HH:mm:ss'}}</span></td>
<td><span ng-bind="item.Status"></span></td>
<td><span ng-bind="item.State"></span></td>
<td><span ng-bind="item.NetworkSettings.Networks.bridge.IPAddress"></span></td>
<td><span ng-bind="item.Ports[0].PrivatePort"></span></td>
<td class="text-right">
<div image-list-actions="" config="item" table-handler="item.tableHandler"
class="ng-isolate-scope">
<a ng-show="item.State == 'running'" ng-click="stopContainer(item)">停止</a>
<span class="text-explode">|</span>
<a ng-click="restartContainer(item)">重启</a>
</div>
</td>
</tr>
<!-- end ngRepeat: item in store -->
</tbody>
</table>
</div>
</div>
</div><!-- end ngIf: !vm.initial -->
</div>
```
基本就是这个样子啦,不用登录服务器,就能管理docker容器了,然后简单的在nginx成配置一个 basic auth ,使用用户名密码登陆,成本很低,几乎没有什么内存消耗。是不是很轻量。
发表评论
-
openresty 前端开发轻量级MVC框架封装二(渲染篇)
2017-01-11 00:50 1663#### 这一章主要介绍怎么使用模板,进行后端渲染,主要用到了 ... -
openresty 前端开发轻量级MVC框架封装一(控制器篇)
2017-01-10 22:48 747#### 通过前面几章,我们已经掌握了一些基本的开发知识,但是 ... -
openresty 前端开发进阶一之http后端
2017-01-08 00:46 704#### 做前端开发,大多数情况下,都需要跟后端打交道,而最常 ... -
openresty 前端开发入门六之调试篇
2017-01-04 14:03 770#### 大多数情况下,调试信息,都可以通过ngx.say打印 ... -
openresty 前端开发入门五之Mysql篇
2017-01-04 00:00 472openresty 前端开发入门五 ... -
openresty 前端开发入门四之Redis篇
2017-01-03 10:41 1440#### 这章主要演示怎么 ... -
openresty 前端开发入门三之JSON篇
2017-01-03 10:36 684#### 这章主要介绍一下,lua怎么返回一个json字符串, ... -
openresty 前端开发入门二
2017-01-03 10:36 523#### 这一章主要介绍介绍怎么获取请求参数,并且处理之后返回 ... -
openresty 前端开发入门一
2016-12-30 00:41 690OpenResty ™ 是一个基于 Nginx 与 Lua 的 ... -
openresty 前端开发序
2016-12-09 11:45 456还记得第一次尝试前后端分离的时候,是使用nginx + ...
相关推荐
仿bilibili动画网站,推荐算法使用UserCF,django+vue3+vite+nginx+docker容器化部署
包含了nginx在docker容器下详细的安装步骤,并提供了相关软件包
该资源包括Linux系统nginx安装包,docker安装包,jdk的安装包以及docker容器的nginx启动脚本,可用于前端jar包部署,只需把前端包放在nginx/www/html目录下,启动nginx脚本即可,拥有搭建redis+sentinel集群的文件以及...
该存储库是如何使用NGINX Docker容器作为反向代理的示例,该代理是在其他Dockers容器中运行的另一个应用程序的。 什么是反向代理 来自NGINX页面的定义: 代理服务器是介于中间或中间的服务器,它将来自多个客户端的...
简单来说,就是使用Nginx做反向代理,代理到后面的Docker容器,bara能动态创建Nignx配置文件,重启Nginx;而浏览器可以通过设置特殊header(默认为一个字母v)来通过Nginx代理,访问指定的后面的Docker容器。bara...
上传nginx docker镜像,供那些不能从官方仓库中下载的同学们,下载离线使用,体验容器技术的魅力。
使用Docker技术安装Nginx及配置简单的负载均衡。 将nginx的配置文件从容器中拷贝到宿主目录 $ mkdir -p /colorfulfrog/nginx/config --先在宿主机创建config目录 $ mkdir -p /colorfulfrog/nginx/html --先在宿主机...
将 nginx docker 容器部署到 heroku 部署 单击以下按钮将存储库部署到 heroku。 手动部署 要手动部署存储库,您必须安装: git clone https://github.com/muhammadhanif/heroku-nginx-docker-container.git cd ...
linux离线环境实现docker化一键快速部署nginx,方便测试、开发构建测试环境
用法要运行它: $ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy然后使用env var VIRTUAL_HOST=subdomain.youdomain.com启动要代理的任何容器$ docker run -e VIRTUAL_...
解决Windows10下无法对docker容器进行端口访问(端口映射的问题) 在Windows10系统服务器中安装了docker和docker-compose 并尝试在其中运行Nginx服务,映射也做好 问题:在主机的浏览器中,打开localhost:port无法...
普通用户运行docker容器-nginx为例
使用docker部署nginx前后端解决跨域问题
Nginx代理管理器的Docker容器 这是的Docker容器。... 使用以下命令启动Nginx代理管理器docker容器: docker run -d \ --name=nginx-proxy-manager \ -p 8181:8181 \ -p 8080:8080 \ -p 4443:4443 \ -v
nginx-docker-container:nginx docker容器
docker容器内安装软件时很慢的解决办法,用网易加速和阿里云加速提升软件安装的速度,安装ps,vi,telnet,netstat等命令,亲测!
实验环境: 一台Liunx服务器(内网可也以) 系统中具有docker环境(如果没有的话,可以查看我的另一篇文章docker的安装...//运行刚刚下载nginx的镜像,现在这个镜像是一个容器。修改name为
申请免费的SSL证书,用docker容器搭建Nginx服务端,详细的Nginx配置ssl证书的方法。
基于busybox的nginx docker镜像 非常小 仅仅3.69M 包含完整的nginx程序 默认www路径是/var/www/html 可以将目录挂载到这个路径 直接就可以启动容器使用了 也可以exec进容器后更改nginx的配置文件实现负载均衡 4层...
主要事关于nginx基础,配置,反向代理,负载均衡,日志解析等等知识点。docker方面是镜像管理,容器管理,仓库管理,数据管理,网络管理等等方面,以及进阶知识点,dockerfile,以及最后的项目的部署。