首页
关于
推荐
搜索定位器
视频解码
电源计划
软件资源
博客友链
搜索
1
开源软件:m3u8.sqlite文件转视频工具
986 阅读
2
欢迎来到我的世界
753 阅读
3
iKuai+Openwrt实现虚拟WAN分流,再也不用担心旁路网关崩了影响全局网络
689 阅读
4
AI:ChatGPT,假如你是Java架构师
662 阅读
5
开源软件:Windows网络驱动器管理工具
629 阅读
资料整理
软件发布
世新家装
萌宠乐园
登录
搜索
标签搜索
Docker
CentOS7
开源软件
Jenkins
MySQL
JVM
世新家装
ZStack
Java
Spring
Shell脚本
docker-compose
iKuai
ESXi
Bean
BeanDefinition
小太阳鹦鹉
欢迎
C#
WPF
卖萌小老头
累计撰写
51
篇文章
累计收到
8
条评论
首页
栏目
资料整理
软件发布
世新家装
萌宠乐园
页面
关于
推荐
搜索定位器
视频解码
电源计划
软件资源
博客友链
搜索到
42
篇与
资料整理
的结果
Spring 源码阅读第一节
SpringBean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理AOP底层原理Spring事务底层原理入门使用Spring的代码:ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); UserService userService = (UserService) context.getBean("userService"); userService.test();这三行代码底层都做了什么,比如:第一行代码,会构造一个ClassPathXmlApplicationContext对象,ClassPathXmlApplicationContext该如何理解,调用该构造方法除开会实例化得到一个对象,还会做哪些事情?第二行代码,会调用ClassPathXmlApplicationContext的getBean方法,会得到一个UserService对象,getBean()是如何实现的?返回的UserService对象和我们自己直接new的UserService对象有区别吗?第三行代码,就是简单的调用UserService的test()方法,不难理解。光看这三行代码,其实并不能体现出来Spring的强大之处,也不能理解为什么需要ClassPathXmlApplicationContext和getBean()方法,随着的深入将会改变你此时的观念,而对于上面的这些疑问,也会随着深入逐步得到解决。对于这三行代码,你现在可以认为:如果你要用Spring,你就得这么写。就像你要用Mybatis,你就得写各种Mapper接口。但是用ClassPathXmlApplicationContext其实已经过时了,在新版的Spring MVC和Spring Boot的底层主要用的都是AnnotationConfigApplicationContext,比如:AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); //ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); UserService userService = (UserService) context.getBean("userService"); userService.test();可以看到AnnotationConfigApplicationContext的用法和ClassPathXmlApplicationContext是非常类似的,只不过需要传入的是一个class,而不是一个xml文件。而AppConfig.class和spring.xml一样,表示Spring的配置,比如可以指定扫描路径,可以直接定义Bean,比如:spring.xml中的内容为:<context:component-scan base-package="com.demo"/> <bean id="userService" class="com.demo.service.UserService"/>AppConfig中的内容为:@ComponentScan("com.demo") public class AppConfig { @Bean public UserService userService(){ return new UserService(); } } 所以spring.xml和AppConfig.class本质上是一样的。目前,我们基本很少直接使用上面这种方式来用Spring,而是使用Spring MVC,或者Spring Boot,但是它们都是基于上面这种方式的,都需要在内部去创建一个ApplicationContext的,只不过:Spring MVC创建的是XmlWebApplicationContext,和ClassPathXmlApplicationContext类似,都是基于XML配置的Spring Boot创建的是AnnotationConfigApplicationContext。因为AnnotationConfigApplicationContext是比较重要的,并且AnnotationConfigApplicationContext和ClassPathXmlApplicationContext大部分底层都是共同的Spring中是如何创建一个对象?其实不管是AnnotationConfigApplicationContext还是ClassPathXmlApplicationContext,目前,我们都可以简单的将它们理解为就是用来创建Java对象的,比如调用getBean()就会去创建对象(此处不严谨,getBean可能也不会去创建对象,后续详解)。在Java语言中,肯定是根据某个类来创建一个对象的。我们在看一下实例代码:AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = (UserService) context.getBean("userService"); userService.test();当我们调用context.getBean("userService")时,就会去创建一个对象,但是getBean方法内部怎么知道"userService"对应的是UserService类呢?所以,我们就可以分析出来,在调用AnnotationConfigApplicationContext的构造方法时,也就是第一行代码,会去做一些事情:解析AppConfig.class,得到扫描路径遍历扫描路径下的所有Java类,如果发现某个类上存在@Component、@Service等注解,那么Spring就把这个类记录下来,存在一个Map中,比如Map<String, Class>。(实际上,Spring源码中确实存在类似的这么一个Map,叫做BeanDefinitionMap,后续会讲到)Spring会根据某个规则生成当前类对应的beanName,作为key存入Map,当前类作为value这样,但调用context.getBean("userService")时,就可以根据"userService"找到UserService类,从而就可以去创建对象了。Bean的创建过程那么Spring到底是如何来创建一个Bean的呢,这个就是Bean创建的生命周期,大致过程如下利用该类的构造方法来实例化得到一个对象(但是如何一个类中有多个构造方法,Spring则会进行选择,这个叫做推断构造方法)得到一个对象后,Spring会判断该对象中是否存在被@Autowired注解了的属性,把这些属性找出来并由Spring进行赋值(依赖注入)依赖注入后,Spring会判断该对象是否实现了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现了,就表示当前对象必须实现该接口中所定义的setBeanName()、setBeanClassLoader()、setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数(Aware回调)Aware回调后,Spring会判断该对象中是否存在某个方法被@PostConstruct注解了,如果存在,Spring会调用当前对象的此方法(初始化前)紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)最后,Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要进行AOP,则会进行动态代理并生成一个代理对象做为Bean(初始化后)通过最后一步,我们可以发现,当Spring根据UserService类来创建一个Bean时:如果不用进行AOP,那么Bean就是UserService类的构造方法所得到的对象。如果需要进行AOP,那么Bean就是UserService的代理类所实例化得到的对象,而不是UserService本身所得到的对象。Bean对象创建出来后:如果当前Bean是单例Bean,那么会把该Bean对象存入一个Map<String,Object>,Map的key为beanName,value为Bean对象。这样下次getBean时就可以直接从Map中拿到对应的Bean对象了。(实际上,在Spring源码中,这个Map就是单例池)如果当前Bean是原型Bean,那么后续没有其他动作,不会存入一个Map,下次getBean时会再次执行上述创建过程,得到一个新的Bean对象。推断构造方法Spring在基于某个类生成Bean的过程中,需要利用该类的构造方法来实例化得到一个对象,但是如果一个类存在多个构造方法,Spring会使用哪个呢?Spring的判断逻辑如下:如果一个类只存在一个构造方法,不管该构造方法是无参构造方法,还是有参构造方法,Spring都会用这个构造方法如果一个类存在多个构造方法这些构造方法中,存在一个无参的构造方法,那么Spring就会用这个无参的构造方法这些构造方法中,不存在一个无参的构造方法,那么Spring就会报错Spring的设计思想是这样的:如果一个类只有一个构造方法,那么没得选择,只能用这个构造方法如果一个类存在多个构造方法,Spring不知道如何选择,就会看是否有无参的构造方法,因为无参构造方法本身表示了一种默认的意义不过如果某个构造方法上加了@Autowired注解,那就表示程序员告诉Spring就用这个加了注解的方法,那Spring就会用这个加了@Autowired注解构造方法了需要重视的是,如果Spring选择了一个有参的构造方法,Spring在调用这个有参构造方法时,需要传入参数,那这个参数是怎么来的呢?Spring会根据入参的类型和入参的名字去Spring中找Bean对象(以单例Bean为例,Spring会从单例池那个Map中去找):先根据入参类型找,如果只找到一个,那就直接用来作为入参如果根据类型找到多个,则再根据入参名字来确定唯一一个最终如果没有找到,则会报错,无法创建当前Bean对象确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做推断构造方法。AOP大致流程AOP就是进行动态代理,在创建一个Bean的过程中,Spring在最后一步会去判断当前正在创建的这个Bean是不是需要进行AOP,如果需要则会进行动态代理。如何判断当前Bean对象需不需要进行AOP:找出所有的切面Bean遍历切面中的每个方法,看是否写了@Before、@After等注解如果写了,则判断所对应的Pointcut是否和当前Bean对象的类是否匹配如果匹配则表示当前Bean对象有匹配的的Pointcut,表示需要进行AOP利用cglib进行AOP的大致流程:生成代理类UserServiceProxy,代理类继承UserService代理类中重写了父类的方法,比如UserService中的test()方法代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的对象)代理类中的test()方法被执行时的逻辑如下:执行切面逻辑(@Before)调用target.test()当我们从Spring容器得到UserService的Bean对象时,拿到的就是UserServiceProxy所生成的对象,也就是代理对象。UserService代理对象.test()--->执行切面逻辑--->target.test(),注意target对象不是代理对象,而是被代理对象。Spring事务当我们在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。Spring事务的代理对象执行某个方法时的步骤:判断当前执行的方法是否存在@Transactional注解如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接修改数据库连接的autocommit为false执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql执行完了之后如果没有出现异常,则提交,否则回滚Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效.
2022年11月06日
195 阅读
0 评论
0 点赞
ZStack打开控制台报错
错误: SeaBIOS (version 1.11.0-2.el7),原因可能CPU型号过早,无法创建云主机或者创建的云主机不能显示console界面的问题官方解决方案:# 1. 配置 vim /etc/modprobe.d/kvm-nested.conf # 修改如下 options kvm_intel nested=1 ept=0 # 2、移除 kvm_intel ,这里可能操作不成功,先操作 第 4 步 rmmod kvm_intel # 3、重新加载 kvm_intel modprobe kvm-intel ept=0 unrestricted_guest=0 # 4、需要重启一下KVM,如果 Zstack 界面重启无效(这里被卡了2个小时),可以直接在服务器上命令行操作 # 查看当前虚拟机 virsh list Id Name State ---------------------------------------------------- 2 10a079cbb9ce45a6a9f719cd751fbcf5 running # 强制关闭 virsh destroy 10a079cbb9ce45a6a9f719cd751fbcf5 # 启动 virsh start 10a079cbb9ce45a6a9f719cd751fbcf5
2022年10月16日
439 阅读
0 评论
0 点赞
2022-10-03
Kubernetes(K8S)环境搭建(kubeadm)
服务器规划k8s-master:10.11.26.81k8s-node1:10.11.26.82k8s-node2:10.11.26.83软件环境操作系统:centos7.4内核版本:3.10.0-693.el7.x86_64Docker:18.09.9K8S:1.23.0Calico:v3.24Calico版本说明:环境准备# 根据规划设置主机名 hostnamectl set-hostname <hostname> # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config # 关闭swap分区 swapoff -a # 临时关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭 # host对应关系 cat >> /etc/hosts <<EOF 10.11.26.81 k8s-master 10.11.26.82 k8s-node1 10.11.26.83 k8s-node2 EOF # 将桥接的IPv4流量传递到iptables的链 # 以下net.ipv4.ip_forward如存在=0,修改为1即可 cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle = 0 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 EOF #net.ipv6.conf.all.disable_ipv6=1 #net.ipv6.conf.all.forwarding=1 #net.ipv6.conf.lo.disable_ipv6=1 #net.ipv6.conf.default.disable_ipv6=1 # 生效 sysctl --system # 时间同步 yum install ntpdate -y ntpdate time.windows.com所有节点安装Docker、kubeadm、kubelet安装docker# 更新软件包和系统内核 yum -y update # 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置yum源 yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 查看可用版本 yum list docker-ce --showduplicates | sort -r # 选定版本安装 yum -y install docker-ce-19.03.9 # 启动并设置开机启动 systemctl enable docker && systemctl start docker # 查看版本 docker version # 配置镜像加速,cgroup驱动等 cat > /etc/docker/daemon.json <<EOF { "graph": "/data/docker", "registry-mirrors": ["https://q4r4fe9a.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF # 重启docker systemctl restart docker # 查看docker信息,进行确认 docker info安装kubeadm、kubelet# 添加k8s阿里软件源 cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg \ https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装 yum install -y \ kubelet-1.23.0 \ kubeadm-1.23.0 \ kubectl-1.23.0 # 启动 systemctl enable kubelet && systemctl start kubelet部署k8smaster和node节点>>> master节点kubeadm部署# 部署 kubeadm init \ --apiserver-advertise-address=10.11.26.81 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.240.0.0/16 \ --ignore-preflight-errors=all<<<< 参数说明 >>>>--apiserver-advertise-address API Server将要广播的监听地址。如指定为 0.0.0.0 将使用缺省的网卡地址。--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址--kubernetes-version 为control plane选择一个特定的Kubernetes版本。缺省值: "stable-1"--service-cidr 集群内部虚拟网络,Pod统一访问入口,缺省值: "10.96.0.0/12"--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致。如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。--apiserver-bind-port int32 API Server绑定的端口。缺省值: 6443--apiserver-cert-extra-sans stringSlice 可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。--cert-dir string 证书的存储路径。缺省值: "/etc/kubernetes/pki"--config string kubeadm配置文件的路径。警告:配置文件的功能是实验性的。--cri-socket string 指明要连接的CRI socket文件。缺省值: "/var/run/dockershim.sock"--dry-run 不会应用任何改变;只会输出将要执行的操作。--feature-gates string 键值对的集合,用来控制各种功能的开关。可选项有:Auditing=true|false (当前为ALPHA状态 - 缺省值=false),CoreDNS=true|false (缺省值=true),DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)-h, > --help 获取init命令的帮助信息--ignore-preflight-errors stringSlice 忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。--node-name string 指定节点的名称。--service-dns-domain string 为services另外指定域名, 例如: "myorg.internal"。缺省值: "cluster.local"--skip-token-print 不打印出由 kubeadm init 命令生成的默认令牌。--token string 这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef--token-ttl duration 令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。缺省值: 24h0m0s如上图图,信息不少。解释说明如下:你的Kubernetes 控制平面已经安装成功!开始使用集群前,你需要用普通用户执行mkdir... 或者你是root用户,执行export...现在应该讲pod网络部署到集群,执行“ kubectl apply -f [podnetwork].yaml ”,其中一个选项列在:https://kubernetes.io/docs/concepts/cluster-administration/addons/然后你可以加入任意数量的工作节点,在每个工作节点上以root身份运行以下命令:kubeadm join...kubeadm部署后,会输出一个join命令,先复制出来,node节点加入master会使用。在运行 kubeadm init 之前可以先执行 kubeadm config images pull 来测试与 gcr.io 的连接,kubeadm config images pull尝试是否可以拉取镜像,由于国内访问"k8s.gcr.io", "gcr.io", "quay.io" 有困难,这里采用自建docker register的方式构建私有镜像docker pull registry docker run --restart=always -d -p 15000:5000 -v /home/registry:/var/lib/registry registry# 本次生成的(node节点执行需要用到) kubeadm join 10.11.26.81:6443 --token ue0jg3.ya6n9z8zfx213xnk \ --discovery-token-ca-cert-hash sha256:0cbd1fe71f7ec93f519eabdcaf47a257785f411365e915f08072eb81c575f99c # 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成 kubeadm token create --print-join-command配置 kubectl# 如上图和说明,拷贝k8s认真文件 # 非root用户执行 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # root用户可执行 export KUBECONFIG=/etc/kubernetes/admin.conf注:以后所有yaml文件都只在Master节点执行。安装目录:/etc/kubernetes/组件配置文件目录:/etc/kubernetes/manifests/node节点开始 >>>node节点执行master节点生成的join命令# 这里复制master生成的一串命令(如果已过期,需要重新生成,请看文章上边的说明) kubeadm join 10.11.26.81:6443 --token ue0jg3.ya6n9z8zfx213xnk \ --discovery-token-ca-cert-hash sha256:0cbd1fe71f7ec93f519eabdcaf47a257785f411365e915f08072eb81c575f99cnode节点结束 <<<继续master节点运行查看加入的node节点NotReady是因为网络插件,继续# 获取node节点 kubectl get nodes如上图,现在所有节点是NotReady,需要安装网络插件,master节点部署时提到过。安装网络插件(CNI)在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置,不同版本的可能会不兼容,具体请参考:https://projectcalico.docs.tigera.io/about/about-calicohttps://projectcalico.docs.tigera.io/releases# 下载配置文件 wget https://docs.projectcalico.org/manifests/calico.yaml # 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。 # 修改完成部署(过程可能会失败) kubectl apply -f calico.yaml kubectl get pod --all-namespaces -o wide # 执行结束要等上一会才全部running kubectl get pods -n kube-system 以上操作执行完成后,master节点执行kubectl get nodes,可以看到status ready测试集群在Kubernetes集群中创建一个pod,验证是否正常运行创建一个pod,开放对外端口访问,这里会随机映射一个端口kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort查看pod状态,必须是running状态而且ready是1,并查看nginx svc的80端口映射到了哪个端口kubectl get pod,svc访问任意机器的刚刚查看的映射端口,看看是否nginx已经运行部署DashboardDashboard是官方提供的一个UI,可用于基本管理K8s资源。由于 K8s 版本不同,具体去这里查看对应的版本:https://github.com/kubernetes/dashboard/releases当前可用支持版本2.5.0wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml构建Podkubectl apply -f recommended.yaml查看 Pod 状态kubectl get pods --all-namespaces | grep dashboard kubectl get svc --all-namespacesdashboard 服务的 namespace 是 kubernetes-dashboard,但是该服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要改成 NodePort 类型的,删除现有的 dashboard 服务kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard创建配置文件dashboard-svc.yaml,内容如下:kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30001 selector: k8s-app: kubernetes-dashboard创建servicekubectl apply -f dashboard-svc.yaml 再次查看服务kubectl get svc --all-namespaces结果如下图:访问地址:https://NodeIP:30001,需要Token才能登陆哦。继续往下创建用户获取授权Token。创建service account并绑定默认cluster-admin管理员集群角色# 创建用户 kubectl create serviceaccount dashboard-admin -n kube-system # 用户授权 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin # 获取用户Token kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') # 本次得到Token eyJhbGciOiJSUzI1NiIsImtpZCI6InZLS292Q0UwRlNFUGRwRU9ySWlYNkRESkZNcjhpQ3Nic1kyM0hPdnNlV28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tNGM2NDkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTQ3ODE5MzgtZDJiZi00MTEyLTlkMTUtNjk3YThiZTJhNDc5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.0XTLd8Zgi1R44LmJhMhYdu1GqmihKr0ePtXFtLXQm9ddckHyrr-bWdlW50ppqikdVKCjC9cxrNcYKOvXWO1iqo1wsh89MHlXSMihyfl35BAig-hZbGAZWrmpyEawGwiS22dcS3t6iyvZDqkRriZ1-Zch8gRPol9P5gmtzv1AN62w0oJyTbHTK9emKymRyGU_eSKKGv12jmP0y1_ko40SAAh37CebDYrNo_tKcLeHxMJUVvVIxteqpV8C60tf15xSBaEt9g0fdvEXg0D84Pe314B-B5t7jmwrtbLR8EhukMV2Ngp2pKU6Q-fxjdx27WTDwOOvB5ohVJgQySMnc271hA输入token登陆成功k8s常用命令# 启动一个 Kubernetes 主节点 kubeadm init # 启动一个 Kubernetes 工作节点并且将其加入到集群 kubeadm join # 更新一个 Kubernetes 集群到新版本 kubeadm upgrade # 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令 kubeadm config # 管理 kubeadm join 使用的令牌 kubeadm token # 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改 kubeadm reset # 查看pod,service,endpoints,secret等等的状态 kubectl get 组件名 # 例如kubectl get pod 查看详细信息可以加上-o wide 其他namespace的指定 -n namespace名 # 创建,变更一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件(实际使用中都是以yaml文件为主,直接使用命令创建pod的很少,推荐多使用yaml文件) kubectl apply -f xxx.yaml # 例如kubectl apply -f nginx.yaml 这里是如果没有则创建,如果有则变更,比create好用 # 删除一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件 kubectl delete -f xxx.yaml # 例如kubectl delete -f nginx.yaml # 查看资源状态,比如有一组deployment内的pod没起来,一般用于pod调度过程出现的问题排查 kubectl describe pod pod名 # 先用kubectl get pod查看 有异常的复制pod名使用这个命令 # 查看pod日志,用于pod状态未就绪的故障排查 kubectl logs pod名 # 先用kubectl get pod查看 有异常的复制pod名使用这个命令 # 查看node节点或者是pod资源(cpu,内存资源)使用情况 kubectl top 组件名 # 例如kubectl top node kubectl top pod # 进入pod内部 kubectl exec -ti pod名 /bin/bash # 先用kubectl get pod查看 有需要的复制pod名使用这个命令
2022年10月03日
410 阅读
0 评论
0 点赞
Docker的Allinone环境
本地Docker环境(service all in docker)centos软件源#1、备份,将 CentOS-Base.repo 为CentOS-Base.repo.backup cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 2、下载新的 http://mirrors.aliyun.com/repo/Centos-7.repo,并命名为CentOS-Base.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #或者 #curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 3、清除缓存 yum clean all # 清除系统所有的yum缓存 yum makecache # 生成yum缓存安装Docker服务内核版本检查:3.10满足条件uname -r卸载旧版本(如果之前安装过)yum remove docker docker-common docker-selinux docker-engine安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖yum install -y yum-utils device-mapper-persistent-data lvm2设置yum源yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo选择docker版本并安装查看docker可用版本yum list docker-ce --showduplicates | sort -r选择版本并安装yum -y install docker-ce-19.03.9启动docker并设置开机自启systemctl enable docker && systemctl start dockerDocker镜像加速创建或修改 /etc/docker/daemon.json{ "registry-mirrors": [ "https://<your_code>.mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.nju.edu.cn" ] }镜像加速器镜像加速器地址专属加速器?其它加速?DaoCloud 镜像站https://docker.m.daocloud.io白名单模式Docker Hub、GCR、K8S、GHCR、Quay、NVCR 等阿里云https://<your_code>.mirror.aliyuncs.com需登录,系统分配Docker HubDocker 镜像代理https://dockerproxy.com Docker Hub、GCR、K8S、GHCR百度云https://mirror.baidubce.com Docker Hub南京大学镜像站https://docker.nju.edu.cn Docker Hub、GCR、GHCR、Quay、NVCR 等中科院软件所镜像站https://mirror.iscas.ac.cn Docker Hub安装Docker图形化# 图形化:portainer # 当前密码:Portainer2022 docker run -d \ --name portainer \ --restart always \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/portainer:/data \ portainer/portainer # portainer忘记密码 # 1、停止portainer容器 # 2、执行密码重置命令: docker run --rm -v /home/portainer:/data portainer/helper-reset-password # 3、查看控制台打印的账号和密码 # 图形化:docker.ui # 初始化账号密码:ginghan/123456 docker run -d \ --name docker.ui \ --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 9001:8999 \ joinsunsoft/docker.ui # 图形化:ui-for-docker docker run -d \ --name docker-web \ --restart always \ -p 9002:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/docker-web:/data \ docker.io/uifd/ui-for-docker # 图形化:lazydocker lazydocker安装MySQL# 二选一 # 5.7.40版本 docker run -d \ --restart=always \ --name mysql \ -p 3306:3306 \ -p 33060:33060 \ -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /home/mysql/logs:/logs \ -v /home/mysql/data:/mysql_data \ -e MYSQL_ROOT_PASSWORD=root \ mysql:5.7.40 # 8.0.27 docker run -d \ --name mysql8 \ --restart always \ --privileged=true \ -p 3307:3306 \ -p 33070:33060 \ -v /home/mysql8/data:/var/lib/mysql \ -v /home/mysql8/conf:/etc/mysql/conf.d \ -v /home/mysql8/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORD=root \ mysql:8.0.27安装Postgresqldocker run -it \ --name postgres \ --restart always \ -e POSTGRES_PASSWORD='root' \ -e ALLOW_IP_RANGE=0.0.0.0/0 \ -v /home/postgres/data:/var/lib/postgresql \ -p 5432:5432 \ -d \ postgres:14–name : 自定义容器名称POSTGRES_PASSWORD:数据库密码-e ALLOW_IP_RANGE=0.0.0.0/0,这个表示允许所有ip访问,如果不加,则非本机 ip 访问不了-v :进行映射,本地目录:容器内路径-p:映射端口,宿主机端口:容器端口最后是 镜像名称:端口号# 进入容器 docker exec -it postgres bash # 当前root切换成postgres su postgres # 输入用户名,密码再执行完后 psql -U postgres -W设置远程访问许可(非常重要)需要修改两个配置文件:pg_hba.conf、postgresql.conf# 拷贝文件出来,并修改 docker cp postgres:/var/lib/postgresql/data/pg_hba.conf /home/postgres/ # IPV4位置增加 host all all 0.0.0.1/0 md5 # 文件拷贝回去 docker cp /home/postgres/pg_hba.conf postgres:/var/lib/postgresql/data/ # postgresql.conf文件拷贝类似 docker cp postgres:/var/lib/postgresql/data/postgresql.conf /home/postgres/ # postgresql.conf文件修改内容 listen_addresses = '*' # 文件拷贝回去 docker cp /home/postgres/postgresql.conf postgres:/var/lib/postgresql/data/安装Redis下载对应版本的配置文件:https://redis.io/topics/config/修改配置文件:bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问protected-mode no #默认yes,开启保护模式,限制为本地访问daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程(可选),改为yes会使配置文件方式启动redis失败dir ./ #输入本地redis数据库存放文件夹(可选)appendonly yes #redis持久化(可选)启动reidsdocker run \ --restart=always \ --name redis \ -p 6379:6379 \ -v /home/redis/redis.conf:/etc/redis/redis.conf \ -v /home/redis/data:/data \ -d redis:5.0 \ redis-server /etc/redis/redis.conf \ --appendonly yes # 不挂载配置文件 docker run \ --name redis \ --restart=always \ --requirepass "这是密码" \ -p 6379:6379 \ -d redis redis-server \ --appendonly yes安装RocketMQ# 拉取镜像 docker pull rocketmqinc/rocketmq # 启动nameserver docker run -d \ --restart=always \ --name rmqnamesrv \ -p 9876:9876 \ -v /home/rocketmq/data/namesrv/logs:/home/logs \ -v /home/rocketmq/data/namesrv/store:/home/store \ -v /usr/local/jdk1.8.0_202:/usr/local/jdk \ -e "MAX_POSSIBLE_HEAP=100000000" \ rocketmqinc/rocketmq:4.4.0 \ sh mqnamesrv vi /home/rocketmq/conf/broker.conf # 所属集群名称,如果节点较多可以配置多个 brokerClusterName = DefaultCluster #broker名称,master和slave使用相同的名称,表明他们的主从关系 brokerName = broker-a #0表示Master,大于0表示不同的slave brokerId = 0 #表示几点做消息删除动作,默认是凌晨4点 deleteWhen = 04 #是否允许Broker自动创建订阅组,建议线上关闭 autoCreateTopicEnable = true #是否允许Broker自动创建订阅组,建议线上关闭 autoCreateSubscriptionGroup = true #在磁盘上保留消息的时长,单位是小时 fileReservedTime = 48 #有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制; brokerRole = ASYNC_MASTER #刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要; flushDiskType = ASYNC_FLUSH #设置broker节点所在服务器的ip地址 brokerIP1 = 10.11.27.16 #磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full diskMaxUsedSpaceRatio=95 # 启动broker docker run -d \ --restart=always \ --name rmqbroker \ --link rmqnamesrv:namesrv \ -p 10911:10911 \ -p 10909:10909 \ -v /home/rocketmq/data/broker/logs:/home/logs \ -v /home/rocketmq/data/broker/store:/home/store \ -v /home/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \ -v /usr/local/jdk1.8.0_202:/usr/local/jdk \ -e "NAMESRV_ADDR=namesrv:9876" \ -e "MAX_POSSIBLE_HEAP=200000000" \ rocketmqinc/rocketmq:4.4.0 \ sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf # 拉取镜像rocketmq-console docker pull pangliang/rocketmq-console-ng # 启动rockermq-console docker run -d \ --restart=always \ --name rmqadmin \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.11.27.16:9876 \ -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 10800:8080 \ pangliang/rocketmq-console-ng安装Nacos# 拉取镜像 docker pull nacos/nacos-server:v2.1.0 # 自定义配置文件 vim /home/nacos/init.d/custom.properties # 配置文件内容 management.endpoints.web.exposure.include = * # 创建并启动容器(A、B两个方案) # A、创建容器:使用standalone模式并开放8848端口,并映射配置文件和日志目录,数据库默认使用 Derby docker run -d \ --restart always \ --name nacos \ -p 8848:8848 \ -e MODE=standalone \ -e PREFER_HOST_MODE=hostname \ -v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \ -v /home/nacos/logs:/home/nacos/logs \ nacos/nacos-server:v2.1.0 # B、使用docker-compose启动 # 首先配置docker-compose文件 standalone-derby.yaml # 配置文件内容 version: "2" services: nacos: image: nacos/nacos-server:latest container_name: nacos environment: - MODE=standalone volumes: - /home/nacos/logs:/home/nacos/logs - /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties ports: - "8848:8848" # 启动、关闭、移除、关闭并移除命令如下: # 启动 docker-compose -f standalone-derby.yaml up # 关闭 docker-compose -f standalone-derby.yaml stop # 移除 docker-compose -f standalone-derby.yaml rm # 关闭并移除 docker-compose -f standalone-derby.yaml down # 依赖mysql数据库 docker run -d \ --restart always \ --name nacos \ -p 8848:8848 \ -e MODE=standalone \ -e PREFER_HOST_MODE=hostname \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=10.11.27.16 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=root \ -e MYSQL_DATABASE_NUM=1 \ -v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \ -v /home/nacos/logs:/home/nacos/logs \ nacos/nacos-server:v2.1.0 # 访问http://ip:8848/nacos/ 账号默认nacos、密码默认nacos(mysql数据库为数据库配置的密码)安装Jekins# 环境准备 # 1、JDK wget https://download.oracle.com/otn/java/jdk/jdk-8u202-linux-x64.tar.gz tar -zxvf jdk-8u202-linux-x64.tar.gz mv jdk1.8.0_202 /usr/local/jdk1.8.0_202 # 2、Maven wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz tar -zxvf apache-maven-3.8.6-bin.tar.gz mv apache-maven-3.8.6 /usr/local/apache-maven-3.8.6 # 3、NodeJS wget https://nodejs.org/download/release/v14.18.1/node-v14.18.1-linux-x64.tar.gz tar -zxvf node-v14.18.1-linux-x64.tar.gz mv node-v14.18.1-linux-x64 /usr/local/node-v14.18.1-linux-x64 # 新建目录并修改权限!!!非常重要!!! mkdir /home/jenkins chown -R 1000 /home/jenkins # 安装 docker run \ --name jenkins \ --restart=always \ -p 8098:8080 \ -p 50000:50000 \ -u root \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/bin/docker \ -v /etc/localtime:/etc/localtime \ -v /usr/local/jdk1.8.0_202:/usr/local/jdk \ -v /usr/local/apache-maven-3.8.6:/usr/local/maven \ -v /usr/local/node-v14.18.1-linux-x64:/usr/local/nodejs \ -v /home/docker/tmp:/var/lib/docker/tmp \ -v /home/jenkins:/var/jenkins_home \ -d jenkins/jenkins # 访问查看密码 docker exec -it {容器ID} bash cat /var/jenkins_home/secrets/initialAdminPassword # 本次搭建密码 e574970ad40f46dcb9736f87733dd22b -> sa2022 # 忘记密码 -> 重置密码为:123456 # 1、修改<passwordHash>******</passwordHash>标签(含中间内容)为: # 2、<passwordHash>#jbcrypt:$2a$10$LxMm9HqAI/R4z7gL57qTouW/Mrz8uSaBpCGKvKc7K6dK.g/0yk/uq</passwordHash> # 3、保存修改 # 4、重启jenkins -> 使用默认密码登录 -> 修改新密码 cd /home/jenkins/users/{user_******} vim config.xml安装Nginx# --link answer-server:answerserver \ docker run -d \ --name nginx \ --restart=always \ -p 80:80 \ -p 443:443 \ -v /home/nginx/html:/usr/share/nginx/html \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /home/nginx/logs:/var/log/nginx \ nginx安装Zipkin1. 首先在MySQL库新建zipkin库,并执行以下SQLCREATE TABLE IF NOT EXISTS zipkin_spans ( `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', `trace_id` BIGINT NOT NULL, `id` BIGINT NOT NULL, `name` VARCHAR(255) NOT NULL, `remote_service_name` VARCHAR(255), `parent_id` BIGINT, `debug` BIT(1), `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL', `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query', PRIMARY KEY (`trace_id_high`, `trace_id`, `id`) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds'; ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames'; ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames'; ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range'; CREATE TABLE IF NOT EXISTS zipkin_annotations ( `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id', `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1', `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB', `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation', `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp', `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address', `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null' ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds'; ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames'; ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values'; ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job'; CREATE TABLE IF NOT EXISTS zipkin_dependencies ( `day` DATE NOT NULL, `parent` VARCHAR(255) NOT NULL, `child` VARCHAR(255) NOT NULL, `call_count` BIGINT, `error_count` BIGINT, PRIMARY KEY (`day`, `parent`, `child`) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;2. 启动zipkin服务docker run -d \ --restart always \ --name zipkin \ -p 9411:9411 \ -v /etc/localtime:/etc/localtime:ro \ -e STORAGE_TYPE=mysql \ -e MYSQL_USER=root \ -e MYSQL_PASS=root \ -e MYSQL_HOST=10.11.27.16 \ -e MYSQL_DB=zipkin \ -e MYSQL_TCP_PORT=3306 \ openzipkin/zipkin
2022年10月01日
499 阅读
1 评论
0 点赞
2022-09-20
ZStack真的很好用
如果你准备上ESXi,或者还是单独一台机器安装了VMWare。何不尝试一下ZStack?当你需要一个集群环境时,可以快速创建所需的机器。程序员学习环境搭建,测试真的很方便。因为站点或者播放器原因可能无法播放,可以通过连接下载视频。 简单演示示例视频 {dplayer src="http://cdn.appom.cn/images/202303010219419.mp4"/}
2022年09月20日
233 阅读
0 评论
0 点赞
2022-09-18
docker-compose笔记
docker 和 docker-compose 对比1、Docker进行项目部署存在的问题2、假设未编排的容器启动顺序缺陷:容器间,不能使用容器名称访问什么是Docker Composecompose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排快速编排:站在项目角度讲一组相关联容器整合在一起,对这组容器按照指定顺序启动。compose定位于多个docker容器管理理解docker-compose.yml 就是一个compose应用(project)应用(project)就是docker-compose.ymlProject:有一组关联的应用容器(服务)组成一个完整的业务单元,在docker-compose.yml文件中定义Service:一个项目中某一个容器,称之为服务安装注意:只有Linux平台上安装Docker时,没有安装docker-compose,Windows、MacOS安装Docker时自动安装docker-compose1、在线安装# 下载文件,{1.16.1}为变量,根据自己的需求下载 sudo curl -L https://github.com/docker/compose/releases/download/{1.16.1}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 修改权限 chmod +x /usr/local/bin/docker-compose2、离线安装# a、下载docker-compose脚本 # b、放入/usr/local/bin目录 # c、修改权限命令指定这个命令在docker-compose.yml配置文件目录docker-compose up # 启动 docker-compose down # 停止docker-compose 命令 项目|项目中某个服务 注意:没有特殊说明,默认都是对项目操作语法:docker-compose -f docker-compose.yml 命令 [选项] [服务ID]up -d [服务ID] docker-compose up 启动整个项目docker-compose up [服务ID] 对当前docker-compose中对应的服务ID的容器操作down docker-compose down 停止整个项目docker-compose down [服务ID] 注意:docker-compose down 关闭所有容器,并溢出网络exec docker-compose exec [服务ID] bash # 进入指定容器ps docker-compose ps # 列出所有运行的服务,-q 只显示IDrestart docker-compose restart 重启整个项目docker-compose restart -t 20 [服务ID] 20s后重启指定服务容器rmdocker-compose rm -f(强制删除) [服务ID] -v(删除容器锁挂载的数据卷)不指定服务ID时,删除所有停止的服务注意:-v谨慎使用topdocker-compose top [服务ID] 查看整个项目中所有服务容器内运行进程或指定服务ID的容器的进程pause暂停 和 unpause回复docker-compose (pause|unpause) [服务ID] 暂停或回复所有服务或指定服务ID的服务logsdocker-compose logs -f(实时)[服务ID] 查看日志示例docker-compose.yaml(引用已有镜像的)# 代表使用docker-compose项目的版本号 # https://docs.docker.com/compose/compose-file/compose-file-v3/ version: "3" services: app: #container_name:web-app1 # 代表给容器指定一个名称 类似于docker run --name 参数 image: app:1.0 ports: - 8080:8080 redis: image: redis:5.0.21 ports: - 6379:6379 mysql: image: mysql:5.7.21 ports: - 3306:3306 environment: # 代表给当前容器指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root - "MYSQL_ROOT_PASSWORD=root" volumes: #- /home/mysql/data:/var/lib/mysql # 绝对路径 - mysqlData:/var/lib/mysql # 相对路径,但是需要先申明 volumes: mysqlData:docker-compose.yaml(根据Dockerfile构建)# 代表使用docker-compose项目的版本号 # https://docs.docker.com/compose/compose-file/compose-file-v3/ version: "3" services: apps: # build: ./ # 指定Dockerfile上下文目录,一切都是默认值 build: context: ./ # 指定Dockerfile上下文目录 dockerfile: Dockerfile # 指定Dockerfile文件名称 ports: - 8085:8085 # command:["app-2.0.jar"] # 用来覆盖容器启动后默认指令,类似于docker run image 覆盖的指令 depends_on: - mysql - redis networks: - appNetwork redis: image: redis:5.0.21 ports: - 6379:6379 networks: - appNetwork mysql: image: mysql:5.7.21 ports: - 3306:3306 #environment: # 代表给当前容器指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root #MYSQL_ROOT_PASSWORD: root env_file: - ./common.env - ./config.env volumes: #- /home/mysql/data:/var/lib/mysql # 绝对路径 - mysqlData:/var/lib/mysql # 相对路径,但是需要先申明 networks: - appNetwork # 申明存储卷 volumes: mysqlData: # 声明网桥 networks: appNetwork:common.env 文件MYSQL_ROOT_PASSWORD: root自定义build,而不是应用已有镜像docker-compose.yml中支持模板命令build 通过docker-compose在启动容器之前根据Dockerfile构建镜像,然后根据构建镜像启动容器command 覆盖容器启动后默认执行的命令container_name 指定docker-compose启动容器名称,(注意:不推荐指定容器名称)depends_on 解决容器的依赖,启动先后的问题注意:当前服务不会等待被依赖的服务【完全启动】之后才启动environment 用来给容器启动指定环境变量,相当于docker run -eenv_file 用来给容器指定环境变量文件expose 用来指定构建镜像过程中容器暴露的端口号image 用来指定启动容器使用的镜像是谁,相当于docker run image(镜像)network 用来指定启动的容器使用的网桥,相当于docker run --networkports 用来指定宿主机和容器之间的端口映射,相当于docker run -pvolumes 用来指定宿主机目录和容器中目录映射,相当于docker run -vrestart 用来指定docker容器(服务)总是运行,相当于docker run --restart=always
2022年09月18日
346 阅读
0 评论
0 点赞
1
...
4
5
6
7