docker技術學習

2022-06-21 06:00:12

docker安裝

安裝docker(烏班圖)-需要su許可權

官網:https://docs.docker.com/engine/install/ubuntu/

幫助檔案:

1.解除安裝舊的

 apt-get remove docker docker-engine docker.io containerd runc

2.設定儲存庫

 sudo apt-get update
 sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

3.新增 Docker 的官方 GPG 金鑰:

sudo mkdir -p /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

4.用以下命令設定儲存庫:

 echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4.安裝docker相關

ce是社群,ee是企業

apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

5啟動docker 驗證 Docker 引擎是否已正確安裝。

docker run hello-world

6檢視版本

docker version

顯示

Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:03 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

8.檢視image

docker images

9.修改預設的拉取映象地址

 /etc/docker/daemon.json

9.解除安裝docker的時候用

 apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin

主機上的映像、容器、卷或自定義組態檔不會自動刪除。要刪除所有映像、容器和卷:

 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

10.啟動docker


11。停止docker


阿里雲映象加速

1.登入阿里雲

2.直接搜尋:映象容器服務,點選進入控制檯->映象工具->映象加速器

使用加速器可以提升獲取Docker官方映象的速度

加速器地址
https://cgys1rlc.mirror.aliyuncs.com

針對Docker使用者端版本大於 1.10.0 的使用者

您可以通過修改daemon組態檔/etc/docker/daemon.json來使用加速器

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

回顧helloword的整個流程

開始,在本機找映象,有就用,沒有就在dockerhub下載,如果dockerhub找到,下載本地執行,找不到報錯。

docker常用命令

幫助命令

docker version #顯示版本資訊
docker info  #顯示更詳細資訊
docker --help #幫助資訊

幫助檔案地址:

映象命令:

docker images #檢視所有映象

docker images --help 


REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   8 months ago   13.3kB
#解釋
REPOSITORY 映象的倉庫源
TAG 映象的標籤
IMAGE ID 映象的id
CREATED 映象的建立時間
SIZE 映象的大小

docker search #搜尋映象

docker search mysql  #搜尋mysql
docker search mysql --filter=STARS=3000 #搜尋出來的大於等於3000

docker pull #下載映象

docker pull mysql #下載mysql

docker pull 映象名[:tag]如果不寫是預設latest 
採用分層下載,聯合檔案系統,還有簽名 ,docker.io是真實地址

docker pull mysql==docker pull docker.io/library/mysql:latest

docker images#檢視映象

docker rmi #刪除映象

docker rmi-f 刪除制定的映象
docker rmi -f id id 刪除多個映象

docker rmi-f $(docker images -aq) 遞迴刪除全部映象

容器命令

啟動並進入容器內部

docker run -it centos /bin/bash

docker run [跟的常用命令]

--name 給容器的別名
-P 隨機外部埠對映容器內部埠
-p 指定埠   比如:   -p 5000:5000 
-d 容器後臺執行 

退回主機

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

列出所有執行中的容器

docker ps

檢視執行過的容器

docker -ps -a

docker 容器執行的狀態

容器狀態有7種:
created(已建立)
restarting(重啟中)
running(執行中)
removing(遷移中)
paused(暫停)
exited(停止)
dead(死亡)

刪除容器

docker rm 容器id			#刪除制定的容器 ,如果刪除正在執行的容器  -f
docker rm -f $(docker ps -aq) #刪除所有容器

docker ps -a -q|xargs docker rm #刪除所有容器

其他命令

啟動和停止容器

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

後臺啟動容器

docker run -d  -it 映象名

檢視紀錄檔

docker logs -f -t 容器id
docker logs -t -f --tail 20   容器id檢視20條
 

寫一段指令碼

while true;do echo kuangshen;sleep 1;done

檢視容器程序資訊

docker top 容器id
 UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                18275               18256               0                   15:17               ?                   00:00:00            /bin/sh -c while true;do echo kuangshen;sleep 1;done
root                20274               18275               0                   15:31               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

檢視映象後設資料

docker inspect  容器id

返回的資料

[
    {
        "Id": "345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d",
        "Created": "2022-06-17T07:17:00.304042239Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo kuangshen;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 18275,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-06-17T07:17:00.902769488Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/hostname",
        "HostsPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/hosts",
        "LogPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d-json.log",
        "Name": "/vigilant_panini",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473-init/diff:/var/lib/docker/overlay2/fcb5c270854d34709d71337480437be0e69003ebca9daf39fd1796c293b88d2d/diff",
                "MergedDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/merged",
                "UpperDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/diff",
                "WorkDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "345af6e6f41f",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true;do echo kuangshen;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "dae4f55d59e869c39417f01d08885567f026c3682c52ef279a2d544fb30e5b63",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/dae4f55d59e8",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "90bf5aedb85730b19d7cfd87f940180253850909f80bd464ca857179becad8ef",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "1e8be48fc967fe40643b0e7ab45fd195182b044fc7e654375cb49dba6af35861",
                    "EndpointID": "90bf5aedb85730b19d7cfd87f940180253850909f80bd464ca857179becad8ef",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

進入容器

docker exec -it  容器id/bin/bash ##進入容器開啟新終端
docker attach  容器id  #進入容器在原來的終端,可以看到之前的程式碼

從容器內拷貝檔案到主機上

docker cp 容器id:容器內路徑 目的主機路徑

小結

attach  當前shell下attach連線制定執行映象
build 通過dockerfile客製化映象
commit 提交當前容器為新的映象
cp 從容器拷貝制定檔案或者目錄到宿主機
create 建立一個新的容器,不啟動
diff 檢視容器變化
events 從服務獲取容器實時時間
exec 在已存在的容器上執行命令
export 匯出容器的內容流作為一個tar歸檔檔案對應import
history 展示一個映象形成歷史
images 列出系統當前映象
import 從tar包中的內容建立一個新的檔案系統映象
info 顯示系統的相關資訊
inspect 檢視容器詳細資訊
kill kill掉制定容器
load 從一個tar包載入一個映象[對應一個save]
login 註冊或登入一個docker伺服器源
logout 從當前原伺服器退出
logs 輸出當前伺服器紀錄檔
port 檢視對映埠對應的容器源端
pause 暫停容器
ps 列出容器列表
pull 從docker源拉取映象
push 推播到制定映象或者docker源
restart 重啟執行中的映象
rm一處一個或多個容器
rmi 移除映象
run 建立一個容器並執行
save 儲存一個映象為tar包[對應load]
search 在dockerhub搜映象
start 啟動映象
stop 停止映象
tag 給源映象打標籤
top 看容器執行程序
unpause 取消暫停容器
version 檢視docker版本
wait 擷取容器停止時的退出狀態值
status  檢視docker 狀態

作業

docker-nginx

1.搜尋映象
2.下載映象
3.啟動映象
4。執行測試:docker run -d --name nginx01 -p 3344:80 nginx

docker -tomcat


es+kibana

es需要掛載
es需要記憶體
es需要暴露多埠

視覺化工具

portainer(先用這個)
docker圖形化管理工具

Rancher(ci/cd再用)

docker映象

提交一個自己的映象

docker commit 提交容器成為一個新副本
docker commit -m "內容" -a "作者" 容器id 目標映象名:[tag]

資料卷

防止容器刪除後資料丟失,有了資料卷可以儲存到電腦,將容器目錄掛載到linux上面

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

掛載完成之後:

Mounts裡就會繫結兩者的關係
source 主機內地址
destination docker容器內的地址

容器內新增可以新增到外部,屬於雙向繫結了是

作業安裝mysql掛載資料

1.查詢mysql
2.下載映象
3.啟動,需要資料掛載  

具名掛載和匿名掛載

不指定主機名 直接是容器內的目錄: docker run -d -P --name nginx01 -v /ect/nginx nginx
所有不指定寧docker容器內的卷,在沒有指定 /var/lib/docker/volumes/xxx/_data
區分具名匿名
-v 容器內路徑   是匿名掛載
-v 卷名:容器內路徑 具名掛載
-v /宿主機器路徑::容器內路徑 指定路徑掛載

擴充套件

通過 -v 容器內路徑:ro rw 改變讀寫許可權
ro 唯讀
rw 可讀可寫
一旦設定了這個容器許可權 只能通過宿主機來操作,容器內部無法操作的 ,ro說明只能通過宿主機來操作,容器內部無法操作
docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

dockerfile

1編寫映象檔案dockerfile1

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "--------end------------"
CMD /bin/bash
  1. 執行docker命令執行檔案注意上全路徑,結尾有個空格點

    docker build  -f  /home/player3/檔案/dockerfile1.Dockerfile  -t  player3/centos   .
    
    

3.啟動容器

docker run -it player3/centos /bin/bash

4.檢視檔案

[root@d6bb2b70632d /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01

我們生成的目錄自動掛載的 

5.在容器內建立一個目錄,檢視容器裡是否有,檢視匿名掛載路徑

docker inspect d6bb2b70632d

"Mounts": [
            {
                "Type": "volume",
                "Name": "d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0",
                "Source": "/var/lib/docker/volumes/d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "438fcc6181fde2565c4e8c995a3a1aa7973cc91fa345c2b396415f4453e3f8a9",
                "Source": "/var/lib/docker/volumes/438fcc6181fde2565c4e8c995a3a1aa7973cc91fa345c2b396415f4453e3f8a9/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

6進入本地目錄看是否出現,本地電腦新增一個都有

root@player3-TM1613:/var/lib/docker/volumes/d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0/_data# ls
demo01.txt

7.測試刪除容器,發現這個本地掛載的資料還在

可以實現什麼,比如多個mysql同步資料?

小作業兩個mysql進行資料同步

volumes-form 容器名,將容器資料卷掛載到其他的資料捲上,屬於繼承了上一層的資料卷,多個資料卷的資料相互複製,刪除掉源頭docker並不會對現有檔案造成影響

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3311:3307 -v /etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7 --volumes-form mysql01

結論:容器之間的生命週期,一直到所有容器都沒有使用為止,本地資料卷的資料是不會刪除的。

編寫docker的具體步驟

1.編寫dockerfile檔案,檔案首字母大寫

2.dockerbuild 構件成一個映象

3.docker run 執行映象

4.docker push 釋出映象 (ducherhub,阿里雲映象倉庫)

dockerfile構建過程

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

dockerimages:通過dockerfile構建生成的映象,最終釋出和執行的產品,原來是jar,war。

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

基礎知識:

1.每個保留關鍵字(指令)都是必須大寫的

2.執行從上到下順序執行

3。#表示註釋

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

dockerfile常見命令

FROM   指定基本映象,一切映象從這裡開始
MAINTAINER 負責人,一般姓名+郵箱
RUN 構建映象的時候需要執行的命令
ADD 步驟,tomcat映象的化tomcat的壓縮包,新增內容
WORKDIR 映象的工作目錄
VOLUME 掛載的目錄
EXPOSE 對外暴露的埠
CMD 命令列操作
ENTRYPOINT 指定容器啟動的時候要執行的命令,可以追加命令
ONBUILD 當構建一個被繼承dockerfile 這個時候就會執行ONBUILD的指令,觸發指令
COPY 類似add,將檔案拷貝到映象中
ENV 設定構建的環境變數

小作業

1.構建一個自己的centos映象

mycentos.Dockerfile

FROM centos
MAINTAINER  kuangshen<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN  yum  -y install net-tools
EXPOSE 80
CMD echo A$MYPATH
CMD  /bin/bash

2.build

docker build  -f  /home/player3/檔案/mycentos.Dockerfile  -t  player3/mycentos   .

3.執行 docker run -it dsoadihaso /bin/bash

檢視映象的構建過程 docker history odsakdlkasjdl

cnd和entrypoint區別

cmd 指定這個容器啟動要執行的命令,之後最後一個會生效,可以被替代
entrypoint  指定這個容器啟動要執行的命令,可以追加命令

cmd的file

FROM centos
CMD ['ls',"-a"]
docker build -f xxx -t cmdtest .
docker run aa1111  

會自動將最後的cmd命令執行,如果想追加命令不能在後面直接加應該這樣寫
docker run aa1111  ls-al

entrypoint的file

FROM centos
ENTRYPOINT ['ls',"-a"]
docker build -f xxx -t entrypointtest .
docker run aa1111  

會自動將最後的cmd命令執行,如果想追加命令可以直接填上後面
docker run aa1111  l

小作業tomcat映象

釋出自己的映象

ducokerhub

1.地址:https://hub.docker.com 註冊自己的賬號

2.確定賬號可以正常登入

3.在伺服器上提交我們的映象

dockerlogin --help

-u -p
使用者名稱,密碼

4登入之後可以提交映象,docker push

本地提交到遠端儘量帶上版本資訊和tag

docker tag 5d0da3dc9764 player3/centos:0.0.1
docker push player3/centos:0.0.1

釋出到阿里雲

1.登入到阿里雲
2.找到容器映象服務
3.找到映象倉庫
4.建立名稱空間
5。建立映象倉庫
6其他參考官方檔案

docker save

docker load

docker網路

docker0

ip addr

第一個是迴環地址,第二個是內網地址,第三個是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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a0:c5:89:32:9c:d1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.109/24 brd 192.168.10.255 scope global dynamic noprefixroute wlp2s0
       valid_lft 6054sec preferred_lft 6054sec
    inet6 fe80::8d0a:e31a:72d0:f111/64 scope link noprefixroute 
       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:83:6a:8a:86 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

docker是如何處理網路問題

docker 可以ping通容器內部

正常電腦本機192.168.0.1 路由器地址,手機連線WiFi了,192.168.0.2,可以相互ping 可以相互ping通。

原理

1.我們每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只需要安裝docker就會有一個網路卡docker0

使用橋接模式,使用的技術是evth-pair 技術(虛擬裝置介面)。

啟動容器後出現的網路卡是成對出現的,一端連著協定,一端彼此相連。

2.不同容器之間可以ping通的

docker exec -it tomcat2 ping  xxx

3.結論,tomcat1和tomcat是公用一個路由,docker0,所有容器不指定網路的情況下,都是使用docker0路由的,docker會給我們的容器分配一個預設的可用ip

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

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

場景:編寫了一個微服務,database.rul=ip;; 專案不重啟,ip換掉了,希望處理這個問題,可以名字來存取容器.

想通過服務去ping tomcat02能ping通嗎?

docker exec -it tomcat02 ping tomcat01

ping不通

啟動tomcat03

docker run -d -P --name tomcat3 --link tomcat02 tomcat01

通過—link就解決了這個問題,反向是不可以ping通的

當我們設定容器的時候不設定ip會給容器設定預設ip,我們可以通過docker inspect去看

docker exec -it tomcat03 cat /etc/hosts

通過檢視tomcat03的docker host ,增加了tomcat02,tomcat01的本地對映

現在玩docker的時候已經不建議使用–link了,自定義網路,不適用docker0,docker0的問題,不支援容器名連線存取

docker network

 docker network ls 檢視所有的溫昂羅
 
  docker network rm id  刪除某個網路
  docker create 

網路模式

bridge:橋接,預設

none:不設定網路

host:和宿主機共用網路

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

測試

docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 tomcat --net bridge tomcat  上面的預設執行了這個
docker0特點;預設,域名不能存取,--link可以打通連線

我們可以自定一個網路

--driver bridge 模式

--subnet 192.168.0.0/16 多少個子網

--gateway 192.168.0.1 +閘道器路由

docker network create  --driver bridge  --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
root@player3-TM1613:/home/player3# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
430c633bd795   bridge    bridge    local
a288f78f519b   host      host      local
74783c519ad2   mynet     bridge    local
7d3b1deefd46   none      null      local

docker run -d -P --name tomcat01 --net mynet tomcat

當你不適用–link也可以ping通名字 了

好處:不同的叢集使用不同的網路,叢集是安全和健康的

我們都知道網段不同是無法ping通的,如何打通docker0和自定義網路呢?

docker network connect 可以打通網路

docker network connect mynet tomcat01

聯通之後就是將tomcat01放到了mynet網路下,一個容器兩個ip

搭建redis叢集

1.建立網路卡

docker network create  redis --subnet 192.168.0.0/16 

2.檢視服務

docker network ls
docker network inspect redis

3.建立6個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 192.168.0.1${port}
Cluster-announce-port 6379
Cluster-announce-bus-port 16379
appendonly yes
EOF
done

4.啟動redis(6個)

node-1

docker run -p 6379:6379 -p 16379: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 192.168.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

node-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 192.168.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

node-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 192.168.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

node-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 192.168.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

node-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 192.168.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

node-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 192.168.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

redis中沒有bash只有 sh

5.進入其中一個容器

docker exec -it redis-1 /bin/sh

6執行叢集命令

redis-cli --cluster create 192.168.0.11:6379 192.168.0.12:6379  192.168.0.13:6379  192.168.0.14:6379  192.168.0.15:6379  192.168.0.16:6379 --cluster-replicas 1

輸入yes

7.連線叢集

redis-cli -c

127.0.0.1:6379> cluster info

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:209
cluster_stats_messages_pong_sent:229
cluster_stats_messages_sent:438
cluster_stats_messages_ping_received:224
cluster_stats_messages_pong_received:209
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:438

8.設定值

set a b
get a
可以正常獲取

9.檢視主從節點,13的從是14

192.168.0.13:6379> cluster nodes
dda9df6e38727c5ad0667278cb77f96d91973f65 192.168.0.15:6379@16379 slave f6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 0 1655738988807 5 connected
cf8b3f0cc101c2bce9f57d10349676a37ed0538c 192.168.0.14:6379@16379 slave 2c1949dcb59bff7a4cb49b0af04d15978987daaa 0 1655738988507 4 connected
2c1949dcb59bff7a4cb49b0af04d15978987daaa 192.168.0.13:6379@16379 myself,master - 0 1655738986000 3 connected 10923-16383
86ad41983210bdd6fd8c723851820852e57f2c0d 192.168.0.12:6379@16379 master - 0 1655738988306 2 connected 5461-10922
1e1386760e3421384022567658601b9dcae3ef02 192.168.0.16:6379@16379 slave 86ad41983210bdd6fd8c723851820852e57f2c0d 0 1655738988000 6 connected
f6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 192.168.0.11:6379@16379 master - 0 1655738987000 1 connected 0-5460

10.停止docker的node-3節點

docker stop node-3

11.重新獲取,發現卡頓,ctrl+c結束後,重新登入,發現從節點已經切換成功

-> Redirected to slot [15495] located at 192.168.0.14:6379
"b"
192.

將springboot打包成docker映象

1.構建springboot專案

正常編寫web專案並且測試

1.1下載dockerfile外掛

2.打包應用

3.編寫dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

4.構建映象

將dockerfile+jar包上傳到伺服器

docker build -t kuangshen666 .

5釋出執行

docker run -d -p 8080:8080 --name kunagshen-springboot-web kuangshen666