docker에서 무언가를 이동할 때 반드시 시스템ctl/systemd가 필요하지 않습니다.

일단 도커 악마 이야기.


docker 본사에서는 호칭을 명확하게 구분하지만, docker 수호자는 'docker cli를 시작하기 위한 실행 환경' 이다.호스트 OS로서 이 서비스를 시작할 필요가 있습니다.
새로운 linux 시스템 호스트 OS에 비해 시스템ctl을 사용하는데 공식 안내서도 마찬가지다.
Docker 데몬 설정 및 오류 슛 - Docker-docs-ja 20.10 문서
따라서 linux 입문자의 대부분은'linux는 시스템ctl을 통해 서비스를 시작해야 한다'는 선입견을 가지고 있다.

systemctl on docker ....?


qita에서는 도커에서 시스템ctl을 사용했다는 보도를 곳곳에서 볼 수 있지만 본질적으로 오용된 것이다.
"docker systemctl" 검색 결과 - Qita
docker 자체에는 원래 docker start/run에서 특정한 프로그램만 시작하는 기능이 있는데 이 기능을 사용하면 용기와 서비스에 정확하게 활용된다.
이 일은 docker 관련 문서에서 자주 언급된다.예를 들면 레드하트.
Docker는 - 해설, 장점, 할 수 있는 일 | Red Hat
지금까지 리눅스 컨테이너에는 여러 프로세스를 관리할 수 있는 init 시스템이 사용됐다.응용 프로그램 전체가 하나의 동작이라는 얘기다.Docker 기술에서는 응용 프로그램을 개별 프로세스로 나누고 해당하는 도구를 제공하는 것을 추천합니다.이 세분법은 좋은 점이 있다.
이것은 아마도 일본어 번역일 것이다. 공식 사이트에도 비슷한 내용이 있다.그래야지.아마 이 근처에...
What is a Container? | App Containerization | Docker
Containers are an abstraction at the app layer that packages code and dependencies together. Multiple containers can run on the same machine and share the OS kernel with other containers, each running as isolated processes in user space. Containers take up less space than VMs (container images are typically tens of MBs in size), can handle more applications and require fewer VMs and Operating systems.
또한, docker는 가상 환경의 일종이지만 VM이 아니다.따라서 여러 VM에 비해 성능이 더 좋은 이유는 대개 이 때문입니다.

시스템 시스템은 서비스 관리자다.


위에서 말한 바와 같이 docker 애호가들 사이에서 시스템ctl==프로세스 관리 도구로 사랑받는 것은 오해이다.
시스템은 시스템 서비스 관리자의 일부분이다.

서비스 매니저가 뭐야?


linux - "init" 와 "서비스 관리자" 는 어떤 차이가 있습니까?
init는 시스템이 시작하는 첫 번째 프로세스입니다.그중에는 다음과 같은 몇 가지 특별한 책임이 있다.
시작 프로세스를 시작하는 데 필요한 다른 사용자 공간 프로세스를 시작합니다.
시스템의 마지막 꺼짐 처리 (init는 사용자 공간이 모두 꺼진 후에 최종적으로 핵을 끄거나 다시 시작하도록 지시합니다.)
분리된 프로세스(상위 프로세스가 실행되지 않은 프로세스)를 사용하고 정리합니다.
다른 한편, 서비스 매니저는 특정 서비스 그룹의 집행 상황을 단독으로 확인하고 이러한 서비스가 선택적으로 계속 집행될 수 있도록 보증한다.정확한 방법은 서비스 간의 의존 관계만 추적하는 기본 스크립트부터 의존 관계를 자동으로 관리하는 복잡한 시스템까지 다양하다.
원래의 SVR4init 실현(기본적으로 리눅스가 나누어 주는 전통적인 시스템v-iit 포장, Busibox init 응용, 그리고 BSD와 Solaris의 init 프로그램의 기초를 포함)에서의 기본 서비스 관리.시작할 때 자동으로 시작되는 프로그램을 정의하고 프로그램이 끝난 후에 다시 시작합니다.따라서 UNIX 쓰기 시스템에서 init가 아닌 기본 서비스 관리자를 찾는 것은 사실상 상당히 어렵다. 기본 라인 수준의 서비스 관리는 기본적으로 init 과정의 일부분이다.
다른 한편, 비init 실시 서비스 매니저를 간단하게 만들 수 있다.클래식 BSD rc.스크립트는 매우 간단한 서비스 관리자 (서비스의 시작과 정지, 기본적인 의존성 관리 제공) 의 예이며, 리눅스에서/etc/init.d개념의 기초를 형성하였다.더 복잡한 예는monit입니다. 이것은 기본 기능에 상태 추적, 자동 리셋 기능, 경보와 일부 시스템 모니터링 지원을 추가합니다.
각양각색의 번거로운 일들이 적혀 있지만 간단하게 말하면 여러 서비스를 적당한 순서로 시작하고 멈추는 것이 주된 목적이다.
예를 들어 흔히 볼 수 있는 WEB 서비스의 경우 안내데스크(apche+mod php 등)보다 mysql가 먼저 떨어지면 데이터를 쓸 수 없다.그래서 mysql는 마지막에 두고 싶어요.등등, 모두 상세한 상황이 있다.
시스템드 자신에 대해서도 대체로 같고, 상세하게 기재된 자료는archlinuxwiki죠.
systemd - ArchWiki
시스템은 Linux 환경의 기본 구성 세트로 SysV 및 LSB init 스크립트와 호환되는 Linux용 시스템 서비스 관리자입니다.시스템드가 적극적으로 병행 서비스를 시작합니다.또한 소켓과 D-Bus의 활성화 활성화 서비스를 사용하여 필요한 데몬을 시작할 수 있으며, Linux의 cloups를 통해 프로세스 관리를 할 수 있다.시스템 상태의 스냅샷을 만들고 복구하며 마운트 지점을 자동으로 관리하고 복잡한 의존 관계를 바탕으로 하는 서비스 컨트롤을 처리합니다.systvinit 대신 SysV 및 LSB init 스크립트를 지원합니다.
linux는 상당히 보급되었지만 서버로서의 측면이 여전히 강하여 원래부터 여러 개의 서비스를 시작할 구상이 있었다.그들은 역사상 다양한 프로그램이 존재했던 적당한 순서로 시작된 서비스 관리자이다.최신 건 시스템드인 것 같은데.
가장 일반적인 서비스 관리자는 Sysvinit입니다.fedora에 시스템d/systvinit 비교가 실렸다.
SysVinit to Systemd Cheatsheet - Fedora Project Wiki

오용이지만 작동이 가능합니다.


물론 그들처럼 qita를 가동할 수 있다.
$ docker pull centos:latest
$ docker run -it centos /bin/bash
XXXXXX# yum install -y httpd
XXXXXX# systemctl start httpd
프로세싱 그룹을 호스트 OS에서 볼 때 부팅해야 합니다.
 170608 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 577f776d40ac71b28e1c2cf7a7c6c26d43ca39d7ad132d7b5889d
 170630 ?        Ss     0:00  \_ /sbin/init
 170672 ?        Ss     0:00      \_ /usr/lib/systemd/systemd-journald
 170685 ?        Ss     0:00      \_ /usr/lib/systemd/systemd-udevd
 170754 ?        Ss     0:00      \_ /usr/sbin/httpd -DFOREGROUND
 170831 ?        S      0:00      |   \_ /usr/sbin/httpd -DFOREGROUND
 170832 ?        Sl     0:00      |   \_ /usr/sbin/httpd -DFOREGROUND
 170834 ?        Sl     0:00      |   \_ /usr/sbin/httpd -DFOREGROUND
 170835 ?        Sl     0:00      |   \_ /usr/sbin/httpd -DFOREGROUND
 170758 ?        Ss     0:00      \_ /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslo
이 중에서 init systemd-*는 이번 간이다.프라이버시가 필요한 건 이 녀석들 잘못이야.(이런 것들이 나쁜 것은 아니지만 본질적인 권한 요구라고 말하기 어렵다.)
관건적인httpd는 init 아래에 걸려 있습니다.-DFOREGRROUND라는 매개변수를 주목합니다.이어서 나오다.

docker에서 단일 프로그램을 직접 시작합니다


장 제목과 같다.build/run을 위해 다음 Docker file을 만듭니다.
FROM centos:latest
RUN yum install -y httpd
CMD /usr/sbin/httpd -DFOREGROUND
CMD는 docker run/start를 시작할 때 이미지의 시작 프로그램을 설정합니다.
docker는 이 CMD에서 지정한 프로그램이 실행되는지 감시하고 있으며, 특별히 지정되지 않으면 프로그램이 끝날 때 docker 용기를 정지합니다.(기본 동작이며 재부팅할 수도 있음)
-FOREGROUND는 httpd가 순조롭게 작동하도록 하기 위한 저주로 앞에서 말한 것은 시스템드가 바뀌었다는 것이다.
이 방법은privileged가 필요 없습니다.
   4669 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id c2a51d2ba0a15d287b58c00da700a70a472bbb898bc88f05
   4691 ?        Ss     0:00  \_ /usr/sbin/httpd -DFOREGROUND
   4720 ?        S      0:00      \_ /usr/sbin/httpd -DFOREGROUND
   4721 ?        Sl     0:00      \_ /usr/sbin/httpd -DFOREGROUND
   4722 ?        Sl     0:00      \_ /usr/sbin/httpd -DFOREGROUND
   4723 ?        Sl     0:00      \_ /usr/sbin/httpd -DFOREGROUND
init, 시스템 d-*dbus-daemon-*를 동반하지 않아도 시작할 수 있습니다.

....그러면httpd라면 공식 이미지를 사용하는 것이 빠를 것이다


센토스 게스트에 얽매이지 않으면 공식 이미지를 사용하는 것이 더 빠르다.
Docker Hub
각 버전을 클릭하면 github의 Docker file에 도달할 수 있습니다.내가 좀 연구했으면 좋겠지.내용은 대체로 정통적인 소스 코드 구축 프로그램이다.

서버 대여 연습?


아마존 EC2 등 대여 서버의 조작 연습에 도커를 사용하는 경우도 있지만 오용도 있다.
  • WEB 애플리케이션의 디버그 연습에 사용할 수 있습니다.나도 가끔 이거 써.
  • 하지만 각종 중간부품(mysql,appache 등) 설정에 사용되는 연습은 좀 어려워요.VMware, Virtulbox와 같은 진정한 VM을 사용하는 것이 좋습니다.
  • 좋은 웹페이지 즐겨찾기