1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Docker 從入門到實(shí)戰(zhàn),收藏起來(lái)有備無(wú)患~

        共 3191字,需瀏覽 7分鐘

         ·

        2022-05-26 22:33

        一、概述

        1.1 基本概念

        Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 ? 并遵從 Apache2.0 協(xié)議開(kāi)源。

        Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。

        容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開(kāi)銷極低。

        1.2 優(yōu)勢(shì)

        簡(jiǎn)化程序:Docker 讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 ?Linux 機(jī)器上,便可以實(shí)現(xiàn)虛擬化。
        Docker改變了虛擬化的方式,使開(kāi)發(fā)者可以直接將自己的成果放入Docker中進(jìn)行管理。方便快捷已經(jīng)是 Docker的最大優(yōu)勢(shì),過(guò)去需要用數(shù)天乃至數(shù)周的 ? ?任務(wù),在Docker容器的處理下,只需要數(shù)秒就能完成。
        節(jié)省開(kāi)支:一方面,云計(jì)算時(shí)代到來(lái),使開(kāi)發(fā)者不必為了追求效果而配置高額的硬件,Docker 改變了高性能必然高價(jià)格的思維定勢(shì)。
        Docker 與云的結(jié)合,讓云空間得到更充分的利用。不僅解決了硬件管理的問(wèn)題,也改變了虛擬化的方式。

        1.3 與傳統(tǒng)VM特性對(duì)比:

        作為一種輕量級(jí)的虛擬化方式,Docker在運(yùn)行應(yīng)用上跟傳統(tǒng)的虛擬機(jī)方式相比具有顯著優(yōu)勢(shì):

        • Docker 容器很快,啟動(dòng)和停止可以在秒級(jí)實(shí)現(xiàn),這相比傳統(tǒng)的虛擬機(jī)方式要快得多。
        • Docker 容器對(duì)系統(tǒng)資源需求很少,一臺(tái)主機(jī)上可以同時(shí)運(yùn)行數(shù)千個(gè)Docker容器。
        • Docker 通過(guò)類似Git的操作來(lái)方便用戶獲取、分發(fā)和更新應(yīng)用鏡像,指令簡(jiǎn)明,學(xué)習(xí)成本較低。
        • Docker 通過(guò)Dockerfile配置文件來(lái)支持靈活的自動(dòng)化創(chuàng)建和部署機(jī)制,提高工作效率。
        • Docker 容器除了運(yùn)行其中的應(yīng)用之外,基本不消耗額外的系統(tǒng)資源,保證應(yīng)用性能的同時(shí),盡量減小系統(tǒng)開(kāi)銷。
        • Docker 利用Linux系統(tǒng)上的多種防護(hù)機(jī)制實(shí)現(xiàn)了嚴(yán)格可靠的隔離。從1.3版本開(kāi)始,Docker引入了安全選項(xiàng)和鏡像簽名機(jī)制,極大地提高了使用Docker的安全性。

        特性容器虛擬機(jī)
        啟動(dòng)速度秒級(jí)分鐘級(jí)
        硬盤使用一般為MB一般為GB
        性能接近原生弱于原生
        系統(tǒng)支持量單機(jī)支持上千個(gè)容器一般幾十個(gè)

        1.4 基礎(chǔ)架構(gòu)

        Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,使用遠(yuǎn)程API來(lái)管理和創(chuàng)建Docker容器。
        Docker 容器通過(guò) Docker 鏡像來(lái)創(chuàng)建。
        容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶?duì)象與類。
        容器對(duì)象
        鏡像

        1.5 Docker 技術(shù)的基礎(chǔ):

        • namespace,容器隔離的基礎(chǔ),保證A容器看不到B容器. 6個(gè)名空間:User,Mnt,Network,UTS,IPC,Pid
        • cgroups,容器資源統(tǒng)計(jì)和隔離。主要用到的cgroups子系統(tǒng):cpu,blkio,device,freezer,memory
        • unionfs,典型:aufs/overlayfs,分層鏡像實(shí)現(xiàn)的基礎(chǔ)

        1.6 Docker 組件

        • docker Client客戶端 -->向docker服務(wù)器進(jìn)程發(fā)起請(qǐng)求,如:創(chuàng)建、停止、銷毀容器等操作
        • docker Server服務(wù)器進(jìn)程 -->處理所有docker的請(qǐng)求,管理所有容器
        • docker Registry鏡像倉(cāng)庫(kù) -->鏡像存放的中央倉(cāng)庫(kù),可看作是存放二進(jìn)制的scm

        二、安裝部署

        2.1 準(zhǔn)備條件

        目前,CentOS 僅發(fā)行版本中的內(nèi)核支持 Docker。Docker 運(yùn)行在 CentOS 7 上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為 3.10 以上。
        Docker 運(yùn)行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本2.6.32-431 或者更高版本。

        2.2 安裝 Docker

        yum install docker -y          #安裝systemctl start docker         #啟動(dòng)systemctl enable docker        #設(shè)置開(kāi)機(jī)自啟動(dòng)

        2.3 基本命令

        docker search centos   #搜索鏡像

        默認(rèn)從國(guó)外拉去,速度很慢,可以使用daocloud配置加速

        curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d6f11267.m.daocloud.io腳本是寫入echo "{\"registry-mirrors\": [\"http://d6f11267.m.daocloud.io\"]}"> /etc/docker/daemon.jsonsystemctl restart docker              #重啟失效

        根據(jù)需求拉取鏡像:

        docker pull docker.io/ansible/centos7-ansible

        拉去search到的全部鏡像:

        for i in `docker search centos|awk '!/NAME/{print $2}'`;do docker pull $i;done

        查看本地鏡像:

        docker images

        2.4 命令整理

        容器操作:

        docker create # 創(chuàng)建一個(gè)容器但是不啟動(dòng)它docker run # 創(chuàng)建并啟動(dòng)一個(gè)容器docker stop # 停止容器運(yùn)行,發(fā)送信號(hào)SIGTERMdocker start # 啟動(dòng)一個(gè)停止?fàn)顟B(tài)的容器docker restart # 重啟一個(gè)容器docker rm # 刪除一個(gè)容器docker kill # 發(fā)送信號(hào)給容器,默認(rèn)SIGKILLdocker attach # 連接(進(jìn)入)到一個(gè)正在運(yùn)行的容器docker wait # 阻塞一個(gè)容器,直到容器停止運(yùn)行

        獲取容器信息:

        docker ps # 顯示狀態(tài)為運(yùn)行(Up)的容器docker ps -a # 顯示所有容器,包括運(yùn)行中(Up)的和退出的(Exited)docker inspect # 深入容器內(nèi)部獲取容器所有信息docker logs # 查看容器的日志(stdout/stderr)docker events # 得到docker服務(wù)器的實(shí)時(shí)的事件docker port # 顯示容器的端口映射docker top # 顯示容器的進(jìn)程信息docker diff # 顯示容器文件系統(tǒng)的前后變化

        導(dǎo)出容器:

        docker exec # 在容器里執(zhí)行一個(gè)命令,可以執(zhí)行bash進(jìn)入交互式

        執(zhí)行:

        docker exec # 在容器里執(zhí)行一個(gè)命令,可以執(zhí)行bash進(jìn)入交互式

        2.5 簡(jiǎn)單實(shí)踐操作

        運(yùn)行并進(jìn)入容器操作:

        docker run -i -t docker.io/1832990/centos6.5  /bin/bash
        • -t 表示在新容器內(nèi)指定一個(gè)偽終端或終端;
        • -i 表示允許我們對(duì)容器內(nèi)的 (STDIN) 進(jìn)行交互;
        • -d 表示將容器在后臺(tái)運(yùn)行;
        • /bin/bash 。這將在容器內(nèi)啟動(dòng) bash shell;

        所以當(dāng)容器(container)啟動(dòng)之后,我們會(huì)獲取到一個(gè)命令提示符:

        在容器內(nèi)我們安裝MySQL并設(shè)置開(kāi)機(jī)自啟動(dòng),將修改后的鏡像提交:

        docker ps -l 查詢?nèi)萜鱅Ddocker commit -m "功能" -a "用戶信息" ID tag 提交修改后的鏡像

        docker inspect ID 查看詳細(xì)信息docker push ID 上傳docker鏡像
        利用DockerFile創(chuàng)建鏡像
        使用命令 docker build , 需要?jiǎng)?chuàng)建一個(gè) Dockerfile 文件,其中包含一組指令來(lái)告訴 Docker 如何構(gòu)建鏡像。
        mkdir DockerFilecd DockerFilecat > Dockerfile <FROM 603dd3515fccMAINTAINER Docker xuelRUN yum install mysql mysql-server -yRUN mddir /etc/sysconfig/networkRUN /etc/init.d/mysqld startEOF
        docker build -t "centos6.8:mysqld" .
        • -t 制定repository 與tag

        • . 指定Dockerfile的路徑

        注意一個(gè)鏡像不能超過(guò) 127 層
        此外,還可以利用 ADD 命令復(fù)制本地文件到鏡像;
        用 EXPOSE 命令來(lái)向外部開(kāi)放端口;
        用 CMD 命令來(lái)描述容器啟動(dòng)后運(yùn)行的程序等。
        CMD [“/usr/sbin/apachectl”, “-D”, “FOREGROUND”]

        2.6 Dockerfile 詳解

        Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為注釋,每一行只支持一條指令,每條指令可以攜帶多個(gè)參數(shù)。
        Dockerfile的指令根據(jù)作用可以分為兩種,構(gòu)建指令和設(shè)置指令。
        構(gòu)建指令:用于構(gòu)建 image,其指定的操作不會(huì)在運(yùn)行image的容器上執(zhí)行;
        設(shè)置指令:用于設(shè)置 image 的屬性,其指定的操作將在運(yùn)行image的容器中執(zhí)行。
        • FROM(指定基礎(chǔ)image)

        構(gòu)建指令,必須指定且需要在 Dockerfile 其他指令的前面。后續(xù)的指令都依賴于該指令指定的image。FROM 指令指定的基礎(chǔ) image 可以是官方遠(yuǎn)程倉(cāng)庫(kù)中的,也可以位于本地倉(cāng)庫(kù)。

        該指令有兩種格式:

        FROM        #指定基礎(chǔ)image為該image的最后修改的版本FROM : #指定基礎(chǔ)image為該image的一個(gè)tag版本。
        • MAINTAINER(用來(lái)指定鏡像創(chuàng)建者信息)

        構(gòu)建指令,用于將image的制作者相關(guān)的信息寫入到image中。當(dāng)我們對(duì)該image執(zhí)行docker inspect命令時(shí),輸出中有相應(yīng)的字段記錄該信息。
        MAINTAINER 
        • RUN(安裝軟件用)
        構(gòu)建指令,RUN可以運(yùn)行任何被基礎(chǔ)image支持的命令。如基礎(chǔ)image選擇了ubuntu,那么軟件管理部分只能使用ubuntu的命令。
        RUN  (the command is run in a shell - `/bin/sh -c`)RUN ["executable", "param1", "param2" ... ]  (exec form)
        • CMD(設(shè)置container啟動(dòng)時(shí)執(zhí)行的操作)
        設(shè)置指令,用于container啟動(dòng)時(shí)指定的操作。該操作可以是執(zhí)行自定義腳本,也可以是執(zhí)行系統(tǒng)命令。該指令只能在文件中存在一次,如果有多個(gè),則只執(zhí)行最后一條。
        CMD ["executable","param1","param2"] (like an exec, this is the preferred form)CMD command param1 param2 (as a shell)

        ENTRYPOINT 指定的是一個(gè)可執(zhí)行的腳本或者程序的路徑,該指定的腳本或者程序?qū)?huì)以 param1 和param2作為參數(shù)執(zhí)行。

        所以如果CMD指令使用上面的形式,那么Dockerfile中必須要有配套的ENTRYPOINT。當(dāng)Dockerfile指定了ENTRYPOINT,那么使用下面的格式:
        CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
        • ENTRYPOINT(設(shè)置container啟動(dòng)時(shí)執(zhí)行的操作)

        設(shè)置指令,指定容器啟動(dòng)時(shí)執(zhí)行的命令,可以多次設(shè)置,但是只有最后一個(gè)有效。

        ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)ENTRYPOINT command param1 param2 (as a shell)

        該指令的使用分為兩種情況,一種是獨(dú)自使用,另一種和CMD指令配合使用。

        當(dāng)獨(dú)自使用時(shí),如果你還使用了CMD命令且CMD是一個(gè)完整的可執(zhí)行的命令,那么CMD指令和ENTRYPOINT會(huì)互相覆蓋只有最后一個(gè)CMD或者ENTRYPOINT有效。
        # CMD指令將不會(huì)被執(zhí)行,只有ENTRYPOINT指令被執(zhí)行CMD echo “Hello, World!”ENTRYPOINT ls -l
        另一種用法和CMD指令配合使用來(lái)指定ENTRYPOINT的默認(rèn)參數(shù),這時(shí)CMD指令不是一個(gè)完整的可執(zhí)行命令,僅僅是參數(shù)部分;ENTRYPOINT指令只能使用JSON方式指定執(zhí)行命令,而不能指定參數(shù)。
        FROM ubuntuCMD ["-l"]ENTRYPOINT ["/usr/bin/ls"]
        • USER(設(shè)置container容器的用戶)

        設(shè)置指令,設(shè)置啟動(dòng)容器的用戶,默認(rèn)是root用戶

        # 指定memcached的運(yùn)行用戶ENTRYPOINT ["memcached"]USER daemonENTRYPOINT ["memcached", "-u", "daemon"]
        • EXPOSE(指定容器需要映射到宿主機(jī)器的端口)
        設(shè)置指令,該指令會(huì)將容器中的端口映射成宿主機(jī)器中的某個(gè)端口。當(dāng)你需要訪問(wèn)容器的時(shí)候,可以不是用容器的IP地址而是使用宿主機(jī)器的IP地址和映射后的端口。
        要完成整個(gè)操作需要兩個(gè)步驟,首先在Dockerfile使用EXPOSE設(shè)置需要映射的容器端口,然后在運(yùn)行容器的時(shí)候指定-p選項(xiàng)加上EXPOSE設(shè)置的端口,這樣EXPOSE設(shè)置的端口號(hào)會(huì)被隨機(jī)映射成宿主機(jī)器中的一個(gè)端口號(hào)。
        也可以指定需要映射到宿主機(jī)器的那個(gè)端口,這時(shí)要確保宿主機(jī)器上的端口號(hào)沒(méi)有被使用。EXPOSE指令可以一次設(shè)置多個(gè)端口號(hào),相應(yīng)的運(yùn)行容器的時(shí)候,可以配套的多次使用-p選項(xiàng)。
        # 映射一個(gè)端口EXPOSE port1# 相應(yīng)的運(yùn)行容器使用的命令  (主機(jī)(宿主)端口:容器端口)docker run -p port1 image
        # 映射多個(gè)端口EXPOSE port1 port2 port3# 相應(yīng)的運(yùn)行容器使用的命令docker run -p port1 -p port2 -p port3 image# 還可以指定需要映射到宿主機(jī)器上的某個(gè)端口號(hào)docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
        端口映射是 Docker 比較重要的一個(gè)功能,原因在于我們每次運(yùn)行容器的時(shí)候容器的IP地址不能指定而是在橋接網(wǎng)卡的地址范圍內(nèi)隨機(jī)生成的。
        宿主機(jī)器的IP地址是固定的,我們可以將容器的端口的映射到宿主機(jī)器上的一個(gè)端口,免去每次訪問(wèn)容器中的某個(gè)服務(wù)時(shí)都要查看容器的IP的地址。
        對(duì)于一個(gè)運(yùn)行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID來(lái)查看該端口號(hào)在宿主機(jī)器上的映射端口。
        • ENV(用于設(shè)置環(huán)境變量)

        構(gòu)建指令,在image中設(shè)置一個(gè)環(huán)境變量。

        ENV  
        設(shè)置了后,后續(xù)的RUN命令都可以使用,container啟動(dòng)后,可以通過(guò)docker inspect查看這個(gè)環(huán)境變量,也可以通過(guò)在docker run —env key=value時(shí)設(shè)置或修改環(huán)境變量。
        假如你安裝了JAVA程序,需要設(shè)置JAVA_HOME,那么可以在Dockerfile中這樣寫:
        ENV JAVA_HOME /path/to/java/dirent
        • ADD(從src復(fù)制文件到container的dest路徑)
        構(gòu)建指令,所有拷貝到container中的文件和文件夾權(quán)限為0755,uid和gid為0;

        如果是一個(gè)目錄,那么會(huì)將該目錄下的所有文件添加到container中,不包括目錄;如果文件是可識(shí)別的壓縮格式,則docker會(huì)幫忙解壓縮(注意壓縮格式);

        如果是文件且中不使用斜杠結(jié)束,則會(huì)將視為文件,的內(nèi)容會(huì)寫入;

        如果是文件且中使用斜杠結(jié)束,則會(huì)文件拷貝到目錄下。
        ADD  

        是相對(duì)被構(gòu)建的源目錄的相對(duì)路徑,可以是文件或目錄的路徑,也可以是一個(gè)遠(yuǎn)程的文件url;

        是container中的絕對(duì)路徑

        • VOLUME(指定掛載點(diǎn))

        設(shè)置指令,使容器中的一個(gè)目錄具有持久化存儲(chǔ)數(shù)據(jù)的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。

        我們知道容器使用的是AUFS,這種文件系統(tǒng)不能持久化數(shù)據(jù),當(dāng)容器關(guān)閉后,所有的更改都會(huì)丟失。當(dāng)容器中的應(yīng)用有持久化數(shù)據(jù)的需求時(shí)可以在Dockerfile中使用該指令。

        FROM baseVOLUME ["/tmp/data"]
        • WORKDIR(切換目錄)

        設(shè)置指令,可以多次切換(相當(dāng)于cd命令),對(duì)RUN,CMD,ENTRYPOINT生效。

        # 在 /p1/p2 下執(zhí)行 vim a.txtWORKDIR /p1 WORKDIR p2 RUN vim a.txt

        2.7 鏡像導(dǎo)入導(dǎo)出

        導(dǎo)出鏡像到本地:

        docker save -o centos6.5.tar centos6.5 或docker export f9c99092063c >centos6.5.tar

        從本地將鏡像導(dǎo)入:

        docker load --input centos6.5.tar 或docker load < centos6.5.tar

        docker rm刪除已經(jīng)終止的容器docker -f rm 可以刪除正在運(yùn)行的容器

        修改已經(jīng)運(yùn)行的后臺(tái)容器:

        docker exec -it CONTAINER ID /bin/bash

        三、存儲(chǔ)

        3.1 數(shù)據(jù)盤

        Docker 的鏡像使用一層一層文件組成的,Docker 的一些存儲(chǔ)引擎可以處理怎么樣存儲(chǔ)這些文件。

        docker inspect centos #查看容器詳細(xì)信息

        信息下方的Layers,就是centos的文件,這些東西都是只讀的不能去修改,我們基于這個(gè)鏡像去創(chuàng)建的鏡像和容器也會(huì)共享這些文件層,而docker會(huì)在這些層上面去添加一個(gè)可讀寫的文件層。

        如果需要修改一些文件層里面的東西的話,docker會(huì)復(fù)制一份到這個(gè)可讀寫的文件層里面,如果刪除容器的話,那么也會(huì)刪除它對(duì)應(yīng)的可讀寫的文件層的文件。

        如果有些數(shù)據(jù)你想一直保存的話,比如:web服務(wù)器上面的日志,數(shù)據(jù)庫(kù)管理系統(tǒng)里面的數(shù)據(jù),那么我們可以把這些數(shù)據(jù)放到data volumes數(shù)據(jù)盤里面。

        它上面的數(shù)據(jù),即使把容器刪掉,也還是會(huì)永久保留。創(chuàng)建容器的時(shí)候,我們可以去指定數(shù)據(jù)盤。其實(shí)就是去指定一個(gè)特定的目錄。

        docker run -i -t -v /mnt  --name nginx docker.io/nginx /bin/bash
        • -v:制定掛載到容器內(nèi)的目錄

        使用docker inspect容器ID可以查看掛載目錄對(duì)應(yīng)于宿主機(jī)的物理文件路徑。

        同樣,我們可以使用將制定物理宿主機(jī)的目錄掛載到容器的制定目錄下:

        將宿主機(jī)目錄掛載到容器內(nèi):

        docker run -d -p 80:80 --name nginx -v /webdata/wordpress:/usr/share/nginx/html docker.io/sergeyzh/centos6-nginx
        • -d 后臺(tái)運(yùn)行

        • —name 給運(yùn)行的容器命名

        • -v 宿主機(jī)目錄:容器目錄 將宿主機(jī)目錄掛載在容器內(nèi)

        • -p 宿主機(jī)端口:容器監(jiān)聽(tīng)端口 將容器內(nèi)應(yīng)用監(jiān)聽(tīng)端口映射到物理宿主機(jī)的特定端口上

        映射多個(gè)物理目錄:(多寫幾個(gè)-v即可)

        3.2 數(shù)據(jù)容器

        可以創(chuàng)建一個(gè)數(shù)據(jù)容器,也就是再創(chuàng)建容器是指定這個(gè)容器的數(shù)據(jù)盤,然后讓其他容器可以使用這個(gè)容器作為他們的數(shù)據(jù)盤,有點(diǎn)像繼承了這個(gè)數(shù)據(jù)容器指定的數(shù)據(jù)盤作為數(shù)據(jù)盤。

        首先創(chuàng)建一個(gè)數(shù)據(jù)容器命名為newnginx

        docker create -v /mnt -it --name newnginx docker.io/nginx /bin/bash

        利用此數(shù)據(jù)容器容器運(yùn)行一個(gè)容器nginx1,在數(shù)據(jù)目錄/mnt 下創(chuàng)建一個(gè)文件

        docker run --volumes-from newnginx --name nginx1 -it docker.io/nginx /bin/bash
        利用數(shù)據(jù)容器在創(chuàng)建一個(gè)容器nginx2,查看數(shù)據(jù)目錄下容器nginx1創(chuàng)建的文件依舊存在,同理在nginx2的/mnt下創(chuàng)建文件,其他基于數(shù)據(jù)容器運(yùn)行的新容器也可以看到文件

        3.3 數(shù)據(jù)盤管理

        在刪除容器時(shí),docker默認(rèn)不會(huì)刪除其數(shù)據(jù)盤。

        docker volume ls                    #查看數(shù)據(jù)盤docker volume ls -f dangling=true        #查看未被容器使用的數(shù)據(jù)盤docker volume rm VOLUME NAME        #刪除數(shù)據(jù)盤

        如果想要?jiǎng)h除容器時(shí),同時(shí)刪除掉其數(shù)據(jù)盤,那么可以使用-v參數(shù)。

        docker rm -v newnginx

        四、網(wǎng)絡(luò)

        docker提供幾種網(wǎng)絡(luò),它決定容器之間和外界和容器之間如何去相互通信。

        docker network ls        #查看網(wǎng)絡(luò)
        當(dāng) Docker 進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為 docker0 的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。

        虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。

        在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以vethxxx這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。

        4.1 bridge橋接

        網(wǎng)絡(luò)除非創(chuàng)建容器的時(shí)候指定網(wǎng)絡(luò),不然容器就會(huì)默認(rèn)的使用橋接網(wǎng)絡(luò)。屬于這個(gè)網(wǎng)絡(luò)的容器之間可以相互通信,不過(guò)外界想要訪問(wèn)到這個(gè)網(wǎng)絡(luò)的容器呢,需使用橋接網(wǎng)絡(luò),有點(diǎn)像主機(jī)和容器之間的一座橋,對(duì)容器有一點(diǎn)隔離作用。

        實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可以使用iptables -t nat -vnL查看。

        4.2 host 主機(jī)網(wǎng)絡(luò)

        如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè) Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。

        但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。只用這種網(wǎng)絡(luò)的容器會(huì)使用主機(jī)的網(wǎng)絡(luò),這種網(wǎng)絡(luò)對(duì)外界是完全開(kāi)放的,能夠訪問(wèn)到主機(jī),就能訪問(wèn)到容器。

        4.3 使用 none 模式

        使用none模式Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。使用此種網(wǎng)絡(luò)的容器會(huì)完全隔離。

        4.4 簡(jiǎn)單演示

        啟動(dòng)兩個(gè)容器,查看其容器內(nèi)部IP地址

        for i in `docker ps |grep -v "CONTAINER"|awk '{print $1}'`;do docker inspect $i|grep 'IPAddress';done

        查看橋接模式下主機(jī)內(nèi)部容器之間和容器與宿主機(jī)直接均可正常通訊

        docker inspect 容器ID

        查看host創(chuàng)建的容器內(nèi)部沒(méi)有IP地址,它使用的為宿主機(jī)的地址:

        docker run -d --net host docker.io/sergeyzh/centos6-nginx

        查看 host 創(chuàng)建的容器內(nèi)部沒(méi)有 IP 地址,它使用的為宿主機(jī)的地址:
        docker run -d --net none docker.io/sergeyzh/centos6-nginx

        4.5 容器端口

        如果想讓外界可以訪問(wèn)到,基于bridge網(wǎng)絡(luò)創(chuàng)建的容器提供的服務(wù),那你可以告訴Docker 你要使用哪些接口。如果想查看鏡像會(huì)使用哪些端口,ExposedPorts,可以獲悉鏡像使用哪些端口。

        docker run -d -p 80 docker.io/sergeyzh/centos6-nginxdocker port 09648b2ff7f6
        • -p 參數(shù)會(huì)在宿主機(jī)隨機(jī)映射一個(gè)高端口到容器內(nèi)的指定端口。

        docker run -d -p 80:80 docker.io/sergeyzh/centos6-nginx    #將宿主機(jī)的80端口映射到容器的80端口

        原文鏈接:https://juejin.im/post/5c491406e51d4518c1551fd6

        轉(zhuǎn)自:高效運(yùn)維



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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲成人五月天 | 国产成人精品无码免费看夜聊软件 | 国产做受91 高潮 | 中文字幕亚洲综合 | 黄色片网站免费 | 大胸美女被人操 | 久久这里只有精品视频81 | 小黄片免费观看 | 热热aⅴ | 依依成人网站 |