Docker学习笔记 (狂神说)
狂神視頻地址:https://www.bilibili.com/video/BV1og4y1q7M4
已經有人寫過此視頻的學習文檔了,
地址:https://blog.csdn.net/weixin_44517301/article/details/121486489
但由于時間原因,部分命令已經不能使用,因此發布此篇
Docker概述
Docker為什么出現
一款產品: 開發–上線 兩套環境!應用環境,應用配置!
開發 — 運維。 問題:我在我的電腦上可以運行!版本更新,導致服務不可用!對于運維來說考驗十分大!
環境配置是十分的麻煩,每一個機器都要部署環境(Redis、ES、Hadoop…) !費事費力。
發布一個項目( jar + (Redis+MySQL+jdk+ES) ),項目能不能帶上環境安裝打包!
之前在服務器配置一個應用的環境 Redis MySQL JDK ES Hadoop 配置超麻煩了,不能夠跨平臺。
開發環境Windows,最后發布到Linux!
傳統:開發做成jar包,運維來做部署!
現在:開發打包部署上線,一套流程做完!
安卓流程:java — apk —發布(應用商店) 張三使用apk 一 安裝即可用!
docker流程: java-jar(環境) — 打包項目帯上環境(鏡像)— 發布( Docker倉庫:商店)----- 下載我們發布的鏡像—直接運行即可
Docker給以上的問題,提出了解決方案!
Docker的思想就來自于集裝箱!
jre 中多個應用(可能端口沖突) – 因為都是交叉的!
隔離:Docker核心思想!打包裝箱!每個箱子是互相隔離的。
Docker通過隔離機制,可以將服務器利用到極致!
Docker歷史
2010年,幾個年輕人,在美國成立了一家公司 dotcloud
做一些pass的云計算服務!LXC(Linux Container容器)有關的容器技術!
Linux Container容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源。
他們將自己的技術(容器化技術)命名就是 Docker
Docker剛剛延生的時候,沒有引起行業的注意!
2013年,Docker開源!
越來越多的人發現docker的優點!火了。Docker每個月都會更新一個版本!
2014年4月9日,Docker1.0發布!
docker為什么這么火?十分的輕巧!
在容器技術出來之前,我們都是使用虛擬機技術!
虛擬機:在window中裝一個VMware,通過這個軟件我們可以虛擬出來一臺或者多臺電腦!笨重!
虛擬機也屬于虛擬化技術,Docker容器技術,也是一種虛擬化技術!
VMware : linux centos 原生鏡像(一個電腦!) 隔離、需要開啟多個虛擬機! 幾個G,幾分鐘 docker: 隔離,鏡像(最核心的環境 4m + jdk + mysql)十分的小巧,運行鏡像就可以了!小巧! 幾個M,秒級啟動!Docker基于Go語言開發的!開源項目!
docker官網:https://www.docker.com/
文檔:https://docs.docker.com/ Docker的文檔是超級詳細的!
倉庫:https://hub.docker.com/
Docker能做什么
之前的虛擬機技術
虛擬機技術缺點:
1、 資源占用十分多
2、 冗余步驟多
3、 啟動很慢!
容器化技術
容器化技術不是模擬一個完整的操作系統!!!
比較Docker和虛擬機技術的不同:
- 傳統虛擬機,虛擬出一套硬件,運行一個完整的操作系統,然后在這個系統上安裝和運行軟件
- 容器內的應用直接運行在宿主機的內容,容器是沒有自己的內核的,也沒有虛擬我們的硬件,所以就輕便了
- 每個容器間是互相隔離,每個容器內都有一個屬于自己的文件系統,互不影響
應用更快速的交付和部署
傳統:一對幫助文檔,安裝程序。
Docker:打包鏡像發布測試一鍵運行。
更便捷的升級和擴縮容
使用了 Docker之后,我們部署應用就和搭積木一樣
項目打包為一個鏡像,擴展服務器A!服務器B
更簡單的系統運維
在容器化之后,我們的開發,測試環境都是高度一致的
更高效的計算資源利用
Docker是內核級別的虛擬化,可以在一個物理機上可以運行很多的容器實例!服務器的性能可以被壓榨到極致。
Docker安裝
Docker的基本組成
鏡像(image):
docker鏡像就好比是一個模板,可以通過這個目標來創建容器服務,tomcat鏡像==>run(運行)==>容器(提供服務器),通過這個鏡像可以創建多個容器(最終服務運行或者項目運行就是在容器中的)。
容器(container):
Docker利用容器技術,獨立運行一個或者一組應用,通過鏡像來創建的.
啟動,停止,刪除,基本命令
目前就可以把這個容器理解為就是一個簡易的 Linux系統。
倉庫(repository):
倉庫就是存放鏡像的地方!
倉庫分為公有倉庫和私有倉庫。(類似git)
Docker Hub是國外的。
阿里云、騰訊云都有容器服務器(配置鏡像加速!)
Docker安裝(CentOS 7)
環境準備
Linux要求內核3.0以上
CentOS 7
安裝
幫助文檔:https://docs.docker.com/engine/install/
卸載與安裝
#1.卸載舊版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #2.需要的安裝包 yum install -y yum-utils#3.設置鏡像的倉庫 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo #上述方法默認是從國外的,不推薦#推薦使用國內的 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#更新yum軟件包索引 yum makecache fast#4.安裝docker相關的 docker-ce 社區版 而ee是企業版 yum install docker-ce docker-ce-cli containerd.io # 這里我們使用社區版即可#5.啟動docker systemctl start docker#6. 使用docker version查看是否按照成功 docker version#7. 測試 docker run hello-world#8.查看已經下載的鏡像(從這里可以查看已有鏡像的id) [root@iz2zeak7sgj6i7hrb2g862z ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 months ago 13.3kB卸載Docker
#1. 卸載依賴 yum remove docker-ce docker-ce-cli containerd.io #2. 刪除資源 rm -rf /var/lib/docker # /var/lib/docker 是docker的默認工作路徑!回顧HelloWorld流程
docker run 流程圖
底層原理
Docker是怎么工作的?
Docker是一個Client-Server結構的系統,Docker的守護進程運行在主機上。通過Socket從客戶端訪問!
Docker-Server接收到Docker-Client的指令,就會執行這個命令!
為什么Docker比Vm快
1、docker有著比虛擬機更少的抽象層。
? 由于docker不需要Hypervisor實現硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上docker將會在效率上有明顯優勢。
2、docker利用的是宿主機的內核,而不需要Guest OS。
因此,當新建一個 容器時,docker不需要和虛擬機一樣重新加載一個操作系統內核。
當新建一個虛擬機時,虛擬機軟件需要加載GuestOS,這個新建過程是分鐘級別的。
而docker由于直接利用宿主機的操作系統,則省略了這個復雜的過程,因此新建一個docker容器只需要幾秒鐘。
Docker的常用命令
1、幫助命令
docker version #顯示docker的版本信息。 docker info #顯示docker的系統信息,包括鏡像和容器的數量 docker 命令 --help #幫助命令幫助文檔的地址:https://docs.docker.com/engine/reference/commandline/build/
2、鏡像命令
docker images查看所有本地的主機上的鏡像
[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 months ago 13.3kB# 解釋 #REPOSITORY # 鏡像的倉庫源 #TAG # 鏡像的標簽(版本) ---lastest 表示最新版本 #IMAGE ID # 鏡像的id #CREATED # 鏡像的創建時間 #SIZE # 鏡像的大小# 可選項 Options:-a, --all Show all images (default hides intermediate images) #列出所有鏡像-q, --quiet Only show numeric IDs # 只顯示鏡像的id[root@VM-4-17-centos ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 months ago 13.3kB [root@VM-4-17-centos ~]# docker images -aq feb5d9fea6a5docker search 搜索鏡像
[root@VM-4-17-centos ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 13234 [OK] mariadb MariaDB Server is a high performing open sou… 5062 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 640 [OK] percona Percona Server is a fork of the MySQL relati… 588 [OK] bitnami/mysql Bitnami MySQL Docker Image 77 [OK] databack/mysql-backup Back up mysql databases to... anywhere! 70 linuxserver/mysql-workbench 44 linuxserver/mysql A Mysql container, brought to you by LinuxSe… 37 ubuntu/mysql MySQL open source fast, stable, multi-thread… 36 circleci/mysql MySQL is a widely used, open-source relation… 27 google/mysql MySQL server for Google Compute Engine 21 [OK] rapidfort/mysql RapidFort optimized, hardened image for MySQL 13 bitnami/mysqld-exporter 3 ibmcom/mysql-s390x Docker image for mysql-s390x 2 newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK] vitess/mysqlctld vitess/mysqlctld 1 [OK] hashicorp/mysql-portworx-demo 0 docksal/mysql MySQL service images for Docksal - https://d… 0 mirantis/mysql 0 cimg/mysql 0 drud/mysql 0 silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK] corpusops/mysql https://github.com/corpusops/docker-images/ 0 drud/mysql-local-57 ddev mysql local container 0 drud/mysql-docker-local-57 This repo has been deprecated, new tags are … 0 # --filter=STARS=3000 #過濾,搜索出來的鏡像收藏STARS數量大于3000的 Options:-f, --filter filter Filter output based on conditions provided--format string Pretty-print search using a Go template--limit int Max number of search results (default 25)--no-trunc Don't truncate output[root@VM-4-17-centos ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 13234 [OK] mariadb MariaDB Server is a high performing open sou… 5062 [OK]docker pull 下載鏡像
# 下載鏡像 docker pull 鏡像名[:tag] [root@VM-4-17-centos ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql #如果不寫tag,默認就是latest 051f419db9dd: Pull complete #分層下載: docker image 的核心 聯合文件系統 7627573fa82a: Pull complete a44b358d7796: Pull complete 95753aff4b95: Pull complete a1fa3bee53f4: Pull complete f5227e0d612c: Pull complete b4b4368b1983: Pull complete f26212810c32: Pull complete d803d4215f95: Pull complete d5358a7f7d07: Pull complete 435e8908cd69: Pull complete Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921 #簽名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真實地址#以下兩條命令等價 docker pull mysql docker pull docker.io/library/mysql:latest[root@VM-4-17-centos ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 90fe46dd8199: Already exists #分層下載: docker image 的核心 聯合文件系統 35a4f1977689: Already exists bbc37f14aded: Already exists 74e27dc593d4: Already exists 93a01fbfad7f: Already exists 3c9ea9927039: Pull complete dfb1b236c7fc: Pull complete e2ad62bd72a7: Pull complete Digest: sha256:94fe67a04001e9841f68f114c8e9b5231c1d012e6b00d3b8ade42c0c5e239a0f Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7docker rmi 刪除鏡像
docker rmi -f 鏡像id #刪除指定id的鏡像 docker rmi -f 鏡像id1 鏡像id2 鏡像id3 #刪除多個鏡像[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 aa803eda0f25 11 days ago 433MB mysql latest 43fcfca0776d 2 weeks ago 449MB hello-world latest feb5d9fea6a5 12 months ago 13.3kB [root@VM-4-17-centos ~]# docker rmi aa803eda0f25 Untagged: mysql:5.7docker rmi -f $(docker images -aq) #刪除全部的鏡像3、容器命令
說明:我們有了鏡像才可以創建容器,Linux,下載一個centos鏡像來學習
docker pull centos[root@VM-4-17-centos ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest新建容器并啟動
docker run [可選參數] image | docker container run [可選參數] image #參書說明 --name="Name" #容器名字 tomcat01 tomcat02 用來區分容器 -d #后臺方式運行 -it #使用交互方式運行,進入容器查看內容 -p #指定容器的端口 -p 8080(宿主機):8080(容器)-p ip:主機端口:容器端口-p 主機端口:容器端口(常用)-p 容器端口容器端口 -P(大寫) 隨機指定端口# 測試、啟動并進入容器 [root@VM-4-17-centos ~]# docker run -it centos /bin/bash [root@fca965a8d399 /]# ls #查看內部的centos bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@fca965a8d399 /]# exit #退回主機 exit列出所有運行的容器
docker ps 命令 #列出當前正在運行的容器-a, --all #列出當前正在運行的容器 + 帶出歷史運行過的容器-n=?, --last int #列出最近創建的?個容器 ?為1則只列出最近創建的一個容器,為2則列出2個-q, --quiet #只列出容器的編號[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@VM-4-17-centos ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fca965a8d399 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago peaceful_matsumoto 75e65c92b2b8 feb5d9fea6a5 "/hello" 52 minutes ago Exited (0) 52 minutes ago eager_johnson de2f71289142 feb5d9fea6a5 "/hello" 12 days ago Exited (0) 12 days ago frosty_murdock [root@VM-4-17-centos ~]# docker ps -a -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fca965a8d399 centos "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago peaceful_matsumoto [root@VM-4-17-centos ~]# docker ps -aq fca965a8d399 75e65c92b2b8 de2f71289142 [root@VM-4-17-centos ~]# docker ps -aq -n=2 fca965a8d399 75e65c92b2b8退出容器
exit #容器直接退出 ctrl +P +Q #容器不停止退出 ---注意:這個很有用的操作[root@VM-4-17-centos ~]# docker run -it centos /bin/bash [root@a7cb8cdd3d32 /]# [root@VM-4-17-centos ~]#刪除容器
docker rm 容器id #刪除指定的容器,不能刪除正在運行的容器,如果要強制刪除 rm -rf 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 #強制停止當前容器4、常用其他命令
后臺啟動命令
# 命令 docker run -d 鏡像名 [root@VM-4-17-centos ~]# docker run -d centos c0c4edabe27667fe1834c86c40338680a3efc333c356f03e253c262e613a4a2f[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 問題docker ps. 發現centos停止了 # 常見的坑,docker容器使用后臺運行,就必須要有要一個前臺進程,docker發現沒有對外提供的應用,就會自動停止 # 例如nginx,容器啟動后,發現自己沒有提供服務,就會立刻停止,就是沒有程序了查看日志命令
docker logs --help Options:--details Show extra details provided to logs * -f, --follow Follow log output--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) * --tail string Number of lines to show from the end of the logs (default "all") * -t, --timestamps Show timestamps--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) ? ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模擬日志 #顯示日志 -tf #顯示日志信息(一直更新) --tail number #需要顯示number條日志 docker logs -t --tail n 容器id #查看n行日志 docker logs -ft 容器id #跟著日志查看容器中的進程信息
docker top 容器id [root@VM-4-17-centos ~]# docker top 1f457dc49d6d UID PID PPID C STIME TTY root 11901 11882 0 14:35 ? root 13165 11901 0 14:39 ?查看鏡像的元數據
docker inspect 容器id [root@VM-4-17-centos ~]# docker inspect 1f457dc49d6d [{"Id": "1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0","Created": "2022-10-07T06:35:17.033786362Z","Path": "/bin/sh","Args": ["-c","while true;do echo 6666;sleep 1; done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 11901,"ExitCode": 0,"Error": "","StartedAt": "2022-10-07T06:35:17.412877686Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/resolv.conf","HostnamePath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/hostname","HostsPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/hosts","LogPath": "/var/lib/docker/containers/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0/1f457dc49d6d9e4227284a1617b944b5307e7678aaa47e5a488425bcd056faf0-json.log","Name": "/suspicious_chaplygin","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,"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/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a-init/diff:/var/lib/docker/overlay2/4a6bb38ec524d5bda0d06ff72ded55ce46b3cefc7546432c840b6661779e8dbb/diff","MergedDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/merged","UpperDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/diff","WorkDir": "/var/lib/docker/overlay2/ec3bcfe72237d908d25f24516dc5eae6c0728b7d7d7705fbffe5e49afe4eec1a/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "1f457dc49d6d","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 6666;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": "1acaa5ed1212a950da1ffcedf9ed5f755c6402543606e339ca8b3200f97948b2","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/1acaa5ed1212","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "ab0a229e69e2c663cd3e898c685b124caed317686c61ca78f0015c7e1fae19a3","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:03","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "cc96daeb0587caacad93f2db01f3ae4024ba2ceb442d801eb1769bfade90c6c9","EndpointID": "ab0a229e69e2c663cd3e898c685b124caed317686c61ca78f0015c7e1fae19a3","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null}}}} ]進入當前正在運行的容器
# 我們通常容器都是使用后臺方式運行的,需要進入容器,修改一些配置# 方式一 docker exec -it 容器id bashShell # 測試 [root@VM-4-17-centos ~]# docker exec -it 1f457dc49d6d /bin/bash [root@1f457dc49d6d /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@1f457dc49d6d /]# # 方式二 docker attach 容器id # 測試 [root@VM-4-17-centos ~]# docker attach 1f457dc49d6d區別 #docker exec #進入當前容器后開啟一個新的終端,可以在里面操作。(常用) #docker attach # 進入容器正在執行的終端從容器內拷貝文件到主機
docker cp 容器id:容器內路徑 目的主機路徑 # 查看容器 [root@VM-4-17-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b19b6c989ee centos "/bin/bash" 47 seconds ago Up 46 seconds nice_sanderson # 進入容器 [root@VM-4-17-centos home]# docker attach 2b19b6c989ee [root@2b19b6c989ee /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@2b19b6c989ee /]# cd home [root@2b19b6c989ee home]# ls [root@2b19b6c989ee home]# touch zwj.java [root@2b19b6c989ee home]# ls zwj.java # 拷貝 [root@2b19b6c989ee home]# touch zwj.javaread escape sequence [root@VM-4-17-centos home]# docker cp 2b19b6c989ee:/home/zwj.java /home/www # 查看驗證 [root@VM-4-17-centos home]# cd www [root@VM-4-17-centos www]# ls zwj.java小結
5、命令大全
attach Attach local standard input, output, and error streams to a running container#當前shell下 attach連接指定運行的鏡像build Build an image from a Dockerfile # 通過Dockerfile定制鏡像commit Create a new image from a container's changes #提交當前容器為新的鏡像cp Copy files/folders between a container and the local filesystem #拷貝文件create Create a new container #創建一個新的容器diff Inspect changes to files or directories on a container's filesystem #查看docker容器的變化events Get real time events from the server # 從服務獲取容器實時時間exec Run a command in a running container # 在運行中的容器上運行命令export Export a container's filesystem as a tar archive #導出容器文件系統作為一個tar歸檔文件[對應import]history Show the history of an image # 展示一個鏡像形成歷史images List images #列出系統當前的鏡像import Import the contents from a tarball to create a filesystem image #從tar包中導入內容創建一個文件系統鏡像info Display system-wide information # 顯示全系統信息inspect Return low-level information on Docker objects #查看容器詳細信息kill Kill one or more running containers # kill指定docker容器load Load an image from a tar archive or STDIN #從一個tar包或標準輸入中加載一個鏡像[對應save]login Log in to a Docker registry #logout Log out from a Docker registrylogs Fetch the logs of a containerpause Pause all processes within one or more containersport List port mappings or a specific mapping for the containerps List containerspull Pull an image or a repository from a registrypush Push an image or a repository to a registryrename Rename a containerrestart Restart one or more containersrm Remove one or more containersrmi Remove one or more imagesrun Run a command in a new containersave Save one or more images to a tar archive (streamed to STDOUT by default)search Search the Docker Hub for imagesstart Start one or more stopped containersstats Display a live stream of container(s) resource usage statisticsstop Stop one or more running containerstag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop Display the running processes of a containerunpause Unpause all processes within one or more containersupdate Update configuration of one or more containersversion Show the Docker version informationwait Block until one or more containers stop, then print their exit codes練習
Docker安裝Nginx
#1. 搜索鏡像 search 建議大家去docker搜索,可以看到幫助文檔 [root@VM-4-17-centos www]# docker search nginx NAME DESCRIPTION STARS nginx Official build of Nginx. 17448 #2. 拉取下載鏡像 pull [root@VM-4-17-centos www]# docker pull nginx#3. 查看是否下載成功鏡像 [root@VM-4-17-centos /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 51086ed63d8c 43 hours ago 142MB centos latest 5d0da3dc9764 12 months ago 231MB#3. 運行測試 # -d 后臺運行 # --name 給容器命名 # -p 宿主機端口:容器內部端口 [root@VM-4-17-centos /]# docker run -d --name nginx1 -p 3344:80 nginx 1f58c7605ac762d29991dbccf5cf710dc98c0ff1df7b652f36891e4b337e0ea0#4. 查看正在啟動的鏡像 [root@VM-4-17-centos /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f58c7605ac7 nginx "/docker-entrypoint.…" 19 seconds ago Up 18 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx1 2b19b6c989ee centos "/bin/bash" 21 minutes ago Up 21 minutes #5. 進入容器 [root@VM-4-17-centos /]# docker exec -it nginx1 /bin/bash root@1f58c7605ac7:/# whereis nginx #找到nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx#6. 停止容器 root@1f58c7605ac7:/# exit exit#7. 停止容器 [root@VM-4-17-centos /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f58c7605ac7 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx1 2b19b6c989ee centos "/bin/bash" 28 minutes ago Up 28 minutes nice_sanderson [root@VM-4-17-centos /]# docker stop 1f58c7605ac7 1f58c7605ac7#8. 刪除容器 [root@VM-4-17-centos /]# docker rm -f 1f58c7605ac7 1f58c7605ac7宿主機端口 和 容器內部端口 以及端口暴露:
如果想要訪問,一定要在阿里云或者騰訊云服務器里開啟安全組!
**問題:**每次改動nginx配置文件,都需要進入容器內部?十分麻煩,我要是可以在容器外部提供一個映射路徑,達到在容器外部修改文件名,容器內部就可以自動修改? 這就是 數據卷 技術!
部署elasticsearch+kibana
# es 暴露的端口很多! # es 十分耗內存 # es 的數據一般需要放置到安全目錄!掛載 # --net somenetwork ? 網絡配置# 啟動elasticsearch [root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2# 測試一下es是否成功啟動 [root@VM-4-17-centos /]# curl localhost:9200 {"name" : "d1fdd23df7b5","cluster_name" : "docker-cluster","cluster_uuid" : "iDjRqpmqQoqV_LOlr9fm2w","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" }[root@iz2zeak7sgj6i7hrb2g862z ~]# docker stats # 查看docker容器使用內存情況Portainer 可視化面板安裝
- portainer(先用這個)
- Rancher(CI/CD再用)
下載成功,訪問測試:
[root@VM-4-17-centos /]# docker run -d -p 8088:9000 \ > --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer Unable to find image 'portainer/portainer:latest' locally latest: Pulling from portainer/portainer b890dbc4eb27: Pull complete 81378af8dad0: Pull complete Digest: sha256:958a8e5c814e2610fb1946179a3db598f9b5c15ed90d92b42d94aa99f039f30b Status: Downloaded newer image for portainer/portainer:latest 9d90ec7ffb1b30909635ee1cb5206c79a5491efba3b6a59cc5358796d7444fb1訪問成功!
這里可以管理我們的images和containers
Docker鏡像詳解
鏡像是什么
鏡像是一種輕量級、可執行的獨立軟件保,用來打包軟件運行環境和基于運行環境開發的軟件,他包含運行某個軟件所需的所有內容,包括代碼、運行時庫、環境變量和配置文件。
所有應用,直接打包docker鏡像,就可以直接跑起來!
如何得到鏡像:
- 從遠程倉庫下載
- 拷貝
- 自己制作 DockerFile
Docker鏡像加載原理
UnionFs (聯合文件系統)
UnionFs(聯合文件系統):Union文件系統(UnionFs)是一種分層、輕量級并且高性能的文件系統,他支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下( unite several directories into a single virtual filesystem)。Union文件系統是 Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。
Docker鏡像加載
docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導加 kernel, Linux剛啟動時會加bootfs文件系統,在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由 bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統中的/dev,/proc,/bin,/etc等標準目錄和文件。 rootfs就是各種不同的操作系統發行版,比如 Ubuntu, Centos等等。
平時我們安裝進虛擬機的CentOS都是好幾個G,為什么Docker這里才200M?
對于個精簡的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了。由此可見對于不同的Linux發行版, boots基本是一致的, rootfs會有差別,因此不同的發行版可以公用bootfs.
虛擬機是分鐘級別,容器是秒級!
分層理解
我們可以去下載一個鏡像,注意觀察下載的日志輸出,可以看到是一層層的在下載
最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像構建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時內存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。
查看鏡像分層的方式可以通過docker image inspect 命令
[root@VM-4-17-centos ~]# docker image inspect redis [{"Id": "sha256:f8528f17261c4a2c94ef702ff483ba7e4b998aa734cba60fa689ca5ecc14705f","RepoTags": ["redis:latest"],"RepoDigests": ["redis@sha256:c95835a74c37b3a784fb55f7b2c211bd20c650d5e55dae422c3caa9c01eb39fa"],"Parent": "","Comment": "","Created": "2022-10-05T09:33:31.067909521Z","Container": "d9be0debfd6dfafd2c63e12be9eb66f4ee73d7c4f9b30ca48cca7ccbc2a40d52","ContainerConfig": {"Hostname": "d9be0debfd6d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"6379/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","REDIS_VERSION=7.0.5","REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.5.tar.gz","REDIS_DOWNLOAD_SHA=67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"redis-server\"]"],"Image": "sha256:5e8566053ad429467d4a956f3254970c357a8a5844825c62f68a146161ec1269","Volumes": {"/data": {}},"WorkingDir": "/data","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"DockerVersion": "20.10.12","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"6379/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","REDIS_VERSION=7.0.5","REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.5.tar.gz","REDIS_DOWNLOAD_SHA=67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3"],"Cmd": ["redis-server"],"Image": "sha256:5e8566053ad429467d4a956f3254970c357a8a5844825c62f68a146161ec1269","Volumes": {"/data": {}},"WorkingDir": "/data","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 116951526,"VirtualSize": 116951526,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/4513227a515eb72cb310d4b566d37c212b1a7c9e109220098db7ffbef89ef865/diff:/var/lib/docker/overlay2/fad8a771ef0591e2f820d63daf14a578593eb73c2570b6f9e99a3c1a5c3e6f27/diff:/var/lib/docker/overlay2/171d780cbb7ee56034ac2119d764a3087db2205e080617030acbf9929445672c/diff:/var/lib/docker/overlay2/107906d828174d9d10ec3a4c736a12093a73555b8f313767a34000d55e9f202e/diff:/var/lib/docker/overlay2/1f429286b38dfe93d4169b3d89aaeee79fbf748edb7eee2f16de329b1ba47dbd/diff","MergedDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/merged","UpperDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/diff","WorkDir": "/var/lib/docker/overlay2/3de98d28b2953e97e7115c90a7060cff99d9135d6f38ab09d0fe03e84cf172af/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:fe7b1e9bf7922fbc22281bcc6b4f5ac8f1a7b4278929880940978c42fc9d0229","sha256:291011b5d90b8e8f3af6cbc4534aba89cb4f1f67ef9df3e2a9a2a9f14b981281","sha256:0162880997e885d9d6a4ae697f93fc07ec17ca107f92948107651ec0f8cc3f8e","sha256:41faab27f2f5bc614adeac79e3bb2718af02106f74706a3544430c2e19667411","sha256:83c9cebc99756a1667f75b5400dd4ca115bb0bd8b3ea8c0a203cc0ef8250bada","sha256:5b654ae80690cab5da76607f4a04368c100765c8c66ce2c12e370129445a27b2"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}} ]理解
所有的 Docker鏡像都起始于一個基礎鏡像層,當進行修改或培加新的內容時,就會在當前鏡像層之上,創建新的鏡像層。
舉一個簡單的例子,假如基于 Ubuntu Linux16.04創建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,
就會在基礎鏡像層之上創建第二個鏡像層;如果繼續添加一個安全補丁,就會創健第三個鏡像層該像當前已經包含3個鏡像層,如下圖所示(這只是一個用于演示的很簡單的例子)。
在添加額外的鏡像層的同時,鏡像始終保持是當前所有鏡像的組合,理解這一點.
在添加額外的鏡像層的同時,鏡像始終保持是當前所有鏡像的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件。
這種情況下,上層鏡像層中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層添加到鏡像當中
Docker通過存儲引擎(新版本采用快照機制)的方式來實現鏡像層堆棧,并保證多鏡像層對外展示為統一的文件系統
Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于 Linux中對應的
件系統或者塊設備技術,井且每種存儲引擎都有其獨有的性能特點。
Docker在 Windows上僅支持 windowsfilter 一種存儲引擎,該引擎基于NTFS文件系統之上實現了分層和CoW [1]。
下圖展示了與系統顯示相同的三層鏡像。所有鏡像層堆并合井,對外提供統一的視圖。
對外視圖:(7是5的更新版)
特點
Docker 鏡像都是只讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部!
這一層就是我們通常說的容器層,容器之下的都叫鏡像層!
commit鏡像
docker commit 提交容器成為一個新的副本# 命令和git原理類似 docker commit -m="描述信息" -a="作者" 容器id 目標鏡像名:[版本TAG]實戰測試
# 1、啟動一個默認的tomcat [root@VM-4-17-centos ~]# docker run -it -p 8085:8080 tomcat de57d0ace5716d27d0e3a7341503d07ed4695ffc266aef78e0a855b270c4064e# 2、發現這個默認的tomcat 是沒有webapps應用,官方的鏡像默認webapps下面是沒有文件的! #docker exec -it 容器id /bin/bash [root@VM-4-17-centos ~]# docker exec -it 40b63bf59d24 /bin/bash root@40b63bf59d24:/usr/local/tomcat# cd webapps# 3、從webapps.dist拷貝文件進去webapp root@40b63bf59d24:/usr/local/tomcat# cp -r webapps.dist/* webapps root@40b63bf59d24:/usr/local/tomcat# cd webapps root@40b63bf59d24:/usr/local/tomcat/webapps# ls docs examples host-manager manager ROOT# 4、將操作過的容器通過commit提交為一個鏡像!我們以后就使用我們修改過的鏡像即可,而不需要每次都重新拷貝webapps.dist下的文件到webapps了,這就是我們自己的一個修改的鏡像。 docker commit -m="描述信息" -a="作者" 容器id 目標鏡像名:[TAG] docker commit -a="zwj" -m="add webapps app" 容器id tomcat:1.0[root@VM-4-17-centos ~]# docker commit -a="zwj" -m="add webapps appliaction" 40b63bf59d24 tomcat:1.0 sha256:ecd5844b77b3b69a086ac98e533957103a0c0dda46d48502c095390a5b285d14[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 1.0 ecd5844b77b3 6 seconds ago 478MB tomcat 9.0 5aa9fb87fe03 2 days ago 475MB tomcat latest aabbe5aca89b 2 days ago 473MB第三步執行完成后可以去公網ip:8085測試
如果你想要保存當前容器的狀態,就可以通過commit來提交,獲得一個鏡像
就好比我們我們使用虛擬機的快照功能
到這里僅僅是入門!
弱小和無知不是生存的障礙,傲慢才是!
容器數據卷
什么是容器數據卷
Docker的理解與回顧
將應用和環境打包成一個鏡像!
程序需要保存數據!如果數據都在容器中,那么我們容器刪除,數據就會丟失!需求:數據可以持久化
MySQL,容器刪了,刪庫跑路!需求:MySQL數據可以存儲在本地!
容器之間可以有一個數據共享技術!Docker容器中產生的數據,同步到本地!
這就是卷技術!其實就是目錄的掛載,將我們容器內的目錄掛載到linux目錄上面!
**總結: **容器的持久化和同步操作!容器間數據也是可以共享的!
使用數據卷
方式一:直接使用命令來掛載
docker run -it -v 主機目錄:容器目錄[root@VM-4-17-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash docker inspect ...
測試文件同步
再來測試
再來測試(測試通過)
實戰:安裝Mysql
思考:MySQL的數據持久化的問題!
# 獲取鏡像 [root@VM-4-17-centos 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@VM-4-17-centos home]# docker run -d -p 8085:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql1 mysql:5.7 eda724b2eeb9c7307155104ec269b9c8bd2aa5a4bc4ef0788de4f034610a6f37# 啟動成功之后,我們在本地使用navicat鏈接測試一下 # navicat鏈接到服務器的8085 --- 8085 和 容器的3306映射,這個時候我們就可以連接上mysql嘍!# 在本地測試創建一個數據庫,查看下我們的路徑是否ok! 刪除 docker rm -f mysql01連接mysql成功
在本地新建一個數據庫
在服務器查看
假設我們把容器刪除了,但掛載到本地的數據卷依然不會丟失,這就實現了容器的持久化功能!
匿名和具名掛載
# 匿名掛載 -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 centosVOLUME ["volume1","volume2"]CMD echo"---end---"CMD /bin/bash # 這里的每一個命令都是鏡像的一層!通過命令創建自己的鏡像!
#docker build -f(file 文件) dockerfile1 -t(target 生成) zwj/centos(鏡像名) :1.0(版本) [root@VM-4-17-centos docker-test-volume]# docker build -f dockerfile1 -t zwj/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos---> 5d0da3dc9764 Step 2/4 : VOLUME ["volume1","volume2"]---> Running in 364679e111ef Removing intermediate container 364679e111ef---> 415c2a69cbad Step 3/4 : CMD echo"---end---"---> Running in 670a9ec22b96 Removing intermediate container 670a9ec22b96---> 35a4317e8199 Step 4/4 : CMD /bin/bash---> Running in 4de171e231bb Removing intermediate container 4de171e231bb---> f365dbf54b57 Successfully built f365dbf54b57 Successfully tagged zwj/centos:1.0[root@VM-4-17-centos docker-test-volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zwj/centos 1.0 f365dbf54b57 About a minute ago 231MB啟動一下我們自己創建的鏡像
這個卷和外部一定有一個同步的目錄!
docker inspect 容器id
進入目錄進行驗證
掛載成功!
這種方式我們未來使用的十分多, 因為我們通常會構建自己的鏡像!
假設構建鏡像時候沒有掛載卷,要手動鏡像掛載 -v 卷名:容器內路徑!
數據卷容器
mysql同步數據
通過我們剛才自己寫的鏡像啟動三個容器
啟動docker2容器
我們在docker1 /volume1下創建一個docker1.txt
#進入容器1創建文件 [root@VM-4-17-centos docker-test-volume]# docker attach 771221b3ea22 [root@771221b3ea22 /]# cd volume1 [root@771221b3ea22 volume1]# ls [root@771221b3ea22 volume1]# touch docker1.txt#進入容器2驗證 [root@VM-4-17-centos /]# docker attach d4b161d036dd [root@d4b161d036dd /]# cd volume1 [root@d4b161d036dd volume1]# ls docker1.txt刪除docker1容器后docker2中依舊存在docker1.txt
同理,我們就可以實現多個mysql或多個redis數據同步
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3345:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --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!
我們首先創建一個默認的centos
[root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7 eeb6ee3f44bd 12 months ago 204MB[root@VM-4-17-centos ~]# docker run -it --name centos-1 centos /bin/bash [root@c023f7df5bfc /]# vim bash: vim: command not found [root@c023f7df5bfc /]# ifconfig bash: ifconfig: command not found發現其中連vim和ifconfig這樣的基礎命令都沒有
接下來創建自己的centos
# 1.編寫dockerfile配置文件 [root@VM-4-17-centos dockerfile]# vim mydockerfile-centos [root@VM-4-17-centos dockerfile]# cat mydockerfile-centos FROM centos:7 #最新的centos是8,這里一定要寫7版本MAINTAINER zwj<2718458328@qq.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash# 2.通過文件構建鏡像 # 命令 docker build -f dockerfile文件路徑 -t 鏡像名:[tag] . docker build -f mydockerfile-centos -t mycentos:0.1 . *** Successfully built 7fc5734753d4 Successfully tagged mycentos:0.1# 3.啟動鏡像 [root@VM-4-17-centos dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 7fc5734753d4 3 minutes ago 625MB centos 7 eeb6ee3f44bd 12 months ago 204MB[root@VM-4-17-centos dockerfile]# docker run -it mycentos:0.1 [root@21caeba328a5 local]# pwd #發現當前直接進入了我們創建鏡像時候的工作路徑 /usr/local發現vim和ifconfig命令也都可以用了
我們可以列出本地鏡像的變更歷史
[root@VM-4-17-centos dockerfile]# docker history 7fc5734753d4 IMAGE CREATED CREATED BY SIZE COMMENT 7fc5734753d4 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B bec1ca033a4d 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 4294061d2866 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 4486b80f3540 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B af18e95c742d 12 minutes ago /bin/sh -c yum -y install net-tools 183MB 06c30e699c42 12 minutes ago /bin/sh -c yum -y install vim 238MB a511a9e7ab57 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 44d1c3b42140 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B efde73fdf021 13 minutes ago /bin/sh -c #(nop) MAINTAINER zwj<2718458328… 0B eeb6ee3f44bd 12 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 12 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 12 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB發現我們的鏡像其實就是這樣一步一步構建出來的
CMD和ENTRYPOINT區別
CMD # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效可被替代 ENTRYPOINT # 指定這個容器啟動的時候要運行的命令, 可以追加命令 # CMD # 1. 編寫dockerfile文件 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd FROM centos:7 CMD ["ls", "-a"]# 2. 構建鏡像 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd -t cmdtest .# 3. run運行, 發現我們的ls -a 命令生效 [root@VM-4-17-centos dockerfile]# docker run 846f1f878b89 . .. .dockerenv bin dev etc home lib lib64# 想追加一個命令 -l 變成 ls -al [root@VM-4-17-centos dockerfile]# docker run 846f1f878b89 -l docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.# cmd的情況下 -l替換了CMD["ls", "-a"]命令, -l不是命令,所以報錯了,實際執行的是下面這行 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l # ENTRYPOINT # 1. 編寫dockerfile文件 [root@VM-4-17-centos dockerfile]# vim dockerfile-entrypoint FROM centos ENTRYPOINT ["ls", "-a"]# 2.構建鏡像 [root@VM-4-17-centos dockerfile]# docker build -f dockerfile-entrypoint -t entrypointtest .# 3. 創建容器 [root@VM-4-17-centos dockerfile]# docker run fc5e427dcacd . .. .dockerenv bin dev etc home lib lib64# 想追加一個命令 -l 變成 ls -al # 我們的追加命令, 是直接拼接到ENTRYPOINT命令的后面的! [root@VM-4-17-centos dockerfile]# docker run fc5e427dcacd -l drwxr-xr-x 1 root root 4096 Oct 10 08:20 . drwxr-xr-x 1 root root 4096 Oct 10 08:20 .. -rwxr-xr-x 1 root root 0 Oct 10 08:20 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Oct 10 08:20 dev drwxr-xr-x 1 root root 4096 Oct 10 08:20 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64實戰:Tomcat鏡像
1.準備鏡像文件 tomcat壓縮包,jdk的壓縮包!
tomcat: Apache Tomcat? - Apache Tomcat 8 Software Downloads
jdk: Java Archive Downloads - Java SE 8 (oracle.com)
我個人在使用tomcat9的時候出現了錯誤,看個人情況吧
[root@VM-4-17-centos tomcat]# ls apache-tomcat-8.5.82.tar.gz jdk-8u65-linux-x64.tar.gz2.編寫Dockerfile文件,官方命名Dockerfile,build會自動尋找這個文件,不需要-f 指定了
# vim Dockerfile 編寫Dockerfile FROM centos:7 MAINTAINER zwj<2718458328@qq.com>COPY readme.txt /usr/local/readme.txtENV MYPATH /usr/localWORKDIR $MYPATHADD jdk-8u65-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.82.tar.gz /usr/local/RUN yum -y install vimENV JAVA_HOME /usr/local/jdk1.8.0_65 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.82 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.82 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-8.5.82/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.82/bin/logs/catalina.out# 創建鏡像 [root@VM-4-17-centos tomcat]# docker build -t diycentos:1.0 .# 啟動容器 [root@VM-4-17-centos tomcat]# docker run -it -p 3344:8080 -v /home/docker-mapping/centos/centos1:/usr/local/apache-tomcat-8.5.82/webapps/examples -v /home/docker-mapping/centos/logs/:/usr/local/apache-tomcat-8.5.82/logs diycentos:1.0 # 訪問測試 [root@VM-4-17-centos tomcat]# curl localhost:3344# 項目發布(由于做了卷掛載,我們在本機即可進行) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"> </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>去瀏覽器訪問
發現:項目部署成功, 可以直接訪問!
我們以后開發的步驟:需要掌握Dockerfile的編寫! 我們之后的一切都是使用docker進行來發布運行的!
發布自己的容器到DockerHub!
1.注冊賬號:Docker Hub Container Image Library | App Containerization
2.確定這個賬號可以登錄
3.在我們服務器上提交自己的鏡像
[root@VM-4-17-centos ~]# docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry. If no server is specified, the default is defined by the daemon.Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username [root@VM-4-17-centos ~]# docker login -u zwjyyds -p ****** WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded4.登錄完畢后就可以提交鏡像了,就是一步 docker push
# 提交 [root@VM-4-17-centos /]# docker push zwjyyds/diycentos:1.0 The push refers to repository [docker.io/zwjyyds/diycentos] An image does not exist locally with the tag: zwjyyds/diycentos [root@VM-4-17-centos /]# docker push diycentos:1.0 The push refers to repository [docker.io/library/diycentos] ce114fd83b70: Preparing e73ea09b2631: Preparing e73f7dbc2b0d: Preparing d1d9974be847: Preparing 174f56854903: Preparing denied: requested access to the resource is denied #被拒絕# 顯示當前鏡像 [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diycentos 1.0 4f91adba8d48 4 hours ago 822MB# 解決,增加一個tag [root@VM-4-17-centos /]# docker tag diycentos:1.0 ****/diycentos:1.0 # ****必須是dockhub的用戶名# 顯示當前鏡像 [root@VM-4-17-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diycentos 1.0 4f91adba8d48 4 hours ago 822MB zwjyyds/diycentos 1.0 4f91adba8d48 4 hours ago 822MB# 提交 [root@VM-4-17-centos /]# docker push zwjyyds/diycentos:1.0小結
Docker網絡
此部分內容建議使用tomcat7.0,新版的tomcat中沒有ping命令和yum命令
理解Docker0
測試
# 獲取當前ip地址 [root@VM-4-17-centos /]# ip addr三個網絡
# 問題: docker是如何處理容器網絡訪問的? [root@VM-4-17-centos /]# docker run -d -P --name tomcat01 tomcat# 查看容器內部的網絡地址 ip addr # 由于版本問題,ip addr可能已經失效,可以用docker inspect tomcat01查看ip地址 [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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_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 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 思考: linux 能不能ping通容器? [root@VM-4-17-centos ~]# 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.076 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.087 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.071 ms# linux 可以 ping 通docker容器內部!我們每啟動一個docker容器, docker就會給docker容器分配一個ip, 我們只要安裝了docker,就會有一個網卡 docker0橋接模式,使用的技術是veth-pair技術!
再次測試ip addr
再啟動一個容器測試,發現又多了一對網卡
容器之間也是可以互相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@VM-4-17-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat e93f963ed8a3c0800fa60c8d70616195dfba770f46f537ec32392eb285456a3b[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e93f963ed8a3 tomcat "catalina.sh run" 9 seconds ago Up 9 seconds 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat03 ad499cf17f6d tomcat "catalina.sh run" 3 hours ago Up 3 minutes 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tomcat02 2e68074aec30 tomcat "catalina.sh run" 4 hours ago Up 4 hours 0.0.0.0:49153->8080/tcp, :::49153->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 knowninspect bridge
其實這個tomcat03就是在本地配置了tomcat02的配置
本質探究:–link 就是我們在hosts配置中增加了一個172.17.0.3 tomcat02 ad499cf17f6d
我們現在玩Docker已經不建議使用–link了!
現在都是自定義網絡!不使用Docker0!
Docker0的問題:它不支持容器名鏈接訪問!
思考一個場景,我們編寫了一個微服務,database url =ip/?***; 項目不重啟,數據ip換掉了,就連接不到數據庫了。我們希望可以處理這個問題,可以按名字來進行訪問容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known# 如何可以解決呢? # 通過--link既可以解決網絡連通問題 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat e93f963ed8a3c0800fa60c8d70616195dfba770f46f537ec32392eb285456a3b[root@VM-4-17-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e93f963ed8a3 tomcat "catalina.sh run" 9 seconds ago Up 9 seconds 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat03 ad499cf17f6d tomcat "catalina.sh run" 3 hours ago Up 3 minutes 0.0.0.0:49156->8080/tcp, :::49156->8080/tcp tomcat02 2e68074aec30 tomcat "catalina.sh run" 4 hours ago Up 4 hours 0.0.0.0:49153->8080/tcp, :::49153->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 knowninspect bridge
[外鏈圖片轉存中…(img-6GD8EnKz-1665554663931)]
其實這個tomcat03就是在本地配置了tomcat02的配置
[root@VM-4-17-centos ~]# 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 ad499cf17f6d 172.17.0.4 e93f963ed8a3本質探究:–link 就是我們在hosts配置中增加了一個172.17.0.3 tomcat02 ad499cf17f6d
我們現在玩Docker已經不建議使用–link了!
現在都是自定義網絡!不使用Docker0!
Docker0的問題:它不支持容器名鏈接訪問!
自定義網絡
查看所有網絡
[root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local d0bc18957a87 none null local網絡模式
bridge: 橋接模式,橋docker 默認
none: 不配置網絡
host: 和宿主機共享網絡
contain: 容器間網絡連通(用的少)
測試
# 我們直接啟動的命令默認有一個 --net bridge,而這個就是我們的docker0 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat01 tomcat:7.0 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat01 --net bridge tomcat:7.0# 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 網關# 創建網絡mynet [root@VM-4-17-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet edbae3e3682aa5ddd712154390d818c322effa142264aff2b0d130acce53aaec# 顯示當前網絡 [root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local edbae3e3682a mynet bridge local d0bc18957a87 none null local我們自己的網絡就創建好了
用創建的網絡啟動兩個容器
[root@VM-4-17-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:7.0 f286cc44c92afaf21f23e85f58b25f36c8abcfd27e922325d1e6f07ae0f9d9e4 [root@VM-4-17-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:7.0 97ac96a4c44e606f1e2f17547e84aa982485bbca819d472bd69d0364692399ca# 顯示這個網絡信息 [root@VM-4-17-centos ~]# docker network inspect mynet# Containers中就多了兩個容器ip"Containers": {"97ac96a4c44e606f1e2f17547e84aa982485bbca819d472bd69d0364692399ca": {"Name": "tomcat-net-02","EndpointID": "1b73798d90957023b8976db96205104f0e6ddd4dd7490513f43fb5e14978c665","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"f286cc44c92afaf21f23e85f58b25f36c8abcfd27e922325d1e6f07ae0f9d9e4": {"Name": "tomcat-net-01","EndpointID": "f9811a47e3111867524519c5d18fa53505e7d5d1998cae04fe3b4b3985059f69","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}}# 我們來ping一下網絡 [root@VM-4-17-centos ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 # ping tomcat02的ip 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.139 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.090 ms# 現在不適用docker --link 也可以ping容器名字了 [root@VM-4-17-centos ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 # ping tomcat02的名字 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.084 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.089 ms我們自定義的網絡docker都已經幫我們維護好了對應的關系,推薦我們平時這樣使用網絡
好處:
redis - 不同的集群使用不同的網絡,保證集群是安全和健康的
mysql - 不同的集群使用不同的網絡,保證集群是安全和健康的
網絡連通
測試打通tomcat01 和mynet
嘗試把tomcat01接入mynet
[root@VM-4-17-centos ~]# docker network connect --helpUsage: docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a networkOptions:--alias strings Add network-scoped alias for the container--driver-opt strings driver options for the network--ip string IPv4 address (e.g., 172.30.100.104)--ip6 string IPv6 address (e.g., 2001:db8::33)--link list Add link to another container--link-local-ip strings Add a link-local address for the container測試
[root@VM-4-17-centos ~]# docker network connect mynet tomcat01查看mynet網絡
docker network inspect mynet類比服務器
就像一個是公網ip,一個是私網ip,一個容器兩個ip
驗證是否能ping通
[root@VM-4-17-centos ~]# 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.112 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.092 ms# 測試tomcat02是否可以ping通 [root@VM-4-17-centos ~]# docker exec -it tomcat02 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known實戰,部署Redis集群
# 創建redis網絡 [root@VM-4-17-centos ~]# docker network create redis --subnet 172.38.0.0/16 2c5bb068547e764cf368b4148af89119ab2c7530f4ed8c172d23479d0f8ebea4# 查看網絡 [root@VM-4-17-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cc96daeb0587 bridge bridge local 68a20aebc99e host host local edbae3e3682a mynet bridge local d0bc18957a87 none null local 2c5bb068547e redis bridge local# 通過腳本創建六個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# 查看配置 [root@VM-4-17-centos ~]# cd /mydata/redis [root@VM-4-17-centos redis]# ls node-1 node-2 node-3 node-4 node-5 node-6# 創建結點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@VM-4-17-centos redis]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 635c755e51e1 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 30 seconds ago Up 29 seconds 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6 49a9e6017bec redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 38 seconds ago Up 37 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5 b2eda60cb33c redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 47 seconds ago Up 46 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4 23e7b7c57502 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 56 seconds ago Up 55 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3 7c724462d992 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2 441b26f7eba7 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1# 創建集群 [root@VM-4-17-centos redis]# 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: 15e62b1ceef1187afaeeefd1564aa8d76a27c819 172.38.0.11:6379slots:[0-5460] (5461 slots) master M: ce628d1171969d7369d5e0fefca8d4851f91f094 172.38.0.12:6379slots:[5461-10922] (5462 slots) master M: b919d9d08ebf96c66f7bed803b439bd6053c8078 172.38.0.13:6379slots:[10923-16383] (5461 slots) master S: 6fe819edf4f4b5613b1425363f825124d81332b7 172.38.0.14:6379replicates b919d9d08ebf96c66f7bed803b439bd6053c8078 S: f8fa5b0b678c710aef205f29d2a25f20db4428b8 172.38.0.15:6379replicates 15e62b1ceef1187afaeeefd1564aa8d76a27c819 S: 7d9245617ecd13a1615fadb6ffdc539a9397c6d2 172.38.0.16:6379replicates ce628d1171969d7369d5e0fefca8d4851f91f094 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: 15e62b1ceef1187afaeeefd1564aa8d76a27c819 172.38.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s) S: 6fe819edf4f4b5613b1425363f825124d81332b7 172.38.0.14:6379slots: (0 slots) slavereplicates b919d9d08ebf96c66f7bed803b439bd6053c8078 M: b919d9d08ebf96c66f7bed803b439bd6053c8078 172.38.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s) S: 7d9245617ecd13a1615fadb6ffdc539a9397c6d2 172.38.0.16:6379slots: (0 slots) slavereplicates ce628d1171969d7369d5e0fefca8d4851f91f094 M: ce628d1171969d7369d5e0fefca8d4851f91f094 172.38.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s) S: f8fa5b0b678c710aef205f29d2a25f20db4428b8 172.38.0.15:6379slots: (0 slots) slavereplicates 15e62b1ceef1187afaeeefd1564aa8d76a27c819 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.docker搭建集群完成!
Springboot微服務打包Docker鏡像
構建springboot項目
打包應用
編寫Dockerfile
java:8已經不再使用,用openjdk:8來代替
構建鏡像
[root@VM-4-17-centos demo]# docker build -t docker-finish . Sending build context to Docker daemon 17.64MB Step 1/5 : FROM openjdk:8 8: Pulling from library/openjdk 001c52e26ad5: Pull complete d9d4b9b6e964: Pull complete 2068746827ec: Pull complete 9daef329d350: Pull complete d85151f15b66: Pull complete 52a8c426d30b: Pull complete 8754a66e0050: Pull complete Digest: sha256:86e863cc57215cfb181bd319736d0baf625fe8f150577f9eb58bd937f5452cb8 Status: Downloaded newer image for openjdk:8---> b273004037cc Step 2/5 : COPY *.jar /app.jar---> f19dfb67f413 Step 3/5 : CMD ["--server.port=8080"]---> Running in 9506ff0a26d3 Removing intermediate container 9506ff0a26d3---> 997aec0f7345 Step 4/5 : EXPOSE 8080---> Running in 5bbbfeaa8604 Removing intermediate container 5bbbfeaa8604---> 5099c2d20953 Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]---> Running in 5b0c4cc8fb76 Removing intermediate container 5b0c4cc8fb76---> 8b793de54771 Successfully built 8b793de54771 Successfully tagged docker-finish:latest發布運行!
記得開啟服務器的防火墻端口
以后我們使用了Docker之后,給別人交付的就是一個鏡像!
總結
以上是生活随笔為你收集整理的Docker学习笔记 (狂神说)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教大家如何把pdf转成dwg格式的cad
- 下一篇: 简历类个人网站如何制作?