1. 程式人生 > 其它 >狂神說docker(最全筆記)

狂神說docker(最全筆記)

筆記來源於 Docker https://www.bilibili.com/video/BV1og4y1q7M4 視訊整理 一.Docker入門 1. Docker 為什麼會出現

https://img-blog.csdnimg.cn/20201013103809810.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmppYW5oYWk=,size_16,color_FFFFFF,t_70#pic_center

2. Docker的歷史 3. Docker最新超詳細版教程通俗易懂 Docker是基於Go語言開發的!開源專案 官網 官方文件Docker文件是超詳細的 倉庫地址 4. 虛擬化技術和容器化技術對比 4.1. 虛擬化技術的缺點 資源佔用十分多 冗餘步驟多 啟動很慢 2.2. 容器化技術 比較Docker和虛擬化技術的不同 傳統虛擬機器, 虛擬出一條硬體,執行一個完整的作業系統,然後在這個系統上安裝和執行軟體 容器內的應用直接執行在宿主機的內部,容器是沒有自己的核心的,也沒有虛擬硬體,所以輕便 每個容器間是相互隔離的,每個容器內都有一個屬於自己的檔案系統,互不影響 應用更快速的互動和部署 傳統:一堆幫助文件,安裝程式 Docker: 打包映象釋出測試,一鍵執行 更便捷的升級和擴縮容 更簡的系統運維 更高效的計算資源利用 4.3. DevOps 3. 名詞解釋 映象(image) Docker映象就好比是一個模板,可以通過這個模板來建立容器服務,tomcat映象 ===> run ===> tomcat01容器, 通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中的) 容器(container) Docker利用容器技術,獨立執行一個或者一組應用, 通過映象來建立的 啟動,停止,刪除,基本命令! 就目前可以把這個容器理解為一個建議的linux系統 倉庫(repository) 存放映象的地方 Docker Hub(預設是國外的) 阿里雲,,,都有容器服務(配置映象加速!) 4. 阿里雲映象加速 登入阿里雲伺服器,找到容器映象服務 設定Registry登入密碼 找到映象加速器 配置使用 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://pi9dpp60.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 4.2 安裝docker 解除安裝舊版本 較舊的 Docker 版本稱為 docker 或 docker-engine 。如果已安裝這些程式,請解除安裝它們以及相關的依賴項。 $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 安裝 Docker Engine-Community 使用 Docker 倉庫進行安裝 在新主機上首次安裝 Docker Engine-Community 之前,需要設定 Docker 倉庫。之後,您可以從倉庫安裝和更新 Docker。 設定倉庫 安裝所需的軟體包。yum-utils 提供了 yum-config-manager ,並且 device mapper 儲存驅動程式需要 device-mapper-persistent-data 和 lvm2。 $ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 使用以下命令來設定穩定的倉庫。 使用官方源地址(比較慢) $ 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 清華大學源 $ sudo yum-config-manager \ --add-repo \ https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo 安裝 Docker Engine-Community 安裝最新版本的 Docker Engine-Community 和 containerd,或者轉到下一步安裝特定版本: $ sudo yum install docker-ce docker-ce-cli containerd.io Docker 安裝完預設未啟動。並且已經建立好 docker 使用者組,但該使用者組下沒有使用者。 要安裝特定版本的 Docker Engine-Community,請在儲存庫中列出可用版本,然後選擇並安裝: 1、列出並排序您儲存庫中可用的版本。此示例按版本號(從高到低)對結果進行排序。 $ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable 2、通過其完整的軟體包名稱安裝特定版本,該軟體包名稱是軟體包名稱(docker-ce)加上版本字串(第二列),從第一個冒號(:)一直到第一個連字元,並用連字元(-)分隔。例如:docker-ce-18.09.1。 $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io 啟動 Docker。 $ sudo systemctl start docker 通過執行 hello-world 映像來驗證是否正確安裝了 Docker Engine-Community 。 $ sudo docker run hello-world 5. 底層原理 HelloWorld映象 底層原理 Docker Engine是一個客戶端-伺服器應用程式,具有以下主要元件: 一個伺服器,它是一種長期執行的程式,稱為守護程序(dockerd命令) 一個REST API,它指定程式可以用來與守護程序對話並指示它做什麼的介面。 Docker是一個Client Server結構的系統,Docker守護程序執行在主機上,然後通過Socket連線從客戶 端訪問,守護程序從客戶端接受命令並管理執行在主機上的容器。容器,是一個執行時環境就是我們所說的集裝箱。 為什麼Docker比Vm快 docker有著比虛擬機器更少的抽象層。由於docker不需要Hypervisor實現硬體資源虛擬化,*執行在docker容器上的程式直接使用的都是實際物理機的硬體資源*。因此在CPU、記憶體利用率上docker將會在效率上有明顯優勢。** docker利用的是宿主機的核心,而不需要Guest OS。因此,當新建一個 容器時,docker不需要和虛擬機器一樣重新載入一個作業系統核心。仍而避免引尋、載入作業系統核心返個比較費時費資源的過程,當新建一個虛擬機器時,虛擬機器軟體需要載入GuestOS,返個新建過程是分鐘級別的。而docker由於直接利用宿主機的作業系統,則省略了返個過程,因此新建一個docker容器只需要幾秒鐘。 二,Docker基本命令 1. Docker的常用命令 幫助命令 docker version # docker版本資訊 docker info # 系統級別的資訊,包括映象和容器的數量 docker 命令 --help 幫助文件 映象命令 docker images 檢視所有本地主機上的映象 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 7 months ago 13.3kB # 解釋 REPOSITORY # 映象的倉庫 TAG # 映象的標籤 IMAGE ID # 映象的ID CREATED # 映象的建立時間 SIZE # 映象的大小 # 可選項 --all , -a # 列出所有映象 --quiet , -q # 只顯示映象的id docker search 查詢映象 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9822 [OK] mariadb MariaDB is a community-developed fork of MyS… 3586 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 719 [OK] # 可選項 --filter=STARS=3000 # 搜素出來的映象就是STARS大於3000的 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9822 [OK] mariadb MariaDB is a community-developed fork of MyS… 3586 [OK] docker pull 下拉映象 # 下載映象,docker pull 映象名[:tag] [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql Using default tag: latest # 如果不寫tag,預設就是latest latest: Pulling from library/mysql bf5952930446: Pull complete # 分層下載,dockerimages的核心,聯合檔案系統 8254623a9871: Pull complete 938e3e06dac4: Pull complete ea28ebf28884: Pull complete f3cef38785c2: Pull complete 894f9792565a: Pull complete 1d8a57523420: Pull complete 6c676912929f: Pull complete ff39fdb566b4: Pull complete fff872988aba: Pull complete 4d34e365ae68: Pull complete 7886ee20621e: Pull complete Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed # 簽名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真實地址 # 等價於 docker pull mysql docker pull docker.io/library/mysql:latest # 指定版本下載 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql bf5952930446: Already exists 8254623a9871: Already exists 938e3e06dac4: Already exists ea28ebf28884: Already exists f3cef38785c2: Already exists 894f9792565a: Already exists 1d8a57523420: Already exists 5f09bf1d31c1: Pull complete 1b6ff254abe7: Pull complete 74310a0bf42d: Pull complete d398726627fd: Pull complete Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 # 檢視本地映象 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 718a6da099d8 6 days ago 448MB mysql latest 0d64f46acfd1 6 days ago 544MB hello-world latest bf756fb1ae65 7 months ago 13.3kB docker rmi 刪除映象 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID # 刪除指定映象 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3 # 刪除多個映象 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f $(docker images -aq) # 刪除所有映象 容器命令 說明: 我們有了映象才可建立容器,linux,下載一個centos映象來測試學習 docker pull centos 新建容器並啟動 docker run [可選引數] image # 引數說明 --name=“Name” 容器名字 tomcat01 tomcat02 用來區分容器 -d 後臺方式執行 -it 使用互動方式執行,進入容器檢視內容 -p 指定容器的埠 -p 8080:8080 -p ip:主機埠:容器埠 -p 主機埠:容器埠(常用) -p 容器埠 容器埠 -p 隨機指定埠 # 測試,啟動並進入容器 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash [root@74e82b7980e7 /]# ls # 檢視容器內的centos,基礎版本,很多命令是不完善的 bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr # 從容器中退回主機 [root@77969f5dcbf9 /]# exit exit [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls bin dev fanfan lib lost+found mnt proc run srv tmp var boot etc home lib64 media opt root sbin sys usr 列出所有的執行的容器 # docker ps 命令 # 列出當前正在執行的容器 -a # 列出正在執行的容器包括歷史容器 -n=? # 顯示最近建立的容器 -q # 只顯示當前容器的編號 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 77969f5dcbf9 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago xenodochial_bose 74e82b7980e7 centos "/bin/bash" 16 minutes ago Exited (0) 6 minutes ago silly_cori a57250395804 bf756fb1ae65 "/hello" 7 hours ago Exited (0) 7 hours ago elated_nash 392d674f4f18 bf756fb1ae65 "/hello" 8 hours ago Exited (0) 8 hours ago distracted_mcnulty 571d1bc0e8e8 bf756fb1ae65 "/hello" 23 hours ago Exited (0) 23 hours ago magical_burnell [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -qa 77969f5dcbf9 74e82b7980e7 a57250395804 392d674f4f18 571d1bc0e8e8 退出容器 exit # 直接退出容器並關閉 Ctrl + P + Q # 容器不關閉退出 刪除容器 docker rm -f 容器id # 刪除指定容器 docker rm -f $(docker ps -aq) # 刪除所有容器 docker ps -a -q|xargs docker rm -f # 刪除所有的容器 啟動和停止容器的操作 docker start 容器id # 啟動容器 docker restart 容器id # 重啟容器 docker stop 容器id # 停止當前正在執行的容器 docker kill 容器id # 強制停止當前的容器 常用的其他命令 後臺啟動容器 # 命令 docker run -d 映象名 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos # 問題 docker ps, 發現centos停止了 # 常見的坑, docker 容器使用後臺執行, 就必須要有一個前臺程序,docker發現沒有應用,就會自動停止 # nginx, 容器啟動後,發現自己沒有提供服務,就會立即停止,就是沒有程式了 檢視日誌 docker logs -tf --tail number 容器id [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff 2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit # 日誌輸出 # 自己編寫一段shell指令碼 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos /bin/sh -c "while true;do echo xiaofan;sleep 1;done" a0d580a21251da97bc050763cf2d5692a455c228fa2a711c3609872008e654c2 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0d580a21251 centos "/bin/sh -c 'while t…" 3 seconds ago Up 1 second lucid_black # 顯示日誌 -tf # 顯示日誌 --tail number # 顯示日誌條數 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251 檢視容器中程序資訊ps # 命令 docker top 容器id [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker top df358bc06b17 UID PID PPID C STIME TTY root 28498 28482 0 19:38 ? 檢視映象的元資料 # 命令 docker inspect 容器id [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker inspect df358bc06b17 [ { "Id": "df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3", "Created": "2020-08-11T11:38:34.935048603Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 28498, "ExitCode": 0, "Error": "", "StartedAt": "2020-08-11T11:38:35.216616071Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566", "ResolvConfPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/resolv.conf", "HostnamePath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/hostname", "HostsPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/hosts", "LogPath": "/var/lib/docker/containers/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3/df358bc06b17ef44f215d35d9f46336b28981853069a3739edfc6bd400f99bf3-json.log", "Name": "/hungry_heisenberg", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "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, "Capabilities": null, "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/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360-init/diff:/var/lib/docker/overlay2/62926d498bd9d1a6684bb2f9920fb77a2f88896098e66ef93c4b74fcb19f29b6/diff", "MergedDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/merged", "UpperDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/diff", "WorkDir": "/var/lib/docker/overlay2/5af8a2aadbdba9e1e066331ff4bce56398617710a22ef906f9ce4d58bde2d360/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "df358bc06b17", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "centos", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20200809", "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": "4822f9ac2058e8415ebefbfa73f05424fe20cc8280a5720ad3708fa6e80cdb08", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/4822f9ac2058", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "5fd269c0a28227241e40cd30658e3ffe8ad6cc3e6514917c867d89d36a31d605", "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": "30d6017888627cb565618b1639fecf8fc97e1ae4df5a9fd5ddb046d8fb02b565", "EndpointID": "5fd269c0a28227241e40cd30658e3ffe8ad6cc3e6514917c867d89d36a31d605", "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 } } } } ] [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# 進入當前正在執行的容器 # 我們通常容器使用後臺方式執行的, 需要進入容器,修改一些配置 # 命令 docker exec -it 容器id /bin/bash # 測試 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker exec -it df358bc06b17 /bin/bash [root@df358bc06b17 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@df358bc06b17 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug11 pts/0 00:00:00 /bin/bash root 29 0 0 01:06 pts/1 00:00:00 /bin/bash root 43 29 0 01:06 pts/1 00:00:00 ps -ef # 方式二 docker attach 容器id # docker exec # 進入容器後開啟一個新的終端,可以在裡面操作 # docker attach # 進入容器正在執行的終端,不會啟動新的程序 從容器中拷貝檔案到主機 docker cp 容器id:容器內路徑 目的地主機路徑 [root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home 三,Docker部署軟體實戰 1.Docker部署軟體實戰 Docker安裝Nginx # 1. 搜尋映象 search 建議去docker hub搜尋,可以看到幫助文件 # 2. 下載映象 pull # 3. 執行測試 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0d120b6ccaa8 32 hours ago 215MB nginx latest 08393e824c32 7 days ago 132MB # -d 後臺執行 # -name 給容器命名 # -p 宿主機埠:容器內部埠 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d --name nginx01 -p 3344:80 nginx # 後臺方式啟動啟動映象 fe9dc33a83294b1b240b1ebb0db9cb16bda880737db2c8a5c0a512fc819850e0 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fe9dc33a8329 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp nginx01 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:3344 # 本地訪問測試 # 進入容器 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker exec -it nginx01 /bin/bash root@fe9dc33a8329:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@fe9dc33a8329:/# cd /etc/nginx/ root@fe9dc33a8329:/etc/nginx# ls conf.d koi-utf mime.types nginx.conf uwsgi_params fastcgi_params koi-win modules scgi_params win-utf 埠暴露概念 2. Docker安裝Tomcat # 官方的使用 docker run -it --rm tomcat:9.0 # 我們之前的啟動都是後臺的,停止了容器之後, 容器還是可以查到,docker run -it --rm 一般用來測試,用完就刪 # 下載再啟動 docker pull tomcat # 啟動執行 docker run -d -p 3344:8080 --name tomcat01 tomcat # 測試訪問沒有問題 # 進入容器 docker exec -it tomcat01 /bin/bash # 發現問題:1.linux命令少了, 2. webapps下內容為空,阿里雲淨吸納過預設是最小的映象,所有不必要的都剔除了,保證最小可執行環境即可 3. Docker部署es + kibana # es 暴露的埠很多 # es 十分的耗記憶體 # es 的資料一般需要放置到安全目錄! 掛載 # --net somenetwork 網路配置 # 啟動elasticsearch docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 a920894a940b354d3c867079efada13d96cf9138712c76c8dea58fabd9c7e96f # 啟動了linux就卡主了,docker stats 檢視cpu狀態 # 測試一下es成功了 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:9200 { "name" : "a920894a940b", "cluster_name" : "docker-cluster", "cluster_uuid" : "bxE1TJMEThKgwmk7Aa3fHQ", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } # 增加記憶體限制,修改配置檔案 -e 環境配置修改 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 視覺化 portainer(先用這個) docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer # 測試 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# curl localhost:8088 <!DOCTYPE html ><html lang="en" ng-app="portainer"> # 外網訪問 http://ip:8088 Rancher(CI/CD再用) 四.Docker原理 特點 Docker獎項都是隻讀的,當容器啟動時, 一個新的可寫層被載入到映象的頂部! 這一層就是我們通常說的容器層, 容器之下的都叫做映象層 commit映象 docker commit 提交容器成為一個新的版本 # 命令和git 原理類似 docker commit -m="提交的描述資訊" -a="作者" 容器id 目標映象名:[TAG] docker commit -a="xiaofan" -m="add webapps app" d798a5946c1f tomcat007:1.0 實戰測試 # 1. 啟動一個預設的tomcat # 2. 發現這個預設的tomcat是沒有webapps應用, 映象的原因,官方映象預設webapps下面是沒有內容的 # 3. 我自己拷貝進去了基本的檔案 # 4. 將我們操作過的容器通過commit提價為一個鏡映象!我們以後就使用我們自己製作的映象了 五,容器資料卷 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.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就說明這個路徑只能通過宿主機來操作,容器內容無法操作 六,DockerFile 初始DockerFile DockerFile就是用來狗之間docker映象的構建檔案!命令指令碼!先體驗一下! 通過這個指令碼可以生成映象,映象是一層一層的,指令碼一個個的命令,每個命令都是一層! # 建立一個dockerfile檔案, 名字可以隨機 # 檔案的內容 指定(大寫) 引數 FROM centos VOLUME ["volume01", "volume02"] CMD echo "----end----" CMD /bin/bash # 這裡的每一個命令都是映象的一層! # 啟動自己的容器 這個卷和外部一定有一個同步的目錄! docker inspect 容器id 測試一下剛才的檔案是否同步到主機上了! 這種方式我們未來使用的十分多, 因為我們通常會構建自己的映象! 假設構建映象時候沒有掛載卷,要手動映象掛載 -v 卷名:容器內路徑! 資料卷容器 多個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 結論 容器之間配置資訊的傳遞, 資料卷容器的宣告週期一直持續到沒有容器使用為止。 但是一旦你持久化到了本地,這個時候,本地的資料是不會刪除的! DockerFile dockerFile是用來構建docker映象的檔案!命令引數指令碼! 構建步驟 1. 編寫一個dockerFile檔案 2.docker build 構建成為一個映象 3. docker run 執行映象 4. docker push 釋出映象(DockerHub、阿里雲映象) 檢視嬰喜愛官方是怎麼做的? 很多官方映象都像是基礎包,很多功能都不具備,我們通常會自己搭建自己的映象! 官方既然可以製作映象,能我們一樣可以! DockerFile的構建過程 基礎知識: 每個保留關鍵字(指令)都是必須大寫字母 執行從上到下順序執行 # 表示註釋 每個指令都會建立提交一個新的映象層,並提交! dockerFile是面向開發的, 我們以後要釋出專案, 做映象, 就需要編寫dockefile檔案, 這個檔案十分簡單! Docker映象逐漸成為企業的互動標準,必須要掌握! 步驟:開發,部署, 運維..... 缺一不可! DockerFile: 構建檔案, 定義了一切的步驟,原始碼 DockerImages: 通過DockerFile構建生成的映象, 最終釋出和執行的產品! Docker容器:容器就是映象執行起來提供伺服器 DockerFile指令說明 FROM # 基礎映象,一切從這裡開始構建 MAINTAINER # 映象是誰寫的, 姓名+郵箱 RUN # 映象構建的時候需要執行的命令 ADD # 步驟, tomcat映象, 這個tomcat壓縮包!新增內容 WORKDIR # 映象的工作目錄 VOLUME # 掛載的目錄 EXPOSE # 保留埠配置 CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效可被替代 ENTRYPOINT # 指定這個容器啟動的時候要執行的命令, 可以追加命令 ONBUILD # 當構建一個被繼承DockerFile 這個時候就會執行 ONBUILD 的指令,觸發指令 COPY # 類似ADD, 將我們檔案拷貝到映象中 ENV # 構建的時候設定環境變數! 建立一個自己的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 七,Dockerfile製作tomcat映象 Dockerfile製作tomcat映象 準備映象檔案 tomcat壓縮包,jdk的壓縮包! 編寫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 構建映象 # docker build -t diytomcat . 啟動映象 # 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 訪問測試 釋出專案(由於做了卷掛載, 我們直接在本地編寫專案就可以釋出了) 在本地編寫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進行來發布執行的! 釋出自己的映象到Docker Hub Docker Hub 地址 註冊自己的賬號! 確定這個賬號可以登入 在我們的伺服器上提交自己的映象 # 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 釋出到阿里雲映象服務上 登入阿里雲 找到容器映象服務 建立名稱空間 建立容器映象 點選倉庫名稱,參考官方文件即可 總結 八,Docker網路 1. Docker網路 連結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容器內部! 原理 我們沒啟動一個docker容器, docker就會給docker容器分配一個ip, 我們只要安裝了docker,就會有一個網絡卡 docker0橋接模式,使用的技術是veth-pair技術! 再次測試 ip addr 再啟動一個容器測試, 發現又多了一對網絡卡 # 我們發現這個容器帶來網絡卡,都是一對對的 # veth-pair 就是一對的虛擬裝置介面,他們都是成對出現的,一端連著協議,一端彼此相連 # 正因為有這個特性,veth-pair充當一個橋樑, 連線各種虛擬網路裝置 # OpenStac, Docker容器之間的連結,OVS的連結, 都是使用veth-pair技術 我們測試一下tomcat01和tomcat02之間是否可以ping通! 結論:容器與容器之間是可以相互ping通的! 繪製一個網路模型圖 結論:tomcat01和tomcat02是共用的一個路由器,docker0 所有容器不指定網路的情況下,都是docker0路由的,doucker會給我們的容器分配一個預設的可用IP 小結 Docker使用的是Linux的橋接,宿主機中是一個Docker容器的網橋docker0. Docker中的所有的網路介面都是虛擬的,虛擬的轉發效率高!(內網傳遞檔案!) 只要容器刪除,對應的網橋一對就沒有了! -- 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的問題:它不支援容器名連結訪問! 自定義網路 檢視所有的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 - 不同的叢集使用不同的網路,保證叢集時安全和健康的 網路連通 測試打通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連通.....! 實戰:部署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叢集完成! SpringBoot微服務打包Docker映象 構建springboot專案 ? IDEA2020 Ultimate版本啟用方案 親測有效 打包應用 編寫Dockerfile FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] 構建映象 釋出執行! # 把打好的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之後,給別人互動的就是一個映象即可! 九,Docker Compose Docker Compose 簡介 Docker Dockerfile build run 手動操作,單個容器! 微服務,100個微服務,依賴關係。 Docker Compose 來輕鬆高效的管理容器,定義執行多個容器。 官方介紹 定義執行多個容器 YAML file配置檔案 single command。命令有哪些? Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features. 所有的環境都可以使用compose。 Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases. 三步驟: Using Compose is basically a three-step process: Define your app’s environment with a Dockerfile so it can be reproduced anywhere. Dockerfile保證我們的專案再任何地方可以執行 Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment. services 什麼是服務。 Run docker-compose up and Compose starts and runs your entire app. 啟動專案 作用:批量容器編排 我自己的理解 Compose是Docker官方的開源專案,需要安裝! Dockerfile讓程式在任何地方執行。web服務、redis、mysql、nginx... 多個容器。 run Compose version: '2.0' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {} docker-compose up 100個服務 Compose:重要概念 服務services, 容器、應用(web、redis、mysql...) 專案project。 一組關聯的容器 安裝 下載 # 官網提供 (沒有下載成功) curl -L "https://github.com/docker/compose/releases/download/1.26.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 授權 chmod +x /usr/local/bin/docker-compose 體驗(沒有測試通過) 地址:https://docs.docker.com/compose/gettingstarted/ python應用。 計數器。redis! 應用app.py Dockerfile 應用打包為映象 FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] # 官網的用來flask框架,我們這裡不用它 # 這告訴Docker # 從python3.7開始構建映象 # 將當前目錄新增到/code印像中的路徑中 # 將工作目錄設定為/code # 安裝Python依賴項 # 將容器的預設命令設定為python app.py Docker-compose yaml檔案(定義整個服務,需要的環境 web、redis) 完整的上線服務! version: '3.8' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine" 啟動compose 專案 (docker-compose up) 流程: 建立網路 執行Docker-compose.yaml 啟動服務 yaml規則 docker-compose.yaml 核心!
https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples
開源專案:部落格 https://docs.docker.com/compose/wordpress/ 下載程式、安裝資料庫、配置.... compose應用 => 一鍵啟動 下載專案(docker-compse.yaml) 如果需要檔案。Dockerfile 檔案準備齊全,一鍵啟動專案即可 實戰:自己編寫微服務上線 編寫專案微服務 Dockerfile構建映象 FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] docker-compose.yml編排專案 version '3.8' services: xiaofanapp: build: . image: xiaofanapp depends_on: - redis ports: - "8080:8080" redis: image: "library/redis:alpine" 丟到伺服器執行 docker-compose up docker-compose down # 關閉容器 docker-compose up --build # 重新構建 總結: 工程、服務、容器 專案 compose: 三層 工程 Project 服務 容器 執行例項! docker k8s 容器 十,Docker Swarm Docker Swarm 叢集 購買伺服器 登入阿里雲賬號,進入控制檯,建立例項 4臺伺服器2G 到此,我們的伺服器購買成功! 四臺機器安裝docker 和我們單機安裝一樣 技巧: xshell直接同步操作,省時間! Docker的安裝 Swarm叢集搭建 工作機制 docker swarm init --help ip addr # 獲取自己的ip(用內網的不要流量) [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker swarm init --advertise-addr 172.16.250.97 Swarm initialized: current node (otdyxbk2ffbogdqq1kigysj1d) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 初始化結點docker swarm init docker swarm join 加入一個結點! # 獲取令牌 docker swarm join-token manager docker swarm join-token worker [root@iZ2ze58v8acnlxsnjoulk6Z ~]# docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377 This node joined a swarm as a worker. 把後面的結點都搭建進去 100臺! 生成主節點init 加入(管理者,worker) Raft協議 雙主雙從:假設一個結點掛了!其他結點是否可以用! Raft協議:保證大多數結點存活才可以使用,只要>1, 叢集至少大於3臺! 實驗: 1、將docker1機器停止。宕機!雙主,另外一個結點也不能使用了! 可以將其他結點離開docker swarm leave worker就是工作的,管理結點操作! 3臺結點設定為了管理結點。 Docker swarm叢集增加節點 十分簡單:叢集,可用! 3個主節點。 > 1臺管理結點存活! Raft協議:保證大多數結點存活,才可以使用,高可用! 體會 彈性、擴縮容!叢集! 以後告別 docker run! docker-compose up!啟動一個專案。單機! 叢集: swarm docker-service k8s service 容器 => 服務! 容器 => 服務! => 副本! redis => 10個副本!(同時開啟10個redis容器) 體驗:建立服務、動態擴容服務、動態更新服務 灰度釋出(金絲雀釋出) 程式設計浪子的部落格 docker run 容器啟動! 不具有擴縮容器 docker service 服務! 具有擴縮容器,滾動更新! 檢視服務 動態擴縮容 [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service update --replicas 3 my-nginx 1/3: running [==================================================>] 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=5 my-nginx scaled to 5 overall progress: 3 out of 5 tasks overall progress: 3 out of 5 tasks overall progress: 3 out of 5 tasks overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=1 my-nginx scaled to 1 overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged 移出!docker service rm docker swarm其實並不難 只要會搭建叢集、會啟動服務、動態管理容器就可以了! 概念的總結 swarm 叢集的管理和編號,docker可以初始化一個swarm叢集,其他結點可以加入。(管理,工作者) Node 就是一個docker結點,多個結點就組成了一個網路叢集(管理、工作者) Service 任務,可以在管理結點或者工作結點來執行。核心,使用者訪問。 Task 容器內的命令、細節任務! service 命令 -> 管理 -> api -> 排程 -> 工作結點(建立Task容器維護建立!) 服務副本和全域性服務 調整service以什麼方式執行 --mode string Service mode (replicated or global) (default "replicated") docker service create --mode replicated --name mytom tomcat:7 預設的 docker service create --mode global --name haha alpine ping www.baidu.com 拓展: 網路模式 "PublishMode":"ingress" Swarm: Overlay: ingress:特殊的Overlay網路!負載均衡的功能!ipvs vip! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 74cecd37149f bridge bridge local 168d35c86dd5 docker_gwbridge bridge local 2b8f4eb9c2e5 host host local dmddfc14n7r3 ingress overlay swarm 8e0f5f648e69 none null local [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network inspect ingress [ { "Name": "ingress", "Id": "dmddfc14n7r3vms5vgw0k5eay", "Created": "2020-08-17T10:29:07.002315919+08:00", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": true, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "ingress-sbox": { "Name": "ingress-endpoint", "EndpointID": "9d6ec47ec8309eb209f4ff714fbe728abe9d88f9f1cc7e96e9da5ebd95adb1c4", "MacAddress": "02:42:0a:00:00:02", "IPv4Address": "10.0.0.2/24", "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4096" }, "Labels": {}, "Peers": [ { "Name": "cea454a89163", "IP": "172.16.250.96" }, { "Name": "899a05b64e09", "IP": "172.16.250.99" }, { "Name": "81d65a0e8c03", "IP": "172.16.250.97" }, { "Name": "36b31096f7e2", "IP": "172.16.250.98" } ] } ] 其他命令學習方式 Docker Stack docker-compose 單機部署專案 docker stack 叢集部署 # 單機 docker-compose up -d wordpress.yaml # 叢集 docker stack deploy wordpress.yaml Docker Secret 安全!配置密碼!證書! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker secret --help Usage: docker secret COMMAND Manage Docker secrets Commands: create Create a secret from a file or STDIN as content inspect Display detailed information on one or more secrets ls List secrets rm Remove one or more secrets Docker Config 配置! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker config --help Usage: docker config COMMAND Manage Docker configs Commands: create Create a config from a file or STDIN inspect Display detailed information on one or more configs ls List configs rm Remove one or more configs 拓展到k8s 雲原生時代 Go語言!必須掌握! Java Go! 併發語言! B語言,C語言的創始人。Unix創始人VB go指標 ———————————————— 版權宣告:本文為CSDN博主「煙霞畔」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/qq_21197507/article/details/115071715