Можете ли вы использовать python-сокеты для связи с Docker-контейнером? - PullRequest
0 голосов
/ 16 мая 2018

В сети Docker я пытаюсь установить связь между двумя контейнерами, используя python-сокеты (для отправки пакетов).Проверка связи работает, но библиотека сокетов python не работает.

Ошибка:

line 6: conn, addr = sock.connect(('172.168.1.2', 4000)) TypeError: 'NoneType' object is not iterable

Первый файл python3 receive.py запускается в container1.Затем python3 send.py запускается в контейнере 2. Контейнер 1 выводит «принято», а затем больше ничего.Контейнер 2 ошибки, как указано выше.

Эта сеть представляет собой пользовательскую сеть с собственной подсетью и шлюзом по умолчанию.Эта ошибка не возникает с тем же самым точным кодом, когда я использую его для подключения к своему Raspberry Pi, но это ошибки с взаимодействием контейнера.

Весь код:

Контейнер1:

import socket

def receive():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(("", 4000))
        s.listen(2)
        conn, addr = s.accept()
        print("accepted")
        print(bytes.decode(conn.recv(1024)))

Контейнер 2:

import socket

def send():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        command = "bridge test!"
        conn, addr = sock.connect(('172.168.1.2', 4000))
        conn.sendall(command)

Для настройки сети:

docker network create --subnet 172.168.1.0/24 testNetwork
docker network connect testNetwork container1
docker network connect testNetwork container2

Я получил IP-адреса контейнеров от Docker Inspect (плюс проверка связи работает) Пожалуйста, помогите!Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

У вас есть пара проблем.

  1. socket.connect ничего не возвращает.Возвращает None.Вы думаете, что возвращается кортеж conn, addr.Python пытается деконструировать все, что возвращено в кортеж, повторяя его, и вы получаете ошибку:

    TypeError: 'NoneType' object is not iterable
    
  2. socket.sendall принимает байты, а не str.Конвертировать

    sock.sendall(command.encode())
    

Вот исправлено send.py:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
command = "bridge test!"
x, y = sock.connect(('172.168.1.2', 4000))
sock.sendall(command.encode())
0 голосов
/ 16 мая 2018

Возможно, вы захотите попробовать API докера для Python.https://github.com/docker/docker-py.git

Вот пример.

#!/usr/bin/python3

import docker
import requests

def main():

  # Connect to the default unix socket (/var/run/docker.sock)
  client = docker.from_env()

  #Pull the nginx:alpine image
  client.images.pull('nginx:alpine')

  #Define some test parameters, our first HTTP port and the number of containers
  portstart = 10000
  count = 1000

  #Create and start 'count' number of containers. Map container port 80 to an external port.
  for a in range(1,count+1):
    container = client.containers.create('nginx:alpine',ports={'80/tcp':portstart+a})
    container.start()
    print('Created container number {} name: {}'.format(a,container.name))

  #Get a list of all the running containers (best you don't run this script on a system which has existing containers running)
  #Iterate through the list, pick out the remote port, and perform a GET request to it to check nginx is online. If the status code is 200, we must be successful!
  container_list = client.containers.list()
  count = 0
  for container in container_list:
    port = container.attrs['HostConfig']['PortBindings']['80/tcp'][0]['HostPort']
    r = requests.get('http://127.0.0.1:{}'.format(port))
    if(r.status_code == 200):
      print('Container {} is alive and working on port {}!'.format(container.name,port))
      count += 1
    else:
      print('Container {} is dead :( Code: {}'.format(container.name,r.status_code))

  print('Summary: Online Containers: {} Offline Containers: {}'.format(count,len(container_list)-count))
  print('Removing containers...')

  #Let's clean up and put our toys back in the toybox.
  for container in container_list:
    container.stop()
    container.remove()

if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...