Docker(超級詳細)


Docker入門

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

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

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. 登陸阿里雲官網找到容器鏡像服務

    image-20210804172617841

  2. 鏡像加速地址

    image-20210804172415295

  3. 配置使用

    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/

鏡像命令

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(暫時先用)

    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再用)

6.1 什么是portainer

Portainer是一個可視化的容器鏡像的圖形管理工具,利用Portainer可以輕松構建,管理和維護Docker環境。 而且完全免費,基於容器化的安裝方式,方便高效部署。

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

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大免費的白嫖網站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM