Alan Hou的个人博客

CI/CD之Docker容器DevOps学习笔记及常见问题

CI/CD之Docker容器DevOps学习笔记及常见问题

安装

Mac

下载并安装即可:https://download.docker.com/mac/stable/Docker.dmg

Mac/Windows下安装虚机的小技巧:Vagrant-首先要安装VirtualBox,然后在Vagrant下载页面进行软件的下载

搜索相关操作系统的Vagrantfile:https://app.vagrantup.com/boxes/search,找到相应文件后创建一个名为Vagrantfile的文件或直接根据命令初始化,再使用vagrant up进行安装

以CentOS安装为例:

启动 Vagrant 自动安装 Docker,修改 Vagrantfile 末尾为

Docker Machine

Windows 和 Mac 安装时会默认带有 Docker Machine, Linux 下安装参见:https://github.com/docker/machine/releases/

此外还可通过 Docker Playground 来进行测试,但经测试国内速度较慢且经常会空间不足无法创建,以上方法中推荐 Vagrant,灵活性较 Docker Machine 更强。

Docker 命令

Docker的镜像和容器

Docker Engine

底层技术支持

 

Docker 镜像

什么是 Image?



什么是 Container?

Dockerfile

Docker 官方 Image 文件:https://github.com/docker-library
Docker 官方文档:https://docs.docker.com/engine/reference/builder/

Docker镜像的发布

https://hub.docker.com
首先注册用户
方法一:进入服务器执行

方法二(推荐)Create Automated Build,关联 GitHub,会自动根据 Dockerfile 自动生成镜像
通过registry 搭建自己的私有 Docker Registry

默认 push 私有服务器不被信任(Get https://192.168.1.6:5000/v2/: http: server gave HTTP response to HTTPS client)

Docker Registry Api 可用于查看验证 push 是否成功,如通过 http://your.ip.address:5000/v2/_catalog查看仓库,得到如下结果:

示例文件(制作基于 Flask Hello World 程序的镜像)

示例文件2(带参数执行的 Docker Image)

Docker的网络

网络是基于数据包的通信方式,网络的分层

Ping(ICMP协议)用于验证 IP 的可达性(防火墙可能会禁止 Ping 操作);telnet 用于检查服务的可用性(telnet ip.addr port)

Network Namespace 的小测试

Docker 默认网络Bridge

容器网络 none & host

# 更复杂的 Docker 测试

Overlay 网络和多机容器间通信

Docker的持久化存储和数据共享

Docker 持久化数据的方案

以下为本地文件系统持久化的两种操作方法:

Data Volume

可通过 Dockerfile中的 VOLUME进行指定,如 MySQL的官方 Dockerfile 中使用VOLUME /var/lib/mysql

Bind Mounting

本地文件和容器之前的一个映射关系(/home/aaa 为本地,可使用$(pwd)映射本地目录)

Docker Compose多容器部署

安装部署 WordPress

Docker Compose是一个可以通过一个 yml 文件定义多容器 Docker应用的工具,默认名称 docker-compose.yml
services:一个 service 代表一个 container,启动类似 docker run

Windows, Mac 默认已安装 Docker Compose,Linux

以上述 WordPress 部署为例

docker-compose.yml

执行

其它命令

水平扩展和负载均衡

容器编排Docker Swarm



基于上述Docker Swarm 集群部署 WordPress

此时便完成了 WordPress 的部署,我们会发现通过所有节点的 IP 均可访问该站点

集群服务器间通信 Routing Mesh测试

Routing Mesh两种体现

Ingress 查看相关命令

Docker Stack部署 WordPress

Docker Secret Management

上面的 docker-compose.yml 中包含数据库密码等敏感信息,类似的信息有:用户名密码、SSH Key、TLS认证和任何不想让其它人看到的数据。对于这类似信息我们需要通过加密的方式进行存储同时 Service 还可以获取

Service 更新

DevOps初体验—Docker Cloud和Docker企业版

CaaS(Container-as-a-Service)

Docker Cloud:提供容器的管理、编排、部署的托管服务

主要模块:关联云服务商、添加节点行为、创建服务、创建 Stack、Image 管理

企业版安装

Docker Store 中申请30天试用,

Docker EE安装方法参见文档(以 CentOS为例)

安装 UCP

注:测试安装时发现版本仅为17.06.2,当前新版的 UCP 需要18以上的企业版,因而选择低版本兼容的 UCP

UCP(Universal Control Plane) 相当于一个网页版的 Swarm,安装完成后可通过 https://<node-ip-address&gt;:443,根据安装时设置的用户名密码登录并上传后台下载的证书

点击 Nodes>Add Node,在 worker 节点服务器上执行生成的docker swarm join 代码段

DTR安装

admin>Admin Settings>Docker Trusted Registry,选择 DTR EXTERNAL URL 和UCP NODE,勾选Disable TLS Verification For UCP,根据生成的docker run -it –rm docker/dtr install…命令在对应的主机上运行
以创建名为 demo 的 Repository 为例:

此外在 System>Security中 Enable Sanning 用于开启对镜像的安全扫描功能,此时即可对仓库中的镜像进行安全扫描:

容器编排Kubernetes

Minikube

使用 minikube 进行安装单节点 K8S集群

K8S最小调度单位 Pod,一个 Pod 共享一个 Namespace

Tectonic

使用Tectonic 搭建多节点集群

kubectl expose命令会给 Pod 创建 Service 供外部访问,Service 主要有三种类型:ClusterIP, NodePort, 外部的LoadBalancer(kubectl expose 通过–type 指定); 也可以使用 DNS,但需要 DNS 的 add-on

容器的的运维和监控

Weave Scope

heapster

Horizontal Pod Autoscaler Walkthrough

日志采集展示

ELK Stack(ElasticSearch+Logstash+Kibana)

本地搭建集群:kubeadm

相应 yml 文件(替换成对应版本):fluentd-elastisearch

集群监控方案(Pull 数据):https://prometheus.io/

Docker+DevOps实战—过程和工具

基本流程参见容器的的运维和监控部分的图片

安装 GitLab,参见Jenkins+Ansible+GitLab自动化部署三剑客

GitLab CI 服务器搭建

Settings>Repository>Protected Branches可设置禁止 master 分支的 push 行为

Repository>Branches 创建新分支(如 dev)

Settings>General>Merge Request 可进行相关限制

监控方案:cAdvisor + InfluxDB + Grafana

监控方案:Prometheus + Grafana

常见问题

1、Error restarting cluster: restarting kube-proxy: waiting for kube-proxy to be up for configmap update: timed out waiting for the condition

2、容器状态为 DEAD 无法删除

3、镜像直推另一台主机

4、镜像日志未彻底删除

5、Docker中Nginx的 Gzip 开启问题

使用 Docker的Nginx 镜像会发现在开启了 gzip后实际并未生效,而对容器查看发现确实包含了--with-http_gzip_static_module,这就有些让人不解了,后来发现需设置gzip_http_version 1.0;才会生效

一些测试命令

 

退出移动版