Browse Tag: ops

Consul 入门笔记

Consul [ˈkɑ:nsl] 是一个分布式的服务发现和配置管理工具,本文是根据consul 入门指南 整理的笔记。

1. 安装

系统是三台虚拟机:

  • CentOS release 6.8
  • CentOS release 7
  • Ubuntu 16.04 LTS

前往 官网下载地址 下载相应系统最新的二进制包,复制consul_VERSION_linux_amd64.zip 到3个节点的 consul 目录下。

在3台虚拟机中按相同步骤安装 consul

2. 开发模式

consul 开发者模式,可以快速开启单节点的 consul服务,具有完整功能,方便开发测试。

2.1 启动开发模式

开发模式命令:

consul members 命令查看当前集群的节点情况

通过HTTP API 查看节点信息

2.2 服务注册

服务可以通过配置文件注册,也可以通过HTTP API 添加。这里以配置文件定义服务:

如果需要定义多个服务,添加多个服务配置文件即可

2.3 服务发现

当定义服务并且重启consul 代理后,就可以通过HTTP API 查询服务信息。

3. Consul 集群

consul 是一个CS 模式的软件,生产环境下一个集群中建议准备3~5个节点运行服务模式的consul,其他节点运行客户端模式。

3.1 启动server 模式

  • -server 以服务模式运行
  • -node 节点名称
  • -bind 指定监听地址,用于多网卡服务器
  • -bootstrap-expect 额外的服务模式节点数量
  • config-dir 配置文件目录

3.2 启动client 模式启动

在集群中其他节点上以客户端模式运行consul,注意更改绑定IP 和节点名。

3.3 加入集群

客户端模式的consul 需要加入一个服务端节点,才能同步服务信息。

加入集群:

查看集群节点:

客户端节点服务发现功能

参考

OpenResty 环境搭建

OpenResty 是一个基于Nginx 与Lua 的高性能Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。本文是根据 openresty 官网 指南搭建OpenResty 服务的笔记。

1 安装 OpenResty

系统 Ubuntu 16.04 LTS

1.1 安装依赖库

1.2. 编译安装 OpenResty

下载地址 https://openresty.org/en/download.html

编译安装命令

VERSION 是下载的openresty 具体版本号。

make install 后应用在 /usr/local/openresty/bin/openresty 目录。

2. 启动服务

准备项目目录

2.1 配置 nginx.conf

OpenResty 是Nginx 与Lua 的封装,最终用运行的还是nginx。

~/work/conf/nginx.conf

2.2 启动 nginx

启动 nginx

如果觉得每次使用/usr/local/openresty/nginx/sbin/nginx 不方便,可以设置环境变量:

~/.bashrc

执行 source ~/.bashrc 使配置生效。

2.3 测试 nginx

测试条件1: 基于 lua 模块响应文本

测试条件2: 打印参数

注意 因为我们手动指定了nginx 的配置文件和执行临时目录,所以重启nginx 时,也需要带上相关配置。重启命令如下:

参考

Docker 学习笔记

  • Docker
    • Docker
  • Docker从入门到实战
    • Docker简介
    • 基本概念
    • 安装
    • 镜像
    • 容器
    • 仓库
    • 数据管理
    • 网络
    • 高级网络配置
    • 实战
    • 安全
    • Dockerfile
    • 底层实现
    • Docker Compose
    • Fig
    • 命令查询
    • 仓库介绍
    • 资源

Docker

《Docker从入门到实战》

Docker

使用阿里云镜像

打包应用及其依赖,并部署

docker build -t registry_url/namespace/csphere/centos:7.1

Docker从入门到实战

github

Docker简介

2013年,dotCloud开源项目

目标:实现轻量级的操作系统虚拟化解决方案

基础:Linux 容器(LXC)

特点

  • 启动快速,资源利用率高
  • 更快速的交付部署
  • 更高效的虚拟化
  • 迁移和扩展
  • 简单管理

基本概念

镜像 Image

镜像是只读模板,用来创建 Docker 容器

容器 Container

从镜像创建的运行实例,用来运行应用且每个容器相互隔离。

容器可以看做一个简易版的 Linux 和运行其中的应用程序。

仓库 Repository

仓库:集中存放镜像文件的场所,分为公开仓库和私有仓库

仓库注册服务器:包含多个仓库(包含多个镜像(有不同的标签))

安装

docker installation

使用自带包安装

更新源安装

镜像

docker pull 从仓库获取所需镜像

sudo docker pull ubuntu:12.04

从其他仓库下载需要的镜像

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

创建容器,并在其中运行应用
sudo docker run -t -i ubuntu:12.04 /bin/bash

列出本地镜像
docker images

创建镜像

通过仓库获取镜像或利用本地文件系统创建

修改已有镜像

  1. 启动已有镜像
  2. 在容器中添加应用
  3. docker commit提交更新后的副本

sudo docker commit -m "Add Git" -a "xugang" ed5c006670da dev/ubuntu:1.0

sudo docker commit -m "提交说明信息" -a "指定用户信息" 创建镜像的容器ID 目标镜像的仓库名和tag信息

创建成功返回镜像ID

启动修改后的镜像 sudo docker run -i -t dev/ubuntu:1.0 /bin/bash

Dockerfile创建镜像

创建Dockerfile 文件

Dockerfile基本语法

  • # 注释
  • FROM 指定基础镜像
  • MAINTAINER 维护者信息
  • RUN 创建中运行的指令
  • ADD 复制本地文件到镜像
  • EXPOSE 向外部开放端口
  • CMD 描述容器启动后运行的程序
  • VOLUME 挂载目录

docker build -t="devevn:v1" ./Dockerfile 生成镜像

-t 添加 tag

修改镜像标签

docker docker tag 47a1d69e70f8 dev/ubuntu:v1

本地导入
导入openvz模板文件

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04

上传镜像
将创建的镜像上传到仓库中进行共享

sudo docker push dev/ubuntu

保存于载入镜像

导入镜像到本地文件

sudo docker save -o ubuntu.tar.gz ubuntu:14.04

载入本地文件到镜像
sudo docker load --input ubuntu.tar.gz


sudo docker load < ubuntu.tar.gz

移除镜像

  • docker rmi 移除镜像
  • docker rm 移除容器

镜像原理

Union FS 将不同的层结合到一个镜像中,并且只读和可写分支联合到一起,从而实现在不变的镜像基础上允许用户进行写操作。

容器

容器:独立运行的一个或一组应用,以及他们的运行态环境

虚拟机:模拟运行的一整套操作系统

启动容器

新建并启动

docker run

Docker run 的后台操作
– 检查镜像存在
– 利用镜像创建并启动容器
– 分配文件系统,挂在可写层
– 宿主主机与容器桥接
– 配置ip 地址给容器
– 执行应用程序
– 执行完毕后容器终止

docker run -t -i ubuntu:14.04 /bin/bash

  • -t 分配伪终端
  • -i 打开容器标准输入

重新启动终止状态容器

docker start

容器的核心为所执行的应用程序,所需要的资源都是应用程序所必需的。除此之外,并没有要其他资源

守护态运行

sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep done

docker ps 查看容器信息
docker logs 获取容器输出信息

终止容器

  • docker stop 终止运行中的容器
  • docker ps -a 查看终止状态
  • docker start 启动
  • docker restart 重启

进入后台容器

docker attach containername

使用nsenter 访问另一个进程的名字空间

使用 .bashrc_docker 添加环境变量和短指令

导出和导入容器

docker export containerid > ubuntu.tar

cat ubuntu.tar | docker import - test/ubuntu:v1.0

删除容器

docker rm containername

仓库

仓库:集中存放镜像的地方

注册服务器:管理仓库的服务器

dl.dockerpool.com/ubuntu

注册服务器/仓库

登录 docker login

注册信息记录在 ~/.docker/config.json

基本操作

  • docker search 查找仓库中的镜像
  • docker pull 下载镜像

docker search -s N 仅显示评价为N 星以上的镜像

自动创建

允许用户通过Docker Hub 指定跟踪 Dockerfile进行创建,方便经常升级镜像内程序

  1. 创建并登录Docker Hub
  2. 绑定Dockerfile 阿里云hub 可演示
  3. 创建

私有仓库

docker-registry 官方提供的用于构建私有镜像仓库的镜像容器

sudo docker run -d -p 500:5000 registry

可以使用参数指定私有仓库和配置文件位置。

使用 docker tag标记镜像后,使用docker push将他推送到仓库。

配置文件

Registry提供了一些仓库模板,用户可以直接使用它们进行开发和生产部署

数据管理

数据卷 (Data volumes)

数据卷容器 (Data volume containers)

数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

-v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷

创建数据卷

$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py

创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录

挂载主机目录

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

挂载主机文件

$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

数据卷容器

数据卷容器: 专门用来提供数据卷供其它容器挂载,用于实现在容器之间持续更新的数据的共享

创建数据卷容器

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

–volumes-from

数据卷容器删除

在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器

备份,恢复,迁移数据卷

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

网络

外部访问容器

-P Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端

-p 指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器

格式 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  • 映射所有接口地址 $ sudo docker run -d -p 5000:5000 training/webapp python app.py
  • 映射到指定地址的指定端口 $ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.p
  • 映射到指定地址的任意端口 $ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

查看映射端口配置 $ docker port nostalgic_morse 5000

绑定多个端口 $ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

容器互联

容器的连接(linking):在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息

容器命名

$ sudo docker run -d -P --name web training/webapp python app.py

--name 用于容器命名

docker inspect 查看容器名字

$ sudo docker inspect -f "name" aed84ee21bde

容器互联

--link 容器之间交互

--link name:alias name 是要链接的容器的名称,alias 是这个连接的别名

容器之间的隧道链接,不用映射端口到宿主主机上,从而避免了暴露数据库端口到外部网络

Docker 公开容器链接信息

  • 环境变量
  • 更新 /etc/hosts 文件

高级网络配置

当Docker 启动时,会在主机上创建一个 docker0 虚拟网桥(实际上是Linux 的一个bridge)它会在挂载到它的网口之间进行转发

DNS配置

利用虚拟文件来挂载到容器3 个相关配置文件,可以自定义配置容器的主机名和 DNS 配置

  • /etc/hostname
  • /etc/hosts
  • /etc/resolv.conf

容器访问控制

通过iptables防火墙进行管理和实现

端口映射实现

默认容器可以访问外部网络的连接

  • 容器访问外部实现: 容器源地址被NAT成本地系统的IP地址
  • 外部访问容器实现: 通过 -p 或 -P 参数来启用

docker0 网桥

Docker 服务创建 docker0 网桥,在内核层连通其他的物理或虚拟网卡,从而就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口的 IP 地址和子网掩码,创建新容器的时候,Docker 从可用的地址段中选择空闲的 IP 地址分配给容器的 eth0 端口。

本地主机上 docker0 接口的 IP 则作为所有容器的默认网关

工具

playground Docker容器管理python库

实战

Supervisor 管理进程

安装 supervisor

supervisor配置启动两个进程

启动容器,使用多个 -p 来映射多个端口,这样同时访问 ssh 和 apache 服务

$ sudo docker run -p 22 -p 80 -t -i test/supervisord

多台物理主机容器互联

Docker 使用桥接网卡桥接本机所有的容器网卡。通过每个物理机网桥桥接到指定的网卡上,可以将多个物理主机的容器组到一个物理网络中

标准化开发测试和生产环境

  • 架构师搭建标准的容器环境供项目组和测试部门使用
  • 开发工程师可以拥有自己单独的容器,通过 docker run -v 将用户的 home 目录映射到容器中。
  • 提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用 -v 加载测试部门的 home 目录启动即可。
  • 这样,在公司内部的开发、测试基本就统一了
  • 测试部门发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中

安全

内核名字空间

Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合。

名字空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。

控制组

控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。

它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。

服务端防护

运行一个容器或应用程序的核心是通过 Docker 服务端。Docker 服务的运行目前需要 root 权限,因此其安全性十分关键。

内核能力机制

能力机制(Capability)是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制。

总体来看,Docker 容器还是十分安全的,特别是在容器内不使用 root 权限来运行进程的话。

另外,用户可以使用现有工具,比如 Apparmor, SELinux, GRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。

Dockerfile

基本结构

基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

指令

创建镜像

docker build [选项] 路径 读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像

底层实现

Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)

名字空间

名字空间是 Linux 内核特性,运行在每个名字空间的应用都像是在独立的操作系统中运行,保证容器之间彼此互不影响

控制组

控制组(cgroups)是 Linux 内核特性,主要用来对共享资源进行隔离、限制、审计等。

Docker Compose

defining and running complex applications with Docker

在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目)

https://github.com/docker/compose

Fig

用于快速搭建关联环境

命令查询

仓库介绍

常用仓库使用

资源

  • 1
  • 2