Данный:
- У меня есть контейнерная служба, которая отправляет пакеты UDP в список сетевых элементов (сторонние серверы-приемники системного журнала).
- Каждый целевой сетевой элемент задается IP-адресом, его номер порта постоянный, одинаковый для каждого узла.
Мне нужно создать простую тестовую среду, как на графике ниже. Основная служба выдает сообщения системного журнала, на графике она названа ПРОИЗВОДИТЕЛЬ КОНТЕЙНЕР
.
ИСПЫТАТЕЛЬНЫЙ КОНТЕЙНЕР
может легко создавать докер-контейнеры, поэтому я выбрал нерест альпийский/сокат: последний
.
Вопрос в том:
- Какие аргументы я должен передать
сокат
чтобы установка работала?
- О чем еще мне нужно заботиться?
Я перепробовал множество комбинаций сокат
args до сих пор, но безуспешно.
С сокат UDP-RECV: 514 UDP-SENDTO: 172.25.0.2: 65354, привязка =: 1234
Я получаю сообщения в прокси-контейнерах, но в тестовом контейнере ничего не приходит.
Кажется, мне не хватает общих знаний. Может ли кто-нибудь объяснить, как это должно быть сделано?
Код, который я использую в тестовом контейнере, выглядит примерно так:
импорт ОС
импортная платформа
импорт потоков
из сокета импортировать сокет
импортировать докер
из докера импортировать DockerClient
из контейнера импорта docker.models.containers
из сети импорта docker.models.networks
защита create_proxy():
docker_client: DockerClient = docker.from_env()
test_network: Network = docker_client.networks.create(f'test_network_{os.environ.get("HOSTNAME")}')
testrunner_container: Container = docker_client.containers.get(platform.node())
testrunner_container.reload()
test_container_ip = testrunner_container.attrs['NetworkSettings']['Networks'][test_network.name]['IP-адрес']
socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # привязка к случайному локальному порту
_, test_container_port = socket_.getsockname()
прокси_порт = 1234
сокат_аргументы = [
'-d', '-d', f'UDP-RECV:514', f'UDP-SENDTO:{test_container_ip}:{test_container_port},bind=:{proxy_port}',
]
proxy_container: Container = docker_client.containers.run(
'альпийский/сокат: последний',
сокат_аргументы,
имя = 'udp_proxy_container',
сеть=test_network.name,
отсоединить = Верно,
удалить = Верно,
)
proxy_container.reload()
proxy_ip = proxy_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']
socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_.bind(('', 0)) # привязка к случайному локальному порту
socket_.connect((proxy_ip, proxy_port))
socket_.settimeout(1)
def Receive_loop (очередь):
пока верно:
пытаться:
сообщение = socket_.recv(1024)
если b'STOP IT' в сообщении:
сломать
очередь.дополнение(сообщение)
кроме socket.timeout как e:
log.error(f"{type(e).__name__} в цикле приема заглушки Syslog: {e}")
msg_queue = []
Receive_thread = threading.Thread (target = Receive_loop, args = (msg_queue,))
Receive_thread.daemon = Истина
receive_thread.start()
# ... какой-то другой код