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之類的。