Docker入门与进阶(下)

作者

刘畅

时间

2020-11-12

实验主机配置

系统centos7.5

主机名

ip

配置

应用

harbor-master

172.16.1.71

2核4G/60G

docker、docker-compose、harbor、Grafana、

Prometheus、cAdvisor

harbor-backup

172.16.1.72

2核4G/60G

docker、docker-compose、harbor

docker-client

172.16.1.73

2核4G/60G

docker、docker-compose、cAdvisor、portainer

本文不赘述docker的安装。

目录

1 企业级镜像仓库Harbor 1

1.1
Harbor
概述 1

1.2
Harbor
HTTP搭建与使用 1

1.3
Harbor
HTTPS搭建与使用 3

1.4
Harbor主从复制 6

1.5
Harbor
基本使用 9

1.6
Harbor运维维护 9

2 单机编排利器Docker Compose 9

2.1
Compose是什么 9

2.2
Linux安装Compose 10

2.3
Compose常用选项与命令 10

2.4
docker-compose.yml编排 10

2.5
一键部署LNMP网站平台 11

2.6
一键部署Nginx反向代理Tomcat集群 14

2.7
小结 17

3 Prometheus+Grafana监控Docker主机 17

3.1
监控系统概述 17

3.2
监控系统部署 17

3.3
Grafana展示 19

3.4
监控多Docker主机 20

4 补充 21

4.1
docker图形化界面 21

4.2
grafana图标不出数据的原因 24

1 企业级镜像仓库Harbor

1.1
Harbor 概述

1 Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

官方:https://goharbor.io/

Github:https://github.com/goharbor/harbor

2 Harbor 部署先决条件

(1)
服务器硬件配置

1) 最低要求:CPU2核/内存4G/硬盘40GB

2) 推荐:CPU4核/内存8G/硬盘160GB

(2)
软件

1) Docker CE 17.06版本+

2) Docker Compose 1.18版本+

(3) Harbor安装有2种方式

1) 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小。

2) 离线安装:安装包包含部署的相关镜像,因此安装包比较大,本文采用离线方式安装harbor。

下载docker compose地址

https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64

下载docker harbor离线包地址

https://github.com/goharbor/harbor/releases/download/v2.1.1/harbor-offline-installer-v2.1.1.tgz

1.2
Harbor HTTP搭建与使用

在172.16.1.71节点上操作

1 先安装Docker
Compose

# mv docker-compose-Linux-x86_64
/usr/bin/docker-compose

# chmod +x /usr/bin/docker-compose

2 部署Harbor
HTTP

# tar -xzf
harbor-offline-installer-v2.1.1.tgz

# cd harbor/

# cp -a harbor.yml.tmpl harbor.yml

# vim harbor.yml

hostname: reg.lc.com

# 先注释https相关配置

https:

harbor_admin_password: Harbor12345

# ./prepare

# ./install.sh

# docker-compose ps

3 通过浏览器访问

(1) 修改windows的C:\Windows\System32\drivers\etc\hosts文件添加如下内容

172.16.1.71 reg.lc.com

(2) 在浏览器中输入http://reg.lc.com 进行访问,用户:admin 密码:Harbor12345

4 通过linux主机访问

在172.16.1.73节点上操作

(1) 修改/etc/hosts文件解析

# vim /etc/hosts

172.16.1.71 reg.lc.com

(2) 登录

# docker login reg.lc.com

错误原因:docker
harbor默认使用https方式登录,现在配的docker harbor连接方式为http,所以需要在docker中配置信任该http域名,解决方法如下。

# vim /etc/docker/daemon.json

{

"registry-mirrors":
["https://b1cx9cn7.mirror.aliyuncs.com"],

"insecure-registries":["reg.lc.com"]

}

# systemctl daemon-reload

# systemctl restart docker

# docker login reg.lc.com

1.3
Harbor HTTPS搭建与使用

在172.16.1.71节点上操作,在"2 部署Harbor
HTTP"基础上更新配置

1 使用cfssl工具生成域名为reg.lc.com的自签名服务证书

(1) 下载cfssl工具

# cat cfssl.sh

wget
https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

wget
https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

wget
https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

chmod +x cfssl*

mv cfssl_linux-amd64 /usr/bin/cfssl

mv cfssljson_linux-amd64
/usr/bin/cfssljson

mv cfssl-certinfo_linux-amd64
/usr/bin/cfssl-certinfo

# sh cfssl.sh

(2) 执行certs.sh脚本生成相关证书

# cat certs.sh

cat > ca-config.json <<EOF

{

"signing": {

"default": {

"expiry":
"87600h"

},

"profiles":
{

"server": {

"expiry":
"87600h",

"usages":
[

"signing",

"key
encipherment",

"server
auth",

"client
auth"

]

}

}

}

}

EOF

cat > ca-csr.json <<EOF

{

"CN": "harbor",

"key": {

"algo":
"rsa",

"size":
2048

},

"names": [

{

"C":
"CN",

"L":
"Beijing",

"ST":
"Beijing"

}

]

}

EOF

cfssl gencert -initca ca-csr.json | cfssljson -bare ca
-

cat > reg.lc.com-csr.json <<EOF

{

"CN": "reg.lc.com",

"hosts": [],

"key": {

"algo":
"rsa",

"size": 2048

},

"names": [

{

"C":
"CN",

"L":
"BeiJing",

"ST":
"BeiJing"

}

]

}

EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem
-config=ca-config.json -profile=server reg.lc.com-csr.json
| cfssljson -bare reg.lc.com

# sh certs.sh

生成的证书中reg.lc.com-key.pem和reg.lc.com.pem是我所需要的

# mkdir -p /data/ssl

# cp -a reg.lc.com.pem reg.lc.com-key.pem
/data/ssl/

2 Harbor启用HTTPS

# cd harbor/

# cp -a harbor.yml.tmpl harbor.yml

# vim harbor.yml

hostname: reg.lc.com

https:

# https port for harbor, default is
443

port: 443

# The path of cert and key files for
nginx

certificate:
/data/ssl/reg.lc.com.pem

private_key:
/data/ssl/reg.lc.com-key.pem

harbor_admin_password: Harbor12345

3 重新配置并部署Harbor

# docker-compose down

down: 停止并删除容器,网络

harbor容器数据持久化目录为/data,日志持久化目录为/var/log/harbor,

删除harbor容器不会删除harbor中的数据。

# ./prepare

# docker-compose
up -d

up:创建和启动容器

-d:将容器放到后台运行

4浏览器访问查看自签证书信息

5 linux主机登录docker harbor

在172.16.1.73节点上操作

# docker login reg.lc.com

解决办法:

# mkdir /etc/docker/certs.d/reg.lc.com
-p

# scp -rp root@172.16.1.71:/data/ssl/reg.lc.com.pem
/etc/docker/certs.d/reg.lc.com/reg.lc.com.crt

提示:

出现上面报错的原因为证书为自签证书,如果是正规机构颁发的证书不会出现如上错误。

1.4
Harbor主从复制

1 harbor主从复制架构

2、在172.16.1.72节点上部署从harbor

# mv docker-compose-Linux-x86_64
/usr/bin/docker-compose

# chmod +x /usr/bin/docker-compose

# tar -xzf
harbor-offline-installer-v2.1.1.tgz

# cd harbor/

# cp -a harbor.yml.tmpl harbor.yml

# vim harbor.yml

hostname: 172.16.1.72

# 注释掉https证书相关的内容

#https:

# https port for harbor, default is
443

#  port: 443

# The path of cert and key files for
nginx

#  certificate:
/your/certificate/path

#  private_key:
/your/private/key/path

harbor_admin_password: Harbor12345

# ./prepare

# ./install.sh

3、在172.16.1.71节点上创建主从复制

(1)
系统管理—>仓库管理—>新建目标

(2)
系统管理—>仓库管理—>新建规则

(3)
测试

1) 当在172.16.1.71主节点上提交镜像后,172.16.1.72从节点会被同步到镜像。

2) harbor镜像同步只会同步镜像。

3) 比如一个项目和镜像只在主节点上存在,当启动复制规则后,会把项目名和镜像同步到

从节点,项目下的用户不会被同步,当主节点删除该项目,从节点的镜像会被删除,但项

目名会被保留。

1.5
Harbor 基本使用

以library项目为例

1 在项目中标记镜像

docker tag SOURCE_IMAGE[:TAG]
reg.lc.com/library/REPOSITORY[:TAG]

2 推送镜像到当前项目

docker push
reg.lc.com/library/REPOSITORY[:TAG]

1.6
Harbor运维维护

1 harbor相关容器及服务

容器

功能

harbor-core

配置管理中心

harbor-db PG

数据库

harbor-jobservice

负责镜像复制

harbor-log

记录操作日志

harbor-portal Web

管理页面和API

nginx

前端代理,负责前端页面和镜像上传/下载转发

redis

会话

registryctl

镜像存储

容器数据持久化目录:/data

日志文件目录:/var/log/harbor

数据库做好定期备份。

docker-compose命令引用的配置文件默认是当前目录下的docker-compose.yml文件。

2 单机编排利器Docker
Compose

在172.16.1.73节点上操作

2.1
Compose是什么

1 Compose是用于定义和运行多容器的工具。

2 通过Compose可以使用YAML文件来配置容器。然后,使用一个命令就可以从配置中创建并

启动所有服务。

3 使用Compose大致为三步

(1)
定义Dockerfile,以便可以在任意环境运行

(2)
定义应用程序启动配置文件docker-compose.yml

(3)
docker-compose启动并管理整个应用程序生命周期

4 官方文档

https://docs.docker.com/compose/

2.2
Linux安装Compose

1 下载二进制文件

curl -L
https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
-o /usr/bin/docker-compose

2 添加可执行权限:

chmod +x /usr/bin/docker-compose

2.3
Compose常用选项与命令

1 常用选项

(1)
-f,--file
指定yaml文件,默认docker-compose.yml

1) Docker-compose读取文件的目录是根据指定"-f docker-compose.yml"所在的目录确定的。

2) 如果编写的文件名就是docker-compose.yml,docker-compose命令操作时可以不指定。

(2) -p,--project-name 指定项目名称,默认是当前目录

2 命令

build

重新构建服务

ps

列出所有容器(包括在线或不在线的)

up

创建和启动容器

exec

在容器里执行命令

scale

指定一个服务容器启动数量

down

删除容器、网络、数据卷和镜像

stop/start/restart

停止/启动/重启服务

2.4
docker-compose.yml编排

1 示例

https://docs.docker.com/compose/compose-file/

2 常用yml参数

2.5
一键部署LNMP网站平台

1 环境设置

[root@docker-client ~]# cd
/root/compose_lnmp/

[root@docker-client compose_lnmp]# tree -L
2

# docker-compose配置文件内容

2 构建镜像

[root@docker-client compose_lnmp]# docker-compose
build

3 创建容器并在后台运行

[root@docker-client compose_lnmp]# docker-compose up
-d

4 查看服务

[root@docker-client compose_lnmp]# docker-compose
ps

5 访问wordpress网站

http://172.16.1.73/wordpress/

因为所有的docker服务都在同一个docker网络中,在不暴露docker服务端口的情况下

可以通过docker容器的名称访问到docker容器内部服务的端口号。

2.6
一键部署Nginx反向代理Tomcat集群

1 环境设置

[root@docker-client ~]# cd
compose_lnmt/

[root@docker-client compose_lnmt]# tree -L
2

# docker-compose.yml文件内容

2 构建镜像

[root@docker-client compose_lnmt]# docker-compose
build

3 创建容器并在后台运行

[root@docker-client compose_lnmt]# docker-compose up
-d

4 查看服务

[root@docker-client compose_lnmt]# docker-compose
ps

5 访问网站

http://172.16.1.73/

6 查看docker网络信息

2.7
小结

以上通过docker-compose安装的lnmp、lnmt服务,执行docker-compose
down命令后不会删除挂

载卷中存储的数据,执行docker-compose up
-d命令即可在保留原来数据的情况下将容器服务拉起。

3 Prometheus+Grafana监控Docker主机

3.1
监控系统概述

1 cAdvisor(Container Advisor)

用于收集正在运行的容器资源使用和性能信息。

https://github.com/google/cadvisor

2 Prometheus(普罗米修斯)

容器监控系统。

https://prometheus.io

https://github.com/prometheus

3 Grafana

是一个开源的度量分析和可视化系统。

https://grafana.com/grafana

4 数据采集顺序

3.2
监控系统部署

1 Docker部署cAdvisor

在172.16.1.71、73节点上操作

# docker run -d \

--volume=/:/rootfs:ro \

--volume=/var/run:/var/run:ro \

--volume=/sys:/sys:ro \

--volume=/var/lib/docker/:/var/lib/docker:ro
\

--volume=/dev/disk/:/dev/disk:ro \

--publish=8080:8080 \

--detach=true \

--name=cadvisor \

--restart=always \

google/cadvisor:latest

# cadvisor访问url地址

http://172.16.1.73:8080/containers/

http://172.16.1.73:8080/metrics

2 Docker部署Grafana

在172.16.1.71节点上操作

# mkdir -p /opt/grafana/

# chown -R 472.472 /opt/grafana/

# docker run -d \

--name grafana7.1.5 \

-p 3000:3000 \

-v /opt/grafana:/var/lib/grafana \

--restart=always \

grafana/grafana:7.1.5

# 数据目录/var/lib/grafana

# grafana访问url地址

http://172.16.1.71:3000

grafana初次访问的用户名和密码都是"admin",输入初始密码后会让你修改

密码,我这里密码设置为"123456"

3 Docker部署Prometheus

在172.16.1.71节点上操作

# mkdir -p /opt/prometheus/

# 上传prometheus.yml文件到/opt/prometheus/目录,添加监控主机如下

# docker run -d \

--name prometheus \

-p 9090:9090 \

-v /opt/prometheus:/etc/prometheus \

--restart=always \

prom/prometheus

# 配置文件目录/etc/prometheus

# Prometheus访问url地址

http://172.16.1.71:9090/

3.3
Grafana展示

1 添加prometheus库

2 添加模版

https://grafana.com/dashboards

ID:193

3 会看到一个监控172.16.1.71、72上所有容器(cpu、内存、网络)的dashboard。

3.4
监控多Docker主机

1 添加选择多节点按钮

label_values(up,instance)

2 图表增加筛选条件

' ,instance="$Node" '

4 补充

4.1
docker图形化界面

在172.16.1.73节点上操作

1 说明

Docker 图形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介绍Portainer。Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

官方网站:https://portainer.io/

官方文档:https://portainer.readthedocs.io/

演示网址:http://demo.portainer.io
账号admin 密码
tryportainer

2 安装

# docker run -d \

--name portainerUI \

-p 9000:9000 \

-v /var/run/docker.sock:/var/run/docker.sock
\

-v /opt/portainer_data:/data \

portainer/portainer

# 数据目录/data

# 访问portainer

http://172.16.1.73:9000/

3 设置一个密码即可,点击创建用户

4 我们搭建的是单机版,直接选择Local ,点击连接

5 现在就可以使用了,点击Local进入仪表盘主页面

6 容器页面

7 portainer
管理远程docker主机

(1)
在172.16.1.72节点上开启DockerAPI

# vim
/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H
unix:///var/run/docker.sock

# systemctl daemon-reload

# systemctl restart docker

# netstat -tulp | grep docker

tcp6       0      0 [::]:2375               [::]:*                  LISTEN      2132/dockerd

(2)
添加远程docker主机

(3)
添加成功

4.2
grafana图标不出数据的原因

1 时间没有同步

2 promql有问题,可能是版本不兼容

3 prometheus里没有数据

Docker入门与进阶(下)的更多相关文章

  1. Docker入门与进阶(上)

    Docker入门与进阶(上) 作者 刘畅 时间 2020-10-17 目录 1 Docker核心概述与安装 1 1.1 为什么要用容器 1 1.2 docker是什么 1 1.3 docker设计目标 ...

  2. 这是一次 docker 入门实践

    前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...

  3. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  4. Docker入门之七Dockerfile

    Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像.首先我们可以先看一个dockerfile是什么样子.这里可以有一个网站不错:http://dockerfile.github ...

  5. Docker入门学习总结

    1. 什么是Docker Docker是一种虚拟化技术,其在容器的基础上进一步封装了文件系统.网络互联.进程隔离等等,从而极大地简化了容器的创建和维护.Docker使用 Google 公司推出的 Go ...

  6. 推荐 10 本 Go 经典书籍,从入门到进阶(含下载方式)

    书单一共包含 10 本书,分为入门 5 本,进阶 5 本.我读过其中 7 本,另外 3 本虽然没读过,但也是网上推荐比较多的. 虽然分了入门和进阶,但是很多书中这两部分内容是都包含了的.大家看的时候可 ...

  7. 第三章 Docker 入门

    第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...

  8. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  9. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

随机推荐

  1. Envoy:主动健康监测

    实验文件 docker-compose version: '3' services: envoy: image: envoyproxy/envoy-alpine:v1.15-latest enviro ...

  2. [Java] 数据分析 -- 大数据

    单词计数 需求:输入小说文本,输出每个单词出现的次数 实现:分map.combine.reduce三个阶段实现 1 /* Data Analysis with Java 2 * John R. Hub ...

  3. 阿里云上安装 OpenStack 是什么体验

    阿里云上跑火车(安装 OpenStack Train 版本),猜猜最终花了多少钱? 前言 前面给大家提供了用虚拟机安装 OpenStack 的镜像,虽然已经很简便了,但还是略显笨重.一来镜像文件比较大 ...

  4. CentOS7中下载RPM及其所有的依赖包

    CentOS7中下载RPM及其所有的依赖包 转载beeworkshop 最后发布于2019-09-28 07:43:40 阅读数 1096  收藏 展开 利用 Downloadonly 插件下载 RP ...

  5. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

  6. 进程-信号相关 函数-(转自wblyuyang)

    Linux 中的进程: 程序时一个预定义的指令序列,用来完成一个特定的任务. C 编译器可以把每个源文件翻译成一个目标文件,链接器将所有的目标文件与一些必要的库链接在一起,产生一个可执行文件.当程序被 ...

  7. Docker无法正常启动的原因及解决办法

    一.Docker启动异常表现: 1.状态反复restaring,用命令查看 $docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS ...

  8. Jquery 常用方法及实例(Day_15)

    想要做一件事,永远都不要怕晚.只要你开始做了,就不晚. 而若是你不开始,仅仅停留在思考.犹豫甚至焦虑的状态,那就永远都是零. mouseover() / mouserout() 当鼠标进入 / 离开某 ...

  9. Scrapy中的错误

    TabError: Inconsistent use of tabs and spaces in indentation 需要将  .py  文件中的使用 tab 做的空格符删掉,打成空格符.任何一个 ...

  10. java中的Class.forName的作用

    Class.forName有什么作用 Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和ne ...