k8s之基本环境准备
写在前面本文看下学习k8s需要的基础环境包括运行环境docker等。1准备linux运行环境环境win10虚拟化工具VMware-workstation-full-15.1.0linuxubuntu-22.04.1-desktop-amd64.iso 。或者如下这里 。然后取所需一般都有。安装完毕后我们开始准备其它环境。2安装docker环境安装sudo apt install docker.io sudo service docker start #启动docker服务 sudo usermod -aG docker ${USER} #当前用户加入docker组安装后验证:dongyunqidongyunqi-virtual-machine:/etc/docker$ docker version Client: Version: 20.10.12 ...镜像下载加速dongyunqidongyunqi-virtual-machine:/etc/docker$ sudo touch daemon.json [sudo] password for dongyunqi: dongyunqidongyunqi-virtual-machine:/etc/docker$ sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://8csof3cn.mirror.aliyuncs.com] } EOF { registry-mirrors: [https://8csof3cn.mirror.aliyuncs.com] }3运行镜像Last login: Sat Dec 31 15:15:57 2022 from 192.168.64.1 dongyunqidongyunqi-virtual-machine:~$ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:c77be1d3a47d0caf71a82dd893ee61ce01f32fc758031a6ec4cf1389248bb833 Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest dongyunqidongyunqi-virtual-machine:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 15 months ago 13.3kB dongyunqidongyunqi-virtual-machine:~$ docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the hello-world image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/上面运行hello-world的输出说明其实就是docker的工作过程和原理如下图4其它4.1docker虚拟化的原理容器的本质就是隔离运行的进程所以其就是一个进程但是是隔离的,那么是如何实现隔离呢docker并没有实现什么新的技术而是基于Linux现有的技术实现的分别是namespacecgroupchroot分别如下namespace创建独立文件系统主机名网络即可以创建独立于主机硬件的独立硬件系统这样隔离就实现了。 cgroup实现对进程的资源使用限制如限制指定的CPU资源内存资源等这样资源限制就实现了。 chroot更改进程根目录即限制可以访问的目录只访问通过namespae创建的独立文件系统这样就拥有了能访问且只能访问的独立文件系统。4.2tag命令规范格式名字:标签名字表明了应用的身份比如 busybox、Alpine、Nginx、Redis 等等。标签tag则可以理解成是为了区分不同版本的应用而做的额外标记任何字符串都可以比如 3.15 是纯数字的版本号、jammy 是项目代号、1.21-alpine 是版本号加操作系统名等等。其中有一个比较特殊的标签叫“latest”它是默认的标签如果只提供名字没有附带标签那么就会使用这个默认的“latest”标签。如下docker pull alpine:3.15 docker pull ubuntu:jammy docker pull nginx:1.21-alpine docker pull nginx:alpine docker pull redis上述的ImageID是镜像唯一标识通过SHA256(镜像文件)获得的64字节长度字符串之类是以16进制形式标识。4.3镜像的结构假设我们现在都基于Ubuntu的基础镜像来生成新的镜像进行了如下3个操作1拷贝jdk可运行jar包到镜像中并设置相关的环境变量这样就构成一个新的镜像A 2拷贝一个编译后的VUE项目到镜像中并设置VUE相关的环境变量这样就构成一个新的镜像B 3拷贝Nginx相关文件到镜像中并设置Nginx相关的参数这样就构成了一个新的镜像C此时我们就有了3个镜像分别是镜像A镜像B镜像C分别包含了公共的Ubuntu文件系统和自己特有的文件如果是我们将公共的Ubuntu文件系统在每个镜像中都包含一份的话就会造成磁盘空间的浪费也会给网络传输等操作带来额外消耗基于此docker选择了将公共中的部分抽取出来并进行共享的方式这种方式就叫做层Layer我们的场景中可能如下图当然实际的是一个多层依赖的过程A依赖BB依赖CC依赖D。最上层是可写的其依赖的其它层都是只读的如下图我们可以通过docker inspect查看dongyunqidongyunqi-virtual-machine:~$ docker inspect nginx:alpine | grep RootFS -A 15 RootFS: { Type: layers, Layers: [ sha256:ded7a220bb058e28ee3254fbba04ca90b679070424424761a53a043b93b612bf, sha256:1fee4bd55a8558ea7d3c6853234c5cfd8e0604bce76d06338817535f22858098, sha256:ec7e4a91c33b5d0d8ef5a4a79113648caab03a6176a43407bdc4f548bbdb0c68, sha256:0511ab7e6edc3eadfc6ce2a8a0691c5da36300336453807ca9b4ad87d6a1a6d0, sha256:c23f26e962bd25628cd27d47c812b759beb564299927b7f23cf1679eac91b534, sha256:f2d47996fdfa7691b228d6c50a33c8526e15e2ac958d58c9d47f454885c7d780, sha256:9e173cdce044cd94cc216182cf69274f233491d6582122d31d820e7679553a76 ] }, Metadata: { LastTagTime: 0001-01-01T00:00:00Z } }4.4Dokcerfile常用指令常规的部署方式我们也会先选择一个基础操作系统可能是Cenos,Ubuntu等而这个基础的操作系统在docker中叫做基础镜像我们要在其基础上执行自己的操作在Dokcerfile中使用from指令指定基础镜像如下FROM alpine:3.15 # 选择Alpine镜像 或者 FROM ubuntu:bionic # 选择Ubuntu镜像现在基础的操作系统我们已经有了就可以在上面部署我们自己的文件了当然想要完成部署我们首先要将自己的文件拷贝到基础镜像中对应的指令是COPY但是需要注意COPY的文件必须在上下文 中存在如COPY run.jar .。另一个比较常用的指令是RUN会在执行docker build构建镜像时执行比如安装某些应用程序运行需要的软件修改某文件的执行权限等如RUN apt-get update \ apt-get install -y \ build-essential \ curl \ make \ unzip \ cd /tmp \ curl -fSL xxx.tar.gz -o xxx.tar.gz\ tar xzf xxx.tar.gz \ cd xxx \ ./config \ make \ make clean RUN chmod 777 ./bin/catalina.sh然后一个常用的命令是CMD用来指定容器启动时要执行的命令如CMD ./nginx/bin/startup。再有就是ENV用来设置运行后容器的环境变量如ENV PATH/usr/lib/jvm/java-8-openjdk-amd64/jre/bin:${PATH}。最后就是EXPOSE指令如EXPOSE 80开放80端口用来对外开放容器端口对于需要对外部访问的应用非常重要。4.5Docker hub红框中的Registry就是docker hub。docker hub是docker公司的官方镜像仓库在2004年和docker 1.0版本同时发布本文看下与其相关内容。4.5.1如何挑选镜像在docker hub 镜像分类如下1官方镜像 2认证镜像(公司账号注册并给docker hub交了钱的) 3半官方镜像公司账号注册但并没有交费 4个人镜像官方镜像如下标记有DOCKER OFFICIAL IMAGE,图认证镜像如下标记有VERIFIED PUBLISHER,图半官方镜像如下标记有VERIFIED PUBLISHER图个人镜像就是没有任何标记的了图正常选择镜像的优先级就是上述从上到下的顺序但还需要考虑下载量点赞量维护频率等因素如果是官方镜像但是已经好久没有维护了并且下载量也远远小于认证镜像则肯定不能选择官方镜像因此要综合各方面因素选择一个最合适的镜像毕竟用在生产环境中还是要非常认证对待怀有敬畏之心。4.5.2如何上传自己的镜像首先我们要先在本地构建镜像如下DockerfileFROM busybox WORKDIR /var RUN pwd接着构建镜像dongyunqidongyunqi-virtual-machine:~$ docker build -t test-push-dockerhub:0.1 -f howPwd.txt helloworld-app/ Sending build context to Docker daemon 8.738kB Step 1/3 : FROM busybox --- 827365c7baf1 Step 2/3 : WORKDIR /var --- Using cache --- 89da7feb392e Step 3/3 : RUN pwd --- Using cache --- 7975c01019bd Successfully built 7975c01019bd Successfully tagged test-push-dockerhub:0.1 dongyunqidongyunqi-virtual-machine:~$ docker images | grep push test-push-dockerhub 0.1 7975c01019bd 19 hours ago 4.86MB然后注册一个docker hub账号略。然后执行docker login登录dongyunqidongyunqi-virtual-machine:~$ docker login -u dongsir2018 Password: WARNING! Your password will be stored unencrypted in /home/dongyunqi/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeededdocker tag增加docker hub用户名前缀docker hub要求,不然push会被拒绝,然后docker pushdongyunqidongyunqi-virtual-machine:~$ docker tag test-push-dockerhub:0.1 dongsir2018/test-push-dockerhub:0.1 dongyunqidongyunqi-virtual-machine:~$ docker push dongsir2018/test-push-dockerhub:0.1 The push refers to repository [docker.io/dongsir2018/test-push-dockerhub] d6a7fc1fb44b: Pushed 0.1: digest: sha256:18dffa91675136f4cbefa2e51140a373e44bb0a86ab7359bd4f47c3c5f4747e2 size: 528在docker hub查看4.5.3docker hub tag命名规范格式版本号-操作系统信息版本号为主版本号 次版本号 补丁号当然不一定全部有有的还会在正式发布前出rc版候选版本release candidate。操作系统信息Alpine、CentOS 的命名比较简单明了就是数字的版本号像这里的alpine3.15 而Ubuntu、Debian则采用了代号的形式。比如Ubuntu 18.04是bionicUbuntu 20.04是focalDebian 9是stretchDebian 10是busterDebian 11是bullseye但不管是什么名字都代表了操作系统如下nginx:1.21.6-alpine表示版本号是 1.21.6基础镜像是最新的 Alpine。 redis:7.0-rc-bullseye表示版本号是 7.0 候选版基础镜像是 Debian 11。 node:17-buster-slim表示版本号是 17基础镜像是精简的 Debian 10。4.5.4镜像生成本地文件并加载有时在无法访问外部网络或者是方便测试时可以通过docker save生成tar之后就可以拷贝给其它人然后通过docker load加载为本地镜像首先执行docker save:dongyunqidongyunqi-virtual-machine:~$ docker save dongsir2018/test-push-dockerhub:0.1 -o /home/dongyunqi/push.tar dongyunqidongyunqi-virtual-machine:~$ ll | grep push -rw------- 1 dongyunqi dongyunqi 5096448 1月 2 11:50 push.tardocker load:dongyunqidongyunqi-virtual-machine:~$ docker load -i push.tar Loaded image: dongsir2018/test-push-dockerhub:0.1 dongyunqidongyunqi-virtual-machine:~$ docker images | grep dong dongsir2018/test-push-dockerhub 0.1 7975c01019bd 19 hours ago 4.86MB4.6容器与外界通信4.6.1互相拷贝文件可以通过docker cp从容器中拷贝文件到宿主机也可以将宿主机的文件拷贝到容器命令格式docker cp 源文件 目标目录其中根据拷贝的方向来设置源文件和目标目录即从容器拷贝文件就是docker cp 容器id:/path/to/file /target/path/to/copy,反之就是docker cp /path/to/file 容器ID:/target/path/to/copy。首先我们启动一个容器dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm redis Unable to find image redis:latest locally latest: Pulling from library/redis ... 20bf15ad3c24: Pull complete Digest: sha256:8184cfe57f205ab34c62bd0e9552dffeb885d2a7f82ce4295c0df344cb6f0007 Status: Downloaded newer image for redis:latest 56f61652f9abfa34f8965920173505e29f8c64127b583c864bb7448d17a3c67f dongyunqidongyunqi-virtual-machine:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 56f61652f9ab redis docker-entrypoint.s… 50 seconds ago Up 42 seconds 6379/tcp admiring_hamilton这里的容器id是56f61652f9ab需要记住后面会用到。宿主机拷贝到容器中dongyunqidongyunqi-virtual-machine:~$ docker cp howPwd.txt 56f61652f9ab:/tmp dongyunqidongyunqi-virtual-machine:~$ docker exec -it 56f61652f9ab bash # 以下是在容器内部操作 root56f61652f9ab:/data# cd /tmp root56f61652f9ab:/tmp# ls howPwd.txt容器拷贝到宿主机dongyunqidongyunqi-virtual-machine:~$ docker cp 56f61652f9ab:/tmp/aaaa.txt /home/dongyunqi/ dongyunqidongyunqi-virtual-machine:~$ ll /home/dongyunqi/ | grep aaaa.txt -rw-r--r-- 1 dongyunqi dongyunqi 5 1月 2 15:28 aaaa.txt4.6.2文件共享在启动容器时使用-v 本机目录:容器目录,可以将本机目录挂载到容器中,如下dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm -v /tmp:/tmp redis 58c048df2894d58ec8a5cd61b911263514f31164b5b181c5dfd34f2419803f7f dongyunqidongyunqi-virtual-machine:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58c048df2894 redis docker-entrypoint.s… 12 seconds ago Up 6 seconds 6379/tcp hungry_chatelet进入容器查看dongyunqidongyunqi-virtual-machine:~$ docker exec -it 58c sh # ls /tmp VMwareDnD systemd-private-0a4012172e21455d83e880e4891de8b0-systemd-oomd.service-bDPagt snap-private-tmp systemd-private-0a4012172e21455d83e880e4891de8b0-systemd-resolved.service-IA5lfo systemd-private-0a4012172e21455d83e880e4891de8b0-ModemManager.service-8B3jNO systemd-private-0a4012172e21455d83e880e4891de8b0-systemd-timesyncd.service-7JYyEP systemd-private-0a4012172e21455d83e880e4891de8b0-colord.service-Xvn3Xq systemd-private-0a4012172e21455d83e880e4891de8b0-upower.service-ilpfcz systemd-private-0a4012172e21455d83e880e4891de8b0-power-profiles-daemon.service-vKki7M tracker-extract-3-files.1000 systemd-private-0a4012172e21455d83e880e4891de8b0-switcheroo-control.service-ZJFobN tracker-extract-3-files.127 systemd-private-0a4012172e21455d83e880e4891de8b0-systemd-logind.service-IrdJI1 vmware-root_633-3988162919这样就可以在宿主机和容器分别看到对方的增删改文件了。4.6.3网络互通docker目前提供的网络互通方式有以下三种1none,即不和外部通信 2host使用和宿主机共享网络的方式通信 3bridge使用桥接的方式和外界通信即在容器和宿主机之间增加一层类似于交换机的角色host启动容器时通过参数--nethost如下dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm --nethost nginx:alpine a64a34e26c5a8cc34f03ce15d2cb035620fc23df680aebe55551a50e37e67f75此时容器和宿主机的网络就不是隔离的了但其它还是隔离的如下容器和宿主机的IP地址是一致的dongyunqidongyunqi-virtual-machine:~$ ifconfig | grep netmask 255 | grep 192 inet 192.168.64.131 netmask 255.255.255.0 broadcast 192.168.64.255 dongyunqidongyunqi-virtual-machine:~$ docker exec a64 ifconfig | grep netmask 255 | grep 192 dongyunqidongyunqi-virtual-machine:~$ docker exec a64 ifconfig ... ens33 Link encap:Ethernet HWaddr 00:0C:29:0D:0D:D1 inet addr:192.168.64.131 Bcast:192.168.64.255 Mask:255.255.255.0 inet6 addr: fe80::8dc9:2881:500e:1a99/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:279604 errors:0 dropped:0 overruns:0 frame:0 TX packets:77760 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:308597312 (294.3 MiB) TX bytes:8465112 (8.0 MiB) ...可以看到IP地址都是192.168.64.131因为此时容器网络和宿主机网络不是隔离的宿主机的网络环境会直接影响到容器所以生产环境中不建议使用。bridge这种方式如下图当执行docker run时默认就是这种方式但显式指定的话会更加明确如下dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm --netbridge nginx4.6.4映射端口如果想要访问容器内的应用需要映射端口号到宿主机然后通过访问宿主机的映射端口访问容器内部的实际应用如下dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm -p 8888:80 nginx 5bc0b6dd810fbc6ceaf42c959db53ddc8f25cedd8e574d0e0c41ce0f8df93571容器端口80映射到宿主机的端口8888访问测试dongyunqidongyunqi-virtual-machine:~$ curl http://localhost:8888 !DOCTYPE html html ... pemThank you for using nginx./em/p /body /html可以通过如下PORTS栏查看端口的映射情况dongyunqidongyunqi-virtual-machine:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5bc0b6dd810f nginx /docker-entrypoint.… 2 minutes ago Up 2 minutes 0.0.0.0:8888-80/tcp, :::8888-80/tcp fervent_volhard0.0.0.0:8888-80/tcp就是本机8888映射到容器80的tcp端口。4.7实战4.7.1搭建私有镜像仓库这里使用Docker Registry来搭建镜像仓库,如下启动dongyunqidongyunqi-virtual-machine:~$ docker run -d -p 5000:5000 registry Unable to find image registry:latest locally latest: Pulling from library/registry ca7dd9ec2225: Pull complete ...这里端口映射为5000:5000我们可以先看下此时仓库中镜像都有哪些:dongyunqidongyunqi-virtual-machine:~$ curl 127.1:5000/v2/_catalog {repositories:[]}是空的此时上传一个自己制作的镜像需要加上127.0.0.1:5000/来显式指定镜像仓库地址默认是docker hub地址如下dongyunqidongyunqi-virtual-machine:~$ docker tag hello-app:2.0 127.0.0.1:5000/hello-app:2.0 # 重命名镜像名称增加要上传的私有仓库地址这里是127.0.0.1:5000 dongyunqidongyunqi-virtual-machine:~$ docker push 127.0.0.1:5000/hello-app:2.0 # 推送到私有仓库 The push refers to repository [127.0.0.1:5000/hello-app] d6a7fc1fb44b: Pushed 2.0: digest: sha256:18dffa91675136f4cbefa2e51140a373e44bb0a86ab7359bd4f47c3c5f4747e2 size: 528此时查看私有仓库dongyunqidongyunqi-virtual-machine:~$ curl 127.1:5000/v2/_catalog # 查看有哪些镜像 {repositories:[hello-app]} dongyunqidongyunqi-virtual-machine:~$ curl 127.1:5000/v2/hello-app/tags/list # 查看某个镜像都有哪些tag {name:hello-app,tags:[2.0]}下载测试dongyunqidongyunqi-virtual-machine:~$ docker rmi 127.0.0.1:5000/hello-app:2.0 # 删除已有的 Untagged: 127.0.0.1:5000/hello-app:2.0 Untagged: 127.0.0.1:5000/hello-appsha256:18dffa91675136f4cbefa2e51140a373e44bb0a86ab7359bd4f47c3c5f4747e2 dongyunqidongyunqi-virtual-machine:~$ docker pull 127.0.0.1:5000/hello-app:2.0 # 重新从私有仓库下载 2.0: Pulling from hello-app Digest: sha256:18dffa91675136f4cbefa2e51140a373e44bb0a86ab7359bd4f47c3c5f4747e2 Status: Downloaded newer image for 127.0.0.1:5000/hello-app:2.04.7.2搭建WordPress架构图如下我们按照从右到左的顺序来启动容器。mariadbdongyunqidongyunqi-virtual-machine:~$ docker run -d --rm \ --env MARIADB_DATABASEdb \ --env MARIADB_USERwp \ --env MARIADB_PASSWORD123 \ --env MARIADB_ROOT_PASSWORD123 \ mariadb:10 Unable to find image mariadb:10 locally 10: Pulling from library/mariadb ...注意这里并没有映射端口到宿主机所以只能在本机访问。访问dongyunqidongyunqi-virtual-machine:~$ docker exec -it 2d2 mysql -u wp -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.10.2-MariaDB-1:10.10.2maria~ubu2204 mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type help; or \h for help. Type \c to clear the current input statement. MariaDB [(none)] show databases; -------------------- | Database | -------------------- | db | | information_schema | -------------------- 2 rows in set (0.000 sec)查看IPdongyunqidongyunqi-virtual-machine:~$ docker exec 2d2 ip addr 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 30: eth0if31: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever这里是172.17.0.4创建WordPress容器时需要使用到。wordpressdongyunqidongyunqi-virtual-machine:~$ docker run -d --rm \ --env WORDPRESS_DB_HOST172.17.0.4 \ --env WORDPRESS_DB_USERwp \ --env WORDPRESS_DB_PASSWORD123 \ --env WORDPRESS_DB_NAMEdb \ wordpress:5 Unable to find image wordpress:5 locally 5: Pulling from library/wordpress ...并没有映射端口到宿主机所以外部无法直接访问接下来使用Nginx反向代理支持外部访问WordPress。同样查看WordPress的IP为172.17.0.5供Nginx使用。nginx准备Nginx配置文件dongyunqidongyunqi-virtual-machine:~$ touch wp.conf dongyunqidongyunqi-virtual-machine:~$ pwd /home/dongyunqi dongyunqidongyunqi-virtual-machine:~$ dongyunqidongyunqi-virtual-machine:~$ sudo tee /home/dongyunqi/wp.conf -EOF server { listen 80; default_type text/html; location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_pass http://172.17.0.5; } } EOF启动容器dongyunqidongyunqi-virtual-machine:~$ docker run -d --rm \ -p 80:80 \ -v pwd/wp.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine b277ed1b9f6adae70a4d341eff2c625146c1494a1833c55ef6b072da1f4a0539访问http://192.168.64.131:80测试4.7.3存在的问题接下来我们看下这种手动启动容器方式存在的问题1多少个容器就要手动创建多少次还需要手动查看IP地址等信息保证网络的连通性 2如果是有一个镜像运行多个容器希望在这个多个容器之间进行负载均衡实现起来会更麻烦 3如果是想要增加节点增加集群的能力又是一个复杂的手动调整的过程以上的问题其实已经超出了容器技术本身的范畴而是需要在其之上需要提供的技术这也正是容器编排技术的雏形而像k8sdocker swarm就对该类问题提供了解决方案并给出其它更多功能的支持。像我们前面运行WordPress先启动miriadb再启动WordPress同时给其设置了miarialdb的IP端口信息最后又启动了Nginx同时给其设置了WordPress的IP信息这其实就是一个编排的过程不过是纯手工的编排粗糙落后效率低所以我们就非常需要像k8s这种支持编排的框架来帮助我解决这些痛点问题。写在后面参考文章列表Docker 镜像加速清华大学开源软件镜像站 。sftp的基本使用 。VMware Workstation Pro 15 for Windows下载与安装 。高速下载Ubuntu系统【清华大学开源软件镜像站】ubuntu-22.04.1-desktop-amd64.iso 。