1. 程式人生 > 其它 >新一代Java程式設計師必學的Docker容器化技術基礎篇

新一代Java程式設計師必學的Docker容器化技術基礎篇

如同Java函式式、鏈式程式設計\Lambda表示式、Stream流程式設計,Docker也是Java必不可缺一門容器化技術,本篇主要從Docker的由來開發,瞭解原理、常用命令以及容器卷技術,如何一步步寫DockerFile,瞭解Docker網路以及Ngnix、ES叢集的容器化部署實戰入手。docker可以打包映象釋出實現一鍵執行,使用docker我們可以像搭積木一樣增加一層層映象實現,docker是核心級別的虛擬化,比虛擬機器更少的抽象層,一臺物理機上可以執行很多的容器示例,可以把伺服器效能壓榨到極致。

Docker概述

**本人部落格網站 **IT小神 www.itxiaoshen.com

Docker文件官網

Docker是一個用於開發、釋出和執行應用程式的開放平臺。Docker使您能夠將應用程式與基礎設施分離開來,以便快速交付軟體。使用Docker,您可以以與管理應用程式相同的方式管理基礎設施。通過利用Docker快速釋出、測試和部署程式碼的方法,您可以顯著減少編寫程式碼和在生產環境中執行程式碼之間的延遲。

docker為什麼會出現

簡單的說就是我們開發軟體是需要部署還包括基礎環境如mysql、redis、jdk和基礎資料等,且還需重複部署很多臺伺服器,部署環境又有開發環境、測試環境、預生產環境、正式線上環境等,從開發-測試-運維都是很費力費時,特別是由於環境依賴等問題有時需要耗費較大時間解決,有了docker可以把上面問題解決,docker圖示上面就有集裝箱圖示,這個比喻很恰當,docker將所有內容存在集裝箱內,搬運至任何地方;而docker的核心思想也就是打包裝箱,每個箱子之間互相隔離,而docker也是利用隔離機制將伺服器利用到極致。

docker能做什麼

  • 開發人員在本地編寫程式碼,並使用Docker容器與同事分享他們的工作成果。
  • 使用Docker將應用程式推入測試環境,並執行自動和手動測試。
  • 當開發人員發現錯誤時,可以在開發環境中修復它們,並將它們重新部署到測試環境中進行測試和驗證。
  • 測試完成後,向客戶獲取修復就像將更新後的映像推入生產環境一樣簡單。

在DevOps時代可以更快的交付和部署,docker容器是直接執行在宿主機上,沒有自己的核心和硬體,所以執行很輕便,每個容器間是互相隔離的,都有自己檔案系統不影響;docker可以打包映象釋出實現一鍵執行,使用docker我們可以像搭積木一樣增加一層層映象實現,docker是核心級別的虛擬化,比虛擬機器更少的抽象層,一臺物理機上可以執行很多的容器示例,可以把伺服器效能壓榨到極致。

docker歷史

2010年,幾個大鬍子年輕人在舊金山成立了一家做 PaaS 平臺的公司,起名為dotCloud,專注於LXC容器化技術,docker剛誕生沒有引起行業的主體,剛開始發展不太如意。2013年10月 dotCloud 公司更名為 Docker 股份有限公司,2014年8月 Docker 宣佈把平臺即服務的業務「dotCloud」出售給位於德國柏林的平臺即服務提供商「cloudControl」,dotCloud 的歷史告一段落

2013年docker開源,越來越多人發現docker這個寶藏,與虛擬機器技術vmware相比,vmware映象經常是幾個G,啟動要幾分鐘,而docker非常輕巧,docker直接執行映象就可以了,秒級啟動服務,太厲害了

docker架構基本組成

Docker使用客戶-伺服器架構。Docker客戶端與Docker守護程序對話,後者負責構建、執行和分發Docker容器。Docker客戶端和守護程序可以執行在同一個系統上,或者您可以將一個Docker客戶端連線到一個遠端Docker守護程序。Docker客戶端和守護程序使用REST API通過UNIX套接字或網路介面進行通訊。另一個Docker客戶端是Docker Compose,它允許您使用由一組容器組成的應用程式。

  • Docker daemon:Docker守護程序(dockerd)監聽Docker API請求,管理Docker物件,如映象、容器、網路和卷。一個守護程序也可以與其他守護程序通訊來管理Docker服務。
  • Docker client:Docker客戶端(Docker)是許多Docker使用者與Docker互動的主要方式。當您使用諸如docker run之類的命令時,客戶端將這些命令傳送給dockerd,由dockerd執行這些命令。docker命令使用docker API。Docker客戶端可以與多個守護程序通訊。
  • Docker registries:Docker登錄檔儲存Docker映象。Docker Hub是一個任何人都可以使用的公共登錄檔,Docker預設配置為在Docker Hub上查詢映像。您甚至可以執行自己的私有登錄檔。
  • Images:映象是一個只讀模板,包含建立Docker容器的說明。通常,一個映象基於另一個映象,並進行一些額外的定製。例如,您可以構建一個基於ubuntu映象的映象,但是安裝Apache web伺服器和您的應用程式,以及使您的應用程式執行所需的配置細節。
  • Containers:容器是映象的可執行例項。您可以使用Docker API或CLI建立、啟動、停止、移動或刪除容器。您可以將容器連線到一個或多個網路,為其附加儲存,甚至根據其當前狀態建立新映象。

簡單理解,docker宿主機是docker核心引擎,用於下載映象和執行容器,映象就好比我們Java中的類,而容器就是類New出來的物件;docker registry如docker hub 就好比maven中央倉庫,用於存放製作好的docker映象,也支援本地私有部署如docker harbor,可以通過docker push或docker pull 進行上傳或下載映象;而docker client就是我們操作docker宿主機的一個命令列工具

底層技術

Docker是用Go程式語言編寫的,並利用了Linux核心的若干特性來交付其功能。Docker使用名為名稱空間的技術來提供名為容器的獨立工作區。當您執行一個容器時,Docker會為該容器建立一組名稱空間。這些名稱空間提供了一個隔離層。容器的每個方面都執行在一個單獨的名稱空間中,它的訪問僅限於該名稱空間。

安裝Docker環境

[docker安裝官網地址](https://docs.docker.com/engine/install/centos/)

詳細參考官網,官網有非常詳細安裝說明

#如果安裝過docker刪除已安裝docker版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                
sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#安裝最新版本的docker核心引擎、命令列客戶端、容器
sudo yum install docker-ce docker-ce-cli containerd.io
#如果要安裝特定版本的Docker引擎,請在repo中列出可用的版本,然後選擇並安裝
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#啟動docker
sudo systemctl start docker
#執行hello-world容器
sudo docker run hello-world

安裝完畢後檢查下版本和測試hello-world如有如下顯示就可以盡情使用單機版的docker了,注意這個只是單機的玩具,如果想要在單機編排執行容器得使用docker-compose,如果要用到docker叢集得使用docker swarm。

所以我們再安裝docker-compose,docker-compose安裝非常簡單,直接將docker-compose可行性檔案拷貝到系統的/usr/local/bin,然後通過sudo chmod +x /usr/local/bin/docker-compose賦予執行檔案許可權即可,docker-compose可執行檔案可到docker的GitHub去獲取;我的虛擬機器是CentOS Linux release 8.3.2011,所以我們選擇這裡選擇Docker for Linux安裝,

配置阿里雲映象

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://f9dk003m.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker命令

docker 文件

docker官方文件

幫助命令

docker verison
docker info
docker --help

常用命令

docker images
--all , -a		顯示所有映象
--digests		顯示摘要
--filter , -f		條件過濾輸出
--format		使用Go模板列印漂亮的影象
--no-trunc		不截斷輸出
--quiet , -q		只顯示影象id
docker search mysql --no-trunc  //查詢映象
docker pull tomcat //拉取映象,如果不寫tag就是預設latest即最新版本,比如要指定安裝mysql5.7則在後面直接:5.7即可,下面有很多Pull complete則代表的是一層層的映象進行分層下載,這個也是docker image的核心,屬於聯合檔案系統
docker run  --name nginx-test -p 8080:80 -d nginx //執行容器,如果本地沒有image映象檔案則會先執行pull拉取映象,--name為容器名字用於區分容器,-p有幾種寫法,這裡是一種,前面的對外暴露8080埠,外部要訪問容器80埠則是通過宿主機的8080埠對映實現,對映容器內部埠80,nginx預設配置埠為80, -d後臺執行;其他還有很多引數如-it使用互動式方式執行,進入容器檢視內容,--rm是停止容器後直接刪除容器資料

我的docker宿主機為192.168.3.117 訪問8080

docker ps //檢視執行容器 加-a則查詢全部容器
docker images //顯示全部映象
docker push //上傳映象,上傳映象需要先執行登入
docker login  //docker倉庫地址 -u 使用者名稱 -p 密碼,退出
docker login out //退出登入
docker create //建立一個新的容器,和run的差別就是不啟動容器
docker start //啟動容器編號或名稱
docker stop //停止容器編號或名稱
docker restart //重啟容器編號或名稱
docker kill //殺掉編號的容器
docker pause  //暫停容器
docker unpause //取消暫停容器
docker rm   //刪除容器編號或名稱,不能刪除執行中容器,可以先執行stop後再刪除
docker rmi  //刪除映象編號,刪除該映象得先刪除該映象所有的容器-f可以刪除多個容器,如果全部刪除docker rmi -f $(docker images -aq)
docker cp //可以從宿主機拷貝容器,也可以從容器拷貝宿主機
docker top //檢視容器內的top命令
docker build  //通過Dockerfile只做映象-t 映象名稱 然後路徑 .為當前路徑
docker commit //提交當前映象為新的映象
docker save //儲存一個映象為tar包
docker tag //給docker中的映象打標籤
docker load //從一個tar包載入映象
docker history //展示一個映象的形成歷史
docker diff  //檢視容器的變化
docker import //匯出容器的內容流到一個tar歸檔檔案tar歸檔檔案
docker export //從一個tar歸檔檔案tar歸檔檔案匯入建立為一個新的檔案映象
docker logs -ft --tail 10 97d71a3ecb35 //檢視容器的日誌 -ft顯示日誌 --tail 日誌顯示行數
docker exec -it 97d71a3ecb35 /bin/bash  //進入容器內部 -it使用互動式方式執行,容器內執行exit退出
docker attach 97d71a3ecb35      //連線到正在執行中的容器,容器輸出會列印控制檯,ctrl+c終端退出容器也會停止
docker inspect 97d71a3ecb35  //檢視容器/映象的元資料如容器的主機配置、掛載、網路設定

部署ES

docker-hub官網 需要註冊docker的賬號,頁面搜尋 elasticsearch,要部署其他軟體也是類似操作

ES需要暴露埠較多,十分佔用記憶體,資料需要放到安全目錄,--net somenetwork進行網路配置,這些後面我們詳細說明,這裡只是引入概念入門理解

docker network create somenetwork //建立使用者定義的網路(用於連線到連線到同一網路的其他服務(如Kibana))
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.14.0  //執行Elasticsearch
docker stats //檢視容器的物理資源使用情況

訪問ES 9200埠,這個是暴露ES RESTful介面埠號,http://192.168.3.117:9200/

我們通過-e設定虛擬機器引數修改ES執行的記憶體

[root@localhost ~]# docker stop 0daa832636720daa83263672[root@localhost ~]# docker rm 0daa83263672[root@localhost ~]# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms516m -Xmx1024m" elasticsearch:7.14.0  //執行Elasticsearch

Docker 映象

什麼是映象

映象是一種輕量級,可執行的獨立軟體包,用來打包軟體執行環境和基於環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時庫,環境變數和配置檔案, 所有的應用,直接打包docker映象,就可以直接跑起來

如何得到映象呢

  • 從遠端倉庫下載
  • 別人拷貝給你
  • 本地commit映象,可以獲取對於映象配置,比如安裝基礎的命令和工具作業系統映象,安裝一個標準大資料節點映象
  • 自己通過Dockerfile製作一個映象

映象載入原理

  • UnionFS(聯合檔案系統) :Union(聯合檔案系統)是一種分層,輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem). Union檔案系統是Docker 映象的基礎,映象可以通過分層來進行繼承,基於基礎映象,可以製作一種具體的應用映象。一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有的底層的檔案和目錄
  • Docker映象載入原理:docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS,bootfs(boot file system)主要包含bootloader 和kernel, bootloader 主要是引導載入kernel, Linux剛啟動的時候會載入bootfs檔案系統,在Docker映象的最底層是bootfs. 這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和核心,當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs
    rootfs(root file system) ,在bootfs之上,包含的就是典型的Linux系統 中 /dev 、/proc 、 /bin, /etc等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,CentOS等等。平時我們安裝進虛擬機器的CentOS都好幾個G,而Docker這裡才209M,對於一個精簡的OS , rootfs可以很小,只需要包含最基本的命令,工具和程式庫就可以了,因為底層直接用宿主機的核心,自己只需要提供rootfs就可以了,由此可見對於不同的Linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行生版可以公用bootfs

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-sA3YOxBS-1629904012586)(image-20210825135001005.png)]

  • docker分層映象:一個映象有很多層,前面我們執行pull、run、inspect命令就有看到,docker分層最大作用就是實現資源共享,Docker映象都是隻讀的,當容器啟動時,一個新的可寫層被載入到映象的頂部,這一層就是我們通常說的容器層,容器之下都叫映象層。

容器資料卷

定義

docker 的理念將應用和環境打包成一個映象, 如果資料都在容器中,那麼我們容器被刪除,資料就會丟失! 怎樣可以把容器資料持久化
比如Mysql,docker設計了一個容器之間資料共享技術,Docker容器中產生的資料同步到本地 ---------這就是資料卷技術,目錄的掛載,將我們容器的目錄,掛載到Linux上面!簡單說就是容器的持久化和同步操作,容器間也是可以資料共享的

如何使用資料卷

一種方式是可以直接通過命令docker run -v方式掛載 ,掛載三種形式,也可以通過Dockerfile檔案來實現掛載,這個下一小節再說

docker run -d -P --name nginx-itxs01 -v /etc/nginx nginx //匿名掛載
docker run -d -P --name nginx-itxs02 -v my_nginx:/etc/nginx nginx //具名掛載
docker run -d -P --name nginx-itxs03 -v /home/docker/root:/etc/nginx nginx //指定路徑掛載!

掛載後我們便可以實現從宿主機上修改nginx.conf配置檔案實現配置更改,放置頁面實現靜態資源的更新

Dockerfile

Dockerfile瞭解

Dockerfile 就是用來構建docker映象的構建檔案!通過這個指令碼可以生成映象,映象是一層一層的,一個個的命令,每個命令都是一層!

先手工寫一個簡單Dockerfile並build成映象,可以看到在容器內掛載兩個目錄

通過docker inspect也可以檢視到掛載資訊,如果在宿主機或者容器內修改掛載目錄下的內容,兩邊都會資料同步

常用命令

FROM--------------- # 基礎映象,一切從這裡開始構建
MAINTAINER---- # 映象是誰寫的,姓名+郵箱
RUN --------------- # 映象構建的時候需要執行的命令
ADD --------------- # 步驟:tomcat映象,這個tomcat壓縮包,新增內容
WORKDIR--------- #映象的工作目錄
VOLUME---------- #掛載的目錄
EXPOST----------- # 保留埠配置
CMD----------------- # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代
ENTRYPOINT---- # 指定這個容器啟動的時候要執行的命令,可以追加命令
ONBUILD----------- # 當構建一個被繼承 DockerFile 這個時候就會執行 ONBUILD 的命令,觸發指令
COPY-----------------# 類似ADD 將我們檔案拷貝到映象中
ENV-------------------# 構建的時候設定環境變數

資料卷容器

volumes-from 容器間傳遞共享

當我們在使用docker容器的時候,會產生一系列的資料檔案,這些資料檔案在我們關閉docker容器時是會消失的,但是其中產生的部分內容我們是希望能夠把它給儲存起來另作用途的,Docker將應用與執行環境打包成容器釋出,我們希望在執行過程鍾產生的部分資料是可以持久化的的,而且容器之間我們希望能夠實現資料共享。通俗地來說,docker容器資料卷可以看成使我們生活中常用的u盤,它存在於一個或多個的容器中,由docker掛載到容器,但不屬於聯合檔案系統,Docker不會在容器刪除時刪除其掛載的資料卷。

docker run -itd --name itsx_docker1 itxs/centos1   //第一個容器docker run -itd --name itsx_docker2 --volumes-from itsx_docker1 itxs/centos1 docker run -itd --name itsx_docker3 --volumes-from itsx_docker1 itxs/centos1

itsx_docker2和itsx_docker3都掛載,可以在itsx_docker2和itsx_docker3容器內檢視到之前建的兩個檔案

刪除itsx_docker1容器,在itsx_docker2和itsx_docker3容器內仍然可以檢視到之前建的兩個檔案,實現容器之間的資料同步,刪除itsx_docker2,itsx_docker3容器內仍然可以檢視到之前建的兩個檔案,因此容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止,但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的

因此比如想實現Mysql資料同步就可以用這種方法實現

//-e 設定mysql root密碼
docker run -d -p 3308:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:8.0
docker run -d -p 3304:3306 l -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 --volumes-from mysql1 mysql:8.0

Dockerfile構建步驟

  • 編寫一個dockfile檔案,dockfile是一個構建檔案,定義了一切的步驟,也即是原始碼,dockerfile是面向開發的,我們以後要釋出專案,做映象,就需要編寫dockfile檔案!Docker映象逐漸成為企業交付的標準,開發人員也必須掌握
    • 每個保留關鍵字(指令)都是必須是大寫字母
    • 執行從上到下順序執行
    • 表示註釋

    • 每一個指令都會建立提交一個新的映象層,並提交!
  • docker build 構建成了一個映象 ,-f指定dockerfile檔案,預設為當前目錄下的Dockerfile,-t .在當前目錄 ,通過DockFile 構建生成的映象,最終釋出和執行的產品
  • docker run 執行映象,容器就是映象執行起來提供伺服器
  • docker push 釋出映象(DockerHub 、Docker Harbor、阿里雲映象倉庫)

1、每個保留關鍵字(指令)都是必須是大寫字母

2、執行從上到下順序執行

3、#表示註釋

4、每一個指令都會建立提交一個新的映象層,並提交!

5、dockerfile是面向開發的,我們以後要釋出專案,做映象,就需要編寫dockfile檔案!Docker映象逐漸成為企業交付的標準,開發人員也必須掌握

研究官方

從docker-hub查詢映象,並通過官方說明連結到GitHub地址,比如我們查詢centos映象

FROM scratch
ADD CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz  /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200114" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-01-14 00:00:00-08:00"

CMD ["/bin/bash"]

Docker Hub中, 幾乎絕大部分的映象都是從這個基礎映象過來的 FROM scratch, 然後配置需要的軟體和配置來進行的構建。

上面centos不能執行vim和ifconfig命令,我們製作一個映象,編寫Dockerfile檔案,內容如下,然後編譯映象,執行容器使用vim和ifconfig命令檢視成功

FROM centos
MAINTAINER [email protected]
ENV MYPATH /uer/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo “----finish----”
CMD /bin/bash
docker build -t itxs/centos-tools .  //編譯映象

Tomcat映象

  • 準備Dockerfile,打包jdk和tomcat,設定jdk環境變數,指定容器內埠
FROM centos
MAINTAINER [email protected]

COPY readme.txt  /uer/local/readme.txt

ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local

RUN yum -y update --nogpgcheck
RUN yum -y makecache --nogpgcheck
RUN yum -y install vim --nogpgcheck

ENV  MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH  $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin

EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
  • 編譯映象和執行容器
docker build -t itxs-tomcat .
docker run -d -p 8081:8080 --name itxstomcat1 -v  /home/docker/data/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test  -v /home/docker/data/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.40/logs itxs-tomcat
  • 訪問測試,由於有掛載可以直接在宿主機下製作一個靜態頁面放在tomcat webapps/test網站下,然後通過暴露埠和頁面地址訪問測試

Docker網路

網路基礎

  • 通過命令ip addr檢視本地ip地址,我們發現除了本機迴環地址和內網地址外,還多了一個網絡卡:Docker0,這是Docker服務啟動後自動生成的。

  • 之前我們從docker inspect 命令可以檢視容器網路配置包括容器主機名和IP地址,docker宿主機和docker容器之間網路是連通的,可以在宿主機直接ping同容器的內網地址,並且容器和容器之間是也是可以互相ping通的,容器1→Docker0→容器2

  • 原理:我們每啟動一個docker容器,docker就會給容器分配一個預設的可用ip,我們只要安裝了docker,就會有一個網絡卡docker0(bridge)。網絡卡採用橋接模式,並使用veth-pair技術(veth-pair就是一堆虛擬裝置介面,成對出現,一段連著協議,一段彼此相連,充當一個橋樑)

  • docker中的所有網路介面都是虛擬的 ,轉發效率高。刪除容器後,對應的網橋也隨之刪除。

網路命令

docker run -d -P --link 容器名/id 映象名/id //直接使用容器名是無法ping通容器內部的,這時我們可以在容器啟動命令中加入一個選項:--link,使得我們可以根據容器名來訪問容器,但是如果反向就不可以ping通,這是因為--link的本質是把需要連線的容器名/id寫入啟動容器的配置檔案中,即增加了一個ip和容器名/id的對映,實現原理也是往容器裡系統/etc/hosts檔案增加解析記錄,--link使用場景較少,已不推薦

docker network ls //列出所有網路
docker中的網路模式有:bridge:橋接(docker預設);none:不配置網路 ;host:和宿主機共享網路
docker run 命令預設帶有一個引數--net bridge,此處的bridge指的就是docker0。如果我們不想使用docker0,那就可以自己建立一個新的網路

docker network create --driver bridge --subnet 192.168.9.0/16 --gateway 192.168.9.1 testnet

只要兩個容器啟動時都通過 --net,選用了同一個已建立的網路,不同容器間即可通過ip地址或容器名/id連通:

那如果兩個容器--net使用不同網路,那我們則需要通過docker network connect命令打通容器與網路之間的連線:最終ping通

[root@localhost centos-tool]# docker run -d --name nginx-test1 --net bridge nginx
75cc2e3d857ace3798e9e853b49fff66e3bdd87eaaba0d770a853ecf16242102
[root@localhost centos-tool]# docker run -d --name nginx-test2 --net testnet nginx
63e4a23762b01f7b30092d83cf268f6282d57d26e14eb67f54a9bf3c372e498a

apt-get update
apt-get install inetutils-ping  //容器內安裝ping命令 

Docker 進階(花絮)

前面學習單個容器的操作,如果我們微服務是幾十上百個且服務與服務之間也有依賴關係,應該怎麼處理?docker compose容器編排就能輕鬆解決這些問題

還有如果服務需要部署到多臺物理機上哪又應該怎麼辦,docker swarm作為docker官方叢集管理可用來解決這些問題,後面還有docker stack 、docker config、docker secret 等;docker swarm適合於十幾臺內的小型叢集規模應用,大規模叢集應用即線上環境我們則直接是使用K8S,所以關於容器編排我們後續以K8S作為重點學習物件

docker進階我們會先從官方Docker Compose官網 的入門案例入手,這裡先踩個花絮,下次再見