명령을 지정하지 않고 Docker 컨테이너에서 전체 OS를 어떻게 실행할 수 있습니까?


25

CoreOS Docker Documentation을 따르고 있으며 다음과 같은 명령으로 컨테이너를 시작하는 것에 대해 언급합니다.

docker run someImageName /bin/somebinary

someImageName이미지는 어디에 있습니까 ? / bin / somebinary가 종료되면 이미지가 더 이상 실행되지 않습니다.

실행할 바이너리를 지정하지 않고 이미지를 실행하고 싶습니다. 대신 이미지 OS 내에서 일반적으로 실행되는 서비스 (예 : systemd / sysvinit)를 실행하고 싶습니다 .

이것은 누군가가 Docker와 관련하여 가장 일반적인 것으로 보이지만 명령없이 이미지를 실행하려고하면 다음을 반환합니다.

2014/02/05 14:49:19 Error: create: No command specified

어떻게 명령을 지정하지 않고 Docker 컨테이너를 시작하고 전체 OS를 실행할 수 있습니까?



@FredtheMagicWonderDog 대답은 동일하지만 확실하지는 않습니다.
mikemaccana

답변:


24

여기에 설명 된대로 /sbin/init단일 사용자에서 다중 사용자 모드로 부팅하는 다른 유닉스 부팅과 마찬가지로 명령으로 실행하면 됩니다.

https://stackoverflow.com/questions/19332662/start-full-container-in-docker

컨테이너는 완전한 OS 일 수 있으며, 그럴 필요는 없습니다 (해당 VM은 물론 구성 및 관리가 더 복잡합니다).

Docker의 요점은 응용 프로그램 컨테이너를 쉽게 만드는 것이므로 전체 OS가 아닌 앱만 구성하면됩니다.


감사. / sbin / init로 이미지를 시작한 후 docker ps -notrunc컨테이너 ID sudo /usr/sbin/lxc-attach -n containerID를 얻기 위해을 실행 한 다음 실행중인 이미지를 가져 왔습니다. 다른 포스터가 언급했듯이, 실제로 두 번째 init가 필요하지 않으므로 다음에 단일 명령 컨테이너를 확인하겠습니다.
mikemaccana

VM에서 전체 OS를 실행할 필요가 없다고 말하는 것은 실제 머신에서 전체 OS를 실행할 필요가 없다는 것과 같습니다. 프로그램은 stdlib없이 실행되고 초기화됩니다.
Lie Ryan

11

Docker는 운영 체제 컨테이너가 아닌 응용 프로그램 컨테이너 의 관리 및 배포를위한 시스템입니다 . 운영 체제 부팅으로 도커 컨테이너 실행을 혼란스럽게하는 것처럼 보입니다.

Docker 컨테이너는 단일 명령으로 시작할 수있는 단일 용도의 매우 좁은 범위의 응용 프로그램이어야합니다. 그보다 복잡한 것을 찾고 있다면 Docker가 원하는 솔루션이 아닙니다. 이 경우 KVM, ESXi, OpenVZ, LXD 등을 확인하십시오 .

기본값 CMDENTRYPOINT컨테이너를 지정하는 방법을 찾고 있다면 Dockerfile을 사용하여 빌드 타임에 할 수 있습니다 .


5
Docker가 무엇인지 알고 있습니다. 애플리케이션 컨테이너는 운영 체제 (예 : Fedora 또는 Ubuntu)를 기반으로합니다. Docker 컨테이너와 같은 Unix 사용자조차도 Unix의 영구 응용 프로그램은 initscript 또는 시스템 단위 파일에서 시작됩니다. 예를 들어, 앱이 다운되면 systemd 제공과 같은 임계 값으로 자동으로 다시 시작하고 싶습니다.
mikemaccana

5
컨테이너에 너무 많은 양을 넣으려고합니다-운영 체제가 아닙니다. 프로세스 감독은 각 컨테이너 외부에서 처리해야합니다.
EEAA

1
프로세스가 죽으면 ... 전체 컨테이너를 다시 시작 하시겠습니까? 나는 그렇게 비싸지 않아서 괜찮을 것 같아요. 내 컨테이너에 / sbin / init가 있지만 전혀 사용되지 않습니다.
mikemaccana

1
그렇습니다. 당신의 용기는있다 /sbin/init,하지만하지 않습니다 해야 할 것이 있습니다. 기본 우분투 컨테이너 또는 이와 유사한 것을 사용했을 것입니다. 이 컨테이너에는 원하는 경우 제거 할 수 있는 많은 비트가 있습니다.
EEAA

1
@ValkoSipuli 그 의견을 자유롭게 가질 수 있습니다. 컨테이너 내에서 하나 이상의 프로세스를 실행하면 컨테이너를 사용하는 많은 이유가 처음부터 유지된다고 여전히 생각합니다. 컨테이너 내부에서 OS를 실행할 수있는 장소가 있습니까? 아마. 그러나 이것은 예외이며 찬반 양론에 대한 많은 심의 없이는 수행해서는 안됩니다.
EEAA

5

컨테이너에서 전체 운영 체제를 실행하려면 다음 Dockerfile을 작성하십시오.

FROM fedora:25

CMD /sbin/init

그런 다음 컨테이너를 빌드하고 시작하고 그 안에 쉘을 입력하여 컨테이너 내부에서 실행되는 서비스를 탐색하십시오.

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

컨테이너 내부의 전체 시스템 서비스. 아름다운.


0
docker pull ubuntu

동일한 이미지에서 필요한만큼 여러 번 실행하십시오. 새로운 컨테이너가 만들어지고 각각의 컨테이너를 시작하고 중지하여 자체 구성을 저장합니다. 편의상 각 컨테이너에 "--name"으로 이름을 지정하는 것이 좋습니다.

Fi :

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

그게 다야.

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

그 후 컨테이너를 영구적으로 생성하면 VM처럼 컨테이너를 시작하고 중지 할 수 있습니다.

docker start MyContainer1

용기에 넣고 원하는 일을하려면 :

docker exec -it MyContainer1 bash
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.