1. 程式人生 > 實用技巧 >Docker學習從安裝到Docker-compose

Docker學習從安裝到Docker-compose

1.學前準備

(1)linux

(2)spingboot(非必要)

1.docker學習

  • Docker概述

  • Docker安裝

  • Docker命令

  • Docker映象

  • 容器資料卷

  • Dockerfile

  • Docker網路原理

  • IDEA整合Docker

  • Docker compose

  • Docker swarm

  • Li/CD

  • Jenkins

3.Docker概述

1.Docker出現

  1. 問題:我的程式在我的電腦上可以執行

  2. docker的思想來源於集裝箱

  3. 隔離:docker的核心思想

  4. docker容器技術也是一種虛擬化技術

  5. docker是基於go語言開發的

  6. docker比虛擬機器有更少的抽象層

  7. docker利用宿主機的核心,vm需要guestos

2.組成

映象(imange):好比模板。用來建立容器服務

容器(contamer):獨立執行一個或一組應用

倉庫(repository):存放映象,分為私有倉庫和公有倉庫(dockerhub)

3.docker工作原理

docker是一個client-server結構的系統,守護程序執行在主機上,通過socker從客戶端訪問。Docker-server接收docker-client指令,從而執行這個指令

3.Docker安裝

1.環境

centos7

2.環境檢視

系統核心:

uname -r 

系統版本:

cat /etc/os-release

3.安裝

1.解除安裝舊版本的docker

yum remove docker

2.安裝需要的安裝包

yum install -y yum-utils

3.設定映象倉庫(配置軟體源,建議阿里雲)

 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.更新yum軟體包索引

    yum makecache fast

5.安裝docker(ce社群版,ee企業版)

yum install docker-ce docker-ce-cli containerd.io

6.啟動docker

systemetl start docker

7.驗證docker是否安裝成功

docker version

8.執行hello-world驗證docker

docker run hello-world

#hello-world實現流程

9.檢視下載的hello-world映象

docker images

4.解除安裝docker

a.解除安裝依賴

yum remove docker-ce docker-ce-cli containerd.io

b.刪除資源(rm -rf /var/lib/docker)

rm -rf /var/lib/docker

/var/lib/docker是docker預設工作路徑

5.阿里雲映象加速

A.登入阿里雲找到容器服務

B.找到映象加速地址

C.配置使用

4.Docker常用命令

1.幫助命令

docker version      #顯示docker版本資訊

docker info        	#顯示docker系統資訊,包括映象容器數量

docker 命令 --help   #幫助命令,檢視命令的用法

幫助文件地址:docker官網下的reference中

2.映象命令

docker images                    #檢視本機上的映象

可選項:-a 列出所有映象  -q 只顯示映象的id

docker search (映象名)             #搜尋映象

可選項:例 --filter=start=3000 搜尋出來映象只顯示start大於3000的映象

docker pull (映象名[:tar])         #下載映象

docker rmi -f (id或映象名)   	    #刪除指定映象

docker rmi -f id id ....          #刪除多個映象

docker rmi -f $(docker images -a) #刪除全部映象

5.容器命令

注:有了映象才可以建立容器

新建容器並啟動

docker run [可選引數] [映象id或映象名]
#引數說明
--name="新的映象名"		 #建立容器名。用以區分容器
-d						#容器啟動後後臺執行
-it						#容器啟動後已互動方式執行,進入容器檢視內容
-p [主機埠:容器埠]	   #對映容器埠
-P						#對映隨機埠

檢視所有執行的容器

docker ps				#檢視所有正在執行的容器
#引數說明
-a						#檢視正在執行的容器和歷史執行過的容器
-n=[數字]				   #檢視最近建立的n個容器
-q						#只顯示容器編號

其他

exit					#停止容器並退出
ctrl+p+q				#容器不停止退出

刪除容器

docker rm [容器id]		       #刪除指定容器,不能刪除正在執行的容器,可跟多個容器id,刪除多個容器
docker rm -f $(docker ps -aq)   #刪除所有容器
docker ps -aq |xargs docker rm  #刪除所有容器

啟動和停止容器

docker start [容器id]		#啟動容器
docker restart [容器id]	#重啟容器
docker stop [容器id]		#停止容器
docker kill [容器id]		#強制停止當前容器

常用命令

docker logs								 #檢視日誌
#引數
-tf									 	 #顯示日誌
--tail [n]							 	 #顯示n條日誌
docker top [容器id]	   					#檢視容器的程序資訊
docker inspect [容器id]  					#檢視映象的元資料
docker exec -it [容器id] /bin/bash		#進入容器並開啟一個新的終端
docker attach [容器id]					#進入容器正在執行的終端
docker cp [容器id]:[容器檔案目錄] [主機目錄]  #從容器中拷貝檔案到主機
docker stats 							 #檢視cpu狀態

注:

  1. 使用docker run -d [映象名或id] 啟動映象後使用docker ps 命令發現並無此映象,這個映象已經停止執行

    docker容器使用後臺執行進必須有一個前臺程序,docker發現沒有應用就會自動停止執行

  2. docker run -it --rm [容器名或id]      #表示啟動容器後刪除容器,即用完即刪,主要用於測試
    
  3. portainer docker圖形化介面管理工具

5.Docker映象

1.映象是什麼

映象是一種輕量、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行軟體所需的所有內容,包括程式碼、執行庫、環境變數和配置檔案等,通常有以下獲取方式:

1.從遠端庫下載

2.朋友拷貝

3.自己製作 (Dockerfile)

2.Docker映象載入原理

  1. unionfs(聯合檔案系統):一種分層的、輕量級的高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下。uniosfs檔案系統是docker映象的基礎,映象可以通過分層來繼承,基於基礎映象,可以製作各種具體的映象。

  2. docker映象載入原理。docker映象實際上是由一層一層的檔案系統組成的,這種層級檔案就是unionfs,包括bootfs和rootfs

  3. 映象的下載都是分層下載的

3.commit映象

docker commit		#提交映象,使其成為一個新的映象
docker commit -m="新映象描述資訊" -a="作者名" [映象id] [目標映象名]:[tag(版本)]	#完整命令

6.容器資料卷

1.概念

  1. 需求:使資料持久化,容器資料不以容器的刪除而丟失
  2. 卷技術:將docker容器中產生的資料同步到本地這就是卷技術
  3. 方法:目錄掛載,將容器內的目錄掛載到linux(主機)中
  4. 容器的持久化和同步操作!容器間也是可以資料共享的

2.使用資料卷

-v										#使用-v命令掛載
docker run -it -v [主機目錄]:[容器內目錄]   #掛載容器目錄
docker inspect [容器id]				   #檢視其中的mount項看目錄掛載是否成功
docker volume							#檢視所有的volume卷情況

3.具名和匿名掛載

  1. 匿名掛載:在掛載時只指定了容器內的路徑未指定容器外路徑

  2. 具名掛載:-v [卷名]:[容器內路徑]

# 匿名掛載
-v 容器內路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 檢視所有的volume的情況
➜  ~ docker volume ls    
DRIVER              VOLUME NAME
local               33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50       
# 這裡發現,這種就是匿名掛載,我們在 -v只寫了容器內的路徑,沒有寫容器外的路徑

# 具名掛載
➜  ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜  ~ docker volume ls                  
DRIVER              VOLUME NAME
local               juming-nginx

# 通過 -v 卷名:容器內路徑
# 檢視一下這個卷
  1. 所有的docker容器內的卷,沒有指定掛載目錄的情況下都是在/var/lib/docker/volumes下,如果指定了目錄,docker volume ls 是檢視不到的。
  2. 一般情況下我們都是具名掛載
-v [容器內路徑]				#匿名掛載
-v [卷名]:[容器內路徑]		   #具名掛載
-v [主機目錄]:[容器內目錄]	  #指定路徑掛載docker volume ls 是檢視不到的

4.拓展

# 通過 -v 容器內路徑: ro rw 改變讀寫許可權
ro #readonly 只讀
rw #readwrite 可讀可寫
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!

7.資料卷容器

資料卷容器指多個容器之間進行資料同步

docker run -it --name [新容器名] --volumes-from [父容器名] [映象名]

注:容器之間的配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的!

7.Dockerfile

1.Dockerfile介紹

dockerfile是用來構建docker映象的檔案!

構建步驟:

  1. 編寫dockerfile檔案
  2. 使用docker build構建一個映象
  3. 使用docker run執行映象
  4. 使用docker pull釋出映象

很多官方映象都是基礎包,很多功能是沒有的,因此通常我們需要自己構建映象

2.Dockerfilre構建過程

1.基礎知識

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

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

2.Dockerfile指令

常用指令
FROM			#基礎映象,一切從這裡開始構建,如:FROM centos
MAINTAINER		#映象是書寫的,姓名+郵箱
RUN				#映象構建時需要執行的命令
ADD				#步驟,如tomcat映象,這個tomcat壓縮包!新增內容 新增同目錄
WORKDIR			#映象工作目錄
VOLUME			#掛載目錄
EXPOST			#保留埠配置(暴露埠)
CMD				#指定容器啟動時執行的命令,只有最後一個命令生效
ENTRYPOTNT		#指定容器啟動時執行的命令,可追加命令
ONBUILD			#當構建一個被繼承 DockerFile 這個時候就會執行ONBUILD的指令,觸發指令。
COPY			#類似ADD,將檔案拷貝到映象中
ENV				#構建時設定環境變數
docker history [映象id]		#列出映象變更歷史

3.實戰

1.建立一個自己的centos

# 1.編寫Dockerfile檔案
vim mydockerfile-centos
FROM centos
MAINTAINER cheng<[email protected]>

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 [檔名] -t [映象名]:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .

2.Tomcat映象

  1. 準備映象檔案

準備tomcat 和 jdk壓縮包,上傳到linux中,編寫好README檔案(幫助文件,可不寫) 。

  1. 編寫dockerfile檔案,官方命名 Dockerfile,使用官方命名在在build時可不用指定-f [檔名],它會自動尋找
FROM centos
MAINTAINER cheng<[email protected]>
COPY README /usr/local/README                    #複製檔案
ADD jdk-8u231-linux-x64.tar.gz /usr/local/       #複製映象並解壓
ADD apache-tomcat-9.0.35.tar.gz /usr/local/      #複製映象並解壓
RUN yum -y install vim
ENV MYPATH /usr/local                             #設定環境變數
WORKDIR $MYPATH                                   #設定工作目錄
ENV JAVA_HOME /usr/local/jdk1.8.0_231             #設定環境變數
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #設定環境變數
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib  #設定環境變數 分隔符是:
EXPOSE 8080                                       #設定暴露的埠
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out                          # 設定預設命令

  1. 構建映象
# 因為dockerfile命名使用預設命名 因此不用使用-f 指定檔案
$ docker build -t mytomcat:0.1 .
  1. run映象
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
  1. 訪問測試

  2. 釋出專案(由於做了卷掛載,我們直接在本地編寫專案就可以釋出了!)

4.釋出映象

1.釋出映象到dockerhub

  1. 註冊並登入dockerhub官網
  2. 在伺服器上提交自己的映象
#登入
docker login -p [dockerhub官網賬號密碼] -u [dockerhub官網賬號使用者名稱]
#提交映象
docker push [作者名]/[要提交的映象名]:[版本號]

2.釋出映象到阿里雲上

  1. 登入阿里雲
  2. 找到容器映象服務
  3. 建立名稱空間
  4. 建立容器映象(映象倉庫)
  5. 上傳映象,參考阿里雲官方文件很詳細https://cr.console.aliyun.com/repository/

5.小結

8.Doocker網路

1.理解docker0

1.檢視安裝了docker的主機上的網路

[root@hecs-x-medium-2-linux-20201216095547 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:6f:50:b1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.202/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
       valid_lft 59862sec preferred_lft 59862sec
    inet6 fe80::f816:3eff:fe6f:50b1/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:c4:e3:42:40 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c4ff:fee3:4240/64 scope link 
       valid_lft forever preferred_lft forever
#我們發現有本機有三個網路
l0:		 本機迴環地址
eth0:    本機內網地址
docker0: docker地址

2.檢視容器內部網路地址,我們發現容器啟動得到一個eth0@if49地址

[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos2 centos
[root@b491eaf50aaf /]# ipadddr
bash: ipadddr: command not found
[root@b491eaf50aaf /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@hecs-x-medium-2-linux-20201216095547 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.039 ms
#通過主機是可以ping通docker容器的
[root@hecs-x-medium-2-linux-20201216095547 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:6f:50:b1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.202/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
       valid_lft 58637sec preferred_lft 58637sec
    inet6 fe80::f816:3eff:fe6f:50b1/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c4:e3:42:40 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c4ff:fee3:4240/64 scope link 
       valid_lft forever preferred_lft forever
49: veth82d7ca1@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 5a:3a:ac:15:e1:7c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::583a:acff:fe15:e17c/64 scope link 
       valid_lft forever preferred_lft forever

3.原理:

  1. 我們沒啟動一個docker容器,docker就會給docker容器分配一個ip,只要我們安裝docker,就會有一個docker0網絡卡,橋接模式,使用的是ecth-pair技術
  2. 我們發現生成的容器網絡卡都是一對一對的
  3. evth-pair充當橋樑,連線各種虛擬網路裝置
  4. openstac、docker容器之間的網路連線,ovs的連線,都使用的是evth-pair技術
  5. 所有容器不指定網路情況下,都是docker0作為路由,docker會給我們容器分配一個預設可用的ip
  6. docker中所有的網路介面都是虛擬的,虛擬網路轉發率高
  7. 只有當容器被刪除,對應的一對網橋也就沒了

思考:專案不重啟,資料庫ip地址改變,我們訪問容器的IP地址是否也要改變?我們是否可以用名字來訪問容器,這樣無論ip如何變化,都不影響我們訪問容器。

通過--link可以解決容器之間網路連通問題

[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos4 --link centos2 centos
[root@04c563284c71 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
52: eth0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@04c563284c71 /]# ^C
#在centos2上ping centos4發現可以ping通,但centos4 ping不通centos2
[root@b491eaf50aaf /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.062 ms
^C
--- 172.17.0.3 ping statistics ---
#檢視centos2上的hosts檔案,多了一個172.17.0.2	b491eaf50aaf配置
[root@b491eaf50aaf /]# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	b491eaf50aaf
[root@b491eaf50aaf /]# 

通過--link技術無法實現容器名連線訪問,我們一般不建議使用--link技術去實現容器間的訪問

3.自定義網路

通常使用此模式實現容器互連

#檢視所有docker網路
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5b68ddb1c185   bridge    bridge    local
cc9723858c9d   host      host      local
ad8a7f493e34   none      null      local
[root@hecs-x-medium-2-linux-20201216095547 ~]# 
# bridge:橋接(預設)  none:不配置網路   host:和宿主機共享網路  container:容器內網路連線(用的少)

命令

--driver brige			 #定義模式(預設橋接)
--subnet 192.168.0.0/16  #定義ip
--gateway 192.168.0.1				 #定義閘道器
#建立一個名為mymet的網路
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mymet
fc7402c6f30decc1c065dc98a6bcb9e95cb36af3e071800eff2d23d2bbbec890
#使用docker network ls檢視是否建立成功
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5b68ddb1c185   bridge    bridge    local
cc9723858c9d   host      host      local
fc7402c6f30d   mymet     bridge    local
ad8a7f493e34   none      null      local
#使用docker network inspect mymet檢視其具體內容是否和我們建立的一致
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network inspect mymet
[
    {
        "Name": "mymet",
        "Id": "fc7402c6f30decc1c065dc98a6bcb9e95cb36af3e071800eff2d23d2bbbec890",
        "Created": "2020-12-18T11:07:12.00039337+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
#使用--net命令建立兩個容器
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos1 --net mymet centos
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos2 --net mymet centos
#檢視各自的ip地址
[root@318e95ba3efb /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
57: eth0@if58: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.3/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever 
[root@a4cf1d734a4e /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
55: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.2/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
#通過ip及容器名互ping,發現是沒有任何問題的
[root@a4cf1d734a4e /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.064 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.064/0.067/0.071/0.008 ms
[root@a4cf1d734a4e /]# ping centos2    
PING centos2 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos2.mymet (192.168.0.3): icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from centos2.mymet (192.168.0.3): icmp_seq=2 ttl=64 time=0.050 ms
^C
--- centos2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.036/0.043/0.050/0.007 ms
[root@318e95ba3efb /]# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.050 ms
^C
--- 192.168.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.050/0.058/0.066/0.008 ms
[root@318e95ba3efb /]# ping centos1    
PING centos1 (192.168.0.2) 56(84) bytes of data.
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=2 ttl=64 time=0.048 ms

4.網路連通

連通一個其他網絡卡的容器到建立的網絡卡,使其可以與此網絡卡上的容器互聯

#建立一個新的容器,不指定網絡卡使用預設的docker0網絡卡
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos3 centos
[root@aa8227884309 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
59: eth0@if60: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
#ping mymnt網絡卡上的容器時發現無法ping通
[root@aa8227884309 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
From 192.168.0.202 icmp_seq=1 Destination Host Unreachable
From 192.168.0.202 icmp_seq=2 Destination Host Unreachable
From 192.168.0.202 icmp_seq=3 Destination Host Unreachable
#使用connect命令將新容器連線到mymet網絡卡
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network connect mymet centos3
#測試,發現已經可以與mymet上的容器相互通訊
[root@aa8227884309 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.051 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.051/0.059/0.068/0.011 ms
[root@aa8227884309 /]# ping centos1    
PING centos1 (192.168.0.2) 56(84) bytes of data.
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=2 ttl=64 time=0.055 ms
^C
--- centos1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.053/0.054/0.055/0.001 ms
#mymnt上的容器也可ping通此容器
[root@a4cf1d734a4e /]# ping centos3
PING centos3 (192.168.0.4) 56(84) bytes of data.
64 bytes from centos3.mymet (192.168.0.4): icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from centos3.mymet (192.168.0.4): icmp_seq=2 ttl=64 time=0.053 ms
^C
--- centos3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.034/0.043/0.053/0.011 ms
#這種連線模式可稱為一個容器兩個ip

5.springboot微服務打包docker映象

步驟:

  1. 構建springboot專案
  2. 打包應用
  3. 編寫dockerfile
  4. 構建映象
  5. 釋出執行

9.Docker-compose

1.簡介

docker-compose 輕鬆管理多個容器,定義執行多個容器

作用:批量容器編排

compose是docker的開源專案,需要安裝

dockerfile讓程式在任何地方執行

學習可參考官方文件:https://docs.docker.com/compose/

2.安裝compose

  1. 下載
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#官方地址下載太慢,我們可以百度其他地址來下載
  1. 授權
chmod +x /use/local/bin/docker-compose
  1. 驗證
docker-compose version

3.步驟

  1. 建立docker-compose目錄
  2. 建立dockerfils檔案(可不建立)
  3. 建立docker-compose.yml檔案
  4. 啟動compose專案(docker-compose up)

執行compose後,會建立一個compose網路,因此專案中的內容都在同一個網路下,可以互相訪問

  1. 停止compose(docker-compose down)

4.yml檔案

可大致分為3層

  1. version:' ' #版本

  2. service: #服務

    服務1:

    ​ 服務2:

    ​ 服務配置

    ​ 如:images: build:network等

  3. 其他配置,如:網路/卷,全域性規則等

#例:docker-compose.yml檔案
version: '3.3'

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
     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: {}