2.Docker提升

2020-08-14 19:09:35

1. 容器數據卷

1.1. docker的理解回顧

將應用和環境打包成一個映象!

數據?如果數據都在容器中,那麼我們容器刪除,數據就會丟失!需求:數據可以持久化

MySQL,容器刪了,刪庫跑路!需求:MySQL數據可以儲存在本地!

容器之間可以有一個數據共用技術!Docker容器中產生的數據,同步到本地!

這就是卷技術,目錄的掛載,將我們容器內的目錄掛載到linux目錄上面!

**總結: **容器的持久化和同步操作!容器間數據也是可以共用的!

1.2. 使用數據卷

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

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

[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

在这里插入图片描述

測試檔案的同步(在主機上改動,觀察容器變化)

在这里插入图片描述

再來測試(測試通過)

  1. 停止容器

  2. 主機上修改檔案

  3. 啓動容器

  4. 容器內的數據依舊是同步的!

1.3. 實戰:安裝MySQL

思考:MySQL的數據持久化的問題!

# 獲取映象
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7

# 執行容器, 需要做數據掛載! # 安裝啓動mysql,需要設定密碼(注意)
# 官方測試, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 啓動我們的
-d		# 後臺執行
-p		# 埠隱射
-v		# 卷掛載
-e		# 環境設定
--name	# 容器的名字
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# 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
9552bf4eb2b69a2ccd344b5ba5965da4d97b19f2e1a78626ac1f2f8d276fc2ba

# 啓動成功之後,我們在本地使用navicat鏈接測試一下
# navicat鏈接到伺服器的3344 --- 3344 和 容器的3306對映,這個時候我們就可以連線上mysql嘍!

# 在本地測試建立一個數據庫,檢視下我們的路徑是否ok!

在这里插入图片描述

1.4. 匿名和具名掛載

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

# 檢視所有volume的情況
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882

# 這裏發現,這種情況就是匿名掛載,我們在-v 後面只寫了容器內的路徑,沒有寫容器外的路徑!

# 具名掛載
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx

# 通過-v 卷名:容器內的路徑
# 檢視一下這個卷
# docker volume inspect juming-nginx

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+08:00",
      "Driver": "local",
      "Labels": null,
      "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
      "Name": "juming-nginx",
      "Options": null,
      "Scope": "local"
  }
]

所有docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxxxx/_data

我們通過具名掛載可以方便的找到我們的一個卷,大多數情況下使用的是具名掛載

# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!
-v	容器內路徑					# 匿名掛載
-v	卷名:容器內路徑			   # 具名掛載
-v /主機路徑:容器內路徑			  # 指定路徑掛載

拓展

# 通過 -v 容器內容路徑 ro rw 改變讀寫許可權
ro	readonly	# 只讀
rw	readwrite	# 可讀可寫

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內容無法操作

2. DockerFile

2.1. 初始DockerFile

DockerFile就是用來狗之間docker映象的構建檔案!命令指令碼!先體驗一下!

通過這個指令碼可以生成映象,映象是一層一層的,指令碼一個個的命令,每個命令都是一層!

# 建立一個dockerfile檔案, 名字可以隨機
# 檔案的內容 指定(大寫) 參數

FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"
CMD /bin/bash

# 這裏的每一個命令都是映象的一層!

在这里插入图片描述

# 啓動自己的容器

在这里插入图片描述

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

在这里插入图片描述

docker inspect 容器id

在这里插入图片描述

測試一下剛纔的檔案是否同步到主機上了!

這種方式我們未來使用的十分多, 因爲我們通常會構建自己的映象!

假設構建映象時候沒有掛載卷,要手動映象掛載 -v 卷名:容器內路徑!

2.2. 數據卷容器

多個mysql同步數據!

在这里插入图片描述

# 啓動3個容器,通過我們剛纔自己寫的映象啓動

在这里插入图片描述

在这里插入图片描述

多個mysql實現數據共用

[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

結論

容器之間設定資訊的傳遞, 數據卷容器的宣告週期一直持續到沒有容器使用爲止。

但是一旦你持久化到了本地,這個時候,原生的數據是不會刪除的!

2.3. DockerFile

dockerFile是用來構建docker映象的檔案!命令參數指令碼!

構建步驟

1. 編寫一個dockerFile檔案

2.docker build 構建成爲一個映象

3. docker run 執行映象

4. docker push 發佈映象(DockerHub、阿裡雲映象)

檢視嬰喜愛官方是怎麼做的?

在这里插入图片描述

在这里插入图片描述

很多官方映象都像是基礎包,很多功能都不具備,我們通常會自己搭建自己的映象!

官方既然可以製作映象,能我們一樣可以!

2.4. DockerFile的構建過程

基礎知識:

  1. 每個保留關鍵字(指令)都是必須大寫字母
  2. 執行從上到下順序執行
  3. # 表示註釋
  4. 每個指令都會建立提交一個新的映象層,並提交!

在这里插入图片描述

dockerFile是面向開發的, 我們以後要發佈專案, 做映象, 就需要編寫dockefile檔案, 這個檔案十分簡單!

Docker映象逐漸成爲企業的互動標準,必須要掌握!

步驟:開發,部署, 運維… 缺一不可!

DockerFile: 構建檔案, 定義了一切的步驟,原始碼

DockerImages: 通過DockerFile構建生成的映象, 最終發佈和執行的產品!

Docker容器:容器就是映象執行起來提供伺服器

2.5. DockerFile指令說明

在这里插入图片描述

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

2.6. 建立一個自己的centos

# 1. 編寫Dockerfile的檔案
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# cat mydockerfile-centos 
FROM centos
MAINTAINER xiaofan<[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 dockerfile檔案路徑 -t 映象名:[tag] .

[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

Successfully built d2d9f0ea8cb2
Successfully tagged mycentos:0.1

在这里插入图片描述

我們可以列出本地進行的變更歷史

在这里插入图片描述

CMD 和ENTRYPOINT區別

CMD			# 指定這個容器啓動的時候要執行的命令,只有最後一個會生效可被替代
ENTRYPOINT		# 指定這個容器啓動的時候要執行的命令, 可以追加命令

測試CMD

# 1. 編寫dockerfile檔案
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test 
FROM centos
CMD ["ls", "-a"]

# 2. 構建映象
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .

# 3. run執行, 發現我們的ls -a 命令生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64

# 想追加一個命令 -l 變成 ls -al
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l

# cmd的情況下 -l替換了CMD["ls", "-a"]命令, -l不是命令,所以報錯了

測試ENTRYPOINT

# 1. 編寫dockerfile檔案
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test 
FROM centos
ENTRYPOINT ["ls", "-a"]

# 2. 構建檔案
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .

# 3. run執行 發現我們的ls -a 命令同樣生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib

# 4. 我們的追加命令, 是直接拼接到ENTRYPOINT命令的後面的!
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
total 56
drwxr-xr-x  1 root root 4096 Aug 13 07:52 .
drwxr-xr-x  1 root root 4096 Aug 13 07:52 ..
-rwxr-xr-x  1 root root    0 Aug 13 07:52 .dockerenv
lrwxrwxrwx  1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x  5 root root  340 Aug 13 07:52 dev
drwxr-xr-x  1 root root 4096 Aug 13 07:52 etc
drwxr-xr-x  2 root root 4096 May 11  2019 home
lrwxrwxrwx  1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx  1 root root    9 May 11  2019 lib64 -> usr/lib64
drwx------  2 root root 4096 Aug  9 21:40 lost+found

3. Dockerfile製作tomcat映象併發布映象

3.1. Dockerfile製作tomcat映象

  1. 準備映象檔案 tomcat壓縮包,jdk的壓縮包!

在这里插入图片描述

  1. 編寫Dockerfile檔案,官方命名Dockerfile, build會自動尋找這個檔案,就不需要-f指定了!
[root@iZ2zeg4ytp0whqtmxbsqiiZ tomcat]# cat Dockerfile 
FROM centos
MAINTAINER xiaofan<[email protected]>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out

  1. 構建映象
# docker build -t diytomcat
  1. 啓動映象
#  docker run -d -p 3344:8080 --name xiaofantomcat1 -v /home/xiaofan/build/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/xiaofan/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.37/logs diytomcat
  1. 存取測試

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

在本地編寫web.xml和index.jsp進行測試

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>

發現:專案部署成功, 可以直接存取ok!

我們以後開發的步驟:需要掌握Dockerfile的編寫! 我們之後的一切都是使用docker進行來發布執行的!

在这里插入图片描述

3.2. 發佈自己的映象到Docker Hub

Docker Hub

  1. 地址 註冊自己的賬號!

    在这里插入图片描述

  2. 確定這個賬號可以登錄

在这里插入图片描述

  1. 在我們的伺服器上提交自己的映象
# push到我們的伺服器上
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker push diytomcat
The push refers to repository [docker.io/library/diytomcat]
2eaca873a720: Preparing 
1b38cc4085a8: Preparing 
088ebb58d264: Preparing 
c06785a2723d: Preparing 
291f6e44771a: Preparing 
denied: requested access to the resource is denied	# 拒絕

# push映象的問題?
The push refers to repository [docker.io/1314520007/diytomcat]
An image does not exist locally with the tag: 1314520007/diytomcat

# 解決,增加一個tag
docker tag diytomcat 1314520007/tomcat:1.0

在这里插入图片描述

3.3. 發佈到阿裡雲映象服務上

  1. 登錄阿裡雲
  2. 找到容器映象服務
  3. 建立名稱空間

在这里插入图片描述

  1. 建立容器映象

在这里插入图片描述

  1. 點選倉庫名稱,參考官方文件即可

在这里插入图片描述

3.4. 總結

在这里插入图片描述

在这里插入图片描述

4. Docker網路

4.1. 鏈接Docker0

測試

在这里插入图片描述

三個網路

# 問題: docker是如何處理容器網路存取的?

# [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat01 tomcat

# 檢視容器內部的網路地址 ip addr
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ip addr, 發現容器啓動的時候得到一個eth0@if115 ip地址,docker分配的!
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
114: eth0@if115: <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

# 思考: linux 能不能ping通容器?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# 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.077 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.075 ms

# linux 可以 ping 通docker容器內部!

原理

  1. 我們沒啓動一個docker容器, docker就會給docker容器分配一個ip, 我們只要安裝了docker,就會有一個網絡卡 docker0橋接模式,使用的技術是veth-pair技術!

再次測試 ip addr

在这里插入图片描述

  1. 再啓動一個容器測試, 發現又多了一對網絡卡

在这里插入图片描述

# 我們發現這個容器帶來網絡卡,都是一對對的
# veth-pair 就是一對的虛擬裝置介面,他們都是成對出現的,一端連着協定,一端彼此相連
# 正因爲有這個特性,veth-pair充當一個橋樑, 連線各種虛擬網路裝置
# OpenStac, Docker容器之間的鏈接,OVS的鏈接, 都是使用veth-pair技術
  1. 我們測試一下tomcat01和tomcat02之間是否可以ping通!

    在这里插入图片描述

結論:容器與容器之間是可以相互ping通的!

繪製一個網路模型圖

在这里插入图片描述

結論:tomcat01和tomcat02是共用的一個路由器,docker0

所有容器不指定網路的情況下,都是docker0路由的,doucker會給我們的容器分配一個預設的可用IP

小結

Docker使用的是Linux的橋接,宿主機中是一個Docker容器的網橋docker0.

在这里插入图片描述

Docker中的所有的網路介面都是虛擬的,虛擬的轉發效率高!(內網傳遞檔案!)

只要容器刪除,對應的網橋一對就沒有了!

在这里插入图片描述

4.2. – link

思考一個場景,我們編寫了一個微服務,database url =ip; 專案不重新啓動,數據ip換掉了,我們希望可以處理這個問題,可以按名字來進行存取容器

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

# 如何可以解決呢?
# 通過--link既可以解決網路連通問題
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P  --name tomcat03 --link tomcat02 tomcat
3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
3a2bcaba804c        tomcat              "catalina.sh run"   4 seconds ago       Up 3 seconds        0.0.0.0:32772->8080/tcp   tomcat03
f22ed47ed1be        tomcat              "catalina.sh run"   57 minutes ago      Up 57 minutes       0.0.0.0:32771->8080/tcp   tomcat02
9d97f93401a0        tomcat              "catalina.sh run"   About an hour ago   Up About an hour    0.0.0.0:32770->8080/tcp   tomcat01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms

# 反向可以ping通嗎?
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

探究:inspect!

在这里插入图片描述

其實這個tomcat03就是在本地設定了tomcat02的設定?

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 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.3	tomcat02 f22ed47ed1be
172.17.0.4	3a2bcaba804c

本質探究:–link 就是我們在hosts設定中增加了一個172.17.0.3 tomcat02 f22ed47ed1be

我們現在玩Docker已經不建議使用–link了!

自定義網路!不使用Docker0!

Docker0的問題:它不支援容器名鏈接存取!

4.3. 自定義網路

檢視所有的docker網路

在这里插入图片描述

網路模式

bridge: 橋接模式,橋接 docker 預設,自己建立的也是用brdge模式

none: 不設定網路

host: 和宿主機共用網路

container:容器網路連通!(用的少, 侷限很大)

測試

# 我們直接啓動的命令預設有一個 --net bridge,而這個就是我們的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0特點,預設,容器名不能存取, --link可以打通連線!
# 我們可以自定義一個網路!
# --driver bridge
# --subnet 192.168.0.0/16 可以支援255*255個網路 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
30d601788862        bridge              bridge              local
226019b14d91        host                host                local
26a5afdf4805        mynet               bridge              local
7496c014f74b        none                null                local

我們自己建立的網路就ok了!

在这里插入图片描述

在自己建立的網路裏面啓動兩個容器

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec",
        "Created": "2020-08-14T11:12:40.553433163+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": {
            "0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c": {
                "Name": "tomcat-net-01",
                "EndpointID": "576ce5c0f5860a5aab5e487a805da9d72f41a409c460f983c0bd341dd75d83ac",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5": {
                "Name": "tomcat-net-02",
                "EndpointID": "81ecbc4fe26e49855fe374f2d7c00d517b11107cc91a174d383ff6be37d25a30",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 再次拼連線
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 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.113 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.093 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.093/0.103/0.113/0.010 ms
# 現在不使用 --link也可以ping名字了!
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms

我們自定義的網路docker都已經幫我們維護好了對應的關係,推薦我們平時這樣使用網路

好處:

redis - 不同的叢集使用不同的網路,保證叢集時安全和健康的

mysql - 不同的叢集使用不同的網路,保證叢集時安全和健康的

4.4. 網路連通

在这里插入图片描述

測試打通tomcat01 和mynet

在这里插入图片描述

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network connect  mynet tomcat01

# 連通之後就是講tomcat01 放到了mynet網路下
# 一個容器兩個ip地址:
# 阿裡雲伺服器,公網ip,私網ip

在这里插入图片描述

在这里插入图片描述

# 連通ok
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms
^C
--- tomcat-net-01 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.085/0.092/0.100/0.012 ms
# 依舊無法連通,沒有connect
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

結論:假設要跨網路 操作別人,就要使用docker network connect連通…!

4.5. 實戰:部署redis

在这里插入图片描述

# 建立網絡卡
docker network create redis --subnet 172.38.0.0/16

# 通過指令碼建立六個redis設定
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 建立結點1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#建立結點2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#建立結點3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#建立結點4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#建立結點5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#建立結點6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 建立叢集
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379
   replicates 259e804d6df74e67a72e4206d7db691a300c775e
S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379
   replicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638
S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379
   replicates a89c1f1245b264e4a402a3cf99766bcb6138dbca
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 541b7d237b641ac2ffc94d17c6ab96b18b26a638 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: a89c1f1245b264e4a402a3cf99766bcb6138dbca 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7a16b9bbb0615ec95fc978fa62fc054df60536f0 172.38.0.16:6379
   slots: (0 slots) slave
   replicates a89c1f1245b264e4a402a3cf99766bcb6138dbca
S: 061a9d38f22910aaf0ba1dbd21bf1d8f57bcb7d5 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 541b7d237b641ac2ffc94d17c6ab96b18b26a638
M: 259e804d6df74e67a72e4206d7db691a300c775e 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 9b19170eea3ea1b92c58ad18c0b5522633a9e271 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 259e804d6df74e67a72e4206d7db691a300c775e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


docker搭建redis叢集完成!

在这里插入图片描述

4.6. SpringBoot微服務打包Docker映象

  1. 構建springboot專案

IDEA2020 Ultimate版本啓用方案 親測有效

  1. 打包應用
  2. 編寫Dockerfile
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]
  1. 構建映象

  2. 發佈執行!

# 把打好的jar包和Dockerfile上傳到linux
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# ll
total 16140
-rw-r--r-- 1 root root 16519871 Aug 14 17:38 demo-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 root root      122 Aug 14 17:38 Dockerfile

# 構建映象,不要忘了最後有一個點
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker build -t xiaofan666 .
Sending build context to Docker daemon  16.52MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar
 ---> d4de8837ebf9
Step 3/5 : CMD ["--server.port=8080"]
 ---> Running in e3abc66303f0
Removing intermediate container e3abc66303f0
 ---> 131bb3917fea
Step 4/5 : EXPOSE 8080
 ---> Running in fa2f25977db7
Removing intermediate container fa2f25977db7
 ---> d98147377951
Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]
 ---> Running in e1885e23773b
Removing intermediate container e1885e23773b
 ---> afb6b5f28a32
Successfully built afb6b5f28a32
Successfully tagged xiaofan666:latest

# 檢視映象
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xiaofan666          latest              afb6b5f28a32        14 seconds ago      660MB
tomcat              latest              2ae23eb477aa        8 days ago          647MB
redis               5.0.9-alpine3.11    3661c84ee9d0        3 months ago        29.8MB
java                8                   d23bdf5b1b1b        3 years ago         643MB

# 執行容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker run -d -P --name xiaofan-springboot-web xiaofan666
fd9a353a80bfd61f6930c16cd92204532bfd734e003f3f9983b5128a27b0375e
# 檢視執行起來的容器埠(因爲我們啓動的時候沒有指定)
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
fd9a353a80bf        xiaofan666          "java -jar /app.jar …"   9 seconds ago       Up 8 seconds        0.0.0.0:32779->8080/tcp   xiaofan-springboot-web
# 本地存取1
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779
{"timestamp":"2020-08-14T09:42:57.371+00:00","status":404,"error":"Not Found","message":"","path":"/"}
# 本地存取2
[root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779/hello
hello, xiaofan
# 遠端存取(開啓阿裡雲上的安全組哦)

在这里插入图片描述

以後我們使用了Docker之後,給別人互動的就是一個映象即可!

5. IDEA中常用設定總結

5.1. 從社羣版切換到旗艦版

在这里插入图片描述

5.2. 設定字型大小

在这里插入图片描述

在这里插入图片描述

5.3. 設定編碼

在这里插入图片描述

5.4. 新增Scala外掛

在这里插入图片描述

5.5. 新增Maven管理

# D:/apache-maven-3.5.4
# D:\apache-maven-3.5.4\conf\settings.xml
# D:\apache-maven-3.5.4\local_repository

在这里插入图片描述

5.6. 新增sbt設定

# VM parameters
-Dsbt.ivy.home=d:/sbt/.ivy2
-Dsbt.global.base=d:/sbt/.sbt
-Dsbt.repository.config=d:/sbt/conf/repo.properties
-Dsbt.boot.directory=d:/sbt/.sbt/boot/
-Dsbt.override.build.repos=true

# D:\sbt\bin\sbt-launch.jar

在这里插入图片描述

5.7. 新增gradle設定

# D:/gradle_location/gradle-5.4

5.8. git 的設定

在这里插入图片描述

在这里插入图片描述

設定一定要從剛開始的按個彈窗設定開始!!!(全域性)

在这里插入图片描述

6. 寄語: 必須在奮鬥中求生存,求發展!