Docker笔记整理
文章目錄
- docker歷史
- docker能做什么
- Docker的安裝
- Docker的基本組成
- 安裝Docker
- 阿里云鏡像加速
- 回顧Hello-World
- 底層原理
- Docker的常用命令
- 幫助命令
- 鏡像命令
- 容器命令
- 常用其他命令
- 總結
- 實戰練習
- 可視化
- docker 鏡像
- commit鏡像
- 容器數據卷
- 使用數據卷
- 安裝MySQL
- 具名和匿名掛載
- 初識DockerFile
- 數據卷容器
- DockerFile
- DockerFile介紹
- DockerFile構建過程
- DockerFile指令
- 發布鏡像
- Docker 網絡
- 理解Docker0
- --link
- 自定義網絡
- 網絡聯通
- 實戰部署Redis
- 安裝單機版Redis
- 實戰部署Redis集群
- 安裝ZooKeeper
- 一、單機搭建
- 二、集群搭建
- Docker Compose
- 簡介
- 安裝
docker歷史
2010年,幾個年輕人,在美國成立dotcloud ,做一些pass云服務。
lxc有關的容器技術,他們將自己的技術容器化
聊聊docker
Docker是基于GO語言開發的!開源項目!
官網:https://www.docker.com/
文檔地址:https://docs.docker.com/ 超級詳細
倉庫地址:https://hub.docker.com/
docker能做什么
之前的虛擬技術
虛擬技術的缺點
容器化技術
容器化技術不是模擬的一個完整的操作系統
Docker和虛擬機之間的區別
- 傳統虛擬機虛擬出一套完整的硬件,運行一套完整的虛擬環境,在操作系統上運行安裝軟件
- 容器直接運行在內核中,容器沒有自己的內核,也沒有虛擬硬件,所以輕便
- 每個容器間相互隔離,每個容器都有屬于自己的文件系統,互不影響
DevOps(開發、運維)
更快速的運維部署
傳統應用:一堆文檔,安裝運行
Docker:打包鏡像發布測試,一鍵運行
更便捷的升級和擴縮容
使用docker之后,發布應用就像搭積木一樣
項目打包為鏡像,可以在其他環境直接運行
更簡單的運維
在容器化后,開發環境、測試環境高度一致
更高效的資源利用
Docker是內核虛擬化,在一個物理機上可以運行多個容器實例,服務器性能可以壓榨到極致
Docker的安裝
Docker的基本組成
鏡像(images)
Docker鏡像是一個模板,可以通過這個模板創建容器服務,tomcat—>run—>tomcat01容器(提供服務器),通過這個鏡像可以創建多個容器
容器(container)
Docker利用容器技術運行通過鏡像創建的應用
啟動、刪除基本命令
倉庫(repository)
存放鏡像的地方!
共有倉庫和私有倉庫!
Docker Hub(默認是國外的)
阿里云…都有這些倉庫(配置鏡像加速)
安裝Docker
環境準備
環境查看
#系統內核3.10以上 [root@izuf6cn5k7l8xuxojhszqbz ~]# uname -r 3.10.0-862.14.4.el7.x86_64 #系統版本 [root@izuf6cn5k7l8xuxojhszqbz /]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"安裝
幫助文檔:https://docs.docker.com/engine/install/centos/
# 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 \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推薦使用阿里云的 # 更新yum相關索引 yum makecache faste # 4.安裝Docker相關內容 docker-ce社區版 ee企業版 yum install docker-ce docker-ce-cli containerd.io # 5.啟動docker sudo systemctl start docker # 6.使用docker version查看是否安裝成功 # 7. hello-world docker run hello-world # 8. 查看下載的hello-world這個鏡像 [root@izuf6cn5k7l8xuxojhszqbz /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 235592615444 4 months ago 104MB mysql 5.7 9cfcce23593a 4 months ago 448MB hello-world latest fce289e99eb9 21 months ago 1.84kB logstash 6.4.0 13b7a09abaf8 2 years ago 670MB kibana 6.4.0 a7e4cd1a7b45 2 years ago 667MB elasticsearch 6.4.0 1ac676545731 2 years ago 791MB了解卸載docker
# 1.卸載依賴 yum remove docker-ce docker-ce-cli containerd.io # 2.刪除資源 rm -rf /var/lib/docker #/var/lib/docker docker的默認工作路徑阿里云鏡像加速
登陸阿里云找到容器服務
鏡像加速地址
配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://0b56c32l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker回顧Hello-World
底層原理
Docker 是一個Client-Server的系統,Docker的守護進程運行在主機上,通過Socket從客戶端訪問
DockerServer接受DockerClient命令
Docker為什么比VM運行更快?
Docker的常用命令
幫助命令
docker version # 顯示Docker的版本信息 docker info # 顯示Docker的系統信息,包括鏡像和容器的數量 docker 命令 --help # 幫助命令幫助文檔地址:https://docs.docker.com/engine/reference/run/
鏡像命令
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 235592615444 4 months ago 104MB mysql 5.7 9cfcce23593a 4 months ago 448MB hello-world latest fce289e99eb9 21 months ago 1.84kB logstash 6.4.0 13b7a09abaf8 2 years ago 670MB kibana 6.4.0 a7e4cd1a7b45 2 years ago 667MB elasticsearch 6.4.0 1ac676545731 2 years ago 791MB# 解釋 REPOSITORY 鏡像倉庫源 TAG 鏡像標簽 IMAGE ID 鏡像ID CREATE 鏡像創建時間 SIZE 鏡像大小# 可選向 Options:-a, --all # 列出所有鏡像-q, --quiet # 只顯示鏡像IDdocker search搜索鏡像
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10075 [OK] mariadb MariaDB is a community-developed fork of MyS… 3694 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 736 [OK] percona Percona Server is a fork of the MySQL relati… 511 [OK] # 可選項 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10075 [OK] mariadb MariaDB is a community-developed fork of MyS… 3694 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 736 [OK] percona Percona Server is a fork of the MySQL relati… 511 [OK] [root@izuf6cn5k7l8xuxojhszqbz ~]# docker search mysql --filter=stars=5000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10075 [OK]docker pull 下載鏡像
# docker pull 鏡像名[:tag] docker pull mysql [root@izuf6cn5k7l8xuxojhszqbz ~]# docker pull mysql Using default tag: latest # 如果不寫tag,默認就是latest latest: Pulling from library/mysql bb79b6b2107f: Pull complete # 分層下載,docker images的核心,聯合文件系統 49e22f6fb9f7: Pull complete 842b1255668c: Pull complete 9f48d1f43000: Pull complete c693f0615bce: Pull complete 8a621b9dbed2: Pull complete 0807d32aef13: Pull complete 9eb4355ba450: Pull complete 6879faad3b6c: Pull complete 164ef92f3887: Pull complete 6e4a6e666228: Pull complete d45dea7731ad: Pull complete Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4 #簽名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真實地址刪除鏡像 docker rmi
docker rmi -f 8e85dd5c3255 # 刪除指定鏡像 docker rmi -f 容器ID 容器ID 容器ID 容器ID# 刪除多個鏡像 docker rmi -f ${docker images -aq} # 刪除全部鏡像容器命令
說明:只有新建鏡像才能創建容器,Linux,下載一個CentOS來學習
docker pull centos新建容器并啟動
docker run [可選參數] image # 參數說明 --name # 指定容器名字 -it # 使用交互方法,進入后臺查看內容 -d # 后臺運行 -p # 指定端口8080:8080-p 主機端口:容器端口(最常用主機端口和容器端口的映射)-p ip:主機端口:容器端口-p 容器端口容器端口 -P # 隨機分配端口# 測試,啟動并進入容器 [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -it kibana:6.4.0 /bin/bash bash-4.2$ [root@izuf6cn5k7l8xuxojhszqbz /]# [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -it centos /bin/bash # 查看容器內的CentOS,基本版本很多功能都不完善 [root@a87299a142d9 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var# 從容器中退回主機 [root@a87299a142d9 /]# exit exit [root@izuf6cn5k7l8xuxojhszqbz /]# ls bin dev get-docker.sh ifstat-1.1.tar.gz lost+found mydata root srv usr boot dubbo-governance.log home lib media opt run sys var d etc ifstat-1.1 lib64 mnt proc sbin tmp zookeeper.out [root@izuf6cn5k7l8xuxojhszqbz /]# # 查看鏡像元數據 [root@izuf6cn5k7l8xuxojhszqbz /]# docker inspect b96481cf196e [{"Id": "b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386","Created": "2020-10-20T01:00:24.252614556Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 12492,"ExitCode": 0,"Error": "","StartedAt": "2020-10-20T02:00:50.534736639Z","FinishedAt": "2020-10-20T02:00:50.11175616Z"},"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566","ResolvConfPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/resolv.conf","HostnamePath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/hostname","HostsPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/hosts","LogPath": "/var/lib/docker/containers/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386/b96481cf196efa193fd2981636b7d1a71ea7a7379ce46b5b603b6520c05c1386-json.log","Name": "/xenodochial_cerf","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/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5-init/diff:/var/lib/docker/overlay2/e88cb8fc7bd56dd63cbb631a8babb55716e65fb3705e0e5c2e0d5da2e6e7737b/diff","MergedDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/merged","UpperDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/diff","WorkDir": "/var/lib/docker/overlay2/0ee9111d7dc3c174492b9aa2f3254982ed4b5f42ce5afb7d95cde986ef4472d5/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "b96481cf196e","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": "2e09d9086aeb52e6a6d5a7ada9b6c8531c0f7b322ccf6532cf169d3ba9756eab","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/2e09d9086aeb","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "63ef5e1ec21bc8973355b716d8dfa42e192efc0f1750ef18947b4f9d1410e512","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.4","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:04","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "adb8cb6caa43e42b2f3963607bf576207abb4a6a2b76c43f3907503f17dbdad9","EndpointID": "63ef5e1ec21bc8973355b716d8dfa42e192efc0f1750ef18947b4f9d1410e512","Gateway": "172.17.0.1","IPAddress": "172.17.0.4","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:04","DriverOpts": null}}}} ] [root@izuf6cn5k7l8xuxojhszqbz /]#退出容器
exit # 退出并停止容器 ctrl + P + Q # 退出但不停止容器列出所有Docker運行容器
docker ps # 參數 無參數 # 列出當前運行的容器 -a # 列出當前運行的容器+歷史運行的容器 -n=? # 顯示最近創建的容器 -q # 只顯示容器的編號刪除容器
docker rm 容器ID # 刪除容器但是不能刪除運行的容器,如果強制刪除rm -f docker rm -f ${docker ps -qa} # 刪除所有容器 docker ps -qa | xargs docker rm # 刪除所有容器啟動和停止容器
docker start 容器ID # 啟動容器 docker restart 容器ID # 重啟容器 docker stop 容器ID # 停止容器 docker kill 容器ID # 強制停止當前容器常用其他命令
Docker進程相關命令
systemctl start docker # 啟動Docker容器 systemctl stop docker # 停止Docker容器 systemctl restart docker # 重啟Docker容器 systemctl status docker # 查看Docker容器狀態 systemctl enable docker # 設置Docker開機自啟 docker top 容器ID # 查看容器進程信息 [root@izuf6cn5k7l8xuxojhszqbz /]# docker top 0a01905d64f5 UID PID PPID C STIME TTY TIME CMD root 16217 16201 0 12:21 pts/0 00:00:00 /bin/bash [root@izuf6cn5k7l8xuxojhszqbz /]#后臺啟動命令
# docker run -d 鏡像名# 問題docker ps 發現CentOS停止運行# docker后臺運行就必須有一個前臺進程,docker發現沒有應用就會自動停止 # nginx發現自己沒有提供服務就會停止運行,就是沒有程序查看日志命令
docker logs -f -t --tail nubmer 容器ID # 顯示日志 - ft # 顯示日志 --tail number # 顯示日志和行數 [root@izuf6cn5k7l8xuxojhszqbz /]# docker logs -f -t --tail 10 d50135d540e2進入當前正在運行的容器
# 通常容器都是后臺運行方式,經常需要進入容器,修改一些配置 # 方式一 docker exec -it 容器ID [root@izuf6cn5k7l8xuxojhszqbz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc3159d51302 kibana:6.4.0 "/bin/bash" 34 minutes ago Up 34 minutes 5601/tcp romantic_euclid abe8d2653a16 elasticsearch:6.4.0 "/usr/local/bin/dock…" 35 minutes ago Up 35 minutes 9200/tcp, 9300/tcp elastic_ellis 89059be6a599 logstash:6.4.0 "/usr/local/bin/dock…" 36 minutes ago Up 36 minutes 5044/tcp, 9600/tcp nostalgic_einstein 059363cf2047 0346349a1a64 "/bin/bash" 46 minutes ago Up 46 minutes 80/tcp, 443/tcp nginx edb16178fcae centos "/bin/bash" About an hour ago Up About an hour nostalgic_allen a956dc76e579 redis "docker-entrypoint.s…" 3 months ago Up About an hour 0.0.0.0:6379->6379/tcp redis 635d1b7ad286 mysql:5.7 "docker-entrypoint.s…" 3 months ago Up About an hour 0.0.0.0:3306->3306/tcp, 33060/tcp mysql [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it 635d1b7ad286 /bin/bash root@635d1b7ad286:/## 方式二 docker attach 容器ID # 進入容器 [root@izuf6cn5k7l8xuxojhszqbz /]# docker attach 635d1b7ad286 [root@izuf6cn5k7l8xuxojhszqbz /]# ...# 兩種方式的區別 docker exec -it 容器ID # 進入容器并開啟一個新的終端 docker attach 容器ID # 進入正在執行的終端,并不會開啟新的進程從容器內拷貝文件到主機
docker cp # 進入docker容器內 [root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it edb16178fcae /bin/bash [root@edb16178fcae /]# cd /home [root@edb16178fcae home]# ls # 在容器內home創建文件 [root@edb16178fcae home]# touch test.java # 退出容器 [root@edb16178fcae home]# exit exit [root@izuf6cn5k7l8xuxojhszqbz /]# ls bin d dubbo-governance.log get-docker.sh ifstat-1.1 lib lost+found mnt opt root sbin sys usr zookeeper.out boot dev etc home ifstat-1.1.tar.gz lib64 media mydata proc run srv tmp var # 將docker內創建的文件拷貝到主機目錄下 [root@izuf6cn5k7l8xuxojhszqbz /]# docker cp edb16178fcae:/home/test.java /home [root@izuf6cn5k7l8xuxojhszqbz /]# cd home [root@izuf6cn5k7l8xuxojhszqbz home]# ls admin es FastDFS hadoop mysql oracle test.java [root@izuf6cn5k7l8xuxojhszqbz home]## 拷貝是一個手動過程,將來可以使用-v 卷的技術字段關聯容器目錄和主機目錄 /home /home總結
實戰練習
Docker 安裝Ninx
# docker search nginx # 搜索鏡像 # docker pull nginx:1.1.0 # 下載指定版本鏡像 # 查看鏡像 [root@izuf6cn5k7l8xuxojhszqbz /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0d120b6ccaa8 2 months ago 215MB redis latest 235592615444 4 months ago 104MB mysql 5.7 9cfcce23593a 4 months ago 448MB rabbitmq 3.7.15-management f05c3eb3cf91 15 months ago 179MB hello-world latest fce289e99eb9 21 months ago 1.84kB mongo 3.2 fb885d89ea5c 23 months ago 300MB logstash 6.4.0 13b7a09abaf8 2 years ago 670MB kibana 6.4.0 a7e4cd1a7b45 2 years ago 667MB elasticsearch 6.4.0 1ac676545731 2 years ago 791MB nginx 1.10 0346349a1a64 3 years ago 182MB # 參數解釋 # -d 后臺運行 # --name 為容器命名 # -p 主機端口:容器端口 [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name ngnix01 -p 3344:80 nginx:1.10 fe9479484c55a8aa62719a65cf146c14ce9bfadf5e20090afcb8e38703ac2bec [root@izuf6cn5k7l8xuxojhszqbz /]# curl localhost:3344# 進入容器 [root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it ngnix01 /bin/bash root@fe9479484c55:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz root@fe9479484c55:/# cd /etc/nginx root@fe9479484c55:/etc/nginx# ls conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf root@fe9479484c55:/etc/nginx#Docker 安裝Tomcat
# docker pull tomcat:9.0 下載鏡像tomcat9 [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name tomcat9 -p 3355:8080 tomcat:9.0 [root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it tomcat9 /bin/bash root@5f17e0823840:/usr/local/tomcat# ls BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work root@5f17e0823840:/usr/local/tomcat# cd webapps root@5f17e0823840:/usr/local/tomcat/webapps# ls root@5f17e0823840:/usr/local/tomcat/webapps#Docker 安裝Es+kibana
# ES暴露端口多 # ES十分耗內存 # ES的目錄一般要存放安全目錄掛載 # --net somenetwork網絡配置 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag # 查看docker stats docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPS="-Xms64m -Xms512m" elasticsearch:tagDocker安裝MinIO
mkdir -p /data/minio/config mkdir -p /data/minio/data docker run -p 9000:9000 -p 9090:9090 \--net=host \--name minio \-d --restart=always \-e "MINIO_ACCESS_KEY=username" \-e "MINIO_SECRET_KEY=password" \-v /mydata/minio/data:/mydata/minio/data \-v /mydata/minio/config:/mydata/minio/config \minio/minio server \/data --console-address ":9090" -address ":9000"可視化
-
portainer(先用這個)
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer -
Rancher(CI/CD再用)
docker 鏡像
commit鏡像
docker commit 提交容器成為一個新的副本 # 命令和git原理類似 docker commit -m="提交描述信息" -a="作者" 容器ID 目標鏡像:[TAG] docker commit -a="steven" -m="add webapps app" 5f17e0823840 tomcat02:1.0.0容器數據卷
使用數據卷
方式一:使用命令掛載 -v
docker run -d -it -v 主機目錄:容器目錄 -p 主機端口:容器端口 --name 容器名字 [root@izuf6cn5k7l8xuxojhszqbz home]# docker run -it -v /home/ceshi:/home centos /bin/bash測試文件同步
好處修改只需要在主機修改即可,容器內會自動同步
安裝MySQL
# 獲取鏡像 [root@izuf6cn5k7l8xuxojhszqbz /]# docker pull mysql:5.7 # 運行容器需要掛載!#安裝啟動MySQL,需要設置密碼,要注意 # 啟動MySQL -d 后臺運行 -p 端口映射 -v 數據卷掛載 -e 環境配置 --name 容器名字 [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=09091995aq --name mysql5.7 mysql:5.7# 啟動成功后,用Navicat鏈接測試# 在本地創建數據庫,查看映射路徑具名和匿名掛載
# 匿名掛載 # -v 查看容器內路徑 docker run -d --name nginx01 -v /etc/nginx nginx # 查看卷 volume [root@izuf6cn5k7l8xuxojhszqbz /]# docker volume ls DRIVER VOLUME NAME local 843c675d3d847a6c57927c79a5886559482bf4916118f91627bfa35ebbbec45b # 這種就是匿名掛載 -v 只寫了容器內的路徑,沒有寫主機路徑# 具名掛載 [root@izuf6cn5k7l8xuxojhszqbz /]# docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx nginx:1.10 1c70f133efdc35f9ce52ddafc7e128d88e833290e3815e2c8f1e5c2699319eb7 [root@izuf6cn5k7l8xuxojhszqbz /]# docker volume ls DRIVER VOLUME NAME local juming_nginx所有的docker在沒有指定目錄的情況下默認放在:/var/lib/docker/volumes/xxx/_data目錄下
# 具名掛載、匿名掛載、指定目錄掛載 -v 容器內路徑 # 匿名掛載 -v 容器名字:/容器內路徑 # 具名掛載 -v 主機路徑::/容器內路徑 # 指定路徑掛載拓展
# 通過 -v 容器內路徑控制讀寫權限 # ro readonly 只讀 # rw readwrite 讀寫 docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx:ro nginx:1.10 docker run -d --name nginx1.10 -p 3344:80 -v juming_nginx:/etc/nginx:rw nginx:1.10# ro只能通過主機修改配置,容器內無法改變初識DockerFile
DockerFile構建Docker鏡像文件!命令腳本體驗
# 創建DockerFile文件,名字可以隨意,建議就用dockefile # 文件中的內容 指令(大寫) 參數 FROM centos VOLUME ['volume01','volume02']CMD echo '-----------end-------------' CMD /bin/bash # 這里的每個命令就是docker鏡像的一層啟動自己的鏡像
查看卷掛在路徑:docker inspect 容器ID
數據卷容器
多個MySQL同步數據
docker run -it --name 容器名字 --volumes-from 父容器名字 鏡像名稱:版本號 docker run -it --name docker02 --volumes-from docker01 stevenyin/centos:1.10DockerFile
DockerFile介紹
DockerFile是用來構建docker鏡像的文件!命令參數腳本
構建步驟
查看一下官方是怎做的
DockerFile構建過程
基礎知識
dockerfile是面向開發的,以后發布項目,做鏡像就需要編寫dockerfile文件
步驟
DockerFile指令
FROM # 基礎鏡像一切從這里構建 MAINNTAINER # 鏡像是誰寫的,作者+郵箱 RUN # 鏡像構建是需要運行的命令 ADD # tomcat鏡像,tomcat是一個壓縮包,添加內容 WORKDIR # 鏡像工作目錄 VOLUME # 目錄掛載,掛載卷 EXPOSE # 暴漏端口 CMD # 指定容器啟動時需要運行的命令,只有最后一個命令會生效,可被替代 ENTRYPOINT # 指定容器啟動時需要運行的命令,可以命令追加 ONBUILD # 當運行一個被繼承的 DockerFile 會觸發ONBUILD COPY # 類似于ADD,將文件拷貝到容器中 ENV # 設置環境變量構建centos
# 1.編寫配置文件dockerfile文件 [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# vim mydockerfile-centos [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# cat mydockerfile-centos FROM centos MAINTAINER steven<yinhaoye@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD $MYPATH CMD echo "------end------" CMD /bin/bash [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# # 2.通過文件構建鏡像 # 命令 docker build -f dockerfile -t 鏡像:[tag] . [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker build -f /home/dockerfile/mydockerfile-centos -t stevenyin/centos:1.11 . Successfully built 502fedcf049b Successfully tagged stevenyin/centos:1.11查看docker構建鏡像歷史
# 查看docker 鏡像構建歷史 # docker history 鏡像ID [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker history 502fedcf049b IMAGE CREATED CREATED BY SIZE COMMENT 502fedcf049b 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B a77ba559c57e 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 32e6bf5b4d27 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "$MYP… 0B 5c37e637387e 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B b80d50163d6d 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB c682c6f2c7e5 12 minutes ago /bin/sh -c yum -y install vim 57.2MB a7a7c274e0db 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 2cd2577889b9 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B 4c14c20e220e 13 minutes ago /bin/sh -c #(nop) MAINTAINER steven<yinhaoy… 0B 0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB [root@izuf6cn5k7l8xuxojhszqbz dockerfile]#CMD和ENTRYPOINT的區別
CMD # 指定容器啟動時需要運行的命令,只有最后一個命令會生效,可被替代 ENTRYPOINT # 指定容器啟動時需要運行的命令,可以命令追加CMD測試
# 1.編寫dockerfile文件mydockerfile-cmd FROM centos CMD ["ls","-a"] # 2.構建鏡像 [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker build -f mydockerfile-cmd -t stevenyin/cmd:1.10 . # run運行,發現 ls -a 生效了 [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/cmd:1.10 . .. .dockerenv bin dev etc home lib lib64 lost+found opt root run sbin srv sys tmp usr var # 3. 想追加命令 -l ls -al [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/cmd:1.10 -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. # CMD情況下-l 替換了CMD ["ls","-a"] -l不是命令所以報錯ENTRYPOINT測試
# 1.編寫DockerFile文件 FROM centos ENTRYPOINT ["ls","-a"] # 2.構建鏡像 docker build -f mydockerfile-entrypoint -t stevenyin/entrypoint:1.10 . [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/entrypoint:1.10 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@izuf6cn5k7l8xuxojhszqbz dockerfile]# docker run stevenyin/entrypoint:1.10 -l total 56 drwxr-xr-x 1 root root 4096 Oct 25 02:22 . drwxr-xr-x 1 root root 4096 Oct 25 02:22 .. -rwxr-xr-x 1 root root 0 Oct 25 02:22 .dockerenv lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x 5 root root 340 Oct 25 02:22 dev drwxr-xr-x 1 root root 4096 Oct 25 02:22 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 drwxr-xr-x 2 root root 4096 May 11 2019 media drwxr-xr-x 2 root root 4096 May 11 2019 mnt drwxr-xr-x 2 root root 4096 May 11 2019 opt dr-xr-xr-x 120 root root 0 Oct 25 02:22 proc dr-xr-x--- 2 root root 4096 Aug 9 21:40 root drwxr-xr-x 11 root root 4096 Aug 9 21:40 run lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 May 11 2019 srv dr-xr-xr-x 13 root root 0 Oct 24 02:53 sys drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr drwxr-xr-x 20 root root 4096 Aug 9 21:40 var [root@izuf6cn5k7l8xuxojhszqbz dockerfile]#發布鏡像
DockerHub
注冊賬號:https://hub.docker.com/
登錄賬號
[root@izuf6cn5k7l8xuxojhszqbz software]# 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@izuf6cn5k7l8xuxojhszqbz software]# [root@izuf6cn5k7l8xuxojhszqbz software]# docker login -u stevenyin Password: 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 Succeeded [root@izuf6cn5k7l8xuxojhszqbz software]#登錄完畢后就可以提交鏡像了,就是一部docker push
發布到阿里云鏡像服務上
推送鏡像具體步驟
1. 登錄阿里云Docker Registry $ sudo docker login --username=yinghaoye123aq registry.cn-shanghai.aliyuncs.com 用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設置的密碼。您可以在訪問憑證頁面修改憑證密碼。2. 從Registry中拉取鏡像 $ sudo docker pull registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[鏡像版本號] 3. 將鏡像推送到Registry $ sudo docker login --username=yinghaoye123aq registry.cn-shanghai.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[鏡像版本號] $ sudo docker push registry.cn-shanghai.aliyuncs.com/aliyun-stevenyin/stevenyin:[鏡像版本號] 請根據實際鏡像信息替換示例中的[ImageId]和[鏡像版本號]參數。4. 選擇合適的鏡像倉庫地址 從ECS推送鏡像時,可以選擇使用鏡像倉庫內網地址。推送速度將得到提升并且將不會損耗您的公網流量。如果您使用的機器位于VPC網絡,請使用 registry-vpc.cn-shanghai.aliyuncs.com 作為Registry的域名登錄。 5. 示例 使用"docker tag"命令重命名鏡像,并將它通過專有網絡地址推送至Registry。$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB $ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-shanghai.aliyuncs.com/acs/agent:0.7-dfb6816 使用 "docker push" 命令將該鏡像推送至遠程。$ sudo docker push registry-vpc.cn-shanghai.aliyuncs.com/acs/agent:0.7-dfb6816Docker 網絡
理解Docker0
# [root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -p 3355:8080 --name tomcat9 tomcat:9.0 # 查看容器內網絡地址 ip addr,啟動后會發現有261: eth0@if262 IP地址 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9 ip addr 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 261: eth0@if262: <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 [root@izuf6cn5k7l8xuxojhszqbz ~]# # linux 能不能ping通容器內部 [root@izuf6cn5k7l8xuxojhszqbz ~]# 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.086 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.070 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms原理
網絡模型
在不指定網絡的情況下,都是由docker0路由的,docker會默認分派一個可用的IP
docker 使用的是liunx中的橋接,宿主機是docker中的網橋,docker0
–link
# 不能通過服務名ping通另一個容器,只能通過IP [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9 ping: tomcat9: Name or service not known [root@izuf6cn5k7l8xuxojhszqbz ~]# # 通過--link可以通過容器名使容器間進行聯通[root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.2 --link tomcat9 tomcat:9.0 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.2 ping tomcat9 PING tomcat9 (172.17.0.2) 56(84) bytes of data. 64 bytes from tomcat9 (172.17.0.2): icmp_seq=1 ttl=64 time=0.095 ms 64 bytes from tomcat9 (172.17.0.2): icmp_seq=2 ttl=64 time=0.066 ms 64 bytes from tomcat9 (172.17.0.2): icmp_seq=3 ttl=64 time=0.064 ms探究inspect
tomcat9.2是在本地配置了tomcat9
# 在hosts里配置,遠離在這里發現 [root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it tomcat9.2 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 tomcat9 a3d12cff39da 172.17.0.4 7f5cb56cad3f [root@izuf6cn5k7l8xuxojhszqbz /]#本質探究: – link就是在hosts文件中增加了172.17.0.2 tomcat9 a3d12cff39da 的映射
局限:docker0不支持容器名訪問
自定義網絡
查看網絡
網絡模式
bridge:橋接網絡docker(默認,自己創建也是有橋接模式)
none:不配置網絡
host:和宿主機共享網絡
container:容器內可以連通(用的少,不建議使用)
測試
# 直接啟動 --net bridge 默認就是docker0 docker run -d -P --name tomcat9 --net bridge tomcat:9.0# docker0不能通過域名訪問,可以通過--link 連通# 自定義網路 --driver bridge 橋接模式 --subnet 192.168.0.0/16 子網地址 --gateway 192.168.0.1 網關 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 36c4197f8b73de837495b148d4b95a2f03c6747608733a2b5d506b98c653f034 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 1edaf6a32eb9 bridge bridge local 18b32561b08d host host local abdd0e9a3c22 mydata_default bridge local 36c4197f8b73 mynet bridge local a7f1b5a0ad78 none null local [root@izuf6cn5k7l8xuxojhszqbz ~]# # 使用自定義網絡啟動容器 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.1 --net mynet tomcat:9.0 658aab97504ae8ee63204c78bd431fc37b41677c51121fa96c2041961d912a80 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker run -d -P --name tomcat9.2 --net mynet tomcat:9.0 97216395cd5188beab139a3f957019d42aa1b9da91a26d6b3cfd907fabc6b78f # 查看自定義網絡 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker network inspect mynet [{"Name": "mynet","Id": "36c4197f8b73de837495b148d4b95a2f03c6747608733a2b5d506b98c653f034","Created": "2020-10-25T21:45:21.745587216+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": {"658aab97504ae8ee63204c78bd431fc37b41677c51121fa96c2041961d912a80": {"Name": "tomcat9.1","EndpointID": "168eb519cd776907149fd9d97121e0a068f2ea28a6b81e86cbac04b742d82721","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""},"97216395cd5188beab139a3f957019d42aa1b9da91a26d6b3cfd907fabc6b78f": {"Name": "tomcat9.2","EndpointID": "00b1cc23a06c62087e7606b8b5286807ce0b7c3aca7d43a26cb8362147d10416","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""}},"Options": {},"Labels": {}} ] [root@izuf6cn5k7l8xuxojhszqbz ~]# # 再次測試不使用--link也可以通過容器名訪問 [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9.2 PING tomcat9.2 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.065 ms 64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms 64 bytes from tomcat9.2.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.066 ms [root@izuf6cn5k7l8xuxojhszqbz ~]#網絡聯通
# 網絡聯通 docker network connect 網絡名 容器名docker network connect mynet tomcat9.2.2# 聯通之后將tomcat9.1.1放入mynet網絡下# 一個容器兩個IP [root@izuf6cn5k7l8xuxojhszqbz ~]# docker exec -it tomcat9.1 ping tomcat9.1.1 PING tomcat9.1.1 (192.168.0.4) 56(84) bytes of data. 64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.101 ms 64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.073 ms 64 bytes from tomcat9.1.1.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.082 ms [root@izuf6cn5k7l8xuxojhszqbz ~]#實戰部署Redis
安裝單機版Redis
1.下載鏡像
docker pull redis2.創建掛載的目錄和配置文件
mkdir -p /mydata/redis/conf [root@iZwz9hw4qywrrl4vj6o0j1Z ~]# cd /mydata/redis/conf/ [root@iZwz9hw4qywrrl4vj6o0j1Z conf]# touch redis.conf3.啟動redis
# 結果 [root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes4.命令解釋
命令解釋
-p 6379:6379 端口映射:前表示主機部分,:后表示容器部分。
–name myredis 指定該容器名稱,查看和進行操作都比較方便。
-v 掛載目錄,規則與端口映射相同。
-d redis 表示后臺啟動redis
redis-server /etc/redis/redis.conf 以配置文件啟動redis,加載容器內的conf文件,最終找到的是掛載的目錄/usr/local/docker/redis.conf
appendonly yes 開啟redis 持久化
實戰部署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.30.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done # 啟動reids容器 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.30.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.confdocker 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.30.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 創建集群 [root@izuf6cn5k7l8xuxojhszqbz /]# docker exec -it redis-1 /bin/sh /data # redis-cli --cluster create 172.30.0.11:6379 172.30.0.12:6379 172.30.0.13:6379 172.30.0.14:6379 172.30.0.15:6379 172.30.0.16:6379 --c luster-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.30.0.15:6379 to 172.30.0.11:6379 Adding replica 172.30.0.16:6379 to 172.30.0.12:6379 Adding replica 172.30.0.14:6379 to 172.30.0.13:6379 M: 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379slots:[0-5460] (5461 slots) master M: 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379slots:[5461-10922] (5462 slots) master M: f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379slots:[10923-16383] (5461 slots) master S: 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379replicates f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 S: 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379replicates 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd S: a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379replicates 039ee87ac86de914417233448396a3c089669a2b 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.30.0.11:6379) M: 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s) S: 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379slots: (0 slots) slavereplicates 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd S: 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379slots: (0 slots) slavereplicates f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 M: 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s) M: f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s) S: a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379slots: (0 slots) slavereplicates 039ee87ac86de914417233448396a3c089669a2b [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. /data # # 測試集群 /data # redis-cli -c 127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:480 cluster_stats_messages_pong_sent:475 cluster_stats_messages_sent:955 cluster_stats_messages_ping_received:470 cluster_stats_messages_pong_received:480 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:955 127.0.0.1:6379> cluster nodes 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379@16379 slave 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 0 1603708641983 5 connected 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379@16379 slave f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 0 1603708641000 4 connected 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379@16379 myself,master - 0 1603708640000 1 connected 0-5460 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379@16379 master - 0 1603708640580 2 connected 5461-10922 f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379@16379 master - 0 1603708640000 3 connected 10923-16383 a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379@16379 slave 039ee87ac86de914417233448396a3c089669a2b 0 1603708640000 6 connected 127.0.0.1:6379> set a b -> Redirected to slot [15495] located at 172.30.0.13:6379 OK 172.30.0.13:6379> get a ^C /data # redis-cli -c 127.0.0.1:6379> get a -> Redirected to slot [15495] located at 172.30.0.14:6379 "b" 172.30.0.14:6379> cluster nodes 534e73cf9cd34bac9d43fce82cdb2e1be90d9fdf 172.30.0.14:6379@16379 myself,master - 0 1603708963000 7 connected 10923-16383 a7562cb7fa1cda8321295b12e3ffc3d844665cce 172.30.0.16:6379@16379 slave 039ee87ac86de914417233448396a3c089669a2b 0 1603708964000 2 connected 039ee87ac86de914417233448396a3c089669a2b 172.30.0.12:6379@16379 master - 0 1603708964000 2 connected 5461-10922 f9de7fd7bf12f7a10ac24155b6b4d8fef6d61ad6 172.30.0.13:6379@16379 master,fail - 1603708902628 1603708901000 3 connected 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 172.30.0.11:6379@16379 master - 0 1603708965564 1 connected 0-5460 20fe1f4923f790377cbaffaf99f9d45558bbd017 172.30.0.15:6379@16379 slave 96d6e1f4ad84f8c9101401bea7408f97e6c56bcd 0 1603708964563 1 connected 172.30.0.14:6379>docker搭建集群完成!
安裝ZooKeeper
一、單機搭建
下載鏡像
[root@izuf6cn5k7l8xuxojhszqbz ~]# docker pull zookeeper:3.5創建數據掛載目錄
/mydata/zookeeper/conf
/mydata/zookeeper/data
/mydata/zookeeper/datalog
運行zookeeper
docker run -d --name zookeeper3.5 \ --restart always \ -p 2181:2181 -p 2888:2888 -p 3888:3888 \ -v /mydata/zookeeper/conf:/conf \ -v /mydata/zookeeper/data:/data \ -v /mydata/zookeeper/datalog:/datalog \ zookeeper:3.5進入zookeeper容器
[root@izuf6cn5k7l8xuxojhszqbz zookeeper]# docker exec -it zookeeper3.5 /bin/bash root@1d0a2f5178b8:/apache-zookeeper-3.5.8-bin/bin# ls README.txt zkCli.cmd zkEnv.cmd zkServer-initialize.sh zkServer.sh zkTxnLogToolkit.sh zkCleanup.sh zkCli.sh zkEnv.sh zkServer.cmd zkTxnLogToolkit.cmd root@1d0a2f5178b8:/apache-zookeeper-3.5.8-bin/bin# ./zkCli.sh Connecting to localhost:2181 log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Welcome to ZooKeeper! JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0] create /test test Created /test [zk: localhost:2181(CONNECTED) 1] get /test test [zk: localhost:2181(CONNECTED) 2]二、集群搭建
在/mydata/下創建zookeeper-cluster文件夾
mkdir zookeeper-cluster在/mydata/zookeeper-cluster下創建三個zookeeper0x文件夾
mkdir zookeeper01 mkdir zookeeper02 mkdir zookeeper03每個zookeeper0x下建立如下
mkdir conf data datalog編寫docker-compose.yml文件
version: '3'#版本號固定寫法 services:zoo1:image: zookeeper #使用的鏡像restart: always #宕機后自動重啟hostname: zoo1 #承載zookeeper容器的主機(父容器)名 可省略container_name: zoo1 #容器名privileged: true #使用該參數,container內的root擁有真正的root權 privileged啟動的容器,可以看到很多host上的設備,并且可以執行mount。甚至允許你在docker容器中啟動docker容器。ports: #主機和容器的端口映射- "2181:2181" volumes: #創建zookeeper容器在宿主機的掛載目錄- /mydata/zookeeper-cluster/zookeeper01/data:/data #數據- /mydata/zookeeper-cluster/zookeeper01/datalog:/datalog #日志- /mydata/zookeeper-cluster/zookeeper01/conf:/conf #配置文件environment: #zookeeper3.4 和zookeeper 3.5在docker環境下搭建集群差異就在這里 #zoo1為容器名,也是主機名,意思為使用容器的內網通信(1)Zookeeper3.5 中指定的 ZOO_SERVERS 參數的 IP 地址和端口號后面多加了 “;2181 ”。(2)ZOO_SERVERS 指定ip時本機的ip地址寫 0.0.0.0。ZOO_MY_ID: 1ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo2:image: zookeeperrestart: alwayshostname: zoo2container_name: zoo2privileged: trueports:- "2182:2181"volumes:- /mydata/zookeeper-cluster/zookeeper02/data:/data- /mydata/zookeeper-cluster/zookeeper02/datalog:/datalog- /mydata/zookeeper-cluster/zookeeper02/conf:/confenvironment:ZOO_MY_ID: 2ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo3:image: zookeeperrestart: always hostname: zoo3container_name: zoo3privileged: trueports: - "2183:2181"volumes:- /mydata/zookeeper-cluster/zookeeper03/data:/data- /mydata/zookeeper-cluster/zookeeper03/datalog:/datalog- /mydata/zookeeper-cluster/zookeeper03/conf:/confenvironment:ZOO_MY_ID: 3ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181Docker Compose
簡介
Docker Compose 定義、運行、管理容器
A docker-compose.yml looks like this:
version: "3.8" services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redis volumes:logvolume01: {}Compose概念
安裝
總結
以上是生活随笔為你收集整理的Docker笔记整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 架构学习优秀网站整理
- 下一篇: PowerDesigner中在生成的数据