首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,073 阅读
2
类的加载
737 阅读
3
Spring Cloud OAuth2.0
725 阅读
4
SpringBoot自动装配原理
689 阅读
5
集合不安全问题
582 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
388
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
页面
统计
关于
搜索到
10
篇与
的结果
2021-10-23
Sealos3.0离线部署K8s集群
2022.8.14补充:sealos3.0原部署方式已下线,4.0可以参照官方文档,笔记待补充Sealos离线部署K8s集群准备工具xshell,xftp,centos 7.9,k8s 1.18.9离线安装包开始安装:一、安装系统1. 选择最小安装2. 分区3. 设置账户二、系统设置1. 网络设置集群内服务器设置为静态IP,使用vim修改 /etc/sysconfig/network-scripts/ifcfg-ensxxx# 修改配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ensxxx # 配置静态IP #BOOTPROTO=dhcp BOOTPROTO=static IPADDR=192.168.5.130 GATEWAY=192.168.5.2 NETMASK=255.255.255.0 DEVICE=eth0 MTU=1500 NM_CONTROLLED=no ONBOOT=yes TYPE=Ethernet USERCTL=no ZONE=public DNS1=8.8.8.8修改保存之后重启网络systemctl restart network2. 设置hostnamehostname统一格式为 ==节点名.k8s==如:master.k8s,node1.k8s,node2.k8s# 修改hostname hostnamectl set-hostname master.k8s # 查看修改结果 hostnamectl status # 设置 hostname 解析 echo "127.0.0.1 $(hostname)" >> /etc/hosts3. 更换yum源# 备份原配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云yum curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 两条命令任选其一 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 清理缓存 yum clean all # 生成新的缓存 yum makecache添加epel源(如果已存在,同理执行备份替换)# 查看一下系统是否已有epel rpm -qa |grep epel # 如果已存在,卸载以前的epel以免受影响 rpm -e epel-release # 更换为阿里的epel源 wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo # 清理缓存 yum clean all # 生成新的缓存 yum makecache4. 挂载数据硬盘无需挂载则跳过此步骤(1)运行fdisk -l查看硬盘详细信息(2)初始化分区执行fdisk /dev/sdc输入p打印分区表,查看分区情况,可以看到,标记处无任何分区信息输入n新建分区输入p再次查看分区表输入w保存退出执行fdisk -l查看已创建的分区(3)创建物理卷执行partprobe /dev/sdc,在不重启系统的情况下重新读取分区表信息# 安装lvm2工具 yum install lvm2 # 创建物理卷 pvcreate /dev/sdc1格式化磁盘# ext4、xfs格式按需选择 mkfs.xfs /dev/sdc1(4)创建挂载点,并挂载磁盘mkdir /data mount /dev/sdc1 /data执行df -Th可查看挂载情况(5)设置系统开机自动挂载磁盘执行blkid /dev/sdc1查看磁盘的uuid编辑/etc/fstab文件,在末尾添加新增的磁盘信息# UUID [挂载点] [磁盘类型] defaults 0 0 # 二者任选其一 # /dev/sdb1 /data xfs defaults 0 0 执行mount -a检查配置注:添加配置文件保存后一定要mount -a检查通过再执行reboot重启5. 同步集群时间执行crontab -e,在末尾添加以下cron定时任务,集群中的每个节点都必须执行# 每天零点零一分执行时间同步任务 01 00 * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1 &保存后显示定时任务创建成功执行contab -l,可查看已创建的任务6. 关闭防火墙systemctl stop firewalld # 临时关闭,重启失效 systemctl disable firewalld # 永久关闭7. /usr/local/bin 全局命令设置执行vim ~/.bashrc,在末尾添加export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:"保存后执行刷新读取命令source .bashrc此项跟后续安装sealos,kubens,k8sreload工具有关,若不使用该工具则跳过三、准备环境# 创建目录 # k8s 部署目录 mkdir -p /home/xxx/deploy # 应用目录 mkdir /home/xxx/deploy/xxx # 资源目录 mkdir /home/xxx/res # 插件目录 mkdir /home/xxx/res/plugin # 应用基础镜像目录 mkdir /home/xxx/res/images # 应用业务镜像目录 mkdir /home/xxx/res/busi mkdir /home/xxx/res/busi/service # 目录结构 └── xxx ├── deploy # 项目部署文件 │ └── xxx └── res # 资源目录 ├── busi # 应用业务镜像目录 ├── images # 基础镜像 ├── kube1.18.9.tar.gz # k8s离线包 ├── plugin # 插件 ├── service # 服务端 └── web # 客户端四、安装k8sk8s版本选择1.18.91.安装sealossealos是k8s一键安装工具,官网地址:https://www.sealyun.com/# 下载并安装sealos, sealos是个golang的二进制工具,直接下载拷贝到bin目录即可, release页面也可下载 wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos && chmod +x sealos && mv sealos /usr/local/bin/ # 上传离线资源包到主节点2.初始化集群sealos init 命令解释, https://www.sealyun.com/instructions# 一主双从Kubernertes集群 sealos init --master 192.168.5.130 \ --node 192.168.5.131 \ --node 192.168.5.132 \ --user root \ --passwd '123456' \ --pkg-url /home/xxx/res/kube1.18.9.tar.gz \ --version v1.18.92.1检查集群状态kubectl get nodes -o wide2.2修改端口范围k8s NodePort 端口范围设置为30000-39999# 编辑kube-apiserver.yaml vim /etc/kubernetes/manifests/kube-apiserver.yaml # 添加端口配置到 spec.containers.command.kube-apiserver - --service-node-port-range=30000-399992.3设置master支持部署pod此项根据实际情况选择,如果不需要master支持pod则跳过#允许master节点部署pod kubectl taint nodes --all node-role.kubernetes.io/master- #如果不允许调度 kubectl taint nodes master1 node-role.kubernetes.io/master=:NoSchedule #污点可选参数 # NoSchedule: 一定不能被调度 # PreferNoSchedule: 尽量不要调度 # NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod2.4 node节点添加标签格式要求:"xxx/role"=master,"xxx/role"=node1,"xxx/role"=node2# 查看节点标签详细信息 kubectl get nodes --show-labels # 设置标签 kubectl label nodes master.k8s "xxx/role"=master kubectl label nodes node1.k8s "xxx/role"=node1 kubectl label nodes node2.k8s "xxx/role"=node22.5 修复子节点kubectl 命令不可用此项按需选择,如果无需子节点支持kubectl命令则跳过# 拷贝master节点/etc/kubernetes/admin.conf文件至node节点 scp /etc/kubernetes/admin.conf root@192.168.5.131:/etc/kubernetes/ # 在对应的node节点执行以下命令 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile source ~/.bash_profile2.6 k8s tab键修复# 安装bash-completion yum install -y bash-completion # 编辑~/.bashrc vim ~/.bashrc # 在末尾添加以下行 source <(kubectl completion bash) # 最后运行 source ~/.bashrc source /etc/profile # 对应的node节点也需运行上面2行命令或退出重新登录2.7 更换docker根文件目录docker文件默认路径是 /var/lib/docker,检查该目录磁盘空间是否足够,根据实际情况修改。注:如果docker根目录文件所处的磁盘空间较小,一定要将docker根文件目录更换至空间较大的数据盘下修改docker文件目录# 停止所有节点上的docker systemctl stop docker # 编辑 /etc/docker/daemon.json,修改data-root目录 vim /etc/docker/daemon.json # 移动docker的数据文件到新目录 mv /var/lib/docker /data/docker # 启动 systemctl start docker注:所有节点依次执行,修改此项尽量不要使用 xshell发送输入命令到所有会话 功能,网络延迟对同时发送命令可能会产生较大的影响3. 添加k8s拉取harbor镜像账户3.1添加docker仓库地址# 编辑daemon.json vim /etc/docker/daemon.json { "insecure-registries": "harbor.xxx.com" }3.2 创建k8s登录harboa.命令行方式创建kubectl create secret docker-registry approval-docker-harbor \ --docker-server=harbor.xxx.com \ --docker-username=xxx\ --docker-password='123456'b.yaml方式创建apiVersion: v1 kind: Secret metadata: namespace: xxx name: approval-docker-harbor type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: xxxxxxxxx4. 安装ingress注:ingress官方建议将ingress部署至master节点,该部署手册中未开启master支持pod调度的功能,在执行部署命令之前需先执行# 2.4节已执行过该命令,无需重复添加 kubectl label nodes master.k8s "xxx/role"=mastermaster节点添加标签后需编辑 ingress.yaml 文件,执行vim ingress.yaml,添加nodeSelector标签,将该pod直接调度到master节点最后执行部署# 进入到ingress文件夹 cd /home/xxx/res/plugin/ingress kubectl apply -f ingress.yaml5. 安装Kuboard此处安装Kuboard v2版本,Kuboard官网地址:https://kuboard.cnkubectl apply -f https://kuboard.cn/install-script/kuboard.yaml kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml # 查看Kuboard运行状态 kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system获取登录Token(注意保存token,切勿泄露)# 在master节点执行以下命令 # 管理员 echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d) # 只读用户(无操作权限) echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d) Kuboard管理地址:192.168.5.130:32567 (任意节点ip + 端口均可访问)6. 安装NFSnfs-client-provisioner.yml需要添加nodeSelector节点选择标签6.1 安装NFS服务端# 安装nfs相关工具 yum install -y nfs-utils # 在文件/etc/exports中添加以下内容(vim /etc/exports) #格式:[共享目录]:[共享主机](权限功能) vim /etc/exports /data/nfs 192.168.0.0/16(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501,fsid=0) localhost(rw) # 创建nfs共享目录 mkdir /data/nfs -p # 启动nfs systemctl enable rpcbind systemctl enable nfs-server systemctl start rpcbind systemctl start nfs-server exportfs -r #检查nfs创建结果 exportfs #输出结果如下 /data/nfs <world>6.2 安装NFS客户端yum -y install nfs-utils # 启动 systemctl start nfs-utils systemctl enable nfs-utils #查看相关信息 rpcinfo -p #测试挂载,单节点不需要这步 mount [nfs服务ip]:[nfs共享路径] [客户机挂载目录]6.3 k8s部署NFS添加nodeSelector节点选择标签(同理安装ingress)# 添加node节点标签 # 若2.4节已执行过该命令,则此处无需重复执行 kubectl label nodes node1.k8s "xxx/role"=node1 # 进入到nfs文件夹 cd /home/xxx/res/plugin/nfs # 修改nfs服务地址,同时添加nodeSelector节点选择标签,参考下图 vim nfs-client-provisioner.yml # 执行部署 kubectl apply -f nfs-client-provisioner.yml kubectl apply -f class.yml kubectl apply -f rbac.ymlNFS部署在default命名空间下,执行kubectl get pod检查NFS状态至此,k8s基础环境部署完毕五、应用1. 上传部署文件将yaml配置文件上传至/home/xxx/deploy/xxx2.执行对应服务的yaml文件# 部署 kubectl apply -f xxx.yaml # 或者执行 k8sreload xxx.yaml # 以上命令二选一 # 删除pod kubectl delete -f xxx.yaml六、其他1. 部署pod至指定节点在具体的yaml文件中指定 nodeSelectorapiVersion: apps/v1 kind: Deployment spec: template: spec: nodeSelector: #node节点标签选择器 "xxx/role": master #node节点标签内容2. 设置容器使用secreta. 在具体的xxx.yaml中设置apiVersion: v1 spec: template: spec: imagePullSecrets: - name: approval-docker-harborb. 设置默认账户方式此方式是设置给对应的namespace(命名空间)下的用户,添加 imagePullSecrets,无需在部署文件中再使用,注:namespace为空对应默认用户(default)# 命令方式 kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "docker-harbor-secret"}]}' -n kubernetes-dashboard# yaml文件方式 apiVersion: v1 kind: ServiceAccount metadata: name: default namespace: #NAME_SPACE# imagePullSecrets: - name: docker-harbor-secret
2021年10月23日
1,073 阅读
0 评论
0 点赞
2021-04-04
Docker Swarm
Docker Swarm初始化节点:docker swarm init加入节点:docker swarm join# 获取令牌 docker swarm join-token manager # leader docker swarm join-token worker # worker节点信息:Raft协议保证大多数节点存活才可使用,只要>1就可以,集群至少大于3台测试(双主双从):1.docker-1宕机,另一个主节点也不可用2.docker swarm leave 节点离开集群3.集群中的worker节点无法使用manager命令,管理工作一律由manager主节点执行注:至少保证1台管理节点存活docker service --help灰度发布(金丝雀发布)docker run # 容器启动,不具备扩缩容功能 docker service # 以服务的形式发布,可以扩缩容,滚动更新当单个Nginx服务负载较大时,需增加3个服务docker service update --replicas 3 mynginx==只要是一个服务,在集群中的任意一个节点都可以访问,服务可以由多个副本动态扩缩容来实现高可用==移除服务:docker service rm [服务名]小结Swarm:集群的管理和编号Node:docker节点,多个节点组成一个网络集群(分为管理和工作者)Service:服务,可以在管理节点或工作节点运行(compose的核心)Task:容器中的命令(细节任务)service运行模式--mode string # default "replicated" 默认运行于副本节点 docker service create --mode replicated --name test01 centos:7.6 # 运行在副本(默认) docker service create --mode global --name test01 centos:7.6 # 全局节点运行网络模式 PublishMode: ingressSwarmOverlayingress:Overlay的特殊模式,负载均衡(IPVS VIP)
2021年04月04日
120 阅读
0 评论
0 点赞
2021-04-04
Docker Compose
定义:Docker Compose是一个用于定义和运行多容器Docker的应用程序工具安装:# 1.下载 # 官方链接(速度较慢) curl -L $(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep "browser_download_url" | grep -i "$(uname -s)-$(uname -m)" | grep -v ".sha" | cut -d '"' -f 4) -o /usr/local/bin/docker-compose # 国内链接 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 2.授权 sudo chmod +x /usr/local/bin/docker-compose # 3.安装 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 4.安装成功后--version查看版本 docker-compose --versionpython应用——计数器1.应用app.py2.Dockerfile 打包镜像3.docker-compose.yml(定义整个服务,需要的环境)4.docker-compose up启动项目yml规则# 3层 version: '' # 版本 service: # 服务 服务1: web # 服务配置 images build network ...... 服务2: redis ...... 服务3:database ...... # 其他配置 volumes: networks: configs:
2021年04月04日
243 阅读
0 评论
0 点赞
2021-03-25
Docker网络
1.Docker0# Docker如何处理容器访问? [root@VM-0-14-centos /]# docker run -d -P tomcat01 tomcat # 容器启动时,docker会分配eth0,该分配的地址能ping通 [root@VM-0-14-centos /]# docker exec -it tomcat01 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 12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # linux可以ping通容器内部 [root@VM-0-14-centos /]# ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.033 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.059 ms 原理 每启动一个docker容器,docker就会自动给容器分配一个ip,安装docker的时候,会产生一个docker0网卡,使用桥接模式,采用evth-pair技术evth-pair:虚拟设备接口,成对出现,一段连接协议,一段彼此相连,因此容器之间也可以互相ping通网络模型:图片来源:狂神说Java结论:容器之间在没有指定网络的情况下,都是通过docker0来进行路由通信,它会给每一个容器分配一个ip2.--link# 容器之间无法ping通 [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat02 ping: tomcat02: Name or service not known # 通过--link可以解决容器间网络连通的问题 [root@VM-0-14-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat bffb39894b46d3a3ace237eac4d5eb0163b4233458c306f8e6172856516a1617 [root@VM-0-14-centos ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.108 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.065 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.066 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.069 ms 原理探究# 查看tomcat03的hosts配置文件 [root@VM-0-14-centos ~]# docker exec -it tomcat03 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 tomcat02 d207c5f1abfe # 通过--link命令直接绑定了tomcat02的地址 172.17.0.4 bffb39894b46 注:现阶段的docker不再推荐使用--link3.自定义网络# 查看docker网络 [root@VM-0-14-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 897e6dc978cd bridge bridge local a7455f4daeeb host host local 3600da2c2a04 none null local 网络模式:bridge:桥接(docker默认)none:不配置网络host:和宿主机共享网络container:容器网络连通(不推荐)# 之前的启动命令默认包含了 --net bridge 命令(也就是docker0) run -d -P --name tomcat01 --net bridge tomcat# 自定义一个mynet # --driver bridge # --subnet 192.168.0.0/16 192.168.0.2~192.168.255.255 # --gateway 192.168.0.1 [root@VM-0-14-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet c0e45563fdc70e8bd9ed21405be5b13e9552f6c08347ea51f1fb16d82d40fb5c [root@VM-0-14-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 897e6dc978cd bridge bridge local a7455f4daeeb host host local c0e45563fdc7 mynet bridge local 3600da2c2a04 none null local 自定义 mynet 测试# 启动两个tomcat容器,并指定好我们自定义的mynet [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 3703838b344e6390caa1a519365be204db614bf6049a08ef20c6f2b9a312fabf [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 7750aa78a0cba0901e7ab7f0ab424900a397a9e0b1be184bf7859a6cbc2d7938 查看网络信息:Ping测试:# 直接ping容器名或者ip,都可以ping通 [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.097 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.066 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.067 ms ^C --- tomcat-net-02 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2ms rtt min/avg/max/mdev = 0.066/0.076/0.097/0.017 ms [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.076 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.071 ms 64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.066 ms 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.075 ms ^C --- 192.168.0.3 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 0.066/0.072/0.076/0.004 ms [root@VM-0-14-centos ~]# docker帮用户自动维护好了自定义网络之间的对应关系,而默认的docker0却没有,所以推荐使用自定义网络,使不同的集群使用不同的网络,以保证集群的安全和健康4.网络连通使用 docker network connect [OPTIONS] NETWORK CONTAINER命令测试打通docker0下的 tomcat01 到 mynet# 执行connect命令,并查看mynet的信息 [root@VM-0-14-centos ~]# docker network connect mynet tomcat01 [root@VM-0-14-centos ~]# docker network inspect mynet# tomcat01 ping mynet下的tomcat-net-01 测试 [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat-net-01 PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data. 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.065 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.064 ms ^C --- tomcat-net-01 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.064/0.066/0.069/0.002 ms [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.067 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.069 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.068 ms ^C --- tomcat-net-02 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3ms rtt min/avg/max/mdev = 0.066/0.067/0.069/0.008 ms
2021年03月25日
90 阅读
0 评论
0 点赞
2021-03-24
Dockerfile
dockerfile用于构建docker镜像(命令参数脚本)1.dockerfile构建过程:# 1.指令关键字必须大写 # 2.从上往下顺序执行 # 3.# 表示注释 # 4.每一个指令都会创建一个新的镜像层,并提交DockerFile:构建文件,定义执行的内容DockerImages:通过DockerFile构建生成的镜像,即最终发布和运行的产品DockerContainer:运行镜像并提供服务2.DockerFile指令FROM # 基础镜像 MAINTAINER # 作者:姓名+邮箱 RUN # 镜像构建时需要运行的命令 ADD # 添加需要使用的文件(会自动解压) WORKDIR # 镜像工作目录 VOLUME # 挂载目录 EXPOSE # 暴露端口 CMD # 指定容器启动时要运行的命令(只有最后一个才生效,可被替代) ENTRYPOINT # 同理CMD,但可命令可以追加,类似于StringUtils.append() ONBUILD # 当构建一个被继承的dockerfile时,就会运行onbuild指令(触发指令) COPY # 类似于ADD,将需要的文件拷贝到镜像中 ENV # 构建时设置环境变量3.centos 测试实例DockerHub中大部分的镜像都是基于scratch这个基础镜像构建而来# 1.编写dockerfile配置文件 FROM centos MAINTAINER suaxi<281463547@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "-----end-----" CMD /bin/bash # 2.构建镜像 docker build -f dockerfile文件路径 -t 镜像名:[TAG] . [root@suaxi dockerfile]# docker build -f dockerfile-centos -t mycentos:1.0 . # 3.测试运行镜像构建历史:docker history 容器idCMD和ENTRYPOINT的区别测试CMD# 1.编写dockerfile文件 FROM centos CMD ["ls","-a"] # 2.构建镜像 [root@suaxi dockerfile]# docker build -f docker-cmd-test -t cmdtest . # 3.运行,执行了ls -a 命令 [root@suaxi dockerfile]# docker run 92054cb6235d . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # 现在项追加一个 -l 命令 ls -al [root@suaxi dockerfile]# docker run 92054cb6235d -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. # 在使用CMD指令的情况下,后追加的 -l 命令替换了之前的CMD["ls","-a"]命令,所以报错测试ENTRYPOINT# 1.编写dockerfile文件 FROM centos ENTRYPOINT ["ls","-a"] # 第2、3步的build和run与之前的一样 [root@suaxi dockerfile]# docker build -f docker-entrypoint-test -t entrypointtest . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos ---> 300e315adb2f Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in bf423c7dc041 Removing intermediate container bf423c7dc041 ---> e25354d47b76 Successfully built e25354d47b76 Successfully tagged entrypointtest:latest [root@suaxi dockerfile]# docker run e25354d47b76 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # 同理追加 -l 命令 [root@suaxi dockerfile]# docker run e25354d47b76 -l total 56 drwxr-xr-x 1 root root 4096 Mar 23 14:12 . drwxr-xr-x 1 root root 4096 Mar 23 14:12 .. -rwxr-xr-x 1 root root 0 Mar 23 14:12 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin drwxr-xr-x 5 root root 340 Mar 23 14:12 dev drwxr-xr-x 1 root root 4096 Mar 23 14:12 etc drwxr-xr-x 2 root root 4096 Nov 3 15:22 home lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64 drwx------ 2 root root 4096 Dec 4 17:37 lost+found drwxr-xr-x 2 root root 4096 Nov 3 15:22 media drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt dr-xr-xr-x 100 root root 0 Mar 23 14:12 proc dr-xr-x--- 2 root root 4096 Dec 4 17:37 root drwxr-xr-x 11 root root 4096 Dec 4 17:37 run lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv dr-xr-xr-x 13 root root 0 Mar 22 13:57 sys drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr drwxr-xr-x 20 root root 4096 Dec 4 17:37 var # 可以发现,使用ENTRYPOINT指令,-l命令直接追加在了ls -a之后,且正确执行4.Tomcat 测试实例1.准备文件:2.编写Dockerfile文件注:Dockerfile为官方命名,build时会自动查找该文件,不需要 -f 指定文件路径FROM centos MAINTAINER suaxi<281463547@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u281-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.27.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_281 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.27 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.27 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.27/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.27/logs/catalina.out 3.构建镜像[root@suaxi dockerfile]# docker build -t diycentos .4.启动镜像[root@suaxi dockerfile]# docker run -d -p 8088:8080 --name tomcattest -v /home/test/tomcat/test:/usr/local/apache-tomcat-9.0.27/webapps/test -v /home/test/build/tomcat/logs:/usr/local/apache-tomcat-9.0.27/logs diycentos 5.访问测试6.发布项目(挂载目录之后在本地编写项目即可)在挂在路径下新建WEB-INF/web.xml文件<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> </web-app> cd ..返回上一级,新建index.html文件<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docker</title> </head> <body> <h1>Docker Tomcat diy test</h1> </body> </html> 外网访问测试成功
2021年03月24日
158 阅读
0 评论
0 点赞
2021-03-23
容器数据卷
容器数据卷:将应用和环境打包成一个镜像目的:将容器中的目录,挂在的Linux本地(容器的持久化和同步操作、容器间数据共享)方式一:直接使用 -v 命令挂载docker run -it -v 主机目录:容器内目录 # 测试 [root@suaxi ~]# docker run -it -v /home/test:/home centos /bin/bash 从容器同步到主机:从主机同步到容器:(在容器停止后,主机修改了绑定路径下的文件,容器再次启动后,双向绑定依然生效)1.安装MySQl# 拉取镜像 [root@suaxi ~]# docker pull mysql # 官方文档命令 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # 启动(注意:docker启动mysql需使用-e命令配置密码) -d 后台运行 -p 端口映射 -v 数据卷挂载 -e 环境配置 --name 给容器起个别名 [root@suaxi ~]# docker run -d -p 8088:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql # 后续再使用navicat等工具连接docker中的mysql实际测试一下配置是否生效删除容器之后,同步到本地的数据依然存在,即实现数据的持久化。2.具名挂载、匿名挂载# 匿名挂载 -v 容器内的路径 -P 大写的P,随机映射端口 [root@suaxi ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx # 具名挂载 -v 卷名:容器内路径 [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 查看刚才挂载的卷 [root@suaxi ~]# docker volume inspect juming-nginx 所有docker容器内的卷,在没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/通过具名挂载,可以方便的找到挂载的卷及相关数据、信息# 区分匿名/具名挂载、指定路径挂载 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v /主机路径:容器内路径 # 指定路径挂载# 通过 -v 容器内路径:ro/rw 改变读写权限 ro read only # 只读 rw read/write # 可读可写 [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # ro 只能通过主机来操作,容器内只具有读的权限方式二:Dockerfile通过脚本生成镜像# 1.创建dockerfile文件 # 2.编写脚本,命令(都是大写)参数 FROM centos VOLUME ["volume01","volume02"] CMD echo "----create complete----" CMD /bin/bash启动并进入容器:脚本命令中挂载的目录是匿名挂载:测试挂载目录下的双向绑定是否成功:1.数据卷容器多个mysql同步数据图片来源:狂神说Java# 通过刚才的脚本依次启动3个容器 [root@suaxi docker-test-volume]# docker run -it --name docker01 b0bf8a6507a3 [root@suaxi docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 b0bf8a6507a3 [root@suaxi docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 b0bf8a6507a3 通过volumes实现容器间的数据共享注:即使删除父容器docker01,其他容器中的数据依然存在# 实现多个mysql间的数据同步 [root@suaxi ~]# docker run -d -p 8088:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql [root@suaxi ~]# docker run -d -p 8088:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
2021年03月23日
157 阅读
0 评论
0 点赞
2021-03-21
Docker镜像
1.UnionFS 联合文件系统UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single vritual filesystem)。Union文件系统是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。2.docker镜像加载原理docker镜像本质由一层一层的文件系统组成——UnionFS。bootfs(boot file system)主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与Linux/Unix是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,同时系统也会卸载bootfs。rootfs(root file system)在bootfs之上,包含的就是Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的Linux发行版(Centos、Ubuntu、RealHat...)图片来源:狂神说JavaDocker镜像为什么这么小?对于一个精简的OS,rootfs可以很小,只需要包含基本的命令、工具和程序库,其底层本质上是调用主机的Kernel,本身只需提供rootfs。3.分层理解redis镜像拉取举例:# 查看镜像分层 docker image inspect 镜像名 "RootFS": { "Type": "layers", "Layers": [ "sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864", "sha256:8e14cb7841faede6e42ab797f915c329c22f3b39026f8338c4c75de26e5d4e82", "sha256:1450b8f0019c829e638ab5c1f3c2674d117517669e41dd2d0409a668e0807e96", "sha256:f927192cc30cb53065dc266f78ff12dc06651d6eb84088e82be2d98ac47d42a0", "sha256:a24a292d018421783c491bc72f6601908cb844b17427bac92f0a22f5fd809665", "sha256:3480f9cdd491225670e9899786128ffe47054b0a5d54c48f6b10623d2f340632" ] }, 所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。例:基于Ubuntu16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;继续添加新的软件同理,在添加额外镜像层的同时,镜像始终保持当前所有的镜像组合,例:每个镜像层包含3个文件,而总镜像包含来自两个镜像层的6个文件,下图中的例子在外部看来整个镜像只包含6个文件,这是因为最上层的文件7是文件5的迭代更新版本在这个过程中,上层镜像层中的文件覆盖了底层镜像层中的文件,这使得文件的更新版本作为一个新的镜像层添加到镜像中。docker通过存储引擎(新版使用快照方式)的方式来实现镜像层堆栈,同时保证多层镜像层对外展示为一个统一的文件系统。Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs及ZFS。在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统实现分层和CoW。所有镜像层堆叠并合并,对外展示为统一的文件系统。补充docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,也就是通常所说的容器,容器之下的都叫镜像层。图片来源:狂神说Java5.commit镜像# 命令 docker commit -m="注释信息" -a="作者" 容器id 目标镜像名:[TAG]例:给精简版的tomcat添加一点东西
2021年03月21日
97 阅读
0 评论
0 点赞
2021-03-21
Docker练习
安装Nginx#1、搜索镜像 [root@suaxi ~]# docker search nginx #2、拉取 [root@suaxi ~]# docker pull nginx #3、运行 #参数说明 -d 后台运行 --name 给容器取名字 -p 容器端口:主机端口 [root@suaxi ~]# docker run -d --name nginx01 -p 8088:80 nginx fd78aade29f79d332f6ec1becfeb7ea7400790195682784b0be576fc9e004cf6 [root@suaxi ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fd78aade29f7 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8088->80/tcp nginx01 [root@suaxi ~]# curl localhost:80 # 进入容器 [root@suaxi ~]# docker exec -it nginx01 /bin/bash root@fd78aade29f7:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr root@fd78aade29f7:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@fd78aade29f7:/# 安装tomcat# 官方文档中建议使用的命令(测试环境下) docker run -it --rm tomcat:9.0 # 参数说明:加了 --rm 表名容器用完即删 # 常规测试 docker run -d -p 8088:8080 --name tomcat01 tomcat 注:阿里云docker镜像是默认的最小镜像,剔除了不必要的功能,只保证最小可运行的环境(阉割了部分功能)部署ElasticSearch + Kibana# 启动 --net somenetwork # 网络配置 docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 # es 启动时添加内存限制 docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx256m" elasticsearch:7.6.2# 测试 [root@suaxi ~]# curl localhost:9200 { "name" : "d9efc9b99508", "cluster_name" : "docker-cluster", "cluster_uuid" : "Q3F3eZv_TouzzDW-_JZyTA", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } 图片来源:狂神说Java
2021年03月21日
137 阅读
0 评论
0 点赞
1
2