Linux 시스템에서 두 개의 링크를 생성하는 가상 직렬 포트를 사용하여 socat
한쪽 끝은 직렬 장치이고 다른 쪽 끝은 해당 장치를 사용하는 코드인 것처럼 가장할 수 있습니다. 명령 socat
은 다음과 같습니다.
socat -d -d pty,raw,echo=1 pty,raw,echo=0
시스템에 /dev/pts/3
및 와 같은 두 개의 포트를 생성합니다 /dev/pts/4
.
이제 한 단계 더 나아가 시스템을 나타내는 두 개의 도커 컨테이너를 갖고 싶습니다. 하나는 직렬 장치인 척하고 다른 컨테이너는 장치를 사용하는 코드입니다. 목표는 프로덕션에서 가상 장치 컨테이너를 제거하고 실제 센서만 사용할 수 있다는 것입니다.
문제는 두 컨테이너 간에 공유할 방법을 찾을 수 없는 것 같고 devpts
왠지 이것이 좋지 않은 것 같은 느낌이 든다는 것입니다.
pty 대신 명명된 파이프를 사용하여 정확히 동일한 동작(가상 직렬 포트)을 달성할 수 있는 방법이 있습니까? 그런 다음 컨테이너 간에 파일(예: "/home/user/folder/my_pipe")을 공유할 수 있습니다. 실제로는 두 컨테이너에 "/home/user/folder"를 마운트하면 두 컨테이너 모두 액세스할 수 있습니다 my_pipe
.
아니면 docker를 사용하여 이 모든 작업을 수행하는 또 다른 더 좋은 방법이 있습니까?
답변1
(그런데 "가상 직렬 포트"는 Windows 용어입니다. Unix에서는 이러한 것을 "(의사)ttys"라고 합니다.)
ctrl-alt-delor의 의미는 socat
"직렬 장치 컨테이너"에서 한 가지 작업을 수행할 수 있고 socat
해당 장치를 사용하는 "코드 컨테이너"에서 한 가지 작업을 수행할 수 있다는 것입니다. 따라서 하나의 컨테이너는 다음을 알아야 합니다. 다른 컨테이너의 IP 주소와 포트가 전부입니다(어떤 컨테이너가 다른 컨테이너에 연결되는지 선택할 수 있음). 또한 "코드 컨테이너"에서 실행되는 코드는 tty만 사용하므로 tty에 대한 경로(인수/명령줄 매개변수 등이어야 함) 이외의 어떤 것에도 의존하지 않습니다.
호출의 세부 사항은 socat
수행하려는 다른 세부 사항에 따라 달라지며 tcp-listen
가장 tcp
간단한 변형입니다. socat
등의 예가 많다 .여기.
편집하다
이름 설명: A단말기(텔레타이프)는 특정 직렬 포트 매개변수에 대한 추상화일 뿐만 아니라 문자(예: 줄 끝) 및 기타 사항(예: 줄 규칙)의 번역 및 해석입니다. 의사 터미널은 실제 하드웨어가 없는 터미널입니다. tty는 ioctl
s가 이러한 모든 매개변수를 설정할 수 있다는 점에서 파일과 다릅니다 .
따라서 프로그램에 전송 속도 설정과 같은 기능이 있는 경우 tty가 필요합니다. 그렇지 않은 경우 명명된 파이프를 사용할 수도 있습니다.
그러나 명명된 파이프나 tty를 사용하여 컨테이너 간에 공유하는 경우에는 차이가 없습니다. 둘 중 하나를 넣을 수 있는 어딘가에 공통 파일 시스템을 설정해야 합니다. 이것이 반드시 (도커) 컨테이너가 일반적으로 작동하는 방식은 아닙니다.
OTOH, (docker) 컨테이너는 일반적으로 네트워킹 준비가 되어 있습니다. 따라서 공유 파일 시스템을 갖는 것보다 네트워크를 통해 컨테이너를 연결하는 것이 더 간단할 수 있습니다. 또한 컨테이너가 동일한 호스트에서 실행될 필요가 없다는 추가 이점도 있습니다(도커 컨테이너는 이를 수행하지 않음). 그래서 더 자연스러운 선택이었죠.
물론, 원하는 대로 할 수 있습니다.