前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Salt管理和部署Docker

使用Salt管理和部署Docker

作者头像
菲宇
发布2019-06-11 17:53:37
1.4K0
发布2019-06-11 17:53:37
举报
文章被收录于专栏:菲宇

  Salt是一个开源配置管理和远程执行应用,Salt目地是简化中央系统管理和配置的管理。而Docker是一个开源应用自动部署项目,在软件容器中提供附加抽象层和操作系统虚拟化。 Docker和Salt都能让裸机服务器和云服务一样使用,Salt提供基础系统,而Docker能包容每个应用,提供微服务功能。 假设以下情况: 目标: 很多主机都需要部署Docker容器,而每个主机上有很多容器。 Not covered: 构建docker容器,通常和Jenkins 一起使用,然后推送到一个私人仓储或使用 Docker Hub. Salt有一个state modules 系统和execution module执行模块,状态是整个情况的表示,而执行模块是用来乏味系统内部执行的命令,但是不能从状态中执行。可见 salt docs. 1.设置变量 开始设置很多变量以后会用得着,使用pillars和 grains能让状态更易于重用,noofcontainers是用于设置启动多少个容器。 {% set name = 'node-demo' %} {% set registryname = 'jacksoncage' %} {% set tag = salt['pillar.get']('imagetag', "latest") %} {% set containerid = salt['grains.get']('id') %} {% set hostport = '808' %} {% set hostip = grains['ip_interfaces']['eth0'][0] %} {% set noofcontainers = range(10) ‰} 2.拉取docker image (docker pull) 使用一个 nodejs demo application 作为image, 我们需要从Docker Hub拉取。 {{ name }}-image: docker.pulled: - name: {{ registryname }}/{{ name }} - tag: {{ tag }} - force: True 3.停止旧的容器 如果有旧的容器在运行我们需要停止: {{ name }}-stop-if-old-{{ no }}: cmd.run: - name: docker stop {{ containerid }}-{{ name }}-{{ no }} - unless: docker inspect --format '{{ .Image }}' {{ containerid }}-{{ name }}-{{ nr }} | grep $(docker images --no-trunc | grep "{{ registryname }}/{{ name }}" | awk '{ print $3 }') - require: - docker: {{ name }}-image 4.去除旧容器 停止以后删除旧容器 {{ name }}-remove-if-old-{{ no }}: cmd.run: - name: docker rm {{ containerid }}-{{ name }}-{{ no }} - unless: docker inspect --format '{{ .Image }}' {{ containerid }}-{{ name }}-{{ nr }} | grep $(docker images --no-trunc | grep "{{ registryname }}/{{ name }}" | awk '{ print $3 }') - require: - cmd: {{ name }}-stop-if-old-{{ no }} 5.启动容器 通过docker run/docker.installed安装新容器,设置主机名 端口和环境变量: {{ name }}-container-{{ no }}: docker.installed: - name: {{ containerid }}-{{ name }}-{{ no }} - hostname: {{ containerid }}-{{ name }}-{{ no }} - image: {{ registryname }}/{{ name }}:{{ tag }} - ports: - "8080/tcp" - environment: - EXECUTER: "forever -f start" - APP: "index.js" - require_in: {{ name }}-{{ no }} - require: - docker: {{ name }}-image 6.运行容器 通过运行docker.running运行容器,这也将端口和主机绑定: {{ name }}-{{ no }}: docker.running: - container: {{ containerid }}-{{ name }}-{{ no }} - port_bindings: "8080/tcp": HostIp: "{{ hostip }}" HostPort: "{{ hostport }}{{ no }}" 完成状态文件和top文件 /srv/salt/containers/applications/node-demo.sls {% set name = 'node-demo' %} {% set registryname = 'jacksoncage' %} {% set tag = salt['pillar.get']('imagetag', "latest") %} {% set containerid = salt['grains.get']('id') %} {% set hostport = '808' %} {% set hostip = grains['ip_interfaces']['eth0'][0] %} {% set noofcontainers = range(5) ‰} {{ name }}-image: docker.pulled: - name: {{ registryname }}/{{ name }} - tag: {{ tag }} - force: True {% for no in noofcontainers %} {{ name }}-stop-if-old-{{ no }}: cmd.run: - name: docker stop {{ containerid }}-{{ name }}-{{ no }} - unless: docker inspect --format '{{ .Image }}' {{ containerid }}-{{ name }}-{{ nr }} | grep $(docker images --no-trunc | grep "{{ registryname }}/{{ name }}" | awk '{ print $3 }') - require: - docker: {{ name }}-image fetch_out_of_band: module.run: - name: docker.stop - opts: 'timeout=20' {{ name }}-remove-if-old-{{ no }}: cmd.run: - name: docker rm {{ containerid }}-{{ name }}-{{ no }} - unless: docker inspect --format '{{ .Image }}' {{ containerid }}-{{ name }}-{{ nr }} | grep $(docker images --no-trunc | grep "{{ registryname }}/{{ name }}" | awk '{ print $3 }') - require: - cmd: {{ name }}-stop-if-old-{{ no }} {{ name }}-container-{{ no }}: docker.installed: - name: {{ containerid }}-{{ name }}-{{ no }} - hostname: {{ containerid }}-{{ name }}-{{ no }} - image: {{ registryname }}/{{ name }}:{{ tag }} - ports: - "8080/tcp" - environment: - EXECUTER: "node" - APP: "index.js" - require_in: {{ name }}-{{ no }} - require: - docker: {{ name }}-image {{ name }}-{{ no }}: docker.running: - container: {{ containerid }}-{{ name }}-{{ no }} - port_bindings: "8080/tcp": HostIp: "{{ hostip }}" HostPort: "{{ hostport }}{{ no }}" {%- endfor %} /srv/salt/top.sls base: 'minion1': - containers.applications.node-demo 部署 完整状态Complete state 能在需要的minions地方执行 salt minion1 state.sls containers.applications.node-demo Salt minion现在运行 node-demo状态文件创建所有容器,然后使用类似haproxy or nginx 等代理将所有运行容器加入到它们配置的hostname.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年08月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档