0%

Docker系统总结

[TOC]

笔记太分散并不好,还是需要系统总结一下,方便后期查阅。

1 Docker的安装和介绍

1.1 Docker简介

Docker是基于go语言实现的云开源项目。

Docker的主要目标是build,ship and run any app,anywhere,也就是说通过对应用程序组件的封装,分发,部署,运行等生命周期的管理。使用户的app(可以是一个web应用程序或者数据库应用等)及其运行环境能够做到一次封装,到处运行

image

Linux容器技术的出现解决了这个问题。而Docker就是基于它的基础上发展过来的。将应用运行到docker容器上面,而Docker容器在任何操作系统上都是一致的,这就是实现跨平台跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

Docker官网:https://www.docker.com/

1.2 Linux环境下安装docker

Docker分为社区版CE和企业版EE。CE版完全足够个人使用,选择stable版本即可。

1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过 uname -r 命令查看你当前的内核版本

1
# uname -r

image-20201217213427007

2.使用 root 权限登录 Centos。确保 yum 包更新到最新。

1
# sudo yum update

3.卸载旧版本(如果安装过旧版本的话)

1
# sudo yum remove docker  docker-common docker-selinux docker-engine

4.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

1
# sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5.设置yum源

1
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

image

6.可以查看所有仓库中所有docker版本,并选择特定版本安装

1
# yum list docker-ce --showduplicates | sort -r

7.安装docker

1
2
# sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版
# sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce

8.启动docker

1
# sudo systemctl start docker

9.设置开机自启动

1
# sudo systemctl enable docker

10.验证安装是否成功(有client和service两部分表示docker安装启动都成功了)

1
# docker version

1.3 配置镜像加速

阿里云界面:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

Docker客户端版本需要大于 1.10.0

可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://26udi78a.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1.4 可能遇到的问题

1.因为之前已经安装过旧版本的docker,在安装的时候报错如下:

1
2
3
4
5
Transaction check error:
file /usr/bin/docker from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64
file /usr/bin/docker-containerd from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64
file /usr/bin/docker-containerd-shim from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64
file /usr/bin/dockerd from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64

2.卸载旧版本的包

1
# sudo yum erase docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64

3.再次安装docker

1
# sudo yum install docker-ce

2.yum安装的时候遇到公钥尚未安装的问题解决

1
在 yum install xxxx 命令之后添加 --nogpgcheck 进行跳过公钥检查安装

或者

导入密钥重新安装Docker

1
rpm --import http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7

2 容器快速上手

Docker上手比较简单,按照命令主要分为

  • 帮助命令
  • 镜像命令
  • 容器命令

image-20210629222231783

2.1 帮助命令

1
2
3
docker version #查看Docker版本
docker info #显示Docker系统信息,包括镜像和容器数
docker --help

2.2 镜像命令

docker images 列出本地主机上的镜像

image-20210629220324007

1
2
3
4
5
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

收起列表

  • 视频:2-1 本章介绍 (01:21)
  • 视频:2-2 认识一下docker命令行 (07:54)
  • 视频:2-3 镜像和容器 (04:26)
  • 视频:2-4 创建我们第一个容器 (10:01)
  • 视频:2-5 命令行小技巧之批量操作 (04:30)
  • 视频:2-6 容器的attached和detached模式 (10:53)
  • 视频:2-7 容器的交互式模式 (12:38)
  • 视频:2-8 windows是如何运行docker engine的 (06:08)
  • 视频:2-9 容器和虚拟机 (14:04)
  • 视频:2-10 创建容器时背后到底发生了什么 (04:15)

3 镜像的创建管理和发布

介绍镜像获取的三大主要方式,初步了解Dockerfile和镜像的构建和分享

收起列表

  • 视频:3-1 镜像的获取方式 (04:23)
  • 视频:3-2 镜像的registry介绍 (06:03)
  • 视频:3-3 镜像的获取查看和删除 (12:22)
  • 视频:3-4 docker镜像的导入导出 (03:05)
  • 视频:3-5 Dockerfile的介绍 (08:08)
  • 视频:3-6 镜像的构建和分享 (13:02)
  • 视频:3-7 通过commit创建镜像 (12:09)
  • 视频:3-8 聊聊scratch这个镜像 (07:39)

4 Dockerfile指南

通过示例结合最全的Dockerfile语法讲解,完全掌握Dockerfile语法和重要的最佳实践

收起列表

  • 视频:4-1 本章介绍 (01:10)
  • 视频:4-2 如何选择基础镜像 (10:15)
  • 视频:4-3 通过RUN执行指令 (08:43)
  • 视频:4-4 文件的复制和目录操作 (12:06)
  • 视频:4-5 构建参数和环境变量 (11:04)
  • 视频:4-6 容器启动命令CMD (13:12)
  • 视频:4-7 容器启动命令ENTRYPOINT (08:31)
  • 视频:4-8 一起构建一个Python Flask镜像 (16:10)
  • 视频:4-9 Dockerfile技巧-合理使用缓存 (08:40)
  • 视频:4-10 Dockerfile技巧——dockerignore (08:05)
  • 视频:4-11 Dockerfile技巧——多阶段构建 (10:25)
  • 视频:4-12 Dockerfile技巧——尽量使用非root用户 (07:25)
  • 视频:4-13 本章总结 (03:36)

5 Docker的存储

数据的持久化如何实现,Volume有哪些类型和使用场景

收起列表

  • 视频:5-1 本章介绍 (04:34)
  • 视频:5-2 数据持久化之Data Volume (17:16)
  • 视频:5-3 Data Volume练习之MySQL (06:57)
  • 视频:5-4 数据持久化之Bind Mount (10:58)
  • 视频:5-5 Bind Mount练习之Docker开发环境(本章未完待续) (12:20)

6 Docker的网络

网络命令空间,端口映射,网络地址转换,路由等概念会在这一章详细的讲解给大家。

7 Docker compose

Docker compose是复杂应用在单机环境下编排的必备工具,本章会通过具体的应用部署演示,覆盖docker compose的基本语法和命令行的使用

8 Docker swarm

作为集群的编排工具,docker swarm虽然不如k8s流行,但是万变不离其宗,掌握其基本原理和使用将大大降低大家学习其它编排工具的难度。

9 Docker vs podman

Podman是docker的最有力竞争者,这一章将带领大家快速入门podman,看看podman和docker有什么异同之处和高下之分。

10 Docker的多架构支持

随着苹果M1芯片的快速发展和普集,arm架构开始进入更多开发者的视野,docker是如何支持多CPU架构的?以及我们如何发布支持多CPU架构的容器镜像呢?这一章将向您解答

11 Git和容器——CI/CD

这一章我们会关注在应用的部署和运维中,在持续集成和持续部署中结合版本管理和容器技术,同时也会快速的介绍一些自动化运维和监控工具。

12 容器安全

安全是个大问题,如何确保在生产环境中安全的使用容器呢?本章会为您解开。

13 Docker常用软件安装

13.1 RabbitMQ安装

RabbitMQ是基于AMQP的一款消息管理系统。AMQP(Advanced Message Queuing Protocol),是一个提供消息服务的应用层标准高级消息队列协议,其中RabbitMQ就是基于这种协议的一种实现。

快速构建

1.docker search选择版本

2.docker pull 下载镜像

3.docker运行

1
docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:版本号

image-20201219141443802

可能出现的问题

Windows环境下浏览器无法访问虚拟机开的rabbitmq服务

安装首先确保RabbitMQ的端口等配置正确,另外开放Linux防火墙端口。如果依旧不能访问web界面,那么可能是RabbitMQ没有开启web管理。

只需要通过rabbitmq-plugins list命令列出插件的启用和禁用状态。然后再修改即可。

解决方法

1.运行RabbitMQ   

1
docker run -d -p 5672:5672 -p 15672:15672 rabbitmq

2.进入RabbitMQ命令界面  

1
docker exec -it rabbitmq /bin/bash

3.开启 

1
rabbitmq-plugins enable rabbitmq_management

13.2 PXC(Percona XtraDB Cluster)集群搭建

常见的MySQL集群方案包括:Replication,Percona XtraDB Cluster(PXC)

MySQL主从复制:https://www.jianshu.com/p/faf0127f1cb2

Replication PXC
数据同步是单向的,master负责写,然后异步复制给slave;如果slave写入数据,不会复制给master。 数据同步时双向的,任何一个mysql节点写入数据,都会同步到集群中其它的节点。
异步复制,从和主无法保证数据的一致性 同步复制,事务在所有集群节点要么同时提交,要么同时不提交

Replication方案适用于日志,博客这样的网站,存储一些价值较低的内容。

而PXC具备强一致性,数据同步是双向的特点,另外PerconaServer是MySQL改进版,性能提升很大。所以这里我选择的是PXC方案搭建Mysql集群。

13.2.1 环境准备

Docker的安装与配置非常简单。
1.安装docker
2.配置docker镜像加速器

13.2.2 PXC集群环境部署

1.下载镜像

1
docker pull docker.io/percona/percona-xtradb-cluster

注意:可以使用docker tag改名,这里我将 docker.io/percona/percona-xtradb-cluster更名为pxc

2.创建内部网络

出于安全考虑,需要给PXC集群实例创建Docker内部网络

这里我搭建集群使用的是5节点,网段可以自己规定

1
2
3
docker network create --subnet=172.10.0.0/24 net1
docker network inspect net1
docker network rm net1

3.创建Docker卷

容器中的PXC节点映射数据目录的解决方法:

1
2
3
4
5
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5

查看docker卷信息:docker inspect v1

4.创建PXC容器

5个PXC容器

1
2
3
4
5
6
7
8
9
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql --privileged --name=node1 --net=net1 --ip 172.10.0.2 pxc 

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --privileged --name=node2 --net=net1 --ip 172.10.0.3 pxc

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.10.0.4 pxc

docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.10.0.5 pxc

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --privileged --name=node5 --net=net1 --ip 172.10.0.6 pxc

13.2.3 验证PCX集群

在数据库中创建5个DB:

image

在DB1中新建test数据库并创建student表:

image-20201102100820614

刷新之后,可以看到DB2,DB3,DB4,DB5全部同步到与DB1一致

image-20201102100858654

13.2.4 数据库负载的配置

数据库负载均衡的必要性:

虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,会暴露负载高,性能差的问题

这里可以使用Haproxy做负载均衡,将请求均匀的分发给每个节点,单节点负载会轻松很多。

1.haproxy的下载

docker pull haproxy

2.创建haproxy配置文件

配置参考:http://zhangge.net/5125.html

/home/soft/haproxy/目录下创建haproxy.cfg文件

haproxy.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon

defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000

#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.10.1.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.10.1.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.10.1.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.10.1.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.10.1.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka

4.实例化haproxy

1
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.10.0.7 haproxy

5.登陆到交互容器里

1
2
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

6.测试

image-20201102120345130

首页展示:

image-20201102120404832