1. centos7中的docker在push时出现访问被拒绝
两种方法,第一种是rpm包 不用教了吧第二种是源码包,一般解压到/usr/local/git,在/etc/profile.d/目录下声明一下环境变量就可以了
2. 如何配置docker远程访问 验证
前篇笔记中搞定了一个镜像并安装了jdk
本想着这tomcat会更简单,后来发现我错了。
且看下面过程:
我这个镜像原始的系统就有openssh,只需要进到镜像里 passwd一个新的密码。退出后commit一下就添加了一个ssh服务。
之后通过以下命令在后台启动镜像,执行ssh服务,开放22端口
1
docker run -d -p 22 ubuntu64:14.04 /usr/sbin/sshd -D
回车后打出容器的ID号就返回了
那我们怎么知道这容器当前什么情况呢?
1
docker ps
列出当前还在运行中的容器
能看到列表中的容器id。还有一条有用的信息是PORTS列,说明宿主机的49153映射到的容器22端口上了。
这时就可以通过putty或scp之类的连接上去进行操作了。
现在我已经把tomcat解压放到/usr/local/java目录下了。
并通过startup.sh启动测试正常.
ok exit +commit
怎么能在镜像启动时就把tomcat启起来呢??
学着之前的命令
1
docker run -it ubuntu_tomcat:7.0.55 /usr/local/java/apache-tomcat-7.0.55/bin/startup.sh
结果得到了如下的响应:
没有环境变量
进到镜像里,查看/etc/profile,明明是有的。之前通过ssh进去也是可以启动的,这是为什么呢?
linux的启动过程里,/etc/profile是在用户登录的时候执行,在命令行run的时候可能是不会进行登录操作,所以没有相应的环境变量。但是我们启动了ssh服务,从远程是通过登录进的系统,这时候就会有环境变量了。
猜出了这原因,怎么解决呢?
run命令是可以挂环境变量参数的。但是这样命令本身就会很复杂。
ok,这个时候就要Dockerfile出场了。
Dockerfile是一个用于创建镜像的工具,它的用法是这样。在当前目录建一个名为Dockerfile的文件。执行docker build:
1
docker build -t="tomcat:7.0.55" .
就会创建一个tomcat:7.0.55的镜像。
那么docker怎么知道这个镜像怎么建呢。需求要我们在Dockerfile文件中说明。
现在来看一下我这次用的Dockerfile文件的内容:
1
2
3
4
5
6
FROM ubuntu_tomcat:7.0.55
ENV JAVA_HOME /usr/local/java/jdk1.7.0_67
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
CMD /usr/local/java/apache-tomcat-7.0.55/bin/catalina.sh run
FROM 指源自哪个镜像创建
ENV 指定环境变量
CMD 镜像启动时默认执行的命令,在这里我们默认把tomcat跑起来。
执行完build以后用images看一下新的镜像
启动一下。
1
docker run -d -p 80:8080 tomcat:7.0.55
把宿主机的80端口映射给镜像的8080。
再用ps命令看一下当前容器:
镜像已经正常跑起来了,端口与已经映射好了。
访问宿主机IP,就可以看到大猫图了。
用logs命令可以看到tomcat的日志。
1
docker logs ff5533
ff5533就是容器的ID
还可以用stop指令关闭容器
1
docker stop ff5533
ok,一个tomcat的服务镜像就搞定了。
3. 请教kubernetes部署问题,pod一直处于pending状态
我们先从整体上看一下Kubernetes的一些理念和基本架构,然后从网络、资源管理、存储、服务发现、负载均衡、高可用、rollingupgrade、安全、监控等方面向大家简单介绍Kubernetes的这些主要特性。当然也会包括一些需要注意的问题。主要目的是帮助大家快速理解Kubernetes的主要功能,今后在研究和使用这个具的时候有所参考和帮助。1.Kubernetes的一些理念:用户不需要关心需要多少台机器,只需要关心软件(服务)运行所需的环境。以服务为中心,你需要关心的是api,如何把大服务拆分成小服务,如何使用api去整合它们。保证系统总是按照用户指定的状态去运行。不仅仅提给你供容器服务,同样提供一种软件系统升级的方式;在保持HA的前提下去升级系统是很多用户最想要的功能,也是最难实现的。那些需要担心和不需要担心的事情。更好的支持微服务理念,划分、细分服务之间的边界,比如lablel、pod等概念的引入。对于Kubernetes的架构,可以参考官方文档。大致由一些主要组件构成,包括Master节点上的kube-apiserver、kube-scheler、kube-controller-manager、控制组件kubectl、状态存储etcd、Slave节点上的kubelet、kube-proxy,以及底层的网络支持(可以用Flannel、OpenVSwitch、Weave等)。看上去也是微服务的架构设计,不过目前还不能很好支持单个服务的横向伸缩,但这个会在Kubernetes的未来版本中解决。2.Kubernetes的主要特性会从网络、服务发现、负载均衡、资源管理、高可用、存储、安全、监控等方面向大家简单介绍Kubernetes的这些主要特性->由于时间有限,只能简单一些了。另外,对于服务发现、高可用和监控的一些更详细的介绍,感兴趣的朋友可以通过这篇文章了解。1)网络Kubernetes的网络方式主要解决以下几个问题:a.紧耦合的容器之间通信,通过Pod和localhost访问解决。b.Pod之间通信,建立通信子网,比如隧道、路由,Flannel、OpenvSwitch、Weave。c.Pod和Service,以及外部系统和Service的通信,引入Service解决。Kubernetes的网络会给每个Pod分配一个IP地址,不需要在Pod之间建立链接,也基本不需要去处理容器和主机之间的端口映射。注意:Pod重建后,IP会被重新分配,所以内网通信不要依赖PodIP;通过Service环境变量或者DNS解决。2)服务发现及负载均衡kube-proxy和DNS,在v1之前,Service含有字段portalip和publicIPs,分别指定了服务的虚拟ip和服务的出口机ip,publicIPs可任意指定成集群中任意包含kube-proxy的节点,可多个。portalIp通过NAT的方式跳转到container的内网地址。在v1版本中,publicIPS被约定废除,标记为deprecatedPublicIPs,仅用作向后兼容,portalIp也改为ClusterIp,而在serviceport定义列表里,增加了nodePort项,即对应node上映射的服务端口。DNS服务以addon的方式,需要安装skydns和kube2dns。kube2dns会通过读取KubernetesAPI获取服务的clusterIP和port信息,同时以watch的方式检查service的变动,及时收集变动信息,并将对于的ip信息提交给etcd存档,而skydns通过etcd内的DNS记录信息,开启53端口对外提供服务。大概的DNS的域名记录是servicename.namespace.tenx.domain,"tenx.domain"是提前设置的主域名。注意:kube-proxy在集群规模较大以后,可能会有访问的性能问题,可以考虑用其他方式替换,比如HAProxy,直接导流到Service的endpints或者Pods上。Kubernetes官方也在修复这个问题。3)资源管理有3个层次的资源限制方式,分别在Container、Pod、Namespace层次。Container层次主要利用容器本身的支持,比如Docker对CPU、内存、磁盘、网络等的支持;Pod方面可以限制系统内创建Pod的资源范围,比如最大或者最小的CPU、memory需求;Namespace层次就是对用户级别的资源限额了,包括CPU、内存,还可以限定Pod、rc、service的数量。资源管理模型-》简单、通用、准确,并可扩展目前的资源分配计算也相对简单,没有什么资源抢占之类的强大功能,通过每个节点上的资源总量、以及已经使用的各种资源加权和,来计算某个Pod优先非配到哪些节点,还没有加入对节点实际可用资源的评估,需要自己的schelerplugin来支持。其实kubelet已经可以拿到节点的资源,只要进行收集计算即可,相信Kubernetes的后续版本会有支持。4)高可用主要是指Master节点的HA方式官方推荐利用etcd实现master选举,从多个Master中得到一个kube-apiserver保证至少有一个master可用,实现highavailability。对外以loadbalancer的方式提供入口。这种方式可以用作ha,但仍未成熟,据了解,未来会更新升级ha的功能。一张图帮助大家理解:也就是在etcd集群背景下,存在多个kube-apiserver,并用pod-master保证仅是主master可用。同时kube-sheller和kube-controller-manager也存在多个,而且伴随着kube-apiserver同一时间只能有一套运行。5)rollingupgradeRC在开始的设计就是让rollingupgrade变的更容易,通过一个一个替换Pod来更新service,实现服务中断时间的最小化。基本思路是创建一个复本为1的新的rc,并逐步减少老的rc的复本、增加新的rc的复本,在老的rc数量为0时将其删除。通过kubectl提供,可以指定更新的镜像、替换pod的时间间隔,也可以rollback当前正在执行的upgrade操作。同样,Kuberntes也支持多版本同时部署,并通过lable来进行区分,在service不变的情况下,调整支撑服务的Pod,测试、监控新Pod的工作情况。6)存储大家都知道容器本身一般不会对数据进行持久化处理,在Kubernetes中,容器异常退出,kubelet也只是简单的基于原有镜像重启一个新的容器。另外,如果我们在同一个Pod中运行多个容器,经常会需要在这些容器之间进行共享一些数据。Kuberenetes的Volume就是主要来解决上面两个基础问题的。Docker也有Volume的概念,但是相对简单,而且目前的支持很有限,Kubernetes对Volume则有着清晰定义和广泛的支持。其中最核心的理念:Volume只是一个目录,并可以被在同一个Pod中的所有容器访问。而这个目录会是什么样,后端用什么介质和里面的内容则由使用的特定Volume类型决定。创建一个带Volume的Pod:spec.volumes指定这个Pod需要的volume信息spec.containers.volumeMounts指定哪些container需要用到这个VolumeKubernetes对Volume的支持非常广泛,有很多贡献者为其添加不同的存储支持,也反映出Kubernetes社区的活跃程度。emptyDir随Pod删除,适用于临时存储、灾难恢复、共享运行时数据,支持RAM-backedfilesystemhostPath类似于Docker的本地Volume用于访问一些本地资源(比如本地Docker)。gcePersistentDiskGCEdisk-只有在GoogleCloudEngine平台上可用。awsElasticBlockStore类似于GCEdisk节点必须是AWSEC2的实例nfs-支持网络文件系统。rbd-RadosBlockDevice-Cephsecret用来通过KubernetesAPI向Pod传递敏感信息,使用tmpfs(aRAM-backedfilesystem)persistentVolumeClaim-从抽象的PV中申请资源,而无需关心存储的提供方glusterfsiscsigitRepo根据自己的需求选择合适的存储类型,反正支持的够多,总用一款适合的:)7)安全一些主要原则:基础设施模块应该通过APIserver交换数据、修改系统状态,而且只有APIserver可以访问后端存储(etcd)。把用户分为不同的角色:Developers/ProjectAdmins/Administrators。允许Developers定义secrets对象,并在pod启动时关联到相关容器。以secret为例,如果kubelet要去pull私有镜像,那么Kubernetes支持以下方式:通过dockerlogin生成.dockercfg文件,进行全局授权。通过在每个namespace上创建用户的secret对象,在创建Pod时指定imagePullSecrets属性(也可以统一设置在serviceAcouunt上),进行授权。认证(Authentication)APIserver支持证书、token、和基本信息三种认证方式。授权(Authorization)通过apiserver的安全端口,authorization会应用到所有http的请求上AlwaysDeny、AlwaysAllow、ABAC三种模式,其他需求可以自己实现Authorizer接口。8)监控比较老的版本Kubernetes需要外接cadvisor主要功能是将node主机的containermetrics抓取出来。在较新的版本里,cadvior功能被集成到了kubelet组件中,kubelet在与docker交互的同时,对外提供监控服务。Kubernetes集群范围内的监控主要由kubelet、heapster和storagebackend(如influxdb)构建。Heapster可以在集群范围获取metrics和事件数据。它可以以pod的方式运行在k8s平台里,也可以单独运行以standalone的方式。注意:heapster目前未到1.0版本,对于小规模的集群监控比较方便。但对于较大规模的集群,heapster目前的cache方式会吃掉大量内存。因为要定时获取整个集群的容器信息,信息在内存的临时存储成为问题,再加上heaspter要支持api获取临时metrics,如果将heapster以pod方式运行,很容易出现OOM。所以目前建议关掉cache并以standalone的方式独立出k8s平台。
4. 局域网服务器上装docker怎么访问地址csdn
可以创建Dockerfile依赖mysql镜像创建一个新的镜像。 上诉命令通过RUN来执行创建的新容器会有安装的软件。 最后通过slave的docker连接到master的容器mysql服务器上master的服务器mysql账号root赋值权限!
5. docker 外网访问不了docker容器
出现问题的原因有3种,
1:你安装docker的服务器没有关闭防火墙,也就是说你访问你安装docker的物理机都访问不了,物理机里的docker就更访问不了了。
2:docker在创建镜像的时候没有做端口映射,这是就出现能访问物理机,但访问不了docker,你可以使用docker ps 查看镜像的端口映射情况。
3:端口映射不正确,如你docker中某一容器的8080端口映射到安装docker物理机的80端口,加入你在镜像里面安装了tomcat,但是你tomcat使用的是8080以外的任意端口,这是你访问物理机ip+80端口也无法访问。
6. docker容器为什么可以跨平台部署
docker镜像和操作系统没关系,docker最大的价值就是提出了镜像打包技术。首先你的明白什么是docker,什么是镜像,什么是容器,然后你就能明白镜像和操作系统之间的关系。docker是一个引擎,是基于内核的一种技术。比如Linux内核,那么它就关心是不是Linux内核,它不关心你是Ubuntu还是CentOS。所以docker也实现了和操作系统的解耦。镜像呢是把服务的运行环境打成了一个包,比如tomcat,镜像里面是把除操作系统的内核以外,然后再加上tomcat的二进制包。然后通过docker引擎构建出来一个tomcat的镜像。容器呢,比如我们想创建一个tomcat服务,之前的方式是在服务器中通过tar或者是rpm安装一个tomcat,然后在start tomcat;如果我们要安装多台的话我们需要多次手动去操作部署。现在有了tomcat镜像以后,我们可以直接利用镜像创建出多个tomcat来(关系是一个tomcat镜像可以创建出多个tomcat容器-即tomcat服务),把容器看成是tomcat的进程就行。
简单来说,一个程序运行,需要操作系统的支持,并且需要访问自己的私有的数据和软件。
docker是容器,它将所有的访问文件和操作系统的api重新定向了,让应用内感觉自己在一>个独立的操作系统上运行,而docker拦截了api调用,并且把那些全局的对操作系统的访问>进行了包装,使得程序不会真的访问它们。
因为docker程序访问的是容器包装的api,理论上说,只要在另一个操作系统上实现了这些>容器的api,就可以把程序移植上去,因为程序不直接和操作系统打交道,感觉不到不同系>统的不同。
7. 什么是K8S
k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。想要了解更多,我推荐你去看看时速云,他们是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。
希望能给您提供帮助,可以给个大大的赞不。
8. WebMvcConfigurer docker 访问不了
访问不了需要检查端口是否配置正确。
检查端口有没有暴露出来,检查目标需要暴露的端口是否配置正确,是否将内部端口map出来。检查container是否正常运行了。是不是在docker之外又套了个vm之类的。