日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Docker1】指令,docker-compose,Dockerfile,容器编排工具k8s

發(fā)布時間:2024/4/24 编程问答 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Docker1】指令,docker-compose,Dockerfile,容器编排工具k8s 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1.pull/image,run/ps(進程),exec/commit
  • 2.save/load
  • 3.docker-compose
    • 3.1 link
    • 3.2 docker-compose .yml
  • 4.Dockerfile
    • 4.1 ENV
    • 4.2 LABEL
  • 5.k8s
    • 5.1.整個流程
    • 5.2 三個基礎(chǔ)概念
    • 5.3 service之間如何互相通信
    • 5.4 service的虛擬ip到公網(wǎng)ip


1.pull/image,run/ps(進程),exec/commit

Docker是主要應(yīng)用于linux和后臺應(yīng)用的虛擬機(和vmware像):由三部分構(gòu)成:鏡像(image)是像ubuntu鏡像文件(iso,img文件),容器(ps)是一個正在運行的虛擬機,倉庫是存放鏡像文件場所(dockerhub)。

tar文件類似于vm使用時的vmdk文件,可將一個鏡像直接保存成一個tar文件,別人load重新加載成一個鏡像,run起來成了一個虛擬機。

Dockfile是一個很短的配置文件,通過寫“如何構(gòu)建”的步驟來指定一個鏡像如何構(gòu)建的,通過docker build指令可將Dockfile構(gòu)建成一個鏡像。倉庫保存了一些公有鏡像如ubuntu鏡像,nginx鏡像,mysql鏡像,tomcat鏡像等。

ubuntu安裝命令:sudo apt install docker.io,網(wǎng)站:play with docker。
docker run -d -p 80:80 nginx上面才會出現(xiàn)80端口,點擊80端口跳轉(zhuǎn)到nginx網(wǎng)頁首頁。
docker run -d -p 81:80 nginx指定外部81端口同理點擊81跳轉(zhuǎn)到nginx網(wǎng)頁首頁(nginx的默認(rèn)端口是80)。


如下再次點擊外部80端口。

如下暫時用不到81,容器里內(nèi)容修改后要commit成新鏡像m1,和pull下來的nginx鏡像并列。

當(dāng)前目錄自己新增index.html(里面寫著wai bu de wen jian)和Dockerfile兩文件,將原來nginx里面index.html替換了,如下vi Dockerfile。


點擊外部100號端口如下:上面為dockerfile build成一鏡像run成為一容器。

2.save/load

docker save + 鏡像id,不是容器id。docker rmi m2將m2鏡像直接刪除,提示有個容器基于這鏡像無法刪除,那將容器(container id)也刪了。

刪了容器還要刪除鏡像m2,docker load使m2鏡像又從tar文件重新拿過來了。

如上行文件映射-v就是將一些靜態(tài)文件放外面,在外面修改文件(因為是映射的)里面文件也會跟著變化。這個文件映射還會用于其他的一些數(shù)據(jù)保存,比如mysql的data目錄也可以映射到外面,防止數(shù)據(jù)丟失。

3.docker-compose

組織一個多容器項目:宿主機(etho網(wǎng)卡)安裝docker會生成一張docker網(wǎng)卡,docker網(wǎng)卡通過nat方式為每個容器分配ip。容器間同一網(wǎng)段可通過ip通信,容器和宿主機通信是通etho網(wǎng)卡轉(zhuǎn)發(fā)路由過來(端口通信),通信方式主要是ip和端口進行通信。



如下curl…回車后打印出下面< html >…。以下就能獲取nginx容器數(shù)據(jù)了,但這種方式需要登錄一臺機器查看ip,再登錄另一臺機器去配置這個ip,在實際生產(chǎn)中是不可行的。

3.1 link

以下為真正的生產(chǎn)過程中的通訊--link,先docker rm -f刪除nginx和alpine兩個容器,在alpine中ping myng(相當(dāng)于域名)的話自動解析為myng的ip。

如下curl myng直接得到nginx的首頁內(nèi)容,瀏覽器將內(nèi)容解析為界面。

3.2 docker-compose .yml

nginx需要到php中去解析,php需要到mysql中訪問數(shù)據(jù)庫,兩個需要寫link,且必須先創(chuàng)建mysql,再部署到其他機器重新輸入整個指令麻煩。將這些指令記錄到一個配置文件里統(tǒng)一配置,這就是docker-compose(需安裝)。


網(wǎng)頁會顯示如下index.html文本字樣。

創(chuàng)建test.php用來監(jiān)測php是否運行成功。

如下phpinfo函數(shù)。




在外面創(chuàng)建的/root/html目錄可以映射到nginx里面/usr/share/nginx/html如下,以.php結(jié)尾會走.php{}里。

如下簡單說就是nginx.conf文件將外面.html和.php文件映射到nginx里面。


port就是-p參數(shù),volumes就是-v參數(shù),devilbox/…是dockerhub上搜索的。



如下是接著上面往后。

點擊如下80端口。

訪問根目錄顯示index.html,訪問test.php中phpinfo()顯示如下。

1.如下首先訪問根目錄即index.html,到nginx下讀取/這個配置條件即會到/usr/share/nginx/html下讀取,這個目錄剛好映射到了外部的/root/html目錄下,最后讀取到了/root/html目錄下的index.html返回。

2.怎么訪問test.php?test.php也是進nginx匹配到了正則以php結(jié)尾,pass轉(zhuǎn)發(fā)到php這臺機器的9000號端口并且目錄是/var/www/html,php這域名會解析到php容器ip,php容器的/var/www/html這個目錄同樣設(shè)置了映射到外部/root/html目錄,返回test.php。

3.mysql.php同樣到/root/html目錄下mysql.php,mysql.php里會指定一條dbhost即數(shù)據(jù)庫主機ip,主機ip指定的是mysql,在docker-compose中也配置了這個服務(wù),根據(jù)mysql域名去解析剛好能解析到mysql的容器,到它的3306號端口,密碼是123456,將登陸成功的消息返回回來。

4.Dockerfile

鏡像像程序,容器像進程。

FROM:指定當(dāng)前鏡像基于哪個鏡像,必填,一行就可以構(gòu)建一個鏡像。

WORKDIR:指定接下來shell語句運行在哪個路徑下,如下alpine鏡像下肯定沒有/app這個目錄,自動創(chuàng)建。

COPY:將當(dāng)前宿主機文件拷貝到鏡像中去。ADD和COPY相似,都是可以從外面復(fù)制到鏡像里面,COPY一般源地址是文件系統(tǒng)源地址,ADD源地址不光是文件系統(tǒng)還可以是一個URL,如果沒有用到網(wǎng)絡(luò)資源,用COPY就行。

RUN:構(gòu)建容器時運行這腳本,當(dāng)前工作目錄就是/app。

CMD:指定整個容器啟動起來運行腳本,運行完后整個容器生命周期結(jié)束(tail -f 阻塞式)。ENTRYPOINT:和CMD一樣指定容器啟動起來的核心腳本,但既指定ENTRYPOINT又指定CMD,以哪個為準(zhǔn):ENTRYPOINT非json則以ENTRYPOINT為準(zhǔn),CMD無效。如果ENTRYPOINT和CMD都是json則ENTRYPOINT+CMD拼成一句shell。如下可以以json數(shù)組形式指定。

必須命名為Dockerfile。

如下指定鏡像名test,最后的點表示dockfile文件位于當(dāng)前目錄下。

1.txt里面原本內(nèi)容有123。

EXPOSE:指定當(dāng)前鏡像暴露出的一個端口,比如nginx鏡像中指定EXPOSE暴露80端口。暴露好處是通過docker run -P將80端口映射到本機的隨機端口,docker run --network=host模式的話會將80端口直接綁定到本機的80端口。


VOLUME:指定映射文件,VOLUME /a/b把容器中的/a/b這個目錄映射到了宿主機的一個目錄下。

4.1 ENV

指定參數(shù)方式:第一個是ENV直接指定當(dāng)前容器的環(huán)境變量,環(huán)境變量可以在docker run中-e指定,也可以在Dockerfile中ENV直接指定,A=10和A空格10都一樣。

第二個是ARG(本身就是參數(shù)意思),ENV和ARG有個本質(zhì)區(qū)別:ENV是構(gòu)建時一直到運行時都一直生效的環(huán)境變量,是系統(tǒng)的環(huán)境變量,ARG則是一個構(gòu)建參數(shù),只有在構(gòu)建(docker build)時才有效,真正運行時無效了。


如下b=11默認(rèn)為11,構(gòu)建時指定。

4.2 LABEL

LABEL:對鏡像沒任何作用,只是標(biāo)識,便于通過docker inspect指令找到這鏡像

ONBUILD:接的參數(shù)可以是Dockerfile中其他任意參數(shù)

ONBUILD是當(dāng)前鏡像構(gòu)建時候不會執(zhí)行,基于當(dāng)前鏡像的鏡像構(gòu)建時候才會執(zhí)行




5.k8s

5.1.整個流程

master下發(fā)給node指令是集群之間的語言(用戶不懂),1.api server(進程,master有四個進程)會監(jiān)聽用戶的指令進行操作master。用戶的指令分為三種形式:第一種通過kubectl指令直接下發(fā),第二種通過htttp接口將指令下發(fā)到node上進行容器的調(diào)度,第三種webui圖形化界面填寫配置或拖拽控件進行容器節(jié)點調(diào)度。

用戶通過如上三種指令方式中任意一種,下發(fā)指令或配置文件到api server,api server只是一個傳達作用。還要通過scheduler和controller-manager兩個進行協(xié)調(diào)調(diào)度,這兩個協(xié)調(diào)調(diào)度還要通過ETCD元數(shù)據(jù)支持,最后生成一個調(diào)度指令交給api server。api server最終將指令下發(fā)傳達到這些節(jié)點,這些節(jié)點進行相應(yīng)容器的創(chuàng)建,銷毀或擴張等一些操作,狀態(tài)更新完后實時匯報狀態(tài)的更新到api server,api server再將狀態(tài)記錄到ETCD里,這就是大概流程。

2.ETCD進程:是kv數(shù)據(jù)庫用來存儲元數(shù)據(jù)信息,如各個節(jié)點狀態(tài),像zookeeper。
3.controller-manager進程:各種資源自動化的控制中心。
4.scheduler進程:調(diào)度實施者。

node即客戶端中kubelet進程是直接和api server進行通信,kube-proxy進程是創(chuàng)建虛擬網(wǎng)卡,docker進程在實際調(diào)度機器時,機器上必須安裝docker才能進行容器調(diào)度。

5.2 三個基礎(chǔ)概念




如上方式不智能(如運維人員剛好有事,沒收到消息),k8s用deployment(kubectl run指令創(chuàng)建)實現(xiàn)自動化運維。如下d1是deployment名字,--image指定運行的鏡像,httpd鏡像會啟一個apache服務(wù)器,指定alpine版本。get查看資源是否啟動成功。最終以docker形式在node節(jié)點上啟動。



現(xiàn)在有個新問題,剛創(chuàng)建好的兩個http容器沒有做端口映射,如下現(xiàn)在要做對外暴露一個接口,做負(fù)載均衡。這就用到service。kube-proxy進程會在整個集群層面抽象出一張大的虛擬的交換機(如下紫色矩形),可創(chuàng)建ip,三個橘色pod統(tǒng)稱為一個service。

5.3 service之間如何互相通信

docker-compose能實現(xiàn)多個dockers之間通信,但k8s中不再以docker為單位,以pod為單位,即services間如何進行通信?最簡單的是通過ip進行通信,和docker-compose一樣,ip是不可能記住的,也不可能每次都去配置ip,那該如何進行通信呢?在k8s中默認(rèn)提供一個dns服務(wù),將d1對應(yīng)ip,所以只需要輸入d1就能解析到ip。服務(wù)1:d1 httpd鏡像。服務(wù)2:d2 nginx鏡像。

如上是在d2容器中,如下d1是dns,解決了服務(wù)間相互調(diào)用問題。

5.4 service的虛擬ip到公網(wǎng)ip

dns解決了服務(wù)間相互調(diào)用問題,現(xiàn)有一個新問題:外界用戶不知道服務(wù)抽象出來的虛擬ip(上圖紫色矩形上的ip),用戶只知道官網(wǎng)ip即master機器ip,用戶能否通過一個ingress代理訪問到虛擬ip。



總結(jié)

以上是生活随笔為你收集整理的【Docker1】指令,docker-compose,Dockerfile,容器编排工具k8s的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。