第一章=>Docker概述
第二章=>Docker安装与镜像下载加速
第三章=>镜像
第四章=>容器
第五章=>发布镜像到阿里云或私有化仓库
第六章=>容器卷
第七章=>Docker安装常用软件
第八章=>Docker高级版-Mysql主从复制、Redis主从、分布式存储
第九章=>DockerFile
第十章=>DockerNetwork
第十一章=>Compose
第十二章=>Docker图形化工具Portainer
*******************************************************************************************************************************************
第一章=>Docker概述
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【1】一切在云端,万物皆容器
【2】是什么?能干嘛?去哪下?怎么玩?永远的HelloWorld
Docker为什么出现?之前开发和运维的扯皮,由于环境不同,问题表现则各异,容器平滑迁移技术出现。Docker让搬家升级为搬楼!搬整个开发环境给运维!
【3】centos7.iso 镜像文件保证了迁移的一致,一次镜像处处运行
配置vi /etc/sysconfig/network-scripts/ifcfg-enp0s3(不同机器,网卡名称不同,如京东的塔式服务器)
BOOTPROTO=dhcp # 不是static重要重要重要!!!
ONBOOT=yes
IPADDR=192.168.0.205 # 重要重要重要!根据windows网段做对应修改,用205是为了防止IP冲突!修改box热键是一路点击第一个
GATEWAY= 192.168.0.1 # 重要重要重要!根据windows cmd获取的做修改(不同的计算机,默认网关不同!)
最后service network restart 或者执行systemctl restart network
【4】Docker是基于go语言实现的开源项目。应用打包为镜像,通过镜像运行成容器实例。跨平台、跨服务器。
【5】容器和虚拟机的区别:虚拟机就是带环境安装的一种解决方案。为了节约资源,基础资源复用,最小的内核支撑软件,这就是容器虚拟化解决的问题。
Docker实在操作系统层面实现了虚拟化。
【6】能解决什么问题?开发兼运维工程师!一次构建,随处运行。快速、便捷、简单、高效。新浪、美团都在用。
*******************************************************************************************************************************************
第二章=>Docker安装与镜像下载加速
【1】Docker hub。Docker必须部署在Linux内核的系统上。
cat /etc/redhat-release
uname -r
【2】Docker的三要素:镜像(类)--->容器(对象)--->仓库(存放镜像)
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【3】图解:Client(docker build/pull/run)---DokcerHost(本地镜像---远程仓库拉取===>运行成容器)
运行主机:后台守护进程(mysql/redis/nginx)。
【4】架构版:Docker是CS架构,后端是一个松耦合架构,众多模块各司其职。Docker也具备网络环境。
【5】安装Docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 配置从阿里云下载
yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
docker images
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker version
docker run hello-world
【6】配置阿里云加速 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vtaihzzp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker run hello-world
*******************************************************************************************************************************************
第三章=>镜像
【1】hello-world分析:本机是否有镜像---去远程仓库查询---拉取、运行
【2】Docker为什么比虚拟机快?有比虚拟机更少的抽象层。Dokcer用宿主机内核,不需要加载操作系统OS内核。
【3】常用命令
docker build --help:构建镜像的帮助信息。
docker push --help:将镜像推送到远程仓库的帮助信息。
docker pull --help:从远程仓库拉取镜像的帮助信息。
docker stop --help:停止容器的帮助信息。
docker start --help:启动容器的帮助信息。
docker restart --help:重启容器的帮助信息。
docker logs --help:查看容器日志的帮助信息。
【4】docker images
docker search hello-world
docker pull hello-world #不写版本号,默认是最新的
docker system df #查看镜像容器占用的空间
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
什么是虚悬镜像?指仓库名和标签都是<none>的镜像。在实际开发中,在构建或者删除镜像时出错会有一定概率出现虚悬镜像。
要删除虚悬镜像,可以使用命令:docker image prune -a
*******************************************************************************************************************************************
第四章=>容器
【1】启动容器,进入容器,管理容器自启动
docker run -itd -p 8003:80 --name {容器的名称} --restart always {镜像ID}
docker update --no-start {容器ID}
docker update --restart always {容器ID}
docker exec -it {容器ID} /bin/bash #退出是exit
docker ps
docker ps -a
【2】docker run -itd ubuntu # 启动后台守护而且可以交互的容器
docker exec -it xxx /bin/bash
docker rm -f $(docker ps -a -q) # 删除所有容器
【3】赵子龙:能进能退,才是真正法器。
编码开发微服务---上线部署容器化---时时刻刻要监控!!!
docker exec -it xxx /bin/bash # 进入
exit #退出
Docker技术是云原生的未来!!!一切在云端,全部跑容器!
【4】从容器拷贝文件到主机: docker cp 容器ID:容器路径 目的主机路径
docker cp 62167badc877:/1.txt /root/1.txt (在宿主机操作命令)
Successfully copied 1.54kB to /root/1.txt
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - wdfgdzx/ubuntu:2.1 这是还原为镜像
docker run -itd wdfgdzx/ubuntu:2.1 即可回复原有的容器(1比1还原)
*******************************************************************************************************************************************
第五章=>发布镜像到阿里云或私有化仓库
【1】镜像:轻量级、可执行的独立软件包。镜像是分层的:UFS联合文件系统。Docker底层:bootfs--->rootfs。加载简单可以复用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
镜像是只读的,容器是可写的。
【2】乌班图安装vim后重新更改镜像!
apt-get update
apt-get -y install vim
vim 1.txt 就可以正常使用了!容器更强大了!
docker commit -m="change info" -a="xlliu24" 62167badc877 my_ubuntu:1.1 #让更改后的容器成为镜像!(加了个vim功能变成了189MB)
【3】docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
docker run -itd 8379e9aa9c7a
docker exec -it 391e069e0e3a /bin/bash (直接可以使用vim命令,因为是自己改造过的镜像运行产生的容器)
【4】发布自己修改的镜像到阿里云
docker login --username=wdfgdzx@163.com registry.cn-hangzhou.aliyuncs.com # 一步
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。HIT...
docker tag 8379e9aa9c7a registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 二步
docker push registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 三步
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker pull registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 拉取到本地
【5】私有库操作(Docker Registry)
docker pull registry
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -d -p 5000:5000 -v /docker/registry:/tmp/registry --privileged=true registry (说明连本地仓库都是docker搭建的,云原生的未来,卧槽)
docker run -itd ba6acccedd29(跑原生ubuntu镜像)
docker exec -it 容器ID /bin/bash (进入ubuntu容器)
apt-get update
apt-get -y install net-tools
ifconfig(就可以看到网络配置了)
exit
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker commit -m="change info" -a="xlliu24" 容器ID my_ubuntu:1.2(改变容器产生镜像)
my_ubuntu 1.2 0e9d02626e32 5 seconds ago 122MB(产生的镜像)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
curl -XGET http://192.168.0.205:5000/v2/_catalog
{"repositories":[]} (返回的信息)
docker tag my_ubuntu:1.2 192.168.0.205:5000/my_ubuntu:1.2 (规范化命名镜像)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
取消推送限制
vim /etc/docker/daemon.json
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置如下:
{
"registry-mirrors": ["https://vtaihzzp.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.0.205:5000"]
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
systemctl restart docker
记得启动私有化仓库的容器,docker start 容器ID
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker push 192.168.0.205:5000/my_ubuntu:1.2
curl -XGET http://192.168.0.205:5000/v2/_catalog
{"repositories":["my_ubuntu"]}(再次查看就有了!!!)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker pull 192.168.0.205:5000/my_ubuntu:1.2 (拉取也是成功的!!!)
*******************************************************************************************************************************************
第六章=>容器卷
【1】一个坑的讲解:--privileged=true 容器卷一定记得开启权限,不然报错(Permission denied)!!!这样容器的root才拥有root权限
docker run -d -p 5000:5000 -v /docker/registry:/tmp/registry --privileged=true registry (还记得这个命令吗?哈哈)
说到底是:重要资料的备份,卧槽,牛批了!容器的数据备份+持久化本地目录。类似Redis的rdb与rof,与解决实际问题不谋而合。
【2】docker run -itd --privileged=true -v /docker/xxx:/容器的目录/xxx 镜像名(使用模版)
【3】docker run -itd --privileged=true -v /docker/test:/docker/test --name=u1 ba6acccedd29(强大呀,还能建立目录,双向同步互通)
docker exec -it 容器ID /bin/bash
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker inspect 容器ID(能看到Mounts节点的挂载目录情况)
【4】默认是rw可读可写。容器内部只能读,不能写(模式是ro read only)
【5】卷的继承:容器2继承容器1的卷规则,(docker run -itd --privileged=true --volumes-from u1 --name=u2 ubuntu。这个实现了3个机器的数据共享,
A-B B-C 所以ABC数据都是一样的,卧槽!B主机数据只要在,容器数据都可以恢复,一主二从)
*******************************************************************************************************************************************
第七章=>Docker安装常用软件
【1】Mysql Redis Rmq(步骤:搜、拉、查、启、停、移)
【2】docker run -itd -p 8080:8080 tomcat
docker exec -it a16cd0888dad /bin/bash
rm -rf webapps
mv webapps.dist webapps
访问: http://192.168.0.205:8080/ 看到tomcat 10.0.14
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置有点不友好,麻烦,版本太新
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
docker run -itd -p 8080:8080 --name=my_tomcat billygoo/tomcat8-jdk8
http://192.168.0.205:8080/ (直接访问好不好,一步到位!!!!)
【3】以Mysql5.7为例
docker run -p 3306:3306 --name=mysql -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
再加个定时cp,cp一份到/backup就万无一失了,牛批!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vim /docker/mysql/conf/my.cnf # 配置mysql,不配置字符集,插入中文就报错了
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker ps
docker restart mysql
show variables like 'character%'; (再进入查看编码就变了,插入中文就可以了)
docker update --no-start {容器ID}
docker update --restart always {容器ID}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it 容器ID /bin/bash
mysql -uroot -p
输入密码
select user,host from mysql.user; #查看用户情况(同样可以用)
【4】Redis
docker rm -f $(docker ps -a -q)
docker run -p 6379:6379 --name redis -v /docker/redis/data:/data -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf
docker cp 产生容器ID:/etc/redis/redis.conf /docker/redis/conf/redis.conf
会失败,因为reids.conf找不到,发现没有默认的redis.conf自己新建放置下!!!放置后再执行一次即可。!!!
docker run -p 6379:6379 --name redis -v /docker/redis/data:/data -v /docker/redis/conf:/etc/redis -d redis redis-server /etc/redis/redis.conf
我尼玛,我折腾了2小时。(这才是问题的根源,带.的路径,宿主机必须提前具备,不然就无法挂载,可以愉快的使用Docker了)
.sh执行报错,大部分是因为编码
vim 对应文件(必须有vim安装)
esc :set ff=unix 保存退出
set ff可以查看
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置持久化
vim redis.conf
appendonly yes
docker restart redis
【5】Nginx
docker rm -f $(docker ps -a -q)
docker run --name nginx --privileged -p 8001:80 -v /docker/nginx/html:/usr/share/nginx/html -d nginx
docker run --name nginx_tmp -itd nginx
docker cp 产生容器ID:/etc/nginx/conf.d/default.conf /docker/nginx/conf.d/default.conf(这才是问题的根源,带.的路径,宿主机必须提前具备,不然就无法挂载,可以愉快的使用Docker了)
docker run --name nginx --privileged -p 8001:80 -v /docker/nginx/conf.d:/etc/nginx/conf.d -v /docker/nginx/html:/usr/share/nginx/html -d nginx
我尼玛,我折腾了2小时。
*******************************************************************************************************************************************
第八章=>Docker高级版-Mysql主从复制、Redis主从(分布式存储)
【1】mysql主从复制
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -p 3307:3306 --name=mysql_master -v /docker/mysql_master/log:/var/log/mysql -v /docker/mysql_master/data:/var/lib/mysql -v /docker/mysql_master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
然后vim /docker/mysql_master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
docker restart mysql_master
然后进入到容器的mysql中
create user 'slave'@'%' identified by 's19911009';
grant replication slave,replication client on *.* to 'slave'@'%';
flush privileges;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -p 3308:3306 --name=mysql_slave -v /docker/mysql_slave/log:/var/log/mysql -v /docker/mysql_slave/data:/var/lib/mysql -v /docker/mysql_slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
然后vim /docker/mysql_slave/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
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
docker restart mysql_slave
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入到主容器mysql:show master status;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入到从容器mysql操作:
docker exec -it mysql_slave /bin/bash
进入到mysql
change master to master_host='192.168.0.205', master_user='slave', master_password='s19911009', master_port=3307, master_log_file='mall-mysql-bin.000003', master_log_pos=154, master_connect_retry=30;
show slave status \G;(NO NO)
start slave; (开启接收)
show slave status \G;(YES YES)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
用Navicat分别连接3307 3308,在3307操作,3308自动同步!!!牛批了(生产中也会用到!!!)
【2】分布式存储(1-2亿数据需要缓存,如何设计存储案例?---3主3从Redis集群扩缩容配置)
哈希取余分区(缺点:是如果宕机或者扩缩容,数据就不可控了)
一致性哈希算法分区(一致性哈希环,人类的智慧是伟大的,卧槽。解决了容错性与扩张性。缺点:数据倾斜问题)
哈希槽分区(节点不超过1000个,槽位不超过16384个。)
【3】Redis主从配置
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -d --name redis-node-1 --net host --privileged=true -v /docker/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /docker/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /docker/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /docker/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /docker/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /docker/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.0.205:6381 192.168.0.205:6382 192.168.0.205:6383 192.168.0.205:6384 192.168.0.205:6385 192.168.0.205:6386 --cluster-replicas 1
(--cluster-replicas 1 表示为每个master创建一个slave节点 )
yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.0.205:6381)
M: 02e8815bd77c908e07ef90ed3b224b0eda12bfbd 192.168.0.205:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b78b2a7272044da9be8fb7f65a5451b599f2dddb 192.168.0.205:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 434e381048b8951be2895d5fc81563d6506dfe28 192.168.0.205:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: de4c954594676fe97891664a59b29424514aa47b 192.168.0.205:6384
slots: (0 slots) slave
replicates b78b2a7272044da9be8fb7f65a5451b599f2dddb
S: d2f6acc92dcab7238e52e9899afd898b880e8eb2 192.168.0.205:6386
slots: (0 slots) slave
replicates 434e381048b8951be2895d5fc81563d6506dfe28
S: 788c716cfd36e15244f64f9050cf8e9118dfe312 192.168.0.205:6385
slots: (0 slots) slave
replicates 02e8815bd77c908e07ef90ed3b224b0eda12bfbd
[OK] All 16384 slots covered.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
链接进入6381作为切入点,查看节点状态
redis-cli -p 6381
cluster info
cluster nodes
1-4 2-5 3-6
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
数据读写存储
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381
27.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.0.205:6383
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> set k3 v3
OK
127.0.0.1:6381> set k4 v4
(error) MOVED 8455 192.168.0.205:6382
为什么?因为是集群了,所以要变换连接方式了
redis-cli -p 6381 -c(所以集群的方式很重要了,非常重要了!!!)
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 192.168.0.205:6383
OK
192.168.0.205:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.0.205:6381
OK
192.168.0.205:6381> set k4 v4
-> Redirected to slot [8455] located at 192.168.0.205:6382
OK
redis-cli --cluster check 192.168.0.205:6381(容器里执行,不是redis里执行,集群检查)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
容错切换迁移
主6381和从机切换,先停止主机6381
docker stop redis-node-1
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
cluster nodes
还原之前的3主3从
docker start redis-node-1
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes(当初的大佬,回来后成为小弟,人走茶凉了)
docker stop redis-node-4
docker start redis-node-4
docker stop redis-node-5
docker start redis-node-5(老师经历一次整顿回来,我这个两次才回来123主 456从)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
主从扩容案例(阿里云的弹性扩容也是这个思想)(从3主3从 到 4主4从)
新建6387、6388两个节点+新建后启动+查看是否8节点
docker run -d --name redis-node-7 --net host --privileged=true -v /docker/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /docker/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 192.168.0.205:6387 192.168.0.205:6381 (6387 去 拜拜 6381的码头)
[OK] New node added correctly.
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第1次)
redis-cli --cluster reshard 192.168.0.205:6381(重新分派槽号)
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(6387的ID)
Source node #1: all
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第2次)
说明每家给了点,凑够了4096
为主节点6387分配从节点6388!!!
redis-cli --cluster add-node 192.168.0.205:6388 192.168.0.205:6387 --cluster-slave --cluster-master-id 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4
(-------这个是6387的编号,按照自己实际情况)
>>> Configure node as replica of 192.168.0.205:6387.
[OK] New node added correctly.
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第3次)
至此扩容完成!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
主从缩容案例(从4主4从,恢复到3主3从)
将6388删除,从集群中将4号从节点6388删除
redis-cli --cluster del-node 192.168.0.205:6388 1e85f38da3370a7f4fa2c0b4dff529cffe19155f(这个是6388的ID)
>>> Sending CLUSTER RESET SOFT to the deleted node.
redis-cli --cluster check 192.168.0.205:6382(第1次检查集群情况)
redis-cli --cluster reshard 192.168.0.205:6381(将6387的槽号清空,重新分配,本例将清出来的槽号都给6381)
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 02e8815bd77c908e07ef90ed3b224b0eda12bfbd(这个是6381的ID)
Source node #1: 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(这个是6387的ID)
Source node #2: done
redis-cli --cluster check 192.168.0.205:6381(第2次检查集群情况)
redis-cli --cluster del-node 192.168.0.205:6387 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(将6387删除 )
Sending CLUSTER RESET SOFT to the deleted node.
redis-cli --cluster check 192.168.0.205:6381(第3次检查集群情况)
至此成功缩容!!!
【4】总结:证明了CSDN+模块化学习的高效和实用性。不浪费时间在细节上。唯亮观其大略。zzyybs@126.com
*******************************************************************************************************************************************
第九章=>DockerFile
【1】用来构建Docker镜像的文本文件。多次变化提交镜像太麻烦了,所以把所有变化列个清单,一次提交。(由一条条的构建指令组成)
三步走:编写DockerFile---docker bulid命令构建镜像---docker run镜像成容器。
【2】构建过程:每一条指令都会构建一个新的镜像并对镜像进行提交。不断的修改镜像---运行容器---修改容器---成为新镜像---运行容器...
DockerFile---镜像---容器!!!(这个就高明了,镜像毕竟太大,而药方很小)
【3】关键保留字(就是Java关键字吗)。
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
FROM 基础镜像、MAINTAINER 作者、RUN 容器运行命令、EXPOSE 暴露端口、WORKDIR 一个落脚点、ENV 设置变量、
ADD 宿主机目录下的文件拷贝到镜像、COPY 。VOLUME 容器卷、CMD 指定容器启动后需要干的事情。ENTRYPOINT 类似CMD 但是不会被覆盖。
【4】用DockerFile改造基础centos7。vim+ifconfig+jdk8
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
(文件名字必须是Dockerfile 错误了找不到,卧槽!!!)
FROM centos:7
MAINTAINER xha<2533694604@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "Success--------------ok"
CMD /bin/bash
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t my_docker_image .
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker images(你想要的JDK8也来了!!!)
REPOSITORY TAG IMAGE ID CREATED SIZE
my_docker_image latest 22e2644e4375 35 seconds ago 1.3GB
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -it my_docker_image /bin/bash
然后验证vim+ifconfig+jdk8都完成了!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
【5】虚悬镜像一定要删除清理掉。
【6】Docker微服务实战!(通过IDEA新建一个微服务模块,通过dockerfile发布微服务到docker容器)
先获取可运行的springboot.jar包
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#基础镜像使用java !!!这就保证了有JDK
FROM java:8
# 作者
MAINTAINER wdfgdzx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD black-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露8000端口作为微服务
EXPOSE 8000
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t my_java_image .
docker images
docker run -d -p 8000:8000 my_java_image
大功告成!!!
*******************************************************************************************************************************************
第十章=>DockerNetwork
【1】Docker网络(Docker启动的时候会多个网络信息docker0虚拟网桥)
docker rm -f $(docker ps -a -q)
ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:6d:39:7e:90 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
【2】network命令
docker network ls
NETWORK ID NAME DRIVER SCOPE
6742edfcbdb2 bridge bridge local
476e155a2e9b host host local
389f0d211d1a none null local
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
【3】跨Docker宿主机通信。可以通过服务名相互通信。
【4】网络模式(bridge 默认的模式,为每个容器分配设置IP 虚拟网桥、host、none、container)
【5】查看容器内部情况。
docker run -itd --name u1 ubuntu bash
docker run -itd --name u2 ubuntu bash
docker inspect u1
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6742edfcbdb28519dbcf2c0d2b7c3d168ed2a38bf1f593064d1a6c8348197a51",
"EndpointID": "9df7410166e5833b3d4dcf7293b543a1f93f44e0be4790fb1ca4f4db267aebeb",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker inspect u2
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6742edfcbdb28519dbcf2c0d2b7c3d168ed2a38bf1f593064d1a6c8348197a51",
"EndpointID": "d4fcf43046c6f3a784f62d3d284d305fd9fe3eaf21c2d44ea5e38d308e0952e6",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
u2容器去除,u3起来,u3的IP地址变成了"IPAddress": "172.17.0.3"。说明容器内部IP是有可能发生变化的。所以需要网络规划!!!
【6】bridge模式(veth---eth0)
docker rm -f $(docker ps -a -q)
docker network inspect bridge
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ip addr
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:6d:39:7e:90 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:6dff:fe39:7e90/64 scope link
valid_lft forever preferred_lft forever
13: vethadb6e1d@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether de:5b:85:56:d3:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::dc5b:85ff:fe56:d3d8/64 scope link
valid_lft forever preferred_lft forever
15: vetha49dab5@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4a:d9:87:69:7c:79 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::48d9:87ff:fe69:7c79/64 scope link
valid_lft forever preferred_lft forever
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it tomcat82 bash
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
说明:15: vetha49dab5@if14:----------14: eth0@if15:
【7】host模式(容器不会获得独立的network namespace)
docker rm -f $(docker ps -a -q)
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8(错误写法)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e03666064522 billygoo/tomcat8-jdk8 "catalina.sh run" 3 seconds ago Up 3 seconds tomcat83
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8(正确写法)
docker inspect tomcat83
"Networks": {
"host": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "476e155a2e9bdd220dc22757bdada2fb6b17ce3503e573569ab9680e3fdb4b13",
"EndpointID": "0a35032484d6831ed1909a627c6173bc8f2ecd98551d51843dc0619f6ba0a046",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it tomcat83 bash(和外网一样,没有自己的网络配置!而IP就是宿主机一样了!!!)
root@192-168-0-205:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:2b:c0:7a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.205/24 brd 192.168.0.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::2828:7091:3a5:4816/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:6d:39:7e:90 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:6dff:fe39:7e90/64 scope link
valid_lft forever preferred_lft forever
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http://192.168.0.205:8080 所以访问宿主机8080就可以访问,卧槽 还能这么方便吗?
【8】none禁用网络功能
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker inspect tomcat84
"Networks": {
"none": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "389f0d211d1a643935619a9e7a48b7431294c64b3ce58c350d5ec72bf5e42266",
"EndpointID": "89e05918528c4d2e9d8257d487874aa3a25f4d1694fdf138af03ece45d6fa586",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
【9】container网络模式(两张嘴公用同一个吸管)
docker rm -f $(docker ps -a -q)
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
会报错:docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
用另一种方法(两台机器的IP地址一样):
docker run -it --name alpine_1 alpine /bin/sh
docker run -it --network container:alpine_1 --name alpine_2 alpine /bin/sh
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
【10】自定义网络模式(感觉这个常用!解决docker容器的IP可能发生变化的问题。)
docker rm -f $(docker ps -a -q)
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 bash (ping 172.17.0.3)
docker exec -it tomcat82 bash (ping 172.17.0.2)
说明(用之前:IP地址可以ping通,但是容器名ping不通)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker network ls
docker network create my_network
docker network ls
NETWORK ID NAME DRIVER SCOPE
d04fde4026be bridge bridge local
476e155a2e9b host host local
9fe53f7c6524 my_network bridge local
389f0d211d1a none null local
docker run -d -p 8081:8080 --network my_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network my_network --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 bash (ping tomcat82)
docker exec -it tomcat82 bash (ping tomcat81)
说明:自定义网络本身就维护好了主机名和IP的对应关系(IP和域名都能通,重要的是域名能通!!!--network my_network)
*******************************************************************************************************************************************
第十一章=>Compose容器编排
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【1】比如20个容器怎么管理?compose是Docker官方开源的项目,负责实现对Docker容器集群的快速编排。
只需要一个docker-compose.yml,写好多个容器之间的调用关系,然后只要一个命令,就能启动或关闭这些容器。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
同比applicationContext.xml对Bean的管理。docker compose.yml 管理docker容器。
【2】compose下载安装步骤
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(下载慢可以用百度网盘。)
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
【3】核心概念(一个文件docker-compose.yml、两大要素service(比如mysql 订单微服务 reids等) project完整业务单元)
Dockerfile---docker-compose.yml---docker-compose up命令完成一键部署上线。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
常用命令:
docker-compose up
docker-compose down
docker-compose restart
docker-compose start
docker-compose stop
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
jar包打包成镜像运行微服务,先获取可运行的springboot.jar包放置到指定目录,然后vim Docekrfile!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#基础镜像使用java !!!这就保证了有JDK
FROM java:8
# 作者
MAINTAINER wdfgdzx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD black-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露8000端口作为微服务
EXPOSE 8000
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t xxx_image .
docker images
docker run -d -p 8000:8000 xxx_image
【4】不用compose就是多个容器分而治之,管理起来会比较麻烦。全部用容器(配置docker-compose是前提。),在/docker/docker_compose建立目录。
vim docker-compose.yml
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
version: "3"
networks:
my_network:
services:
my_service:
image: my_java_image
ports:
- 8100:8000 #左边 5000 是主机访问端口,可按需修改
volumes:
- "/docker/docker_compose/data:/data"
networks:
- my_network
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- 6379:6379 #左边 5000 是主机访问端口,可按需修改
volumes:
- "/docker/docker_compose/redis/redis.conf:/etc/redis/redis.conf"
- "/docker/docker_compose/redis/data:/data"
networks:
- my_network
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 's19911009'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'music'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 's19911009'
ports:
- "3306:3306"
volumes:
- /docker/docker_compose/mysql/db:/var/lib/mysql
- /docker/docker_compose/mysql/conf/my.cnf:/etc/my.cnf
- /docker/docker_compose/mysql/init:/docker-entrypoint-initdb.d
networks:
- my_network
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
【5】docker-compose常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行!!!
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
*******************************************************************************************************************************************
第十二章=>Docker图形化工具Portainer
【1】Portainer轻量级可视化管理docker工具
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
多端口映射 --restart=always保证和docker同步启动
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
访问:http://192.168.0.205:9000/#/auth
admin s19911009
就可以看到可视化界面了!!!
【2】Portainer常规操作
Container发布一个nginx定义端口80(直接操作成功,牛批,比命令简单点!!!)
【3】CIG(在目录/docker/compose_cig下操作!!!)
docker stats原生界面+简单的可以用,更复杂的就需要CIG
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
version: '3.1'
# 挂载grafana_data数据卷
volumes:
grafana_data: {}
services:
# 创建数据库cadvisor
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
# 对外暴露的端口
ports:
- "8083:8083"
- "8086:8086"
# influxdb数据卷挂载
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
# cadvisor数据库连接容器influxsrv
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
user: "104"
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 up -d
访问:
收集 192.168.0.205:8080 cAdvisor
存储 192.168.0.205:8083 influxdb SHOW DATABASES回车能开看到数据库
展现 192.168.0.205:3000 grafana admin admin 设置里配置InfluxDB(http://InfluxDB:8086 root root)