socat을 통해 TCP 소켓을 통해 컨테이너 내 명령 실행

5682 단어 Dockersocat
네트워크를 통해 외부에서 표준 입력과 출력을 사용하는 명령을 실행하시겠습니까?
컨테이너를 사용하면 드물죠.예를 들어 데이터 과학이 실현한 간단한 파이톤 스크립트.socat를 사용하여 TCP 소켓을 통해 외부에서 명령을 실행합니다.

과제.


예를 들어 1초의 오차도 없는 매우 심한 지령 용기가 있다.이 컨테이너가 실행된 후 표준 출력에 날짜와 시간을 표시합니다.
date 명령은 호스트 측에서 실행하는 것은 매우 쉽지만, 다른 용기에서 실행하려고 해도 명령을 직접 실행하는 방법을 찾지 못한다.

이를 위해 ssh나 Docker on Dockerdocker run date:latest에서 컨테이너를 운행할 수 있지만 호출된 컨테이너에 Docker나 공유date를 설치하는 것은 사전 준비가 번거롭다.
본고는 상기 상황date을 이용하여'다른 용기의 명령을 실행하여 표준 출력을 얻기를 원한다'는 상황을 해결하고자 한다.

구체적인 예


이전 글에서는 헤드 없는 크롬으로 HTML을 표준 출력으로 덤프하는 컨테이너를 제작했다.이 컨테이너를 실행하면 대상 웹 사이트의 HTML이 출력됩니다.
$ docker pull grohiro/headless-chrome
$ docker run grohiro/headless-chrome http://www.google.com/
#=> (HTMLが出力される)
컨테이너 내부docker.sock에서 명령을 실행한 후 HTML을 덤프하고 있습니다.socat를 사용하면 TCP 포트 9000을 통해 외부에서 컨테이너를 실행할 수 있습니다.

컨테이너 이미지 만들기


먼저 위 크롬 용기에 추가gooogle-chrome된 이미지를 제작했다.머리 없는 크롬을 시작하는 래퍼 스크립트도 추가됐다.
Dockerfile
FROM grohiro/headless-chrome
USER root
RUN apt-get install -y -qq socat
COPY ./chrome.sh /
ENTRYPOINT ["socat", "tcp4-listen:9000,fork,reuseaddr", "system:/chrome.sh"]
chrome.sh
#!/bin/sh
read URL
google-chrome --headless --no-sandbox --dump-dom --start-maximized --disable-gpu "$URL"
파일을 만들면 Docker 이미지가 만들어집니다.이름은 socat입니다.
$ docker build -t headless-chrome-socat .
생성된 컨테이너를 실행하면 TCP 포트 9000이 socat에 바인딩되어 LISTEN 상태가 됩니다.이 포트로 전송된 데이터는 표준 입력단headless-chrome-socat으로 전송됩니다.socat 표준 입력 문자열을 Chrome의 매개변수로 실행합니다.Chrome은 지정된 URL을 읽고 HTML을 표준 출력으로 이동합니다.chrome.sh 이 표준 출력을 요청 원본에 응답하는 용기로 되돌려줍니다.
실행 가능한 컨테이너는 소켓 입력을 로드하여 Chrome 덤프의 HTML을 가져옵니다.

동작 확인


먼저 호스트 측면에서 URL을 수동으로 입력하여 HTML 출력 여부를 확인합니다.
다음 명령으로 생성된 컨테이너 포트 9000을 chrome.sh에 매핑한 후 시작합니다.
$ docker run -p 9000:9000 headless-chrome-socat
포트 9000에 연결하여 URL을 보내 보십시오.
$ nc 127.0.0.1 9000
http://www.google.com
#=> (HTMLが出力される)
입력한 http://www.google.com 경과socat를 헤드 없는 크롬에 건네주고 HTML을 출력했다.

docker-compose


완료 후 정의127.0.0.1:9000.
docker-compose.yml
services:
  crawler:
    # コマンド実行元のコンテナ
    image: php:7.5-slim
  chrome:
    # ヘッドレス Chrome コンテナ
    image: headless-chrome-socat
chrome.sh 에서 docker-compose.yml 용기에서 docker-compose.yml URL을 보내면 크롬을 실행하면 HTML을 얻을 수 있습니다.
예를 들어 crawler 컨테이너 내의 PHP에서 tcp://chrome:9000로 데이터를 읽고 쓸 수 있습니다.
$response = "";
$fp = fsockopen('chrome', '9000');
if ($fp) {
    fwrite($fp, "https://www.google.com\n");
    while (!@feof($fp)) {
        $response .= fgets($fp, 4096);
    }
}

좋은 웹페이지 즐겨찾기