Docker的基本组成:
镜像(image):一个只读的模板,镜像可以用于创建docker容器,一个镜像可以创建多个容器;相当于一个root文件系统。
容器(container):容器是用镜像创建的运行实例;docker利用容器独立运行一个或一组应用,应用程序或服务运行在容器里面,类似于一个虚拟化的运行环境(每个容器都是相互隔离 且保证安全的平台)。
仓库(repository):集中存放镜像的地方(private和public)。
Docker运行的基本流程:
Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。
1.用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者;
2.Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求;
3.Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在;
4.Job的运行过程中,当需要使用容器镜像时,则从Docker Register中下载镜像,并通过镜像管理驱动Graph Driver 将下载的镜像以Graph的形式存储;
5.当需要Docker创建网络环境时,通过网络管理驱动Network Driver创建并配置Docker容器网络环境;
6.当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec Driver来完成;
7.Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来实现具体对容器进行的操作。
CentOs7安装Docker:
安装步骤:
1. 安装yum-utils包
yum -y install yum-utils
2.安装镜像仓库(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.重建yum下载索引
yum makecache fast
4.安装docker
yum -y install docker-ce docker-ce-cli containerd.io
5.启动docker
systemctl start docker
6.永远的HelloWorld
docker run HelloWorld
阿里云镜像加速:
Docker常用命令:
1.帮助启动类命令
systemctl start/restart/stop/enable docker
docker info #查看概要信息
docker --help #总体帮助文档
docker 具体命令 --help #命令帮助文档
2.镜像命令
docker images #列出所有镜像文件
-a 列出所有镜像
-q只显示镜像id
REPOSITORY:表示镜像的仓库源
TAG:表示镜像的标签版本号
MAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
docker search 镜像名 --limit N 显示前N个镜像
docker pull 镜像名 #下载镜像
docker system df #查看镜像/容器/数据卷所占的空间
docker rmi 镜像名/镜像id # 删除镜像 -f 强制删除 (可以删除多个镜像)
docker rmi -f $(docker images -qa) #删除所有镜像
虚悬镜像: 仓库名和标签都是null的镜像
docker run -it 容器名 #启动交互式容器
-i:以交互模式运行容器 通常与-t同时使用
-t:为容器分配一个伪输入终端 通常与-i同时使用
-P 随机端口映射
-p 指定端口映射
-name "名称" #为容器指定一个新名称
-d #后台交互式启动
docker logs 容器id #查看容器日志
docker ps #查看当前正在运行的容器
docker ps -a #查看所有运行记录
docker ps -n N #查看前N条记录
docker inspect 容器id #查看容器内部细节
docker exec -it 容器名 #重新进入容器实例 用exit退出后 容器不会停止//推荐
docker attach -it 容器名 #重新进入容器实例 与上相反
docker cp 容器名:文件路径 目的主机路径
docker export 容器id 文件名.tar #导出容器
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 #导入容器
#提交到本地镜像
docker commit -m="镜像描述" -a="作者" 容器id 镜像用户/镜像名:镜像版本号
#本地镜像发布到阿里云
见阿里云
ctrl+p+q退出
Docker私服仓库:
#运行私有库
docker run -d -p 5000:5000 -v /aqing/myregistry/:/tmp/registry --privileged=true registry
#默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便宿主机联调
#模拟get请求 查看私有库里面的内容
curl -XGET http://192.168.142.130:5000/v2/_catalog
#将镜像修改成符合私服规范的tag
docker tag wbu/ifconfig:1.2 192.168.142.130:5000/wbu/ifconfig:1.2
#修改配置文件使之支持http
vim /etc/docker/daemon.json
#添加
"insecure-registries":["192.168.142.130:5000"]
#推送镜像到私有库
docker push 192.168.142.130:5000/wbu/ifconfig:1.2
#从私有库拉取镜像
docker pull 192.168.142.130:5000/wbu/ifconfig:1.2
容器数据卷:
推荐:--privileged=true 扩大容器权限解决挂载目录没有权限的问题
数据卷:将docker容器内的数据保存到宿主机的磁盘中
docker run -it --privileged=true -v 宿主目录:容器目录 镜像名 #默认可读可写
特点:
1.数据卷可以在容器之间共享或重用数据
2.数据卷中的更改可以直接实时生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
容器卷之间的继承:
第一步:完成容器与宿主机的映射
第二步:继承
docker run -it --privileged=true --volumes-from u1(要继承的容器名) --name=u2 ubuntu(镜像名)
安装Tomcat:
docker pull tomcat #下载最新版
docker exec -it 容器id /bin/bash
#以下操作仅最新版需要
随后将webapps删除.将webapps.dist重命名成webapps
然后访问8080端口
安装MySQL(latest):
-
确保您已经安装了Docker。如果没有安装,请根据您的操作系统进行安装。
-
打开终端或命令提示符,并运行以下命令拉取MySQL 8.0的Docker镜像:
docker pull mysql
-
完成镜像下载后,可以运行以下命令创建并启动MySQL容器:
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 -d mysql
其中,
mysql-container
是您为容器指定的名称,your_password
是您设置的MySQL root用户的密码。请确保将your_password
替换为您自己的密码。 -
等待一段时间,MySQL容器将会启动。您可以使用以下命令检查容器的运行状态:
docker ps
如果看到MySQL容器正在运行,则说明安装成功。
现在,您可以使用MySQL客户端连接到MySQL容器,并开始使用MySQL 8.0。您可以使用以下命令连接到MySQL容器:
docker exec -it mysql-container mysql -uroot -p
然后,输入您在第3步设置的密码即可登录到MySQL。
注意:因为是mysql8 所以分别执行一下两条命令 即可远程连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
flush privileges;
防止使用过程中中文报错:
show variables like 'character%';
可视化工具执行:
*通过容器数据卷启动mysql:
docker run -d -p 3306:3306 --privileged=true
-v /aqing/mysql/log:/var/log/mysql
-v /aqing/mysql/data:/var/lib/mysql
-v /aqing/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=111111
--name=mysql mysql
在/aqing/mysql/conf中新建my.cnf 将以下内容拷贝进去 重启mysql
然后按上述命令自行检查字符编码
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
安装Redis:
#拉取redis
docker pull redis
copy一份redis.conf到宿主目录中
#数据卷启动redis
docker run -p 6379:6379 --name myredis --privileged=true -v /aqing/redis/redis7.conf:/etc/redis/redis.conf -v /aqing/redis/data:/data -d redis redis-server /etc/redis/redis.conf
启动后秒退可能是redis.conf配置文件与redis版本不一致
可以通过
docker logs 容器id
查看日志
修改redis.conf
bind一行注释
requirepass一行修改密码
protected一行改为no
daemon一行改为no 避免与docker -d命令冲突
MySQL主从复制:
1.run一个master容器
docker run -p 3307:3306 --name mysql-master
-v /sqldata/mysql-master/log:/var/log/mysql
-v /sqldata/mysql-master/data:/var/lib/mysql
-v /sqldata/mysql-master/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=111111
-d mysql
2.进入/sqldata/mysql-master/conf目录下配置my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=1024
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认0表示不自动清理
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#secure_file_priv=/var/lib/mysql
#default_authentication_plugin=mysql_native_password #设置密码规则
#max_connections=1000 #最大连接数设置 根据实际需要 自行调整
3.重启mysql-master
4.进入mysql-master容器
5.创建slave
#创建slave用户
CREATE USER 'slave'@'%' IDENTIFIED BY '111111';
#授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
6.新建从服务器3308
docker run -p 3308:3306 --name mysql-slave -v /sqldata/mysql-slave/log:/var/log/mysql -v /sqldata/mysql-slave/data:/var/lib/mysql -v /sqldata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=111111 -d mysql
7.进入/sqldata/mysql-slave/conf配置my.cnf文件
[mysqld]
## 同一局域网内注意要唯一
server-id=102
## 开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-mysql-slave1-bin
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认0表示不自动清理
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制时间写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具备super权限的用户除外)
read_only=1
#secure_file_priv=/var/lib/mysql
#default_authentication_plugin=mysql_native_password #设置密码规则
#max_connections=1000 #最大连接数设置 根据实际需要 自行调整
8.重启mysql-slave
9.在主mysql中查看从mysql的状态
show master status;
10.进入mysql-slave容器
11.在从数据库中配置主从复制
change master to master_host='192.168.142.130',master_user='slave',master_password='111111',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=476,master_connect_retry=30;
12.在从数据库中查看主从状态
show slave status \G;
13.在从数据库中开启主从同步
start slave;
14.测试
其他:
SELECT Host, User, plugin from user;
主从复制中
在主机中修改从机的加密方式(毕竟是mysql8)
alter user 'slave'@'%' identified with mysql_native_password by '111111';
Redis集群(三主三从):
一、搭建
1.开启6台redis服务器
docker run -d --name redis-node-1 --net host --privileged=true -v /redisdata/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381
2.进入redis-node-1 构建集群关系
docker exec -it redis-node-1 /bin/bash
3.进去之后构建主从关系
redis-cli --cluster create 192.168.142.130:6381 192.168.142.130:6382 192.168.142.130:6383 192.168.142.130:6384 192.168.142.130:6385 192.168.142.130:6386 --cluster-replicas 1
4.查看集群状态
redis-cli -p 6381
cluster info
cluster nodes
二、主从容错切换迁移
1.数据读写存储
redis-cli -p 6381 -c
# -c 集群
redis-cli -p 6381
#单机连接
#查看集群信息
redis-cli --cluster check 192.168.142.130:6381
2.容错切换迁移
master服务器宕机之后 从服务器会作为主服务器顶上去
master恢复后原来的master服务器作为从服务器 作为新master的从服务器
恢复原来的主从关系:
停止新master服务器 让从服务器顶上去 在从新启动新master服务器 此时恢复到原来的主从关系
三、主从扩容
1.新run两个redis服务器
docker run -d --name redis-node-7 --net host --privileged=true -v /redisdata/redis/share/redis-node-7:/data redis --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /redisdata/redis/share/redis-node-8:/data redis --cluster-enabled yes --appendonly yes --port 6388
2.进入7号机
3.将新增的6387作为master加入集群
redis-cli --cluster add-node 192.168.142.130:6387 192.168.142.130:6381
4.检查集群状态
redis-cli --cluster check 192.168.142.130:6381
5.重新分配槽号
redis-cli --cluster reshard 192.168.142.130:6381
6.检查集群状态
7.为6387分配从节点6388
#redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave -cluster-master-id 新主机节点id
redis-cli --cluster add-node 192.168.142.130:6388 192.168.142.130:6387 --cluster-slave --cluster-master-id ec057e566b342e0ba55b6842d63d51d8a5a42bd8
8.检查集群状态
四、 主从缩容
先删从机再删主机
redis-cli --cluster del-node 从机ip:端口 从机id
redis-cli --cluster del-node 192.168.142.130:6388 376e3e72be6db64b398cf2f10409054b0308938d
重新分配槽位,将需要删除的节点的槽位全部分配给6381
redis-cli --cluster reshard 192.168.142.130:6381
## 需要分配4096个槽位 6381来接收 6387发送 done 执行
检查集群状态
删除主节点
redis-cli --cluster del-node 192.168.142.130:6387 ec057e566b342e0ba55b6842d63d51d8a5a42bd8
检查集群状态
DockerFile:
Dockerfile是用来构建Docker镜像的文本文件,是有一条条构建镜像所需的指令和参数构成的脚步
Dockerfile基础:
1.每条保留字指令都必须为大写字母且后面至少跟随一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程:
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器进行修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker在基于刚提交的镜像运行一个新的容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成
Dockerfile保留字:
见官网 https://docs.docker.com/engine/reference/builder/
#构建命令
docker build -t 新镜像名:版本号 .
虚悬镜像:
镜像名和版本号都是null的镜像
#查询所有虚悬镜像
docker image ls -f dangling=true
#删除虚悬镜像
docker image prune
Docker部署java项目:
将springboot项目打包成jar部署在docker上面,运行springboot项目
暂时省略。。。。。。
Docker之NetWork(Docker网络):
docker network +command、
1.bridge(默认桥接 会虚拟出一个docker0网桥 它在内核层连通了其他的物理或虚拟网卡 默认使用docker0 )
2.host与宿主机公用网络(此时 端口映射没意义)
3.none (没有任何的网络设置)
4.container (与已经存在的容器共享ip和端口范围,与容器共享ip时 假如提供网络方宕机 继承方则没有ip和端口范围)
#查看指定容器最后20行的信息
docker inspect 容器名 | tail -n 20
自定义网络:
docker network create 网络名
然后在docker run的时候带上 --net 网络名
自定义网络本身就维护好了主机名和ip的对应关系(ip和服务名都能ping通)
Docker-Compose:
负责实现对docker容器集群的快速编排
下载:https://docs.docker.com/compose/install/standalone/
curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
Compose核心概念:
{
一个文件:docker-compose.yml,
两个要素:{
服务(service):一个个的应用容器实例,
工程(project):由一组关联的应用容器组成个一个完整的业务单元,在docker- compose.yml文件中定义
}
}
一个工程=多个服务(容器应用实例)
Comsose使用的三个步骤:
1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件;
2.使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务;
3.最后执行docker-compose up 命令 来启动并运行整个应用容器,完成一键部署上线;
不适用compose存在的隐患:
1.服务启动的先后顺序固定;
2.多个run命令;
3.容器间的宕机或启停,有可能导致ip地址的对应的容器实例变化,映射出错;
使用Docker-Compose:
Portanier:
官网:https://www.portainer.io
文档:https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux
#安装
docker run -d -p 9000:9000 --name portainer --restart=always --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
–restart=always:docker启动或重启即启动该容器
安装Nginx:
CIG监控(cAdvisor+InfluxDB+Grafana):
version: '3.9'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run.rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
检查配置并运行
docker-compose config -q
docker-compose up
CIG添加panel:
new dashboard