<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker基礎(chǔ)與實(shí)戰(zhàn),看這一篇就夠了

          共 7342字,需瀏覽 15分鐘

           ·

          2020-08-15 02:07

          docker 基礎(chǔ)

          什么是Docker

          Docker 使用 Google 公司推出的 Go 語(yǔ)言 進(jìn)行開(kāi)發(fā)實(shí)現(xiàn),基于 Linux 內(nèi)核的 cgroupnamespace,以及 AUFS 類的 Union FS 等技術(shù),對(duì)進(jìn)程進(jìn)行封裝隔離,屬于 操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器。

          Docker 在容器的基礎(chǔ)上,進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等,極大的簡(jiǎn)化了容器的創(chuàng)建和維護(hù)。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷。

          記住最重要的一點(diǎn),Dokcer實(shí)際是宿主機(jī)的一個(gè)普通的進(jìn)程,這也是Dokcer與傳統(tǒng)虛擬化技術(shù)的最大不同。

          為什么要使用Docker

          使用Docker最重要的一點(diǎn)就是Docker能保證運(yùn)行環(huán)境的一致性,不會(huì)出現(xiàn)開(kāi)發(fā)、測(cè)試、生產(chǎn)由于環(huán)境配置不一致導(dǎo)致的各種問(wèn)題,一次配置多次運(yùn)行。使用Docker,可更快地打包、測(cè)試以及部署應(yīng)用程序,并可減少?gòu)木帉?xiě)到部署運(yùn)行代碼的周期。

          docker 安裝

          • 安裝前提
            Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,首先查看本頁(yè)面的前提條件來(lái)驗(yàn)證你的CentOS 版本是否支持 Docker 。使用uname -r指令查看服務(wù)器版本
          • 更新yum,升級(jí)到最新版本
            yum update
          • 卸載老版本的docker(若有)
            yum remove docker docker-common docker-selinux docker-engine
            執(zhí)行該命令只會(huì)卸載Docker本身,而不會(huì)刪除Docker存儲(chǔ)的文件,例如鏡像、容器、卷以及網(wǎng)絡(luò)文件等。這些文件保存在/var/lib/docker 目錄中,需要手動(dòng)刪除。
          • 查看yum倉(cāng)庫(kù),查看是否有docker
            ll /etc/yum.repos.d/

          如果用的廠商的服務(wù)器(阿里云、騰訊云)一般都會(huì)有docker倉(cāng)庫(kù),如果用的是虛擬機(jī)或者公司的服務(wù)器基本會(huì)沒(méi)有。

          • 安裝相關(guān)軟件包
            yum-util 提供yum-config-manager功能,另外兩個(gè)是devicemapper驅(qū)動(dòng)依賴的。
            yum install -y yum-utils device-mapper-persistent-data lvm2
          • 安裝倉(cāng)庫(kù)
            yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
          • 查看docker版本
            yum list docker-ce --showduplicates | sort -r
          • 安裝docker
            yum install docker-ce
            以上語(yǔ)句是是安裝最新版本的Docker,你也可以通過(guò) yum install docker-ce- 安裝指定版本
          • 啟動(dòng)docker
            systemctl start docker
          • 驗(yàn)證安裝是否正確
            dokcer run hello-world

          docker 重要命令

          鏡像相關(guān)

          • 搜索鏡像 docker search
            docker search nginx Docker就會(huì)在Docker Hub中搜索含有“nginx”這個(gè)關(guān)鍵詞的鏡像倉(cāng)庫(kù)
          • 下載鏡像 docker pull
            docker pull nginx Docker就會(huì)在Docker Hub中下載含有“nginx”最新版本的鏡像
            當(dāng)然也可以使用
            docker pull reg.jianzh5.com/nginx:1.7.9 下載指定倉(cāng)庫(kù)地址標(biāo)簽的nginx鏡像
          • 列出鏡像 docker images
          • 刪除鏡像 docker rmi
            docker rmi hello-world刪除我們剛剛下載的 hello-world鏡像
          • 構(gòu)建鏡像 docker build
            通過(guò)Dockerfile構(gòu)建鏡像,這個(gè)我們等下再拿出來(lái)詳細(xì)說(shuō)明。

          容器相關(guān)

          • 新建啟動(dòng)鏡像 docker run
            這個(gè)命令是我們最常用的命令,主要使用以下幾個(gè)選項(xiàng)
            ① -d選項(xiàng):表示后臺(tái)運(yùn)行
            ② -P選項(xiàng)(大寫(xiě)):隨機(jī)端口映射
            ③ -p選項(xiàng)(小寫(xiě)):指定端口映射,前面是宿主機(jī)端口后面是容器端口,如 docker run nginx -p 8080:80,將容器的80端口映射到宿主機(jī)的8080端口,然后使用 localhost:8080就可以查看容器中nginx的歡迎頁(yè)了
            ④ -v選項(xiàng):掛載宿主機(jī)目錄,前面是宿主機(jī)目錄,后面是容器目錄,如 docker run -d -p 80:80 -v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx 掛載宿主機(jī)的 /dockerData/nginx/conf/nginx.conf的文件,這樣就可以在宿主機(jī)對(duì) nginx進(jìn)行參數(shù)配置了,注意目錄需要用絕對(duì)路徑,不要使用相對(duì)路徑,如果宿主機(jī)目錄不存在則會(huì)自動(dòng)創(chuàng)建。
            ⑤--rm : 停止容器后會(huì)直接刪除容器,這個(gè)參數(shù)在測(cè)試是很有用,如 docker run -d -p 80:80 --rm nginx
            ⑥--name : 給容器起個(gè)名字,否則會(huì)出現(xiàn)一長(zhǎng)串的自定義名稱如 docker run -name niginx -d -p 80:80 - nginx

          • 列出容器 docker ps
            這個(gè)命令可以列出當(dāng)前運(yùn)行的容器,使用 -a參數(shù)后列出所有的容器(包括已停止的)

          • 停止容器 docker stop
            docker stop 5d034c6ea010 后面跟的是容器ID,也可以使用容器名稱

          • 啟動(dòng)停止的容器 docker start
            docker run是新建容器并啟動(dòng),docker start 是啟動(dòng)停止的容器,如 docker start 5d034c6ea010

          • 重啟容器 docker restart
            此命令執(zhí)行的過(guò)程實(shí)際是先執(zhí)行 docker stop,然后再執(zhí)行 docker start,如 docker restart 5d034c6ea010

          • 進(jìn)入容器 docker exec -it 容器id /bin/bash
            docker exec -it 5d034c6ea010 /bin/bash,就相當(dāng)于進(jìn)入了容器本身的操作系統(tǒng)

          • 刪除容器 docker rm
            docker rm 5d034c6ea010 后面跟的是容器ID,刪除容器之前需要先停止容器運(yùn)行

          • 數(shù)據(jù)拷貝 docker cp
            此命令用于容器與宿主機(jī)之間進(jìn)行數(shù)據(jù)拷貝,如 docker cp 5d034c6ea010: /etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf 將容器的目錄文件拷貝到宿主機(jī)指定位置,容器ID可以替換成容器名。

          命令實(shí)戰(zhàn)

          如果我們需要一個(gè)nginx容器,并且需要在宿主機(jī)上直接修改nginx的配置文件、默認(rèn)主頁(yè),在宿主機(jī)可以實(shí)時(shí)看到容器nginx的日志。我們可以按照如下的方式一步一步完成。

          • 使用--rm參數(shù)啟動(dòng)容器,方便刪除
            docker run -d -p 8081:80 --name nginx --rm nginx
          • 進(jìn)入容器,查看容器中配置文件、項(xiàng)目文件、日志文件的目錄地址
            docker exec -it 9123b67e428e /bin/bash
          • 導(dǎo)出容器的配置文件
            docker cp nginx:/etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf導(dǎo)出配置文件 nginx.conf
            docker cp nginx:/etc/nginx/conf.d /dockerData/nginx/conf/conf.d導(dǎo)出配置目錄 conf.d
          • 停止容器
            docker stop 9123b67e428e,由于加了--rm參數(shù),容器會(huì)自動(dòng)刪除
          • 再以如下命令啟動(dòng)容器,完成目錄掛載
            docker?run?-d?-p?8081:80?--name?nginx?\?
            -v?/dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf?\?
            -v?/dockerData/nginx/conf/conf.d:/etc/nginx/conf.d?\?
            -v?/dockerData/nginx/www:/usr/share/nginx/html?\?
            -v?/dockerData/nginx/logs:/var/log/nginx?nginx
          • 訪問(wèn)服務(wù)器地址
            http://192.168.136.129:8081/訪問(wèn)報(bào)錯(cuò),這時(shí)候就進(jìn)入宿主機(jī)的日志目錄 /dockerData/nginx/logs查看日志
            2019/11/23 10:08:11 [error] 6#6: *1 directory index of "/usr/share/nginx/html/" is forbidden, client: 192.168.136.1, server: localhost, request: "GET / HTTP/1.1", host: "192.168.136.129:8081"

          因?yàn)?/usr/share/nginx/html/被掛載到了服務(wù)器上面的 /dockerData/nginx/www目錄下,原來(lái)的歡迎頁(yè)面在 dockerData/nginx/www是沒(méi)有的,所有就報(bào)錯(cuò)了,這里我們隨便建一個(gè)。

          • 建立默認(rèn)主頁(yè)

            #打開(kāi)項(xiàng)目文件
            cd?/dockerData/nginx/www
            #使用vim?創(chuàng)建并編輯文件
            vi?index.html
            #此時(shí)我們會(huì)進(jìn)入vim界面,按?i?插入,然后輸入
            Hello,Welcome?to?Docker?World
            #輸入完后,按?esc,然后輸入?:wq
          • 再次訪問(wèn)瀏覽器地址

          Dockerfile

          我們可以使用Dockfile構(gòu)建一個(gè)鏡像,然后直接在docker中運(yùn)行。Dockerfile文件為一個(gè)文本文件,里面包含構(gòu)建鏡像所需的所有的命令,首先我們來(lái)認(rèn)識(shí)一下Dockerfile文件中幾個(gè)重要的指令。

          指令詳解

          • FROM
            選擇一個(gè)基礎(chǔ)鏡像,然后在基礎(chǔ)鏡像上進(jìn)行修改,比如構(gòu)建一個(gè)SpringBoot項(xiàng)目的鏡像,就需要選擇java這個(gè)基礎(chǔ)鏡像,F(xiàn)ROM需要作為Dockerfile中的第一條指令
            如:FROM openjdk:8-jdk-alpine 基礎(chǔ)鏡像如果可以的話最好使用alpine版本的,采用alpline版本的基礎(chǔ)鏡像構(gòu)建出來(lái)的鏡像會(huì)小很多。

          • RUN
            RUN指令用來(lái)執(zhí)行命令行命令的。它有以下兩種格式:

            • shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。
              RUN echo '

              Hello, Docker!

              ' > /usr/share/nginx/html/index.html
            • exec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],這更像是函數(shù)調(diào)用中的格式。
          • CMD
            此指令就是用于指定默認(rèn)的容器主進(jìn)程的啟動(dòng)命令的。CMD指令格式和RUN相似,也是兩種格式

            • shell 格式:CMD <命令>
            • exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
            • 參數(shù)列表格式:CMD ["參數(shù)1", "參數(shù)2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的參數(shù)。
          • ENTRYPOINT
            ENTRYPOINT 的格式和 RUN指令格式一樣,分為 exec 格式和 shell 格式。
            ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動(dòng)程序及參數(shù)。
            ENTRYPOINT 在運(yùn)行時(shí)也可以替代,不過(guò)比 CMD 要略顯繁瑣,需要通過(guò) docker run 的參數(shù) --entrypoint 來(lái)指定。
            當(dāng)指定了 ENTRYPOINT 后,CMD 的含義就發(fā)生了改變,不再是直接的運(yùn)行其命令,而是將 CMD 的內(nèi)容作為參數(shù)傳給 ENTRYPOINT指令,換句話說(shuō)實(shí)際執(zhí)行時(shí),將變?yōu)椋?/p>

            ?""
          • COPY & ADD
            這2個(gè)指令都是復(fù)制文件,它將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄 復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置。
            比如:COPY demo-test.jar app.jarADD demo-test.jar app.jar
            ADD指令比 COPY高級(jí)點(diǎn),可以指定一個(gè)URL地址,這樣Docker引擎會(huì)去下載這個(gè)URL的文件,如果 ADD后面是一個(gè) tar文件的話,Dokcer引擎還會(huì)去解壓縮。
            我們?cè)跇?gòu)建鏡像時(shí)盡可能使用 COPY,因?yàn)?COPY 的語(yǔ)義很明確,就是復(fù)制文件而已,而 ADD 則包含了更復(fù)雜的功能,其行為也不一定很清晰。

          • EXPOSE
            聲明容器運(yùn)行時(shí)的端口,這只是一個(gè)聲明,在運(yùn)行時(shí)并不會(huì)因?yàn)檫@個(gè)聲明應(yīng)用就會(huì)開(kāi)啟這個(gè)端口的服務(wù)。
            在 Dockerfile 中寫(xiě)入這樣的聲明有兩個(gè)好處,一個(gè)是幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口,以方便配置映射;另一個(gè)用處則是在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),也就是 docker run -P 時(shí),會(huì)自動(dòng)隨機(jī)映射 EXPOSE 的端口。
            要將 EXPOSE 和在運(yùn)行時(shí)使用 -p <宿主端口>:<容器端口> 區(qū)分開(kāi)來(lái)。-p,是映射宿主端口和容器端口,換句話說(shuō),就是將容器的對(duì)應(yīng)端口服務(wù)公開(kāi)給外界訪問(wèn),而 EXPOSE 僅僅是聲明容器打算使用什么端口而已,并不會(huì)自動(dòng)在宿主進(jìn)行端口映射。

          • ENV
            這個(gè)指令很簡(jiǎn)單,就是設(shè)置環(huán)境變量,無(wú)論是后面的其它指令,如 RUN,還是運(yùn)行時(shí)的應(yīng)用,都可以直接使用這里定義的環(huán)境變量。它有如下兩種格式:

            • ENV
            • ENV = =...
          • VOLUME
            該指令使容器中的一個(gè)目錄具有持久化存儲(chǔ)的功能,該目錄可被容器本身使用,也可共享給其他容器。當(dāng)容器中的應(yīng)用有持久化數(shù)據(jù)的需求時(shí)可以在Dockerfile中使用該指令。如 VOLUME /tmp
            這里的 /tmp 目錄就會(huì)在運(yùn)行時(shí)自動(dòng)掛載為匿名卷,任何向 /tmp 中寫(xiě)入的信息都不會(huì)記錄進(jìn)容器存儲(chǔ)層,從而保證了容器存儲(chǔ)層的無(wú)狀態(tài)化。當(dāng)然,運(yùn)行時(shí)可以覆蓋這個(gè)掛載設(shè)置。比如:
            docker run -d -v mydata:/tmp xxxx

          • LABEL
            你可以為你的鏡像添加labels,用來(lái)組織鏡像,記錄版本描述,或者其他原因,對(duì)應(yīng)每個(gè)label,增加以LABEL開(kāi)頭的行,和一個(gè)或者多個(gè)鍵值對(duì)。如下所示:

            LABEL?version="1.0"
            LABEL?description="test"

          Dockerfile實(shí)戰(zhàn)

          我們以一個(gè)簡(jiǎn)單的SpringBoot項(xiàng)目為例構(gòu)建基于SpringBoot應(yīng)用的鏡像。功能很簡(jiǎn)單,只是對(duì)外提供了一個(gè) say接口,在進(jìn)入這個(gè)方法的時(shí)候打印出一行日志,并將日志寫(xiě)入日志文件。

          @SpringBootApplication
          @RestController
          @Log4j2
          public?class?DockerApplication?{

          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(DockerApplication.class,?args);
          ????}

          ????@GetMapping("/say")
          ????public?String?say(){
          ????????log.info("get?say?request...");
          ????????return?"Hello,Java日知錄";
          ????}
          ??
          }

          我們使用maven將其打包成jar文件,放入一個(gè)單獨(dú)的文件夾,然后按照下面步驟一步步構(gòu)建鏡像并執(zhí)行

          • 在當(dāng)前文件夾建立Dockerfile文件,文件內(nèi)容如下:

            FROM openjdk:8-jdk-alpine
            #將容器中的/tmp目錄作為持久化目錄
            VOLUME /tmp
            #暴露端口
            EXPOSE 8080
            #復(fù)制文件
            COPY docker-demo.jar app.jar
            #配置容器啟動(dòng)后執(zhí)行的命令
            ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
          • 使用如下命令構(gòu)建鏡像
            docker built -t springboot:v1.0 .-t 指定鏡像的名稱及版本號(hào),注意后面需要以 . 結(jié)尾。

          • 查看鏡像文件

          • 運(yùn)行構(gòu)建的鏡像
            docker run -v /app/docker/logs:/logs -p 8080:8080 --rm --name springboot springboot:v1.0

          • 瀏覽器訪問(wèn)
            http://192.168.136.129:8080/say

          • 在宿主機(jī)上實(shí)時(shí)查看日志
            tail -100f /app/docker/logs/docker-demo-info.log

          小結(jié)

          本文詳細(xì)介紹了日常使用Docker過(guò)程中經(jīng)常用到的相關(guān)指令,每小結(jié)都用一個(gè)綜合實(shí)戰(zhàn)將所有指令結(jié)合在一起使用,領(lǐng)悟這些實(shí)際用例可以讓你學(xué)習(xí)Docker事半功倍。



          如果本文對(duì)你有幫助,
          別忘記給我個(gè)三連:
          點(diǎn)贊,轉(zhuǎn)發(fā),評(píng)論
          咱們下期見(jiàn)!

          收藏?等于白嫖點(diǎn)贊?才是真情!


          1.?人人都能看懂的 6 種限流實(shí)現(xiàn)方案!

          2.?一個(gè)空格引發(fā)的“慘案“

          3.?大型網(wǎng)站架構(gòu)演化發(fā)展歷程

          4.?Java語(yǔ)言“坑爹”排行榜TOP 10

          5. 我是一個(gè)Java類(附帶精彩吐槽)

          6. 看完這篇Redis緩存三大問(wèn)題,保你能和面試官互扯

          7. 程序員必知的 89 個(gè)操作系統(tǒng)核心概念

          8. 深入理解 MySQL:快速學(xué)會(huì)分析SQL執(zhí)行效率

          9. API 接口設(shè)計(jì)規(guī)范

          10. Spring Boot 面試,一個(gè)問(wèn)題就干趴下了!



          掃碼二維碼關(guān)注我


          ·end·

          —如果本文有幫助,請(qǐng)分享到朋友圈吧—

          我們一起愉快的玩耍!



          你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡

          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人h | 婷婷激情中文字幕 | 涩涩大香蕉 | 日韩色情影院 | 天天操夜夜撸 |