当前位置: 首页 > news >正文

k8s之基本环境准备

写在前面

本文看下学习k8s需要的基础环境,包括运行环境,docker等。

1:准备linux运行环境

环境:win10

虚拟化工具:VMware-workstation-full-15.1.0

linux:ubuntu-22.04.1-desktop-amd64.iso 。或者如下:
这里 。然后:


取所需,一般都有。

安装完毕后我们开始准备其它环境。

2:安装docker环境

安装:

sudo apt install docker.io sudo service docker start #启动docker服务 sudo usermod -aG docker ${USER} #当前用户加入docker组

安装后验证:

dongyunqi@dongyunqi-virtual-machine:/etc/docker$ docker version Client: Version: 20.10.12 ...

镜像下载加速:

dongyunqi@dongyunqi-virtual-machine:/etc/docker$ sudo touch daemon.json [sudo] password for dongyunqi: dongyunqi@dongyunqi-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 dongyunqi@dongyunqi-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 dongyunqi@dongyunqi-virtual-machine:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 15 months ago 13.3kB dongyunqi@dongyunqi-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.1:docker虚拟化的原理

容器的本质就是隔离运行的进程,所以其就是一个进程,但是是隔离的,那么是如何实现隔离呢?docker并没有实现什么新的技术,而是基于Linux现有的技术实现的,分别是namespace,cgroup,chroot,分别如下:

namespace:创建独立文件系统,主机名,网络,即可以创建独立于主机硬件的独立硬件系统(这样隔离就实现了)。 cgroup:实现对进程的资源使用限制,如限制指定的CPU资源,内存资源等(这样资源限制就实现了)。 chroot:更改进程根目录,即限制可以访问的目录,只访问通过namespae创建的独立文件系统(这样就拥有了能访问且只能访问的独立文件系统)。

4.2:tag命令规范

格式名字:标签,名字表明了应用的身份,比如 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依赖B,B依赖C,C依赖D。最上层是可写的,其依赖的其它层都是只读的,如下图:

我们可以通过docker inspect查看:

dongyunqi@dongyunqi-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.4:Dokcerfile常用指令

常规的部署方式,我们也会先选择一个基础操作系统,可能是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.5:Docker 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:如何上传自己的镜像

首先我们要先在本地构建镜像,如下Dockerfile:

FROM busybox WORKDIR /var RUN pwd

接着构建镜像:

dongyunqi@dongyunqi-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 dongyunqi@dongyunqi-virtual-machine:~$ docker images | grep "push" test-push-dockerhub 0.1 7975c01019bd 19 hours ago 4.86MB

然后注册一个docker hub账号,略。

然后执行docker login登录:

dongyunqi@dongyunqi-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 Succeeded

docker tag增加docker hub用户名前缀(docker hub要求,不然push会被拒绝),然后docker push:

dongyunqi@dongyunqi-virtual-machine:~$ docker tag test-push-dockerhub:0.1 dongsir2018/test-push-dockerhub:0.1 dongyunqi@dongyunqi-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.3:docker hub tag命名规范

格式版本号-操作系统信息,版本号为主版本号 + 次版本号 + 补丁号当然不一定全部有,有的还会在正式发布前出rc版(候选版本,release candidate)。操作系统信息,Alpine、CentOS 的命名比较简单明了,就是数字的版本号,像这里的alpine3.15 ,而Ubuntu、Debian则采用了代号的形式。比如Ubuntu 18.04是bionic,Ubuntu 20.04是focal,Debian 9是stretch,Debian 10是buster,Debian 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:

dongyunqi@dongyunqi-virtual-machine:~$ docker save dongsir2018/test-push-dockerhub:0.1 -o /home/dongyunqi/push.tar dongyunqi@dongyunqi-virtual-machine:~$ ll | grep push -rw------- 1 dongyunqi dongyunqi 5096448 1月 2 11:50 push.tar

docker load:

dongyunqi@dongyunqi-virtual-machine:~$ docker load -i push.tar Loaded image: dongsir2018/test-push-dockerhub:0.1 dongyunqi@dongyunqi-virtual-machine:~$ docker images | grep dong dongsir2018/test-push-dockerhub 0.1 7975c01019bd 19 hours ago 4.86MB

4.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

首先我们启动一个容器:

dongyunqi@dongyunqi-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 dongyunqi@dongyunqi-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,需要记住,后面会用到。

  • 宿主机拷贝到容器中
dongyunqi@dongyunqi-virtual-machine:~$ docker cp howPwd.txt 56f61652f9ab:/tmp dongyunqi@dongyunqi-virtual-machine:~$ docker exec -it 56f61652f9ab bash # 以下是在容器内部操作 root@56f61652f9ab:/data# cd /tmp root@56f61652f9ab:/tmp# ls howPwd.txt
  • 容器拷贝到宿主机
dongyunqi@dongyunqi-virtual-machine:~$ docker cp 56f61652f9ab:/tmp/aaaa.txt /home/dongyunqi/ dongyunqi@dongyunqi-virtual-machine:~$ ll /home/dongyunqi/ | grep aaaa.txt -rw-r--r-- 1 dongyunqi dongyunqi 5 1月 2 15:28 aaaa.txt
4.6.2:文件共享

在启动容器时使用-v 本机目录:容器目录,可以将本机目录挂载到容器中,如下:

dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm -v /tmp:/tmp redis 58c048df2894d58ec8a5cd61b911263514f31164b5b181c5dfd34f2419803f7f dongyunqi@dongyunqi-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

进入容器查看:

dongyunqi@dongyunqi-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目前提供的网络互通方式有以下三种:

1:none,即不和外部通信 2:host,使用和宿主机共享网络的方式通信 3:bridge,使用桥接的方式和外界通信,即在容器和宿主机之间增加一层类似于交换机的角色
  • host
    启动容器时通过参数--net=host,如下:
dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm --net=host nginx:alpine a64a34e26c5a8cc34f03ce15d2cb035620fc23df680aebe55551a50e37e67f75

此时容器和宿主机的网络就不是隔离的了,但其它还是隔离的,如下容器和宿主机的IP地址是一致的:

dongyunqi@dongyunqi-virtual-machine:~$ ifconfig | grep "netmask 255" | grep 192 inet 192.168.64.131 netmask 255.255.255.0 broadcast 192.168.64.255 dongyunqi@dongyunqi-virtual-machine:~$ docker exec a64 ifconfig | grep "netmask 255" | grep 192 dongyunqi@dongyunqi-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时,默认就是这种方式,但显式指定的话会更加明确,如下:

dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm --net=bridge nginx
4.6.4:映射端口

如果想要访问容器内的应用,需要映射端口号到宿主机,然后通过访问宿主机的映射端口访问容器内部的实际应用,如下:

dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm -p 8888:80 nginx 5bc0b6dd810fbc6ceaf42c959db53ddc8f25cedd8e574d0e0c41ce0f8df93571

容器端口80映射到宿主机的端口8888,访问测试:

dongyunqi@dongyunqi-virtual-machine:~$ curl http://localhost:8888 <!DOCTYPE html> <html> ... <p><em>Thank you for using nginx.</em></p> </body> </html>

可以通过如下PORTS栏查看端口的映射情况:

dongyunqi@dongyunqi-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_volhard

0.0.0.0:8888->80/tcp就是本机8888映射到容器80的tcp端口。

4.7:实战

4.7.1:搭建私有镜像仓库

这里使用Docker Registry来搭建镜像仓库,如下启动:

dongyunqi@dongyunqi-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,我们可以先看下此时仓库中镜像都有哪些:

dongyunqi@dongyunqi-virtual-machine:~$ curl 127.1:5000/v2/_catalog {"repositories":[]}

是空的,此时上传一个自己制作的镜像,需要加上127.0.0.1:5000/来显式指定镜像仓库地址,默认是docker hub地址,如下:

dongyunqi@dongyunqi-virtual-machine:~$ docker tag hello-app:2.0 127.0.0.1:5000/hello-app:2.0 # 重命名镜像名称,增加要上传的私有仓库地址,这里是127.0.0.1:5000 dongyunqi@dongyunqi-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

此时查看私有仓库:

dongyunqi@dongyunqi-virtual-machine:~$ curl 127.1:5000/v2/_catalog # 查看有哪些镜像 {"repositories":["hello-app"]} dongyunqi@dongyunqi-virtual-machine:~$ curl 127.1:5000/v2/hello-app/tags/list # 查看某个镜像都有哪些tag {"name":"hello-app","tags":["2.0"]}

下载测试:

dongyunqi@dongyunqi-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-app@sha256:18dffa91675136f4cbefa2e51140a373e44bb0a86ab7359bd4f47c3c5f4747e2 dongyunqi@dongyunqi-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.0
4.7.2:搭建WordPress

架构图如下:

我们按照从右到左的顺序来启动容器。

  • mariadb
dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm \ > --env MARIADB_DATABASE=db \ > --env MARIADB_USER=wp \ > --env MARIADB_PASSWORD=123 \ > --env MARIADB_ROOT_PASSWORD=123 \ > mariadb:10 Unable to find image 'mariadb:10' locally 10: Pulling from library/mariadb ...

注意这里并没有映射端口到宿主机,所以只能在本机访问。

访问:

dongyunqi@dongyunqi-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.2+maria~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)

查看IP:

dongyunqi@dongyunqi-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: eth0@if31: <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容器时需要使用到。

  • wordpress
dongyunqi@dongyunqi-virtual-machine:~$ docker run -d --rm \ > --env WORDPRESS_DB_HOST=172.17.0.4 \ > --env WORDPRESS_DB_USER=wp \ > --env WORDPRESS_DB_PASSWORD=123 \ > --env WORDPRESS_DB_NAME=db \ > 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配置文件:
dongyunqi@dongyunqi-virtual-machine:~$ touch wp.conf dongyunqi@dongyunqi-virtual-machine:~$ pwd /home/dongyunqi dongyunqi@dongyunqi-virtual-machine:~$ dongyunqi@dongyunqi-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

启动容器:

dongyunqi@dongyunqi-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:如果是想要增加节点,增加集群的能力,又是一个复杂的手动调整的过程

以上的问题其实已经超出了容器技术本身的范畴,而是需要在其之上需要提供的技术,这也正是容器编排技术的雏形,而像k8s,docker 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) 。

http://www.jsqmd.com/news/868860/

相关文章:

  • Open Generative AI科研应用:科学可视化与数据呈现的AI工具
  • Elm Native UI社区资源汇总:如何获取帮助和贡献代码的完整指南
  • 戴森球计划工厂蓝图库:3000+专业设计解决太空建造难题
  • 3个简单步骤:OpenSIPS与MySQL/PostgreSQL数据库集成完整指南
  • 昇腾CANN asc-devkit:开发者工具包的核心能力和工程化实践
  • 跨平台资源下载神器res-downloader:3分钟学会如何轻松获取各大平台无水印内容
  • QueryKit与SwiftUI集成:打造现代化iOS应用的完整数据层解决方案
  • Kontena vs Kubernetes:开发者友好型容器平台终极对比指南
  • Keil MDK Pack Installer报错解析与解决方案
  • Keil C51递归调用警告处理与工程配置详解
  • DLSS版本管理器终极指南:3步快速解锁游戏性能新境界
  • HEIF Utility终极指南:在Windows上完美查看和转换HEIC图片的免费解决方案
  • 昇腾CANN amct:模型压缩工具的量化和部署实践
  • 5大智能功能解密:如何用自动化系统彻底告别茅台手动抢购
  • Zhui组件库开发指南:从环境搭建到贡献代码的完整路线图
  • 方言AI最后一公里卡在哪?贵州话语音合成中声调混淆率高达37.6%——我们用韵律标注增强+CTC-Aware Loss降到了8.2%
  • MobaXterm中文版架构解析:企业级远程管理性能优化最佳实践
  • 2026年质量好的户外专用线/吊篮专用线可靠供应商推荐 - 行业平台推荐
  • LunaSea高级功能解析:Webhook推送通知与多配置文件管理
  • 零代码打造专业数据大屏:DataRoom开源大屏设计器完全指南 [特殊字符]
  • 2026楼宇自控厂家哪家好?用户口碑品牌推荐榜!
  • 量子嵌入理论与误差检测在强关联系统中的应用
  • 毕业设计定做【芳心科技】E. 温度采集物联网系统
  • CaldroidListener使用教程:轻松实现Android日期点击事件处理
  • 掌握科学图像处理利器:ImageJ核心功能全解析与实战指南
  • Native Starter Kit性能优化指南:提升React Native应用运行效率的7个技巧
  • 昇腾CANN triton-inference-server-ge-backend:Triton 推理服务在 NPU 上的部署实战
  • 5分钟掌握Ventoy主题定制:让你的启动界面独一无二
  • 服务器末级缓存优化:指令-数据关联性管理技术
  • Pills CSS Grid高级技巧:嵌套布局、偏移量与自定义宽度全解析