建网站深圳,旅游网站设计的建设原则,找公司开发网站,秦皇岛做网站多少钱一、说明 在下面的文章中#xff0c; 将向您概述 docker 容器之间的通信。docker 通信的验证将通过运行 C 客户端-服务器应用程序和标准“ping”命令来执行。将构建并运行两个单独的 Docker 映像。 由于我会关注 docker 网络方面#xff0c;因此不会提供 C 详细信息。… 一、说明 在下面的文章中 将向您概述 docker 容器之间的通信。docker 通信的验证将通过运行 C 客户端-服务器应用程序和标准“ping”命令来执行。将构建并运行两个单独的 Docker 映像。 由于我会关注 docker 网络方面因此不会提供 C 详细信息。有一个文件和易于理解的程序。我还假设读者了解 docker 的主要概念。在本文中我不会穷尽 docker 网络的完整概念。为了进一步学习我建议使用文档可以在此处找到。 简单来说Docker 概念是一个开放平台允许软件工程师在容器的帮助下开发、集成和运行应用程序并根据 Dockerfile 中的规范进行构建。 Docker 开发策略使用户能够将应用程序与基础设施分离有效利用资源并按构建和计划交付应用程序。 首先我将解释并为您提供有关通信两个 docker 映像的完整信息这些映像可以部署在一台主机上这种类型的 docker 网络通信将使用 docker BRIDGE。 其次我将展示 docker 概念OVERLAY NETWORK其中 docker 映像将部署在单独的主机和单独的网络上。 通信方法将由同一客户端 — 服务器 C 应用程序或命令 ping 进行验证。 请注意网络配置在下一篇文章中描述必须被视为一个简单的示例。通常在每种情况下网络架构都可以以不同的方式组织并连接许多不同的容器。 我还验证了云中的覆盖网络将云 Linode 服务器上的主机与我的本地计算机连接起来本文中未描述因为我必须发布所有 IP 地址。 二、Docker 中的桥接网络 2.1 网络构建 考虑下图请注意当连接在一台 Host上运行的容器时会使用这种类型的通信。在我们的示例中我们将在一个容器中运行 C 客户端在另一个容器中运行 C 服务器本文中包含的程序。通过支持 docker 桥通信管道可以实现容器之间的通信该桥可以关联为内部 ETH 网络仅适用于在同一主机上运行的映像。 您可以根据 Dockerfile 构建容器一个用于客户端一个用于服务器。在检查容器通信时您需要启动第一个服务器运行服务器容器。服务器将等待客户端您从第二个容器启动客户端。 客户端向服务器发送 0-100 之间的随机数。服务器收集从客户端发送的接收信息并作为字符串添加3.1415 并将包重新发送到客户端。 以下示例docker 图像和 C 文件管理器代表了我对软件和硬件的具体设置。您必须或不必更改客户端中的 IP 地址。我使用的端口是5555你可以根据自己的喜好调整。 按作者 2.2 客户端C // Client inspired by GeeksforGeeks#include stdio.h
#include sys/socket.h
#include arpa/inet.h
#include unistd.h
#include string
#include string.h
#include iostream
#include stdlib.h
#include time.h#define PORT 5555int main()
{int sock 0, valread;struct sockaddr_in serv_addr;srand(time(NULL));char buffer[1024] {0};if ((sock socket(AF_INET, SOCK_STREAM, 0)) 0){std::cout Socket creation error std::endl;return -1;}serv_addr.sin_family AF_INET;serv_addr.sin_port htons(PORT);if (inet_pton(AF_INET, 127.0.0.1, serv_addr.sin_addr) 0) //LOCAL//if(inet_pton(AF_INET, 172.17.0.2, serv_addr.sin_addr)0) //CLIENT DOES NOT RUN IS CONTAINER//if(inet_pton(AF_INET, 172.21.0.1, serv_addr.sin_addr)0) //CONTAINER//if(inet_pton(AF_INET, 10.0.9.1, serv_addr.sin_addr)0) //OVERLAY{std::cout Address is invalid ... std::endl;return -1;}if (connect(sock, (struct sockaddr *)serv_addr, sizeof(serv_addr)) 0){std::cout Connection Failed. Try again! ... std::endl;return -1;}int number rand() % 100;std::cout check : number std::endl;std::string str std::to_string(number);char *cstr str[0];send(sock, cstr, strlen(cstr), 0);std::cout Message sent std::endl;valread read(sock, buffer, 1024);std::cout buffer std::endl;return 0;
} Dockerfile 客户端 FROM ubuntu:bionic #pull ubuntu
FROM gcc:latest #pull gcc
#just in case, you can install gcc and cmake
#RUN apt-get update apt-get -y install build-essentials gcc cmake
ADD . /usr/src # add (copy) all from local folder to /usr/src
WORKDIR /usr/src
EXPOSE 5555
RUN g medium_client.cpp -o medium_client
# comment this and un - comment other if you would like to run your # program manually from shell
CMD [./medium_client]
#CMD [/bin/bash] 在终端构建容器上执行以下命令。 sudo docker build . -t client:1 2.3 服务器C // Server side C/C program to demonstrate Socket programming
// Server - inspired by GeeksforGeeks
#include iostream
#include unistd.h
#include stdio.h
#include sys/socket.h
#include stdlib.h
#include netinet/in.h
#include string
#include string.h#define PORT 5555int main()
{int server_fd, new_socket, valread;struct sockaddr_in address;int opt 1;int addrlen sizeof(address);char buffer[1024] {0};if ((server_fd socket(AF_INET, SOCK_STREAM, 0)) 0){std::cout socket failed std::endl;exit(EXIT_FAILURE);}if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,opt, sizeof(opt))){std::cout socket failed std::endl;exit(EXIT_FAILURE);}address.sin_family AF_INET;address.sin_addr.s_addr INADDR_ANY;address.sin_port htons(PORT);if (bind(server_fd, (struct sockaddr *)address,sizeof(address)) 0){std::cout bind failed std::endl;exit(EXIT_FAILURE);}if (listen(server_fd, 3) 0){std::cout listen std::endl;exit(EXIT_FAILURE);}if ((new_socket accept(server_fd, (struct sockaddr *)address,(socklen_t *)addrlen)) 0){std::cout accept std::endl;exit(EXIT_FAILURE);}double pi 3.1415;std::string str1 server ;std::string str2 std::to_string(pi);valread read(new_socket, buffer, 1024);std::cout buffer std::endl;std::string str str1 : str2 and buffer;char *cstr str[0];send(new_socket, cstr, strlen(cstr), 0);std::cout Message hass been sent! std::endl;return 0;
} 服务器 Dockerfile FROM ubuntu:bionic
FROM gcc:latest
ADD . /usr/src
WORKDIR /usr/src
EXPOSE 5555
RUN g medium_server.cpp -o medium_server
# comment this and un - comment other if you would like to run your # program manually from shell
CMD [./medium_server]
#CMD [/bin/bash] 在终端上执行以下命令构建容器。 sudo docker build . -t server:1 执行以下命令创建桥接并检查通信。我假设您在容器客户端和服务器之前构建。 // inspect available docker networks (here is my setup) - see bridge is running as default
sudo docker network ls 接下来您需要检查您的网桥并捕获网桥容器的 IP 地址。子网网络是您的服务器 cpp 程序内部需要的网络。如果您有其他的请更改并重新运行容器构建。 现在你需要创建自己的网络bridge是一个提供者并指定你的名字这里我使用home_net。 sudo docker network create –-driver bridge home_net
// confirm creation running again
sudo docker network ls 您的网络已创建但为了为容器提供通信两个容器都必须连接到网络。执行以下命令以运行容器并附加到您的网络 home_net。 请注意您应该为 /bin/bash 构建两个容器请参阅 Dockerfile 中的注释以便首先使用命令行运行容器而不运行构建容器时已编译的程序。 sudo docker run -it -p 5555:5555 --networkhome_net server:1 接下来再次检查您的网络。查看您的容器已连接到您的网络。 sudo docker network inspect home_net 对其他容器执行相同操作。 sudo docker run -it --networkhome_net client:1 并检查运行以下命令。 sudo docker network inspect home_net 现在您的两个容器正在运行并连接到您的网络。 现在执行以下命令在正在运行的容器中。从服务器启动表单。 ./server_medium # container with server
./client_medium # container with client 现在您可以看到容器之间的一些通信。 三、Docker 中的覆盖网络 当您想要运行的 docker 容器位于不同的物理位置在不同的物理主机上运行时您仍然可以将容器连接到其他容器。这里我们将在 Docker 中使用覆盖网络概念。 您可以想象docker 容器可以与桥接通信类似跨独立的虚拟网络称为覆盖网络发送和接收信息。 这意味着我们可以为容器构建私有虚拟网络并且可以完全透明地交互。请考虑下图。在此示例中我们可以重用图像和 C 客户端-服务器应用程序IP 地址必须相应更改。 请注意在这两种情况下桥接网络和覆盖网络容器之间的通信也可以通过运行命令来验证ping host_IP_address。对于当前网络覆盖网络将执行此类测试。然而作者也在这种类型的 docker 架构中运行 C 应用程序客户端 - 服务器。当主机服务器部署在云端Linode服务器时也验证了有关应用程序的验证。 对于这两种情况桥接、覆盖您有 4 种可能的选择来运行您的应用程序取决于客户端的“位置”。 在构建客户端映像之前请考虑以下需要为medium_client.cpp 提供的IP 地址规范。 //CLIENT AND SERVER RUN LOCAL (NOT IN CONTAINERS)
if (inet_pton(AF_INET, 127.0.0.1, serv_addr.sin_addr) 0)
//CLIENT DOES NOT RUN IN CONTAINER. SERVER IN CONTAINER
//if(inet_pton(AF_INET, 172.17.0.2, serv_addr.sin_addr)0)
//BRIDGE COMMUNICATION
//if(inet_pton(AF_INET, 172.21.0.1, serv_addr.sin_addr)0)
//OVERLAY COMMUNICATION
//if(inet_pton(AF_INET, 10.0.9.1, serv_addr.sin_addr)0) 使用覆盖网络的容器之间的通信将通过命令 ping 进行验证但是正如我之前提到的之前的 C 应用程序也可以工作。 运行以下命令#Host 1 和 #Host 2 3.1 主机1 首先使用主机 1 网络的 IP 地址初始化网络管理器。 sudo docker swarm init --advertise-addr 192.168.0.101 就我而言我收到的输出如下。 3.2 主机1内部主持人 复制并运行命令 docker swarm join --token SWMTKN-1-4pmk157a83i2nungc6jdtmh7vp4ujqich1pho141kox1dzxeiu-c6usd1wik2kl6p3ot7fhx4pd1 192.168.0.101:2377 您应该收到如下信息。 3.2 #主机1其它 运行以下命令并验证 swarm 管理器上图之一显示了 swarm 和网桥 sudo docker network ls 现在创建覆盖网络这里我们的名字是overnet。 sudo docker network create -d overlay overnet 检查您创建的网络。验证身份等 sudo docker network inspect overnet 拉取两个 Ubuntu 映像副本激活网络并创建一个新服务 myservice。以下命令还发送 # Host 2 的图像 sudo docker service create --name myservice --network overnet --replicas 2 ubuntu sleep 运行以下命令确认您已完成的操作。 sudo docker service ls
sudo docker service ps myservice 现在确认您是否正确创建了覆盖网络并且两个容器都已连接。# 主机 1 的 IP 地址为 10.0.1.4。 运行命令 sudo docker network inspect overnet 3.3 主机2 运行相同的操作我不显示图像因为它与上面类似。该主机收到地址IP 10.0.1.5 sudo docker network inspect overnet 3.4 #主机1和#主机2 运行以下命令来安装“ping 命令”。 apt-get update apt-get install -y iputils-ping 在 #Host 1 和 2 上运行命令来捕获容器名称 sudo docker ps 并连接到 docker shell 以运行 ping sudo docker exec -it 94835734987 sh
ping 10.0.1.5 # from host 1
ping 10.0.1.4 # from host 2 感谢您的阅读。 四、参考资源 凡本文遇到的代码资源可在下述地址下 Networking overview | Docker Docs