Docker 컨테이너를 시작하려고 합니다(아마도https://github.com/ibuildthecloud/systemd-docker, 방금 "systemd --user" 유닛 파일에서 알아냈습니다. 처음부터 시작하길 바랍니다.
문제는 After=docker.service
systemd 사용자 모드 장치가 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-이미지