socat을 통해 TCP 소켓을 통해 컨테이너 내 명령 실행
컨테이너를 사용하면 드물죠.예를 들어 데이터 과학이 실현한 간단한 파이톤 스크립트.
socat
를 사용하여 TCP 소켓을 통해 외부에서 명령을 실행합니다.과제.
예를 들어 1초의 오차도 없는 매우 심한 지령 용기가 있다.이 컨테이너가 실행된 후 표준 출력에 날짜와 시간을 표시합니다.
이
date
명령은 호스트 측에서 실행하는 것은 매우 쉽지만, 다른 용기에서 실행하려고 해도 명령을 직접 실행하는 방법을 찾지 못한다.이를 위해 ssh나 Docker on Docker
docker 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);
}
}
Reference
이 문제에 관하여(socat을 통해 TCP 소켓을 통해 컨테이너 내 명령 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/grohiro/items/0ebcd58e00ff2067e926텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)