狂神说docker(最全笔记) | 您所在的位置:网站首页 › 遇见狂神说官网 › 狂神说docker(最全笔记) |
笔记来源于
Docker https://www.bilibili.com/video/BV1og4y1q7M4 视频整理
一.Docker入门
1. Docker 为什么会出现
所有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 初始DockerFileDockerFile就是用来狗之间docker镜像的构建文件!命令脚本!先体验一下! 通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层! # 创建一个dockerfile文件, 名字可以随机 # 文件的内容 指定(大写) 参数 FROM centos VOLUME ["volume01", "volume02"] CMD echo "----end----" CMD /bin/bash # 这里的每一个命令都是镜像的一层!这个卷和外部一定有一个同步的目录! 测试一下刚才的文件是否同步到主机上了! 这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像! 假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径! 数据卷容器多个mysql同步数据! 多个mysql实现数据共享 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 [root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7结论 容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的! DockerFiledockerFile是用来构建docker镜像的文件!命令参数脚本! 构建步骤 1. 编写一个dockerFile文件 2.docker build 构建成为一个镜像 3. docker run 运行镜像 4. docker push 发布镜像(DockerHub、阿里云镜像) 查看婴喜爱官方是怎么做的? 很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像! 官方既然可以制作镜像,能我们一样可以! DockerFile的构建过程基础知识: 每个保留关键字(指令)都是必须大写字母执行从上到下顺序执行# 表示注释每个指令都会创建提交一个新的镜像层,并提交!dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单! Docker镜像逐渐成为企业的交互标准,必须要掌握! 步骤:开发,部署, 运维..... 缺一不可! DockerFile: 构建文件, 定义了一切的步骤,源代码 DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品! Docker容器:容器就是镜像运行起来提供服务器 DockerFile指令说明我们可以列出本地进行的变更历史 CMD 和ENTRYPOINT区别 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令测试CMD # 1. 编写dockerfile文件 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test FROM centos CMD ["ls", "-a"] # 2. 构建镜像 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest . # 3. run运行, 发现我们的ls -a 命令生效 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 . .. .dockerenv bin dev etc home lib lib64 # 想追加一个命令 -l 变成 ls -al [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown. [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l # cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了测试ENTRYPOINT # 1. 编写dockerfile文件 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test FROM centos ENTRYPOINT ["ls", "-a"] # 2. 构建文件 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test . # 3. run运行 发现我们的ls -a 命令同样生效 [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test . .. .dockerenv bin dev etc home lib # 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的! [root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l total 56 drwxr-xr-x 1 root root 4096 Aug 13 07:52 . drwxr-xr-x 1 root root 4096 Aug 13 07:52 .. -rwxr-xr-x 1 root root 0 Aug 13 07:52 .dockerenv lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x 5 root root 340 Aug 13 07:52 dev drwxr-xr-x 1 root root 4096 Aug 13 07:52 etc drwxr-xr-x 2 root root 4096 May 11 2019 home lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------ 2 root root 4096 Aug 9 21:40 lost+found 七,Dockerfile制作tomcat镜像 Dockerfile制作tomcat镜像 准备镜像文件 tomcat压缩包,jdk的压缩包!访问测试 发布项目(由于做了卷挂载, 我们直接在本地编写项目就可以发布了) 在本地编写web.xml和index.jsp进行测试 发现:项目部署成功, 可以直接访问ok! 我们以后开发的步骤:需要掌握Dockerfile的编写! 我们之后的一切都是使用docker进行来发布运行的! Docker Hub 地址 注册自己的账号! 确定这个账号可以登录 测试 三个网络 # 问题: docker是如何处理容器网络访问的? # [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat01 tomcat # 查看容器内部的网络地址 ip addr [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ip addr, 发现容器启动的时候得到一个eth0@if115 ip地址,docker分配的! 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 114: eth0@if115: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # 思考: linux 能不能ping通容器? [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.075 ms # linux 可以 ping 通docker容器内部!原理 我们没启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker,就会有一个网卡 docker0桥接模式,使用的技术是veth-pair技术!再次测试 ip addr 我们测试一下tomcat01和tomcat02之间是否可以ping通! 结论:容器与容器之间是可以相互ping通的! 绘制一个网络模型图 结论:tomcat01和tomcat02是共用的一个路由器,docker0 所有容器不指定网络的情况下,都是docker0路由的,doucker会给我们的容器分配一个默认的可用IP 小结 Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0. Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!) 只要容器删除,对应的网桥一对就没有了! 思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known # 如何可以解决呢? # 通过--link既可以解决网络连通问题 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat 3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a2bcaba804c tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:32772->8080/tcp tomcat03 f22ed47ed1be tomcat "catalina.sh run" 57 minutes ago Up 57 minutes 0.0.0.0:32771->8080/tcp tomcat02 9d97f93401a0 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:32770->8080/tcp tomcat01 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.129 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms # 反向可以ping通吗? [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known探究:inspect! 其实这个tomcat03就是在本地配置了tomcat02的配置? [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 tomcat02 f22ed47ed1be 172.17.0.4 3a2bcaba804c本质探究:--link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be 我们现在玩Docker已经不建议使用--link了! 自定义网络!不使用Docker0! Docker0的问题:它不支持容器名链接访问! 自定义网络查看所有的docker网络 网络模式 bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式 none: 不配置网络 host: 和宿主机共享网络 container:容器网络连通!(用的少, 局限很大) 测试 # 我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0 docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat # docker0特点,默认,容器名不能访问, --link可以打通连接! # 我们可以自定义一个网络! # --driver bridge # --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254 # --gateway 192.168.0.1 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 30d601788862 bridge bridge local 226019b14d91 host host local 26a5afdf4805 mynet bridge local 7496c014f74b none null local我们自己创建的网络就ok了! 在自己创建的网络里面启动两个容器 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec", "Created": "2020-08-14T11:12:40.553433163+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c": { "Name": "tomcat-net-01", "EndpointID": "576ce5c0f5860a5aab5e487a805da9d72f41a409c460f983c0bd341dd75d83ac", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5": { "Name": "tomcat-net-02", "EndpointID": "81ecbc4fe26e49855fe374f2d7c00d517b11107cc91a174d383ff6be37d25a30", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] # 再次拼连接 [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.113 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.093 ms ^C --- 192.168.0.3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.093/0.103/0.113/0.010 ms # 现在不使用 --link也可以ping名字了! [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.068 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.096 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络 好处: redis - 不同的集群使用不同的网络,保证集群时安全和健康的 mysql - 不同的集群使用不同的网络,保证集群时安全和健康的 网络连通测试打通tomcat01 和mynet 结论:假设要跨网络 操作别人,就要使用docker network connect连通.....! 实战:部署redisdocker搭建redis集群完成! ? IDEA2020 Ultimate版本激活方案 亲测有效 打包应用编写Dockerfile FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]构建镜像 发布运行! # 把打好的jar包和Dockerfile上传到linux [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# ll total 16140 -rw-r--r-- 1 root root 16519871 Aug 14 17:38 demo-0.0.1-SNAPSHOT.jar -rw-r--r-- 1 root root 122 Aug 14 17:38 Dockerfile # 构建镜像,不要忘了最后有一个点 [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker build -t xiaofan666 . Sending build context to Docker daemon 16.52MB Step 1/5 : FROM java:8 8: Pulling from library/java 5040bd298390: Pull complete fce5728aad85: Pull complete 76610ec20bf5: Pull complete 60170fec2151: Pull complete e98f73de8f0d: Pull complete 11f7af24ed9c: Pull complete 49e2d6393f32: Pull complete bb9cdec9c7f3: Pull complete Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d Status: Downloaded newer image for java:8 ---> d23bdf5b1b1b Step 2/5 : COPY *.jar /app.jar ---> d4de8837ebf9 Step 3/5 : CMD ["--server.port=8080"] ---> Running in e3abc66303f0 Removing intermediate container e3abc66303f0 ---> 131bb3917fea Step 4/5 : EXPOSE 8080 ---> Running in fa2f25977db7 Removing intermediate container fa2f25977db7 ---> d98147377951 Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"] ---> Running in e1885e23773b Removing intermediate container e1885e23773b ---> afb6b5f28a32 Successfully built afb6b5f28a32 Successfully tagged xiaofan666:latest # 查看镜像 [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE xiaofan666 latest afb6b5f28a32 14 seconds ago 660MB tomcat latest 2ae23eb477aa 8 days ago 647MB redis 5.0.9-alpine3.11 3661c84ee9d0 3 months ago 29.8MB java 8 d23bdf5b1b1b 3 years ago 643MB # 运行容器 [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker run -d -P --name xiaofan-springboot-web xiaofan666 fd9a353a80bfd61f6930c16cd92204532bfd734e003f3f9983b5128a27b0375e # 查看运行起来的容器端口(因为我们启动的时候没有指定) [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fd9a353a80bf xiaofan666 "java -jar /app.jar …" 9 seconds ago Up 8 seconds 0.0.0.0:32779->8080/tcp xiaofan-springboot-web # 本地访问1 [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779 {"timestamp":"2020-08-14T09:42:57.371+00:00","status":404,"error":"Not Found","message":"","path":"/"} # 本地访问2 [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# [root@iZ2zeg4ytp0whqtmxbsqiiZ idea]# curl localhost:32779/hello hello, xiaofan # 远程访问(开启阿里云上的安全组哦)以后我们使用了Docker之后,给别人交互的就是一个镜像即可! 九,Docker Compose Docker Compose 简介Docker Dockerfile build run 手动操作,单个容器! 微服务,100个微服务,依赖关系。 Docker Compose 来轻松高效的管理容器,定义运行多个容器。 官方介绍 定义运行多个容器YAML file配置文件single command。命令有哪些?Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features. 所有的环境都可以使用compose。Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases. 三步骤: Using Compose is basically a three-step process: Define your app’s environment with a Dockerfile so it can be reproduced anywhere. Dockerfile保证我们的项目再任何地方可以运行Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment. services 什么是服务。Run docker-compose up and Compose starts and runs your entire app. 启动项目作用:批量容器编排 我自己的理解 Compose是Docker官方的开源项目,需要安装! Dockerfile让程序在任何地方运行。web服务、redis、mysql、nginx... 多个容器。 run Compose version: '2.0' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}docker-compose up 100个服务 Compose:重要概念 服务services, 容器、应用(web、redis、mysql...)项目project。 一组关联的容器 安装 下载 # 官网提供 (没有下载成功) curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 国内地址 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 授权 chmod +x /usr/local/bin/docker-compose地址:https://docs.docker.com/compose/gettingstarted/ python应用。 计数器。redis! 应用app.pyDockerfile 应用打包为镜像 FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] # 官网的用来flask框架,我们这里不用它 # 这告诉Docker # 从python3.7开始构建镜像 # 将当前目录添加到/code印像中的路径中 # 将工作目录设置为/code # 安装Python依赖项 # 将容器的默认命令设置为python app.pyDocker-compose yaml文件(定义整个服务,需要的环境 web、redis) 完整的上线服务! version: '3.8' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"启动compose 项目 (docker-compose up) 流程: 创建网络执行Docker-compose.yaml启动服务 yaml规则docker-compose.yaml 核心! https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples 开源项目:博客https://docs.docker.com/compose/wordpress/ 下载程序、安装数据库、配置.... compose应用 => 一键启动 下载项目(docker-compse.yaml)如果需要文件。Dockerfile文件准备齐全,一键启动项目即可编写项目微服务 Dockerfile构建镜像 FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]docker-compose.yml编排项目 version '3.8' services: xiaofanapp: build: . image: xiaofanapp depends_on: - redis ports: - "8080:8080" redis: image: "library/redis:alpine" 丢到服务器运行 docker-compose up docker-compose down # 关闭容器 docker-compose up --build # 重新构建总结: 工程、服务、容器 项目 compose: 三层 工程 Project服务容器 运行实例! docker k8s 容器 十,Docker Swarm Docker Swarm集群 购买服务器登录阿里云账号,进入控制台,创建实例 4台服务器2G到此,我们的服务器购买成功! 四台机器安装docker和我们单机安装一样 技巧: xshell直接同步操作,省时间! Docker的安装 Swarm集群搭建工作机制 初始化结点docker swarm init docker swarm join 加入一个结点! # 获取令牌 docker swarm join-token manager docker swarm join-token worker [root@iZ2ze58v8acnlxsnjoulk6Z ~]# docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377 This node joined a swarm as a worker.把后面的结点都搭建进去 100台! 生成主节点init加入(管理者,worker) Raft协议双主双从:假设一个结点挂了!其他结点是否可以用! Raft协议:保证大多数结点存活才可以使用,只要>1, 集群至少大于3台! 实验: 1、将docker1机器停止。宕机!双主,另外一个结点也不能使用了! 十分简单:集群,可用! 3个主节点。 > 1台管理结点存活! Raft协议:保证大多数结点存活,才可以使用,高可用! 体会弹性、扩缩容!集群! 以后告别 docker run! docker-compose up!启动一个项目。单机! 集群: swarm docker-service k8s service 容器 => 服务! 容器 => 服务! => 副本! redis => 10个副本!(同时开启10个redis容器) 体验:创建服务、动态扩容服务、动态更新服务 灰度发布(金丝雀发布) 编程浪子的博客 查看服务 动态扩缩容 [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service update --replicas 3 my-nginx 1/3: running [==================================================>] 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=5 my-nginx scaled to 5 overall progress: 3 out of 5 tasks overall progress: 3 out of 5 tasks overall progress: 3 out of 5 tasks overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=1 my-nginx scaled to 1 overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged移出!docker service rm docker swarm其实并不难 只要会搭建集群、会启动服务、动态管理容器就可以了! 概念的总结swarm 集群的管理和编号,docker可以初始化一个swarm集群,其他结点可以加入。(管理,工作者) Node 就是一个docker结点,多个结点就组成了一个网络集群(管理、工作者) Service 任务,可以在管理结点或者工作结点来运行。核心,用户访问。 Task 容器内的命令、细节任务! service 命令 -> 管理 -> api -> 调度 -> 工作结点(创建Task容器维护创建!) 服务副本和全局服务 调整service以什么方式运行 --mode string Service mode (replicated or global) (default "replicated") docker service create --mode replicated --name mytom tomcat:7 默认的 docker service create --mode global --name haha alpine ping www.baidu.com拓展: 网络模式 "PublishMode":"ingress" Swarm: Overlay: ingress:特殊的Overlay网络!负载均衡的功能!ipvs vip! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 74cecd37149f bridge bridge local 168d35c86dd5 docker_gwbridge bridge local 2b8f4eb9c2e5 host host local dmddfc14n7r3 ingress overlay swarm 8e0f5f648e69 none null local [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network inspect ingress [ { "Name": "ingress", "Id": "dmddfc14n7r3vms5vgw0k5eay", "Created": "2020-08-17T10:29:07.002315919+08:00", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": true, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "ingress-sbox": { "Name": "ingress-endpoint", "EndpointID": "9d6ec47ec8309eb209f4ff714fbe728abe9d88f9f1cc7e96e9da5ebd95adb1c4", "MacAddress": "02:42:0a:00:00:02", "IPv4Address": "10.0.0.2/24", "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4096" }, "Labels": {}, "Peers": [ { "Name": "cea454a89163", "IP": "172.16.250.96" }, { "Name": "899a05b64e09", "IP": "172.16.250.99" }, { "Name": "81d65a0e8c03", "IP": "172.16.250.97" }, { "Name": "36b31096f7e2", "IP": "172.16.250.98" } ] } ] 其他命令学习方式 Docker Stack docker-compose 单机部署项目 docker stack 集群部署 # 单机 docker-compose up -d wordpress.yaml # 集群 docker stack deploy wordpress.yaml Docker Secret 安全!配置密码!证书! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker secret --help Usage: docker secret COMMAND Manage Docker secrets Commands: create Create a secret from a file or STDIN as content inspect Display detailed information on one or more secrets ls List secrets rm Remove one or more secrets Docker Config 配置! [root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker config --help Usage: docker config COMMAND Manage Docker configs Commands: create Create a config from a file or STDIN inspect Display detailed information on one or more configs ls List configs rm Remove one or more configs 拓展到k8s云原生时代 Go语言!必须掌握! Java Go! 并发语言! B语言,C语言的创始人。Unix创始人VB go指针 |
CopyRight 2018-2019 实验室设备网 版权所有 |