시스템 사용자 모드에서 도커를 기다리는 방법은 무엇입니까?

시스템 사용자 모드에서 도커를 기다리는 방법은 무엇입니까?

Docker 컨테이너를 시작하려고 합니다(아마도https://github.com/ibuildthecloud/systemd-docker, 방금 "systemd --user" 유닛 파일에서 알아냈습니다. 처음부터 시작하길 바랍니다.

문제는 After=docker.servicesystemd 사용자 모드 장치가 systemd 시스템 모드 장치를 볼 수 없기 때문에 이를 수행할 수 없다는 것입니다.

누구든지 이 문제를 해결할 좋은 방법이 있습니까?

지금까지 내 "최고의" 아이디어는 "docker info"가 의미 있는 것을 반환한 다음 After=를 반환할 때까지 루프에서 대기하는 스크립트를 실행하는 한 번만 실행되는 시스템 단위를 만드는 것입니다. 방법.

답변1

이 문제를 해결하는 좋은 방법은 Docker 데몬(다음에서 실행)을 사용하는 것입니다.체계systemd) 소켓 활성화를 사용합니다.

이렇게 하면 docker 명령을 시작할 때(예:사용자systemd 장치) 연결할 소켓이 있지만 Docker 데몬이 실제로 서비스를 제공할 준비가 될 때까지 차단됩니다.

명시적 종속성을 제거하기 위한 소켓 활성화의 기본 아이디어는 에 설명되어 있습니다.systemd 블로그의 이 게시물에서는 전통적으로 명시적 종속성을 통해 처리되지만 소켓 활성화를 사용하면 더 이상 구성할 필요가 없는 네 가지 서비스에 대해 설명합니다. 다음은 발췌한 내용입니다(길지만 의미가 있습니다).

소켓 활성화를 사용하면 주문 없이 정확히 동시에 네 가지 서비스를 모두 시작할 수 있습니다. 청취 소켓 생성이 데몬 프로세스 외부로 이동되었으므로 동시에 시작할 수 있으며 서로의 소켓에 즉시 연결할 수 있습니다. 즉, 한 단계에서 /dev/log및 소켓이 생성되고 /run/dbus/system_bus_socket다음 단계에서 네 가지 서비스가 모두 동시에 생성됩니다. D-Bus는 syslog에 로그를 기록하려고 할 때 /dev/log소켓 버퍼가 가득 차 있지 않는 한 즉시 다른 초기화 작업을 계속 수행할 수 있습니다. syslog 서비스가 포착되면 대기 중인 메시지를 처리합니다. 소켓 버퍼가 가득 차면 클라이언트 로깅은 소켓에 다시 쓸 수 있을 때까지 일시적으로 차단되고, 로그 메시지를 쓸 수 있을 때 계속됩니다. 이는 우리 서비스의 스케줄링이 전적으로 커널에 의해 수행됨을 의미합니다. 사용자 공간 관점에서 볼 때 모든 서비스는 동시에 실행되며 한 서비스가 이를 필요로 하는 다른 서비스를 따라잡을 수 없으면 일시적으로 해당 요청을 차단합니다. 사용 가능한 경우 계속 실행됩니다. 이러한 요청이 전송되었습니다. 이 모든 것은 완전히 자동이며 사용자 공간에는 보이지 않습니다. 따라서 소켓 활성화를 통해 시작을 크게 병렬화할 수 있으므로 이전에는 직렬화가 엄격하게 필요하다고 생각되었던 서비스를 동시에 시작할 수 있습니다. 대부분의 Linux 서비스는 소켓을 통신 채널로 사용합니다. 소켓 활성화를 통해 클라이언트와 서버는 이러한 채널을 동시에 시작할 수 있습니다.

Docker 데몬은 소켓 활성화를 지원합니다.2014년부터이므로 사용 중인 버전이 이미 이 기능을 지원할 수도 있습니다.

배포판에 docker.socket유닛이 포함되어 있는지 확인하세요. 이 경우 유닛을 활성화하기만 하면 됩니다.

Docker 데몬이 소켓 활성화를 지원하지만 배포판에 이 docker.socket장치가 포함되어 있지 않은 경우 검토하세요.이 튜토리얼설정 방법에 대한 지침입니다.


고려해야 할 또 다른 옵션은 Docker에서 Docker로 전환하는 것입니다.팟캐스트.

Podman은 Docker에 대한 드롭인 호환 대체품이 되려고 시도합니다(따라서 동일한 명령줄을 사용할 수 docker있으므로 podman.

이들 간의 주요 차이점은 podman에는 데몬이 필요하지 않으므로 컨테이너를 시작하기 전에 데몬이 시작될 때까지 기다릴 필요가 없다는 것입니다. Podman은 최신 버전의 Linux 배포판에서 소프트웨어 패키지로 제공됩니다. 그리고 지금처럼 사용할 수 있다는 사실로 인해 docker시작하기가 쉬워질 것입니다.

답변2

그건 그렇고, 나는 컨테이너를 실행하기 위해 systemd를 사용하지 않고docker-systemctl-교체완전히 스크립트되었습니다.

이 경우 사용자 모드는 컨테이너가 "USER=" 설정으로 실행되어 모든 프로세스를 루트가 아닌 소유자에게 푸시하기 때문에 다른 의미를 갖습니다. 이는 일부 docker-cloud 구현에 대한 요구 사항입니다. 예는 다음에서 찾을 수 있습니다.도커-systemctl-이미지

관련 정보