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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Docker进阶实战

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker进阶实战 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、容器數(shù)據(jù)卷
    • 1.數(shù)據(jù)卷介紹
    • 2.數(shù)據(jù)卷使用
      • 2.1 數(shù)據(jù)卷的常用命令
    • 3.MySql在Docker中的持久化問題
    • 4. 匿名和具名掛載
      • 4.1 匿名掛載
      • 4.2 具名掛載
      • 4.3 掛載信息查看與權(quán)限寫入
  • 二、DockerFile
    • 1. 概述
    • 2. 構(gòu)建過程
      • 2.1 基礎(chǔ)知識
    • 2.2 DockerFile 指令
    • 3. 實戰(zhàn)
      • 3.1 構(gòu)建centos 鏡像
      • 3.2 構(gòu)建tomcat 鏡像
  • 三、DockerNet
    • 1. 認(rèn)識網(wǎng)絡(luò)模式
    • 2. 默認(rèn)網(wǎng)絡(luò)
      • 2.1 Host
      • 2.2 Container
      • 2.3 None
      • 2.4 Bridge
    • 3. Docker:網(wǎng)絡(luò)模式詳解
      • 3.1 Bridge模式的拓?fù)?/li>
      • 3.2 Docker:網(wǎng)絡(luò)模式詳解
      • 3.3 容器聯(lián)通
    • 4. 自定義網(wǎng)絡(luò)
      • 4.1 查看默認(rèn)的網(wǎng)橋信息
      • 4.2 自定義網(wǎng)絡(luò)
      • 4.3 自定義網(wǎng)絡(luò)的好處
    • 5.網(wǎng)絡(luò)連通
    • 6. Redis集群部署實戰(zhàn)
    • 7. SpringBoot微服務(wù)打包發(fā)布
  • 四、Docker Compose
    • 1. Compose 簡介
    • 2. Compose 安裝
    • 3. 使用
      • 3.1 準(zhǔn)備
      • 3.2 創(chuàng)建 Dockerfile 文件
      • 3.3 創(chuàng)建 docker-compose.yml
    • 4 .使用 Compose 部署前后分離項目實戰(zhàn)
      • 4.1 打包前后端項目
      • 4.2 編寫DockerFile
      • 4.3 編寫docker-compose.yaml
      • 4.4 啟動部署
  • 五、Docker Machine
  • 六、Docker Swarm
  • 總結(jié)


前言

Dokcer 進(jìn)階

如果還沒想清楚,就用 蠻力算法 。——Ken Thompson


一、容器數(shù)據(jù)卷

1.數(shù)據(jù)卷介紹

Docker將運用與運行的環(huán)境打包形成容器運行, Docker容器產(chǎn)生的數(shù)據(jù),如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)做為鏡像的一部分保存下來, 那么當(dāng)容器刪除后,數(shù)據(jù)自然也就沒有了。 為了能保存數(shù)據(jù)在Docker中我們使用卷。|

卷就是目錄或文件,存在于一個或多個容器中,由Docker掛載到容器,但卷不屬于聯(lián)合文件系統(tǒng)(Union FileSystem),因此能夠繞過聯(lián)合文件系統(tǒng)提供一些用于持續(xù)存儲或共享數(shù)據(jù)的特性:。

卷的設(shè)計目的就是數(shù)據(jù)的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數(shù)據(jù)卷。

數(shù)據(jù)卷的特點:
1. 數(shù)據(jù)卷可在容器之間共享或重用數(shù)據(jù)
2. 卷中的更改可以直接生效
3. 數(shù)據(jù)卷中的更改不會包含在鏡像的更新中
4. 數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止

容器之間的數(shù)據(jù)共享技術(shù),Dokcer容器中產(chǎn)生的數(shù)據(jù),同步到本地。核心就是目錄的掛載,講容器內(nèi)部的目錄,掛載到Linux上面
小結(jié):容器的持久化和同步操作!容器也是可以數(shù)據(jù)共享的!

2.數(shù)據(jù)卷使用

直接使用命令方式來掛載 -v # docker run -it -v 主機(jī)目錄/容器目錄 測試 # docker run -it -v /home/test:/home cnetos /bin/bash 啟動之后查看容器詳細(xì)信息 # docker inspect <容器id> > Mounts 掛載信息 > Type 類型 > Source 主機(jī)內(nèi)地址 > Destination docker容器內(nèi)地址



雙向綁定數(shù)據(jù)。數(shù)據(jù)互通。在本地主機(jī)修改即可,無需進(jìn)入docker容器中。

2.1 數(shù)據(jù)卷的常用命令

1.創(chuàng)建數(shù)據(jù)卷 # docker volume create <卷名稱> 2.查看所有數(shù)據(jù)集 # docker volume ls 3.查看指定的數(shù)據(jù)卷信息 # docker volume inspect <卷名稱> { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } 4.刪除數(shù)據(jù)卷 # docker volume rm <卷名稱> 5.刪除容器的時候刪除與之相關(guān)的數(shù)據(jù)卷 # docker rm -v ... > 數(shù)據(jù)卷是被設(shè)計用來持久化數(shù)據(jù)的,它的生命周期獨立于容器,Docker 不會在容器被刪除后自動刪除數(shù)據(jù)卷。 > 并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的數(shù)據(jù)卷 。如果需要在刪除容器的同時移除數(shù)據(jù)卷。 > 可以在刪除容器的時候使用 docker rm -v 這個命令。 6.無主的數(shù)據(jù)卷可能會占據(jù)很多空間,要清理請使用以下命令 # docker volume prune

使用 --mount創(chuàng)建數(shù)據(jù)卷掛載一個主機(jī)目錄作為數(shù)據(jù)卷
使用 --mount 標(biāo)記可以指定掛載一個本地主機(jī)的目錄到容器中去。

$ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp \ --mount type=bind,source=/src/webapp,target=/opt/webapp \ training/webapp python app.py

上面的命令掛載主機(jī)的/src/webapp目錄到容器的/opt/webapp目錄。用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你創(chuàng)建它。

Docker 掛載主機(jī)目錄的默認(rèn)權(quán)限是讀寫 ,用戶也可以通過添加readonly 參數(shù)指定為只讀 。

$ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp:ro \ --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \ training/webapp \ python app.py 加了readonly之后,就掛載為只讀了。如果你在容器內(nèi)/src/webapp目錄新建文件,會顯示如下錯誤 /src/webapp # touch new.txt touch: new.txt: Read-only file system

3.MySql在Docker中的持久化問題

實例
安裝MySql,MySql的數(shù)據(jù)持久化問題

1.獲取鏡像 # docker pull mysql 2.運行容器,需要掛載數(shù)據(jù)到本地,需要配置密碼 官方命令 # docker run --name some-mysql -e MYSQL_ROOT_PASWORD=my-secret -d mysql:tag 自定義命令 # docker run -d -p 3344:3306 -v/home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 > -d 后臺運行 > -p 端口映射 > -v 數(shù)據(jù)卷 > -e 配置環(huán)境參數(shù) > --name 容器名字 啟動成功之后,使用本地數(shù)據(jù)庫連接工具,進(jìn)行測試 服務(wù)器3344端口映射到容器內(nèi)的3306端口,進(jìn)行連接 利用卷的掛載,實現(xiàn)數(shù)據(jù)持久化

4. 匿名和具名掛載

我們使用Docker與宿主機(jī)做關(guān)聯(lián)時,常常是要進(jìn)行掛載數(shù)據(jù)和配置文件的,那么Dokcer中就提供了兩種掛載方式,分別是具名掛載與匿名掛載。顧名思義,具名就是有具體名稱的掛載方式,而匿名就是沒有名字,或者說沒有指定名字,而被系統(tǒng)隨機(jī)分配名字的方式。
掛載命令
匿名掛載,具名掛載,指定路徑掛載的命令區(qū)別如下:
-v 容器內(nèi)路徑 #匿名掛載
-v 卷名:容器內(nèi)路徑 #具名掛載
-v /宿主機(jī)路徑:容器內(nèi)路徑 #指定路徑掛載

4.1 匿名掛載

如下運行并匿名掛載Nginx容器:

匿名掛載命令格式 # docker run -d -P --name nginx01 -v /etc/nginx nginx

查看所有的數(shù)據(jù)卷volume的情況, VOLUME NAME這里的值是真實存在的目錄。

# docker volume ls DRIVER VOLUME NAME local 198f39c04b7705350088ad8f9ab6072068da3547db375f99bb305cbf92abdb9f local 10913c9dbecc738bf7ce2614bca085d23d8ea57998051e1967ab865476d7a845 local ba800c642e0e295b2a275e0d3809ddc6bd2d1f11565b4741dfea506fd6e0e4f6 local fc1eccb2b19c84dd769c572a0389658fefc3248b19b9bbe3573c3cd299fa28a0

這種隨機(jī)名稱的掛載即為匿名掛載

4.2 具名掛載

如下運行并具名掛載Nginx容器:

具名掛載 # docker run -d -P --name nginx02 -v <具體名稱>:/etc/nginx nginx # docker volume ls DRIVER VOLUME NAME local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26 local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956 local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a local juming-nginx

4.3 掛載信息查看與權(quán)限寫入

查看指定的數(shù)據(jù)卷信息的命令:docker volume inspect數(shù)據(jù)卷名稱

查看掛載信息 # docker volume inspect <卷名稱> [{"CreatedAt": "2022-05-14T21:45:11+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/liusiqi/_data","Name": "nginx","Options": null,"Scope": "local"} ] > 可以看到Mountpoint參數(shù)即為掛載路徑 url:/var/lib/docker/volumes/liusiqi/_data > Docker所有的數(shù)據(jù)卷默認(rèn)在/var/lib/docker/volumes/ 目錄下

權(quán)限寫入

指定數(shù)據(jù)卷映射的相關(guān)參數(shù):
ro —— readonly 只讀。設(shè)置了只讀則只能操作宿主機(jī)的路徑,不能操作容器中的對應(yīng)路徑。
rw ----- readwrite 可讀可寫

1.只讀具名 # docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx 2.讀寫具名 # docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

二、DockerFile

1. 概述

DockerFile 就是用來構(gòu)建dokcer鏡像的文件!命令參數(shù)腳本。
構(gòu)建步驟:

  • 編寫dockerfile 文件
  • docker build 構(gòu)建成為一個鏡像
  • docker run 運行鏡像
  • docker push 發(fā)布鏡像(dokcerHub ,阿里云鏡像倉庫)
  • 例子:centos7的官方構(gòu)筑

    FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"]


    關(guān)系圖

    解析過程圖

    2. 構(gòu)建過程

    2.1 基礎(chǔ)知識

  • 每一個保留關(guān)鍵字(指令)都必須是大寫字母
  • 執(zhí)行從上到下順序執(zhí)行
  • (#) 表示注釋
  • 每一個指令都會創(chuàng)建提交一個新的鏡像層,進(jìn)行提交

  • dockerfile面向開發(fā)的,發(fā)布項目,作鏡像就需要編寫dockerfile文件。

    DockerFile:構(gòu)建文件,定義步驟,類似源代碼
    DockerImages: 通過 DockerFile 構(gòu)建生成鏡像,最終發(fā)布和運行產(chǎn)品
    Docker容器: 容器就是鏡像進(jìn)行運行來提供服務(wù)的

    2.2 DockerFile 指令

    指令說明
    FROM指定基礎(chǔ)鏡像
    MAINTAINER鏡像是誰寫的,姓名+郵箱
    RUN鏡像構(gòu)建的時候需要運行的命令
    ADD將本地文件添加到容器中,tar類型文件會自動解壓(網(wǎng)絡(luò)壓縮資源不會被解壓),可以訪問網(wǎng)絡(luò)資源,類似wget
    WORKDIR鏡像的工作目錄
    VOLUME掛載的目錄
    EXPOSE保留端口配置
    CMD指定這個容器啟動的時候要運行的命令(只有最后一個會生效)
    EMTRYPOINT指定這個容器啟動的時候要運行的命令,可以追加命令
    ONBUILD當(dāng)構(gòu)建一個被繼承DockerFile,這個時候就會運行ONBUILD的指令,觸發(fā)指令
    COPY功能類似ADD,但是是不會自動解壓文件,也不能訪問網(wǎng)絡(luò)資源
    ENV構(gòu)建的時候設(shè)置環(huán)境變量


    CMD 和 ENTRYPOINT 區(qū)別

    CMD : 指定這個容器啟動的時候要運行的命令,職業(yè)最后一個會生效,可被替代
    ENTRYPOINT: 指定這個容器啟動的時候要運行的命令,可以追加命令

    3. 實戰(zhàn)

    3.1 構(gòu)建centos 鏡像

  • 編寫dockerfile
    自定義一個帶有vim 和net-tools 的centos并進(jìn)行發(fā)布
  • FROM centos:7 MAINTAINER 姓名<郵箱>ENV MYPATH /usr/local WORKDIR $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD echo "-----end----" CMD /bin/bash
  • 進(jìn)行鏡像build
  • build自定義的鏡像,注意build語句最后有一個.n # docker build -f dockerfile文件名 -t 鏡像名稱 .
  • 查看鏡像的編譯歷史
  • 查看編譯歷史 # dokcer history 鏡像id

    例:
    nginx 編譯歷史

    IMAGE CREATED CREATED BY SIZE COMMENT 7425d3a7c478 4 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 4 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 4 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B <missing> 4 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB <missing> 4 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB <missing> 4 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB <missing> 4 days ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB <missing> 4 days ago /bin/sh -c set -x && addgroup --system -… 61.1MB <missing> 4 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.2 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.6 0B <missing> 4 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 days ago /bin/sh -c #(nop) ADD file:4a0bb88956083aa56… 80.4MB

    tomcat 編譯歷史

    IMAGE CREATED CREATED BY SIZE COMMENT 6a1271dfce51 3 days ago /bin/sh -c #(nop) CMD ["catalina.sh" "run"] 0B <missing> 3 days ago /bin/sh -c #(nop) EXPOSE 8080 0B <missing> 3 days ago /bin/sh -c set -eux; nativeLines="$(catalin… 0B <missing> 3 days ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 20.2MB <missing> 3 days ago /bin/sh -c #(nop) ENV TOMCAT_SHA512=53bfdba… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV TOMCAT_VERSION=10.0.20 0B <missing> 3 days ago /bin/sh -c #(nop) ENV TOMCAT_MAJOR=10 0B <missing> 3 days ago /bin/sh -c #(nop) ENV GPG_KEYS=A9C5DF4D22E9… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV LD_LIBRARY_PATH=/usr/… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV TOMCAT_NATIVE_LIBDIR=… 0B <missing> 3 days ago /bin/sh -c #(nop) WORKDIR /usr/local/tomcat 0B <missing> 3 days ago /bin/sh -c mkdir -p "$CATALINA_HOME" 0B <missing> 3 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/tomca… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV CATALINA_HOME=/usr/lo… 0B <missing> 4 days ago /bin/sh -c #(nop) CMD ["jshell"] 0B <missing> 4 days ago /bin/sh -c set -eux; arch="$(dpkg --print-… 343MB <missing> 4 days ago /bin/sh -c #(nop) ENV JAVA_VERSION=11.0.15 0B <missing> 4 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B <missing> 4 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/openj… 0B <missing> 4 days ago /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J… 27B <missing> 4 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/… 0B <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 11.3MB <missing> 4 days ago /bin/sh -c apt-get update && apt-get install… 152MB <missing> 4 days ago /bin/sh -c set -ex; if ! command -v gpg > /… 19MB <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 10.7MB <missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 days ago /bin/sh -c #(nop) ADD file:68a5d7d0db5926251… 124MB

    3.2 構(gòu)建tomcat 鏡像

  • 準(zhǔn)備鏡像文件 tomcat 壓縮包,jdk的壓縮包!

    通過ftp傳入服務(wù)器上
  • 編寫dockerFile 文件
    建議: 本地編輯ftp傳入服務(wù)或者,拷貝
  • FROM centos:7MAINTAINER 姓名 <郵箱>COPY readme.txt /usr/local/readme.txt# ADD 進(jìn)容器無需解壓 ADD apache-tomcat-9.0.62.tar.gz /usr/local/ ADD jdk-8u202-linux-x64.tar.gz /usr/local/ # 下載vim RUN yum -y install vim # 配置基礎(chǔ)目錄 ENV MYPATH /usr/local # 工作目錄 WORKDIR $MYPATH # 配置環(huán)境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_202 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 暴露端口 EXPOSE 8080# 啟動tomcat 并且動態(tài)打印日志 CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
  • 啟動容器
  • # docker run -d -p 3355:8080 --name diytomcat -v /home/dockerfile/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test > -d 后臺運行 > -p 綁定端口 > --name 命名 > -v 掛載
  • 編寫index.html 進(jìn)行測試
  • <!DOCTYPE html> <html><head><meta charset="UTF-8"/><title>這是個標(biāo)題</title></head><body><h1>DockerFIle 測試</h1></body> </html>

    在網(wǎng)頁中輸入ip+端口 注意要加上/test

    三、DockerNet

    1. 認(rèn)識網(wǎng)絡(luò)模式

    查看Dokcer的所有網(wǎng)絡(luò):

    # docker network ls


    Docker自身的4種網(wǎng)絡(luò)工作方式,和一些自定義網(wǎng)絡(luò)模式

    安裝Docker時,它會自動創(chuàng)建三個網(wǎng)絡(luò),bridge(創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò))、 none 、host

  • host:容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。

  • Container:創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍。

  • None:該模式關(guān)閉了容器的網(wǎng)絡(luò)功能。

  • Bridge:此模式會為每一個容器分配、設(shè)置IP等,并將容器連接到一個docker0虛擬網(wǎng)橋,通過docker0網(wǎng)橋以及Iptables nat表配置與宿主機(jī)通信。

  • 以上都是不用動手的,真正需要配置的是自定義網(wǎng)絡(luò)。

    DockerComposeDocker內(nèi)置這三個網(wǎng)絡(luò),運行容器時,你可以使用該–network標(biāo)志來指定容器應(yīng)連接到哪些網(wǎng)絡(luò)。

    該bridge網(wǎng)絡(luò)代表docker0所有Docker安裝中存在的網(wǎng)絡(luò)。除非你使用該

    docker run --network= < NETWORK>

    選項指定,否則Docker守護(hù)程序默認(rèn)將容器連接到此網(wǎng)絡(luò)。

    我們在使用docker run創(chuàng)建Docker容器時,可以用 --net 選項指定容器的網(wǎng)絡(luò)模式,Docker可以有以下4種網(wǎng)絡(luò)模式:

    host模式:使用 --net=host 指定。none模式:使用 --net=none 指定。bridge模式:使用 --net=bridge 指定,默認(rèn)設(shè)置。container模式:使用 --net=container:NAME_or_ID 指定。

    2. 默認(rèn)網(wǎng)絡(luò)

    2.1 Host

    2.2 Container

    2.3 None

    2.4 Bridge

    3. Docker:網(wǎng)絡(luò)模式詳解

    3.1 Bridge模式的拓?fù)?/h3>

    當(dāng)Docker server啟動時,會在主機(jī)上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個二層網(wǎng)絡(luò)中。接下來就要為容器分配IP了,Docker會從RFC1918所定義的私有IP網(wǎng)段中,選擇一個和宿主機(jī)不同的IP地址和子網(wǎng)分配給docker0,連接到docker0的容器就從這個子網(wǎng)中選擇一個未占用的IP使用。如一般Docker會使用172.17.0.0/16這個網(wǎng)段,并將172.17.0.1/16分配給docker0網(wǎng)橋(在主機(jī)上使用ifconfig命令是可以看到docker0的,可以認(rèn)為它是網(wǎng)橋的管理接口,在宿主機(jī)上作為一塊虛擬網(wǎng)卡使用)。單機(jī)環(huán)境下的網(wǎng)絡(luò)拓?fù)淙缦?#xff0c;主機(jī)地址為10.10.0.186/24。

    3.2 Docker:網(wǎng)絡(luò)模式詳解

    Docker容器完成bridge網(wǎng)絡(luò)配置的過程如下:

  • 在主機(jī)上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對出現(xiàn)的,它們組成了一個數(shù)據(jù)的通道,數(shù)據(jù)從一個設(shè)備進(jìn)入,就會從另一個設(shè)備出來。因此,veth設(shè)備常用來連接兩個網(wǎng)絡(luò)設(shè)備。
  • Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0。另一端放在主機(jī)中,以veth65f9這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。
  • 從docker0子網(wǎng)中分配一個IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。
  • Docker 利用 veth-pair技術(shù)實現(xiàn)橋接:


    Docker中的所有的網(wǎng)絡(luò)接口都是虛擬的。只要容器停止或者刪除,容器對應(yīng)的網(wǎng)橋也會刪除。

    3.3 容器聯(lián)通

    在微服務(wù)部署的場景下,注冊中心是使用服務(wù)名來唯一識別微服務(wù)的,而我們上線部署的時候微服務(wù)對應(yīng)的IP地址可能會改動,所以我們需要使用容器名來配置容器間的網(wǎng)絡(luò)連接。使用–link可以完成這個功能。

    == --link 功能已經(jīng)是過去的技術(shù)了,這里做一個了解,真實項目使用場景中拋棄這種方式 ==

  • 創(chuàng)建tomcat04 link 到已經(jīng)創(chuàng)建好的tomcat01
  • # docker run -P -d --name tomcat04 --link tomcat01 tomcat:8.0

  • 使用tomcat 04 去ping tomcat01
  • docker exec -it tomcat04 ping tomcat01

    我們看到這種link方式直接使用容器名稱就可以ping通了。

    但是反過來容器Tomcat01通過容器名Tomcat04直接ping容器Tomcat04是不行的。這是因為 –link的底層操作是修改容器的hosts文件達(dá)到ip地址與容器名稱映射的。

    4. 自定義網(wǎng)絡(luò)

    建議使用自定義的網(wǎng)橋來控制哪些容器可以相互通信,還可以自動DNS解析容器名稱到IP地址。Docker提供了創(chuàng)建這些網(wǎng)絡(luò)的默認(rèn)網(wǎng)絡(luò)驅(qū)動程序,你可以創(chuàng)建一個新的Bridge網(wǎng)絡(luò),Overlay或Macvlan網(wǎng)絡(luò)。你還可以創(chuàng)建一個網(wǎng)絡(luò)插件或遠(yuǎn)程網(wǎng)絡(luò)進(jìn)行完整的自定義和控制。

    你可以根據(jù)需要創(chuàng)建任意數(shù)量的網(wǎng)絡(luò),并且可以在任何給定時間將容器連接到這些網(wǎng)絡(luò)中的零個或多個網(wǎng)絡(luò)。此外,您可以連接并斷開網(wǎng)絡(luò)中的運行容器,而無需重新啟動容器。當(dāng)容器連接到多個網(wǎng)絡(luò)時,其外部連接通過第一個非內(nèi)部網(wǎng)絡(luò)以詞法順序提供。

    4.1 查看默認(rèn)的網(wǎng)橋信息

    # docker network inspect bridge

    無容器純凈的網(wǎng)絡(luò)信息

    [{"Name": "bridge","Id": "e83d01603ae8672ded8b5c7ef7e82c0cb900341f4290c70db5a6be4796d29850","Created": "2022-05-13T18:39:19.710131055+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0","com.docker.network.bridge.name": "docker0","com.docker.network.driver.mtu": "1500"},"Labels": {}} ]

    我們可以看到子網(wǎng)掩碼和網(wǎng)關(guān)的值,這就是網(wǎng)絡(luò)的基礎(chǔ)配置

    “Subnet”: “172.17.0.0/16”,
    “Gateway”: “172.17.0.1”

    4.2 自定義網(wǎng)絡(luò)

    # docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 指令說明
    –driver bridge指定bridge驅(qū)動程序來管理網(wǎng)絡(luò)
    –subnet 192.168.0.0/16指定網(wǎng)段的CIDR格式的子網(wǎng)
    –gateway 192.168.0.1指定主子網(wǎng)的IPv4或IPv6網(wǎng)關(guān)

    查看自定義網(wǎng)絡(luò)信息

    # docker network inspect mynet這就是我們自定義網(wǎng)絡(luò)的信息,發(fā)現(xiàn)子網(wǎng)掩碼和網(wǎng)關(guān)的值就是我們自定義的"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.168.0.0/16","Gateway": "192.168.0.1"}]},

    4.3 自定義網(wǎng)絡(luò)的好處

    在我們的自定義網(wǎng)絡(luò)下,容器之間既可以通過容器名也可以通過ip地址進(jìn)行網(wǎng)絡(luò)通信。 我們自定義的網(wǎng)絡(luò)默認(rèn)已經(jīng)幫我們維護(hù)了容器間的網(wǎng)絡(luò)通信問題,這是實現(xiàn)網(wǎng)絡(luò)互聯(lián)的推薦方式。

  • 指定自定義網(wǎng)路來創(chuàng)建容器
  • # docker run -d -P --name tomcat-net-01 --net mynet tomcat # docker run -d -P --name tomcat-net-02 --net mynet tomcat # docker network inspect mynet
  • 查看自定義網(wǎng)路信息
  • "Containers": {"9aa606ae62a6d77aa6c40a744ee3c0eed4772f5b1d1431801c02d97f09d5e8fc": {"Name": "tomcat-net-02","EndpointID": "da83160897db652df09d582038d8a0fe14da24358080d07f7d5aae37cc950bec","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"c56e201f175aa039644cd4c8048f483a3cd54b01f1801631734870afb686a886": {"Name": "tomcat-net-01","EndpointID": "7877f0e43a170de3e5416c0a84f2710f05e223d7bd06b40a286e4b61d31ef2b6","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}}
  • 通過容器名來測試容器tomcat-net-01 和容器tomcat-net-02之間是否能正常網(wǎng)絡(luò)通信。
  • root@VM-12-15-ubuntu:~# docker exec -it tomcat-net-01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.2) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.091 ms 64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.067 ms 64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.064 ms 64 bytes from tomcat-net-02.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.066 msroot@VM-12-15-ubuntu:~# docker exec -it tomcat-net-02 ping tomcat-net-01 PING tomcat-net-01 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-01.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.057 ms 64 bytes from tomcat-net-01.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms 64 bytes from tomcat-net-01.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.074 ms 64 bytes from tomcat-net-01.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.046 ms

    發(fā)現(xiàn)不用配置 --link 也可以實現(xiàn)直接用容器名稱ping通網(wǎng)絡(luò)

    5.網(wǎng)絡(luò)連通

    不同網(wǎng)絡(luò)直接不可以直接ping通,這時候就需要進(jìn)行網(wǎng)絡(luò)連接。圖中,net01 與 net02 屬于mynet 網(wǎng)絡(luò),想要tomcat01 直接ping通 net01 。

  • 連通網(wǎng)絡(luò)
  • connect 的原理 就是 把一個容器的連接到 想要連接的網(wǎng)絡(luò)上 # docker network connect mynet tomcat01
  • 查看 mynet
  • # docker network inspect mynet "Containers": {"33f14e1a2d365c5d8af4b75ccac09a41dd1770ba80343568c3ddb22c488158db": {"Name": "tomcat-net-01","EndpointID": "2cd736c5cd7261d3fabc679c69e4422d3bf978913adece65be65b540a7284b7e","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"7c3ff77c72ce4e42a550280b7258be861882c3c5f0b6f6aad5c2de6c19d726b1": {"Name": "tomcat-net-02","EndpointID": "3a770656df1b290a730dd9f91694fcb3f7623d3b39031d49c7ad338a40512272","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"83c7a5d8df01b4ad7cadf3a5655d150b81b15b08fda56e35df9148a1acd03b09": {"Name": "tomcat01","EndpointID": "d27de557fb44d51a8b4216af3a7fc25679c00dc1c6bfc614db1f54db09aa830a","MacAddress": "02:42:c0:a8:00:04","IPv4Address": "192.168.0.4/16","IPv6Address": ""}}

    發(fā)現(xiàn)在mynet 的網(wǎng)絡(luò)信息中多了tomcat01 的信息。可以看到給容器tomcat-01分配了一個ip地址,這樣就可以實現(xiàn)不同網(wǎng)絡(luò)的互聯(lián)。

    6. Redis集群部署實戰(zhàn)

    7. SpringBoot微服務(wù)打包發(fā)布

    四、Docker Compose

    1. Compose 簡介

    Compose 是用于定義和運行多容器 Docker 應(yīng)用程序的工具。通過 Compose,您可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)。然后,使用一個命令,就可以從 YML 文件配置中創(chuàng)建并啟動所有服務(wù)。
    如果你還不了解 YML 文件配置,可以先閱讀 YAML 入門教程。

    Compose 使用的三個步驟:

  • 使用 Dockerfile 定義應(yīng)用程序的環(huán)境。
  • 使用 docker-compose.yml 定義構(gòu)成應(yīng)用程序的服務(wù),這樣它們可以在隔離環(huán)境中一起運行。
  • 最后,執(zhí)行 docker-compose up 命令來啟動并運行整個應(yīng)用程序。
  • docker-compose.yml 的配置案例如下(配置參數(shù)參考下文):

    # yaml 配置實例 version: '3' services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis volumes:logvolume01: {}

    2. Compose 安裝

    Linux 上我們可以從 Github 上下載它的二進(jìn)制包來使用,最新發(fā)行的版本地址:https://github.com/docker/compose/releases。
    運行以下命令以下載 Docker Compose 的當(dāng)前穩(wěn)定版本:

    $ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    要安裝其他版本的 Compose,請?zhí)鎿Q v2.2.2。

    Docker Compose 存放在 GitHub,不太穩(wěn)定。
    你可以也通過執(zhí)行下面的命令,高速安裝 Docker Compose。

    $ curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

    將可執(zhí)行權(quán)限應(yīng)用于二進(jìn)制文件:

    $ sudo chmod +x /usr/local/bin/docker-compose

    創(chuàng)建軟鏈:

    $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

    測試是否安裝成功:

    $ docker-compose --version cker-compose version 1.24.1, build 4667896b

    3. 使用

    步驟來源于官網(wǎng),可移步官網(wǎng)。 官網(wǎng)地址

    3.1 準(zhǔn)備

    創(chuàng)建一個測試目錄:

    # mkdir composetest # cd composetest

    在測試目錄中創(chuàng)建一個名為 app.py 的文件,并復(fù)制粘貼以下內(nèi)容:

    import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5) @app.route('/') def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

    在此示例中,redis 是應(yīng)用程序網(wǎng)絡(luò)上的 redis 容器的主機(jī)名,該主機(jī)使用的端口為 6379。
    在 composetest 目錄中創(chuàng)建另一個名為 requirements.txt 的文件,內(nèi)容如下:

    flask redis

    3.2 創(chuàng)建 Dockerfile 文件

    在 composetest 目錄中,創(chuàng)建一個名為 Dockerfile 的文件,內(nèi)容如下:

    FROM python:3.7-alpine //從 Python 3.7 映像開始構(gòu)建鏡像。 WORKDIR /code //將工作目錄設(shè)置為 /code。 ENV FLASK_APP app.py //設(shè)置 flask 命令使用的環(huán)境變量。 ENV FLASK_RUN_HOST 0.0.0.0 //設(shè)置 flask 命令使用的環(huán)境變量。 RUN apk add --no-cache gcc musl-dev linux-headers //安裝 gcc,以便諸如 MarkupSafe 和 SQLAlchemy 之類的 Python 包可以編譯加速。 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt //復(fù)制 requirements.txt 并安裝 Python 依賴項。 COPY . . // 將 . 項目中的當(dāng)前目錄復(fù)制到 . 鏡像中的工作目錄。 CMD ["flask", "run"] //容器提供默認(rèn)的執(zhí)行命令為:flask run。

    鏡像下載比較慢,推薦切換國內(nèi)鏡像

    3.3 創(chuàng)建 docker-compose.yml

    在測試目錄中創(chuàng)建一個名為 docker-compose.yml 的文件,然后粘貼以下內(nèi)容:

    # yaml 配置 version: '3' services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

    該 Compose 文件定義了兩個服務(wù):web 和 redis。

  • web:該 web 服務(wù)使用從 Dockerfile 當(dāng)前目錄中構(gòu)建的鏡像。然后,它將容器和主機(jī)綁定到暴露的端口 5000。此示例服務(wù)使用 Flask Web 服務(wù)器的默認(rèn)端口 5000 。
  • redis:該 redis 服務(wù)使用 Docker Hub 的公共 Redis 映像。
  • 在測試目錄中,執(zhí)行以下命令來啟動應(yīng)用程序:

    # docker-compose up # docker-compose up -d //后臺運行

    小結(jié):

  • Docker 鏡像。 run => 容器
  • DockerFile 共建鏡像(服務(wù)打包)
  • docker-compose 啟動項目(編排,配置,依賴,掛載;多個微服務(wù)/環(huán)境)
  • Dokcer 網(wǎng)絡(luò)
  • 4 .使用 Compose 部署前后分離項目實戰(zhàn)

    采用SpringBoot + Vue + mysql

    4.1 打包前后端項目

    4.2 編寫DockerFile

    4.3 編寫docker-compose.yaml

    4.4 啟動部署

    五、Docker Machine

    待更新

    六、Docker Swarm

    待更新


    總結(jié)

    你的無畏源于無知。 — 三體

    總結(jié)

    以上是生活随笔為你收集整理的Docker进阶实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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