- 浏览: 33397 次
最新评论
### 一直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 1731#### 这一章主要介绍怎么使用模板,进行后端渲染,主要用到了 ... -
openresty 前端开发轻量级MVC框架封装一(控制器篇)
2017-01-10 22:48 786#### 通过前面几章,我们已经掌握了一些基本的开发知识,但是 ... -
openresty 前端开发进阶一之http后端
2017-01-08 00:46 770#### 做前端开发,大多数情况下,都需要跟后端打交道,而最常 ... -
openresty 前端开发入门六之调试篇
2017-01-04 14:03 793#### 大多数情况下,调试信息,都可以通过ngx.say打印 ... -
openresty 前端开发入门五之Mysql篇
2017-01-04 00:00 517openresty 前端开发入门五 ... -
openresty 前端开发入门四之Redis篇
2017-01-03 10:41 1479#### 这章主要演示怎么 ... -
openresty 前端开发入门三之JSON篇
2017-01-03 10:36 720#### 这章主要介绍一下,lua怎么返回一个json字符串, ... -
openresty 前端开发入门二
2017-01-03 10:36 566#### 这一章主要介绍介绍怎么获取请求参数,并且处理之后返回 ... -
openresty 前端开发入门一
2016-12-30 00:41 727OpenResty ™ 是一个基于 Nginx 与 Lua 的 ... -
openresty 前端开发序
2016-12-09 11:45 502还记得第一次尝试前后端分离的时候,是使用nginx + ...
相关推荐
arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构...
"普通用户运行docker容器-nginx为例" 本文档主要介绍了如何使用普通用户运行 Docker 容器,使用 Nginx 作为示例。整个过程可以分为四大部分:安装 Docker、创建普通用户和 Docker 组、准备 Nginx 镜像和配置文件、...
资源包含Dockerfile文件,可以直接构建自己的nginx镜像
上传nginx docker镜像,供那些不能从官方仓库中下载的同学们,下载离线使用,体验容器技术的魅力。
包含了nginx在docker容器下详细的安装步骤,并提供了相关软件包
该资源包括Linux系统nginx安装包,docker安装包,jdk的安装包以及docker容器的nginx启动脚本,可用于前端jar包部署,只需把前端包放在nginx/www/html目录下,启动nginx脚本即可,拥有搭建redis+sentinel集群的文件以及...
主要介绍了docker安装nginx并配置通过https访问的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
nginx1.26.2版本docker镜像
nginx容器内安装目录: /home/nginx/nginx_stream 免重新编译,解决1.24.0 编译sticky 失败问题,启动即用
该存储库是如何使用NGINX Docker容器作为反向代理的示例,该代理是在其他Dockers容器中运行的另一个应用程序的。 什么是反向代理 来自NGINX页面的定义: 代理服务器是介于中间或中间的服务器,它将来自多个客户端的...
6. **Docker容器化部署**: Docker是一种流行的容器化技术,它允许我们将应用程序及其依赖打包成独立的容器,从而实现轻量级的虚拟化。在本项目中,Docker被用来打包和部署Django应用、Vue3构建后的前端代码以及...
使用docker部署nginx前后端解决跨域问题
简单来说,就是使用Nginx做反向代理,代理到后面的Docker容器,bara能动态创建Nignx配置文件,重启Nginx;而浏览器可以通过设置特殊header(默认为一个字母v)来通过Nginx代理,访问指定的后面的Docker容器。bara...
docker镜像文件nginx1.8.1
nginx ARM平台容器镜像
在现代的云计算环境中,Docker已经成为部署和管理应用程序的标准工具之一。...通过这样的设置,你可以轻松地为每个Docker容器设置自动化的`nginx`代理,无需手动管理复杂的网络配置,提高了开发和运维的效率。
标题中的问题“docker里面nginx目录挂载启动失败”涉及到Docker容器化技术中Nginx服务器的部署,尤其是关于容器的挂载目录设置和启动问题。这个问题的核心在于,尝试将宿主机上的目录挂载到Docker容器内的Nginx配置...
我们可以使用以下命令启动 Nginx 容器: ``` docker run -d \ --name nginx \ -p 80:80 \ -v "$PWD/nginx.conf":/etc/nginx/nginx.conf \ nginx ``` 这个命令将启动一个名为 nginx 的容器,并将容器的 80 端口...
使用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 ...