Docker(超級詳細)

Docker入門

官網地址:https://www.docker.com/html

文檔地址:https://docs.docker.com/java

image-20210804161213317

1.docker安裝

#1.卸載舊版本
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#2.安裝存儲庫
 sudo yum install -y yum-utils
#3.設置鏡像倉庫
  #默認是國外鏡像,比較慢
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
   #推薦使用國內的阿里雲鏡像
     sudo yum-config-manager \
        --add-repo \
       http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#4.安裝docker引擎(最新版本)
 sudo yum install docker-ce docker-ce-cli containerd.io
#5.啓動docker
 sudo systemctl start docker
 #測試docker安裝成功
 docker version
#6.測試Helloword
 sudo docker run hello-world

image-20210804171004437

2.卸載docker

#1.卸載 Docker Engine、CLI 和 Containerd 包:
 sudo yum remove docker-ce docker-ce-cli containerd.io
 
#2.主機上的映像、容器、卷或自定義配置文件不會自動刪除。刪除全部鏡像、容器和卷:
 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd
 
 #/var/lib/docker docker的默認工做路徑

3.阿里雲鏡像加速

  1. 登錄阿里雲官網找到容器鏡像服務mysql

    image-20210804172617841

  2. 鏡像加速地址linux

    image-20210804172415295

  3. 配置使用nginx

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

4.docker經常使用命令

幫助命令

docker version #顯示docker的版本信息
docker info # 顯示docker的系統信息
docker 命令 --help #幫助命令

幫助文檔地址:https://docs.docker.com/reference/git

鏡像命令

docker images #查看全部本地的主機上的鏡像
docker search xx #搜索xx鏡像
docker pull xx #拉取下載xx鏡像
docker rmi -f 鏡像id #刪除指定的鏡像
docker rmi -f 鏡像id 鏡像id #刪除多個鏡像
docker rmi -f $(docker images -aq) #刪除所有的容器

容器命令

#新建容器並啓動
dockers run [可選參數] 鏡像id或名字

docker run -d --name nagin01 -p 3344:80 nginx
    #參數說明
    --name="Name" #容器名字
    -d  #後臺方式運行
    -it #使用交互方式運行,進入容器查看內容
    -p #指定容器的端口 -p 8080:8080 (主機端口:容器端口)
    -P #隨機指定端口

#啓動並進入容器
docker run -it centos /bin/bash
#退出容器
exit#直接退出容器並中止
ctrl+Q+P #容器不中止退出

#列出全部的容器
docker ps [可選參數]
    #可選參數
        -a #列出全部的容器
        -n #顯示最講建立的容器
        -q #只顯示容器的id
#刪除容器
 docker rm 容器id #刪除指定容器
 docker rm -f $(docker ps -aq) #強制刪除全部的容器
#啓動和中止容器
 docker start 容器id #啓動指定的容器
 docker restart 容器id #重啓指定的容器
 docker stop 容器id #中止指定的正在運行容器
 docker kill 容器id #強制中止指定的容器

5.其餘經常使用命令

#查看日誌、
 docker logs 
 #查看容器中的進程信息
 docker top 容器id 
 #查看鏡像元數據
 docker inspect 容器id
 #進入正在運行的容器
 docker exec -it 容器id /bin/bash
 docker attach 容器id
     #這兩種方式的區別
     #docker exec 進入容器開啓一個新的終端,能夠在裏面操做
     #docker attach 進入容器正在執行的終端,不會啓動新的線程
#從容器內拷貝文件到主機上
docker cp 容器id:容器內路徑 目的地主機路徑

#查看cpu的狀態
docker stats
docker run -it --rm tomcat:9.0 #咱們以前的啓動都是後臺,中止了容器後,容器還能夠查看,這個命令是用完後就刪除容器,通常用於測試

6.可視化

  • portainer(暫時先用)github

    docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
  • Rancher(CI/CD再用)web

6.1 什麼是portainer

Portainer是一個可視化的容器鏡像的圖形管理工具,利用Portainer能夠輕鬆構建,管理和維護Docker環境。 並且徹底免費,基於容器化的安裝方式,方便高效部署。redis

官方站點:https://www.portainer.io/spring

6.2 安裝portainer

#1.下載並啓動
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
#2.開放端口並外網訪問測試
www.enora.com.cn:9000

訪問後頁面以下,首先選擇Docker的connectimage-20210805083059667

進入docker 管理的主頁

image-20210805083445539

7.Docker鏡像

7.1 鏡像是什麼

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境開發的軟件,它包含了運行某個軟件所需的全部內容,包括代碼、運行時、庫、環境變量和配置文件。全部的應用,直接打包docker鏡像,就能夠直接跑起來!

如何獲得鏡像

  • 從遠程倉庫下載
  • 製做一個鏡像DockerFile

7.2 Docker鏡像加載原理

UnionFS(聯合文件系統)

UnionFS(聯合文件系統):是一種分層、輕量級並高性能的文件系統,它支持對文件系統的修改,做爲一次提交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下。Union文件系統是Docker鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具體的應用鏡像。

特性:一次同時加載多個文件系統,但從外面看起來,只能看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統包含全部底層的文件和目錄。

Docker鏡像加載原理

docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統是UnionFS。採用分層構建機制,最底層爲bootfs,其之上rootfs。

bootfs:(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kennel,linux剛啓動是會加載bootfs文件系統,再docker鏡像的最底層是bootfs。這一層與咱們典型的Linux/Unix系統是同樣的,包含bootj加載器和內核。當boot加載完成後整個內核就在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs: 位於bootfs之上,rootfs是Docker容器在啓動時內部進程可見的文件系統,即Docker容器的根目錄。rootfs一般包含一個操做系統運行所需的文件系統,例如可能包含典型的類Unix操做系統中的目錄系統,如/dev、/proc、/bin、/etc、/lib、/usr、/tmp及運行Docker容器所需的配置文件、工具等。

特色

Docker鏡像都是隻讀的,當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層就是咱們一般說的容器層,容器層之下的都叫鏡像層

7.3 commit鏡像

如何提交一個本身的鏡像

docker commit #提交容器成爲一個新的副本

#命令和git原理相似
docker commit -m="提交的描述信息" -a="做者" 容器id 目標鏡像名:[TAG]

實戰測試

#1. 啓動一個默認的tomcat
docker run -d -p 8080:8080 46cfbf1293b1
#2. 發現這個默認的tomcat是沒有webapps應用,鏡像的緣由官方的鏡像默認webapps下面是沒有文件的
#3. 本身拷貝基本的文件到webapps文件夾下
cp -r webapps.dist/* webapps
#4.將咱們操做過的容器經過commit提交爲一個新的鏡像,之後咱們就能夠直接使用咱們修改過的鏡像便可
docker commit -a="sean" -m="add apps into webapps folder" 3de860244cd4 tomcat_sean:v0.1

image-20210805152850887

image-20210805153432583

Docker 進階

1. 容器數據卷

1.1 概念

當咱們在使用docker容器的時候,會產生一系列的數據文件,這些數據文件在咱們關閉docker容器時是會消失的,可是其中產生的部份內容咱們是但願可以把它給保存起來另做用途的,Docker將應用與運行環境打包成容器發佈,咱們但願在運行過程鍾產生的部分數據是能夠持久化的的,並且容器之間咱們但願可以實現數據共享。

容器之間能夠有一個數據共享的技術,將Docker容器中產生的數據,同步到本地!這就是卷技術。目錄的掛載將容器內的目錄掛載到Linux上面。

總結:容器的持久化和同步操做,容器間也是能夠同步數據的!

1.2 使用數據卷

1.2.1 方式一: 直接使用命令來掛載 -v

docker run -it -v 主機目錄:容器內目錄

測試

1.啓動運行容器

docker run -it -v /home/sean:/home 300e315adb2f

image-20210805155946462

2.啓動起來後能夠經過 命令docker inspect 容器id查看掛載狀況

docker inspect 8a5f116da90b

image-20210805160210625

image-20210805160324606

之後修改只需再本地修改便可,容器內會自動同步

實戰:安裝Mysql

思考:Mysql的數據持久化的問題

  • 獲取鏡像並運行
#獲取鏡像
docker pull mysql:5.7
#運行容器的時候,須要作數據掛載,須要注意的是Mysql須要配置密碼(參考官方文檔),若是沒有設置密碼的化,容器是啓動不起來的
 docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MY_SQL_ROOT_PASSWORD=root mysql:5.7
  • 容器運行後,使用Navicat 軟件鏈接docker的Mysql

    image-20210805232748499

  • 在數據庫中新建一個數據庫

    image-20210805232325620

  • 如今進入宿主機服務器目錄/home/mysql/data,查看是否有剛纔建立的數據庫

    image-20210805232450899

以上測試代表:容器內的mysql中的數據已經同步到服務器本地咯,實現了容器數據持久化功能

具名和匿名掛載

匿名掛載

在使用-v 進行數據卷掛載的時候,只有容器內路徑,即-v 容器內路徑

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

查看全部的volume的狀況

docker volume ls

image-20210805233947356

這種沒有一串隨機數字的就是匿名掛載生成的volume name

具名掛載

在使用-v 進行數據卷掛載的時候,卷名:容器內路徑,即-v 卷名:容器內路徑

docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx nginx

查看volume的狀況

image-20210805234356657

查看該卷

docker volume inspect sean_nginx

image-20210805234559629

全部的docker容器內的卷,沒有指定目錄的狀況下都是在該目錄下/var/lib/docker/volumes/xxx/data

image-20210805235013336

經過具名掛載能夠方便的找到咱們的一個卷,大多數狀況下都使用具名掛載

#如何區分匿名、具名、指定路徑掛載

-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 #具名掛載
-v /宿主機路徑:容器內路徑 #指定路徑掛載

拓展:

#經過 -v 容器內路徑:ro rw 改變讀寫權限
ro:read only #只讀
rw: readwrite #可寫可讀
docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v sean_nginx:/etc/nginx:rw nginx
#ro 說明這個路徑只能經過宿主機來操做,容器內部是沒法操做的

1.2.2 方式二:使用DockerFile

初識DockerFile

Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。經過這個腳本能夠生成鏡像,鏡像是一層一層的,腳本一個一個的命令,每一個命令都是一層。

  • 編寫dockerFile文件
FROM centos
VOLUME ["volume01","volume02"]
CMD '---------end-----------'
CMD /bin/bash
  • 構建docker鏡像

    docker build -f dockerFile1 -t centos_sean .
    
     #-f, --file string       Name of the Dockerfile (Default is 'PATH/Dockerfile')
     # -t, --tag list          Name and optionally a tag in the 'name:tag' format

    image-20210806094413499

  • 運行生成的鏡像,能夠看到是能夠運行進入到容器內的

    image-20210806102349835

這個卷和外部必定有一個同步的目錄

#經過docker inspect能夠查看對應的掛載目錄
docker inspect 4daed2f6eb77

image-20210806102821990

數據卷容器(容器間的數據共享)

命名的容器掛載數據卷,其餘容器經過掛載這個父容器實現數據共享,掛載數據卷的容器稱爲數據卷容器。

建立數據卷容器

docker run -it --name dc01 imageName #啓動dc01容器
docker run -it --name dc02 --volumes-from dc01 imageName #dc02繼承自dc01

容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止!!!

應用:多個Mysql共享數據或者nginx共享數據

總結:經過--volumes-from能夠實現容器間的數據共享。

參考:https://www.cnblogs.com/lwenwu/p/14029573.html

2.DockerFile

2.1 DockerFile介紹

dockerFile是用來構建docker鏡像的文件,命令參數腳本

構建步驟:

  1. 編寫一個dockerfile文件
  2. docker build 構建爲一個鏡像
  3. docker run 運行鏡像
  4. docker push 發佈鏡像(DockerHub、阿里雲鏡像倉庫)

首先了解官方鏡像(centos爲例)

image-20210806121241017

點擊版本號後跳轉到github,發現github上就是DockerFile文件

image-20210806121038756

官方既然能夠製做鏡像,那咱們也能夠本身製做本身的鏡像,不少官方鏡像都是基礎包,不少功能都沒有,一般會本身構建本身的鏡像

2.2 DockerFile構建過程

基礎知識:

  1. 每一個保留關鍵字(指令)都是必須是大寫字母
  2. 執行從上到下順序執行
  3. 表示註釋

  4. 每個指令都會建立提交一個新的鏡像層,並提交

image-20210806130816220

dockerfile是面向開發的,之後要發佈項目,作鏡像都須要編寫dockerfile文件!Docker鏡像逐漸成爲一個企業的交付標準,必須掌握。

步驟:

​ DockerFile:構建文件,定義了一切的步驟,至關於源代碼

​ DockerImages:經過dockerfile構建生成的鏡像,最終發佈和運行的產品

​ Docker容器:容器就是鏡像運行起來提供服務器

2.3 DockerFile命令

FROM #基礎鏡像,一切從這裏開始構建
MAINTAINER #鏡像是誰寫的,姓名+郵箱
RUN #鏡像構建的時候須要運行的命令
ADD #添加內容,好比要在centos基礎上添加tomcat就須要使用該命令
WORKDIR #鏡像的工做目錄
VOLUME #掛載的目錄
EXPOST #保留端口配置
CMD        #指定這個容器啓動的時候要運行的命令,只有最後一個會生效,可被替代
ENTRYPOINT #指定這個容器啓動的時候要運行的命令,能夠追加命令
ONBUILD    #當構建一個被繼承DockerFile,這個時候就會運行ONBUILD的指令,觸發指令
COPY       #相似ADD,將文件拷貝到鏡像中
ENV        #構建時設置環境變量

image-20210806125241699

實戰:構建一個本身的鏡像

#1.編寫DockerFile文件
FROM centos
MAINTAINER xuxin<sean_xin@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end------"
CMD /bin/bash

#2.構建鏡像
docker build -f myCentos -t myCentos .

#3.測試運行
docker run -d 86f274d241ef

image-20210807192656772

發現pwd命令、工做目錄等都已經按照dockerfile修改了

#鏡像的歷史變動,平時拿到一個鏡像,可使用該命令研究它的建立過程
docker history 鏡像id

image-20210807193007610

實戰:Tomcat鏡像

  1. 準備鏡像文件tomcat壓縮包,jdk的壓縮包

    image-20210807203236672

  2. 編寫dockerfile文件,官方命名Dockerfile

    FROM centos
    MAINTAINER sean<sean_xin@126.com>
    COPY readme.txt /usr/local/readme.txt
    ADD apache-tomcat-7.0.81.tar.gz /usr/local
    ADD jdk-8u211-linux-x64.tar.gz /usr/local
    RUN yum -y install vim
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_211
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.81
    ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.81
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    CMD /usr/local/apache-tomcat-7.0.81/bin/startup.sh && tail -F /usr/local/apche-tomcat-7.0.81/bin/catalina.out
  3. 構建鏡像(使用Dockerfile命令後不用-f命令)

    docker build -t diytomcat .

    image-20210807211538597

  4. 運行鏡像

    docker run -d -p 9090:8080 --name seantomcat -v /home/sean/test:/usr/local/apache-tomcat-7.0.81/webapps/test -v /home/sean/tomcatlogs/:/usr/local/apache-tomcat-7.0.81/logs diytomcat
  5. 訪問測試

    image-20210807212546507

  6. 發佈項目(因爲作了卷掛載,能夠直接再本地編寫項目就發佈)

2.4 發佈鏡像

發佈鏡像到dockerHub

  1. 官網註冊帳號:https://hub.docker.com/

    image-20210807224614605

  2. 登陸dockerHub

    docker login -u724056979

    image-20210807224855929

  3. 提交鏡像

    #首先須要對鏡像進行打tag標籤,用dockerhub帳戶名/鏡像名:版本號
    docker tag centos_sean:latest 724056979/centos:1.0
    
    #而後使用push命令提交鏡像
    docker push 724056979/centos:1.0

    image-20210807230600098

    image-20210807232945521

發佈鏡像到阿里雲

  1. 登陸阿里雲

  2. 找到容器鏡像服務

    image-20210807233342218

  3. 建立命名空間

    image-20210807232100703

  4. 建立容器鏡像

    image-20210807231924076

  5. 建立成功後,根據阿里雲提示操做

    image-20210807231851563

小結:

image-20210807233616926

image-20210807201407025

3.Docker網絡

#經常使用的docker network命令
docker network --help #獲取docker網絡命令幫助
docker network ls #獲取dockers全部的網絡
docker network inspect networkId #查看具體network的元數據

3.1 測試docker網絡

測試:3個重要的網卡地址

image-20210807234352360

思考:docker是如何處理容器網絡訪問的?

  1. 宿主機能夠ping通docker運行的容器嘛?

    image-20210809083832645

    #查看容器內地址
    docker exec -it tomcat01 ip addr

    image-20210809083454533

    發現容器啓動的時候會獲得一個eth0@if72 ip地址,docker分配的。

    說明宿主姐能夠ping通容器內部

原理

​ 每啓動一個docker容器,docker就會給docker容器分配一個ip,只要安裝了docker,就會有一個網卡docker0,使用橋接模式,其使用的技術就是evth-pair技術!

  1. 在宿主機上再次測試ip addr發現會多一個網卡

image-20210809084349425

  1. 再啓動一個tomcat容器,並查看地址,發現又多一對網卡地址73:vetha2920@if72

    #啓動tomcat02容器
    docker run -d --name tomcat02 tomcat
    #查看ip地址
    ip addr

    image-20210809084953615

    veth-pair就是一對的虛擬設備接口,他們都是成對出現的,正是由於有這個特性,一端連着協議,一端彼此相連,evth-pair充當一個橋樑,鏈接各類虛擬網絡設備的

  2. 測試如下tomcat01和tomcat02是否能夠ping 通

    docker exec -it tomcat02 ping 172.17.0.2

    image-20210809093519597

    結論:容器和容器之間是能夠互相ping通的

Docker核心網絡圖:docker中的全部的網絡接口都是虛擬的,虛擬的轉發效率高!只要刪除容器,對應網橋也就刪除

image-20210809094419995

思考一個場景,編寫一個微服務,database url=ip,項目部重啓,數據庫ip換掉了,能夠經過名字來進行訪問容器。也就是說能夠想springcloud的服務發現與註冊同樣使用名稱來註冊服務,而不是使用IP地址的方式

#同時啓動了2個tomcat容器
docker ps

image-20210809100116305

#都直接使用容器名可否ping通呢?
docker exec -it tomcat01 ping tomcat02

image-20210809100334624

發現都使用容器名是不能ping通的,該如何解決這個問題呢?可使用docker --link解決網絡連通問題

#使用--link從新啓動過一個tomcat03
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#使用容器名tomcat03 ping tomcat02
docker exec -it tomcat03 ping tomcat02

image-20210809101003612

測試發現經過--link可使用容器名互相通訊的。可是可使用tomcat02 ping tomcat03嗎?繼續測試

#使用容器名tomcat02 ping tomcat03
docker exec -it tomcat02 ping tomcat03

image-20210809101236074

測試發現這樣是不行的,探究其中的原理

#查看tomcat03的host文件配置
docker exec -it tomcat03 cat /etc/hosts

image-20210809103410768

--link本質:就是在hosts配置中增長了一個tomcat02的映射,如今不推薦使用--link,可使用docker 自定義網絡,不使用docker0來實現。docker0存在的問題:不支持容器名進行鏈接訪問。

3.3 docker自定義網絡

image-20210809105102867

網絡模式:

bridge: 橋接 docker(默認) none: 不配置網絡 host: 和宿主機共享網絡

測試

  1. 建立自定義網絡

    docker network create 命令

    image-20210809104839361

#直接啓動的命令,默認添加了--net bridge,而這個就是docker0
docker run -d -P --name tomcat01  tomcat 
docker run -d -P --name tomcat01 --net bridge tomcat
#docker0不能經過容器名進行網絡連通,可使用--link

#使用自定義網絡
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

image-20210809110533255

​ 查看自定義網絡mynet,咱們本身的網絡就建立好了

image-20210809110932159

  1. 容器使用自定義網絡

    #運行tomcat容器使用自定義網絡mynet
    docker run -d -P --name tomcat-net-01 --net mynet tomcat
    #查看mynet自定義網絡元數據
    docker network inspect mynet

    image-20210809111602618

  2. 使用自定義網絡來經過容器名來連通

    #使用自定義網絡再運行一個tomcat-net-02
    docker run -d -P --name tomcat-net-02 --net mynet tomcat
    #連通測試
    docker exec -it tomcat-net-01 ping tomcat-net-02
    docker exec -it tomcat-net-02 ping tomcat-net-01

    image-20210809112528239

    image-20210809112652291

自定義網絡能夠不使用--link也能夠經過容器名互相連通,docker都已經維護好了對應的關係,推薦平時使用自定義網絡。

使用自定義網絡的好處:對於不通的集羣使用不一樣的網絡,保證集羣的安全和健康

好比:mysql集羣可使用192.168.0.2這樣網段內的地址,而redis集羣可使用192.167.0.2這樣的網段實現互相隔離。

3.4 docker網絡連通

思考:以下圖所示網絡,處於不一樣網段的兩個容器如何實現tomcat-01與tomcat-net-01的互相連通?

image-20210809113716734

#兩個容器能夠直接連通嗎?
docker exec -it tomcat-01 ping tomcat-net-01

image-20210809114251401

通過測試發現這樣是不可能連通的,應該怎麼處理呢?可使用docker network connect命令,實現一個容器與網卡直接相連

image-20210809114447897

#打通tomcat01與mynet網絡
docker network connect mynet tomcat01
#查看mynet網絡的元數據
docker network inspect mynet

image-20210809114729268

通過測試發現使用docker network connect,連通後把tomcat01添加到了mynet網絡裏,即一個容器2個IP,好比阿里雲主機也有2個IP地址(內網和外網地址)

#再次測試tomcat01 ping tomcat-net-01
docker exec -it tomcat01 ping tomcat-net-01

image-20210809115301728

結論:假設要跨網絡操做,就須要使用docker network connect連通

實戰:SpringBoot微服務打包Docker鏡像

  1. 構建springboot項目

    image-20210809120140131

  2. 打包應用

    image-20210809120107442

  3. 編寫Dockerfile

    • 下載docker插件

      image-20210809120948580

    • 編寫Dockerfile文件

      FROM java:8.0
      COPY *.jar /app.jar
      CMD ["--server.port=8080"]
      EXPOSE 8080
      ENTRYPOINT ["java","-jar","/app.jar"]
    • 上傳jar包和Dockerfile文件

      image-20210809124820423

  4. 構建鏡像

    image-20210809124907591

  5. 發佈運行測試

    image-20210809125004461

之後使用了docker以後,交付給別人的就是一個鏡像文件

Docker高階

1.docker-compose

1.1 簡介

Compose 是用於定義和運行多容器 Docker 應用程序的工具。經過 Compose,您可使用 YML 文件來配置應用程序須要的全部服務。而後,使用一個命令,就能夠從 YML 文件配置中建立並啓動全部服務。

Compose 使用的三個步驟:

  • 使用 Dockerfile 定義應用程序的環境。
  • 使用 docker-compose.yml 定義構成應用程序的服務,這樣它們能夠在隔離環境中一塊兒運行。
  • 最後,執行 docker-compose up 命令來啓動並運行整個應用程序。

官網文檔地址:https://docs.docker.com/compose/

1.2 安裝

  1. 下載 Docker Compose 的當前穩定版本

    curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    #這個可能快點
    curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
  2. 受權

    sudo chmod +x /usr/local/bin/docker-compose
  3. 測試安裝

    docker-compose version

    image-20210809131509335

出現該畫面說docker-compose安裝成功。

1.3 初體驗docker-compose

​ 官方文檔:https://docs.docker.com/compose/gettingstarted/

  1. 應用app.py
  2. Dockerfile應用打包爲鏡像
  3. Docker-compose yaml文件(定義整個服務,須要的環境,尾部、redis)完整的上線服務
  4. 啓動compose項目(docker-compose up)

之前都是單個docker run 啓動容器,如今經過docker-compose編程yaml配置文件,能夠經過compose一鍵啓動、中止全部服務。

1.4 compose yaml配置文件

官方文檔:https://docs.docker.com/compose/compose-file/compose-file-v3/

對於yaml文件的構成主要是由3層

version: #第一層 版本號
services: #第二層
	service1:web
		images
		build
		...
	service2: redis
    	...
#第三層,其餘配置,網絡/卷/全局規則
volumes: 
networks:

image-20210809142100399

特別注意在啓動多個服務的時候,他們之間有前後順序,須要使用depends_on來限定服務的啓動順序

version: "3.9"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

實戰:一鍵部署WP

官方文檔: https://docs.docker.com/samples/wordpress/

  1. 建立一個my_wordpress的文件夾並進入

    mkdir my_wordpress
    cd my_wordpress
  2. 編寫docker-compose.yml文件

    version: "3.9"
        
    services:
      db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
        
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        volumes:
          - wordpress_data:/var/www/html
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
    volumes:
      db_data: {}
      wordpress_data: {}
  3. 訪問測試

    image-20210809153002091

10大免費的白嫖網站

相關文章
相關標籤/搜索