`
qq362228416
  • 浏览: 34352 次
社区版块
存档分类
最新评论

使用nginx管理docker容器

阅读更多
### 一直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 ,使用用户名密码登陆,成本很低,几乎没有什么内存消耗。是不是很轻量。
0
0
分享到:
评论

相关推荐

    nginx1.26.2版本docker镜像

    为了更好地使用 Docker 管理 Nginx 服务,用户还可以在容器运行期间,通过映射端口(port mapping)的方式,将容器内的服务端口映射到宿主机的端口上,从而使得外部可以访问到 Nginx 服务。 Docker 镜像通常会在其...

    nginx离线包 docker镜像离线包

    由于java应用的广泛性和Docker容器的灵活性,结合nginx的反向代理功能,可以在一个容器化的环境中高效地管理和运行java应用。不过,由于缺乏具体的文件列表信息,无法给出更详细的关于java在这其中扮演的角色描述。 ...

    nginx ARM平台容器镜像

    在特定的硬件平台上,比如ARM架构的设备上,运行nginx的Docker容器镜像具有特殊的意义。ARM平台由于其低功耗、高效的处理性能,广泛应用于移动设备、嵌入式系统和高性能计算领域。 由于ARM平台和传统的x86平台在...

    nginx arm版本 docker镜像

    在使用Nginx ARM版本Docker镜像时,可以通过Docker命令快速启动、停止和管理容器。Docker的容器化技术保证了应用运行环境的一致性,无论是在开发、测试还是生产环境中。此外,Docker的轻量级特性和虚拟化功能也使得...

    无标题nginx1.26.2的docker镜像文件

    无标题nginx1.26.2的docker镜像文件实际上是一种以Docker容器形式封装的Nginx服务器软件。Docker是一个开源的应用容器引擎,允许...它利用了Docker容器化技术的优势,以实现快速部署、环境一致性和便于管理的特性。

    普通用户运行docker容器-nginx为例

    "普通用户运行docker容器-nginx为例" 本文档主要介绍了如何使用普通用户运行 Docker 容器,使用 Nginx 作为示例。整个过程可以分为四大部分:安装 Docker、创建普通用户和 Docker 组、准备 Nginx 镜像和配置文件、...

    nginx docker 镜像nginx.tar

    上传nginx docker镜像,供那些不能从官方仓库中下载的同学们,下载离线使用,体验容器技术的魅力。

    Docker容器下nginx的安装

    包含了nginx在docker容器下详细的安装步骤,并提供了相关软件包

    Linux系统环境docker安装包以及nginx安装包及docker容器的nginx启动脚本以及openjdk8镜像安装包

    该资源包括Linux系统nginx安装包,docker安装包,jdk的安装包以及docker容器的nginx启动脚本,可用于前端jar包部署,只需把前端包放在nginx/www/html目录下,启动nginx脚本即可,拥有搭建redis+sentinel集群的文件以及...

    docker安装nginx并配置通过https访问的方法

    主要介绍了docker安装nginx并配置通过https访问的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    nginx 1.24.0 docker 镜像已编译好 sticky 会话保持

    nginx容器内安装目录: /home/nginx/nginx_stream 免重新编译,解决1.24.0 编译sticky 失败问题,启动即用

    nginx-docker-reverse-proxy:Nginx作为Docker容器的反向代理

    该存储库是如何使用NGINX Docker容器作为反向代理的示例,该代理是在其他Dockers容器中运行的另一个应用程序的。 什么是反向代理 来自NGINX页面的定义: 代理服务器是介于中间或中间的服务器,它将来自多个客户端的...

    nginx:latest镜像 docker load -i nginx.tar

    随着Docker容器技术的兴起,Nginx作为基础镜像与Docker技术的结合也变得越来越普遍。Docker提供了一种简便的方式,通过镜像来打包、分发和运行应用程序,使得部署和服务过程更加高效和一致。 在本例中,提及的...

    nginx+docker学习教程

    Nginx与Docker结合还具有强大的网络功能,Docker容器可以通过网络链接来通信。利用Docker网络功能,我们可以创建虚拟网络,并将Nginx容器连接到应用容器,实现网络服务间的有效隔离和通信。 此外,Docker提供了编排...

    docker镜像nginx:latest离线加载包

    此外,对于复杂的项目,还需要掌握Docker Compose等工具的使用,以便更好地管理和运行包含多个容器的应用。 在运维工作中,Docker提供了一个高效、便捷的运维体验。它通过容器化技术简化了应用部署的流程,使得应用...

    nginx的Docker镜像资源

    3. 运行容器实例:使用docker run命令可以基于拉取的Nginx镜像启动一个或多个容器。在运行时,用户可以挂载卷、设置网络和传递环境变量等,对容器的行为和配置进行详细定义。 4. 配置与优化:虽然标准镜像已经足够...

    仿bilibili动画网站,推荐算法使用UserCF,django+vue3+vite+nginx+docker容器化部署

    6. **Docker容器化部署**: Docker是一种流行的容器化技术,它允许我们将应用程序及其依赖打包成独立的容器,从而实现轻量级的虚拟化。在本项目中,Docker被用来打包和部署Django应用、Vue3构建后的前端代码以及...

    使用docker部署nginx前后端解决跨域问题.docx

    使用docker部署nginx前后端解决跨域问题

    基于Nginx和Docker的测试环境bara.zip

    简单来说,就是使用Nginx做反向代理,代理到后面的Docker容器,bara能动态创建Nignx配置文件,重启Nginx;而浏览器可以通过设置特殊header(默认为一个字母v)来通过Nginx代理,访问指定的后面的Docker容器。bara...

    docker镜像文件nginx1.8.1

    docker镜像文件nginx1.8.1

Global site tag (gtag.js) - Google Analytics