मैं सिस्टम बूट पर डोकर कंटेनर को स्वचालित रूप से कैसे शुरू कर सकता हूं?


111

माना कि मेरे पास एक डॉकटर कंटेनर है जिसे मैं चलाना चाहता हूं, फिर मैं कॉल कर सकता हूं

$ docker run ...

और सब कुछ ठीक है। क्या कंटेनर को इस तरह से चलाने के लिए एक अंतर्निहित तरीका है कि यह स्वचालित रूप से फिर से चालू हो जाएगा, अगर सिस्टम क्रैश और रीबूट करता है?

यदि हां, तो क्या यह डॉकर कंपोज़ में भी उपलब्ध है?

जवाबों:


134

हां, डॉकटर ने नीतियों को फिर से शुरू कर दिया है जैसे docker run --restart=alwaysकि यह संभाल लेगा। यह भी compose.yml config फाइल के रूप में उपलब्ध है restart: always


25
यह पहला और स्वीकृत जवाब है, हालांकि संभवतः उस सुविधा की खोज करने वाले अधिकांश लोग वास्तव में एक सेवा के रूप में अपने कंटेनर को चलाना चाहते हैं। सेवा प्रबंधक के रूप में उपयोग करनेSystemd वाला @kon का उत्तर उस उद्देश्य के लिए सबसे अच्छे समाधानों में से एक है और इसके लिए अधिक अपवोट चाहिए।
रेमी बेचारे

1
यह मेरे काम नहीं आया। मेरे पास एक कंटेनर है जिसे "crmpicco-mysql" कहा जाता है और मैं भाग गया docker run --restart=always crmpicco-mysqlऔर मुझे त्रुटि मिली Unable to find image 'crmpicco-mysql:latest' locally:।
crmpicco

2
आपकी त्रुटि असंबंधित है। आप एक अलग प्रश्न पोस्ट करना चाह सकते हैं, लेकिन ऐसा लगता है कि आप docker छवि नामों और docker कंटेनर नामों को भ्रमित कर रहे हैं। docker runआदेश एक छवि है जो आप के माध्यम से सूचीबद्ध कर सकते हैं के नाम की उम्मीद है docker images
पीटर लियोन

12
इसके साथ एकमात्र समस्या यह है कि "हमेशा" कंटेनर को तब भी अनन्त रूप से पुनरारंभ करेगा जब इसे एक त्रुटि के कारण रोका गया था (डॉक्स देखें)। ऐसी नीति होनी चाहिए जो केवल डेमॉन-स्टार्ट पर शुरू हो
लॉस्टिकलैंड

4
मुझे लगा कि कंटेनरों / डॉकरों के प्रमुख विक्रय बिंदुओं में से एक यह था कि मुझे अपनी प्रत्येक सेवा को सिस्टमड (जो एक दर्द हो सकता है) को स्थापित करने और प्रबंधित करने की आवश्यकता नहीं है।
मार्क

140

यदि आप चाहते हैं कि कंटेनर को तब भी शुरू किया जाए जब तक कि किसी उपयोगकर्ता ने लॉगिन नहीं किया हो (जैसे कि वर्चुअलबॉक्स वीएम जो मैं केवल शुरू करता हूं और हर बार लॉगिन नहीं करना चाहता)। यहां मैं उबंटू 16.04 एलटीएस के लिए प्रदर्शन किए गए चरण हैं। एक उदाहरण के रूप में, मैंने एक oracle db कंटेनर स्थापित किया:

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

और निम्नलिखित सामग्री जोड़ें:

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

और स्टार्टअप पर सेवा को सक्षम करें

sudo systemctl enable docker-MYPROJECT-oracle_db.service

अधिक जानकारी के लिए https://docs.docker.com/engine/admin/host_integration/


9
डॉकटर-कम्पोज़ के साथ ऐसा करने की चाह रखने वालों के लिए, आप dockerकमांड को ऊपर से बदल सकते हैं, docker-compose-f/usr/bin/docker-compose -f /path/to/docker-compose.yml up
डॉक

1
@ Charlesreid1 में जो जोड़ने के लिए कहा गया है, यदि आपकी फ़ाइल docker-compose.ymlनिर्दिष्ट करती है , तो स्पष्ट रूप से अपने डॉक संकलन .envफ़ाइल --project-directory /path/to को निर्दिष्ट करने के अलावा उपयोग करें।
whlteXbread

1
डॉकर का लॉग सिस्टम और प्रोसेस मैनेजर है। यह दुर्भाग्यपूर्ण है कि इसके पास सही पुनरारंभ नीति नहीं है।
फ्रेंकलिन यू

किसी भी विचार कैसे विंडोज सर्वर 2012 पर ऐसा करने के लिए? जब तक मैं लॉगिन नहीं करता मैं डॉक नहीं चला सकता ...
एलेक्स लॉर्ड मोर्डर

यह कुछ के लिए भी दिलचस्प हो सकता है कि एक सहायक [Unit]निर्देश कहा जाता है Before=। खासतौर पर डेटाबेस मैनेजमेंट सिस्टम जैसी चीजें शुरू करते समय, यह सुनिश्चित करने में मददगार हो सकती है कि यह विशिष्ट अन्य सेवाओं से पहले शुरू हो ।
मीका

92

डिफ़ॉल्ट पुनः आरंभ नीति है no

निर्मित कंटेनरों के लिए docker updateपुनरारंभ नीति को अद्यतन करने के लिए उपयोग करें।

docker update --restart=always 0576df221c0b

0576df221c0b कंटेनर आईडी है।


क्या alwaysइसका मतलब यह नहीं है कि अगर मैं इसे रोक देता हूं तो भी कंटेनर फिर से चालू हो जाएगा ? निश्चित रूप से इस तरह की लगातार शुरुआत के बिना एक कंटेनर को रिबूट पर पुनरारंभ करने का एक तरीका है ...
मार्क

4
@ मारक: नहीं। प्रलेखन देखें :If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
SaeX

14

आप उपयोग कर सकते हैं docker update --restart=on-failure <container ID or name>

नाम का सुझाव देने पर, on-failureन केवल कंटेनर को विफलता पर, बल्कि सिस्टम बूट पर भी पुनरारंभ किया जाएगा।

प्रति प्रलेखन , एक से अधिक पुनः आरंभ विकल्प हैं:

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

3
वाह अच्छा काम यह खोज, यह देखते हुए कि यह प्रलेखन में उल्लेख नहीं किया गया है। मेरे लिए सही समाधान।
कैमरन हडसन

असफलता का उपयोग करने के बारे में ध्यान देने वाली एक बात, यदि आपके पास एक कंटेनर है जो पहले से चल रहे दूसरे पर निर्भर करता है, तो "स्टार्ट ऑर्डर" नहीं लगता है, इसलिए कोई भी शुरू कर सकता है और तुरंत विफल हो सकता है और ओएस बूट पर कभी भी शुरू नहीं हो सकता है
फेर

12

1) सबसे पहले, आपको बूट पर docker सेवा को सक्षम करना होगा

$ sudo systemctl enable docker

2) फिर अगर आप डोकर-लिखें .yml फ़ाइल जोड़ने है restart: alwaysया आप डोकर कंटेनर जोड़ने अगर पुनः आरंभ = हमेशा इस तरह:

docker run --restart=always और डॉकटर कंटेनर चलाएं

सुनिश्चित करो

यदि आप मैन्युअल रूप से एक कंटेनर को रोकते हैं, तो इसकी पुनरारंभ नीति को तब तक अनदेखा कर दिया जाता है जब तक कि डोकर डेमॉन पुनरारंभ नहीं हो जाता है या कंटेनर मैन्युअल रूप से पुनरारंभ नहीं हो जाता है।

डॉकर के आधिकारिक पृष्ठ पर इस पुनरारंभ नीति को देखें

3) यदि आप डॉकटर-कंपोज़ शुरू करना चाहते हैं, तो जब आप अपने सिस्टम को रिबूट करते हैं तो सभी सेवाएँ चलती हैं।

$ docker-compose up -d

9

प्रलेखन से अधिक "कोमल" मोड:

docker run -dit --restart unless-stopped <image_name>

2
दुर्भाग्य से, जब डॉकटर डेमन को रिबूट द्वारा रोक दिया जाता है, तो डेमन कंटेनरों को "बंद" कर देता है, उन्हें रोक दिया जाता है। फिर जब सिस्टम बूट होता है, तो यह वास्तव में इन्हें शुरू नहीं करता है। यह गूंगा है। यहां बग है: github.com/docker/for-linux/issues/652
mlissner

restart=unless-stoppedविकल्प है जब डोकर इंजन पुनरारंभ कंटेनर शुरू करने के लिए प्रयास करेंगे। मेरे द्वारा देखे गए अपवाद तब होते हैं जब डॉक इंजन स्वयं को रिबूट पर शुरू करने के लिए स्वचालित रूप से कॉन्फ़िगर नहीं किया जाता है ( systemctl status dockerयह सुनिश्चित करने के लिए जांचें कि यह सक्षम है) और नेटवर्किंग शुरू होने से पहले कंटेनर शुरू करने वाला इंजन तैयार है जिसे मैंने केवल ओवरले नेटवर्किंग के साथ देखा है। ये दोनों restart=alwaysभी टूट जाते ।
बीएमडब्ल्यू

2

मैं विंडोज पर बूट कंटेनर स्टार्टअप हासिल करना चाहता था।

इसलिए, मैंने अभी एक अनुसूचित कार्य बनाया है जो सिस्टम बूट पर लॉन्च होता है। वह कार्य बस "Windows.exe के लिए डॉकर" (या जो भी आपके डॉक करने योग्य का नाम है) शुरू होता है।

फिर, "हमेशा" की पुनरारंभ नीति वाले सभी कंटेनर शुरू हो जाएंगे।


2

यह क्या है के लिए crontab है:

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

अपने उपयोगकर्ता कॉन्टैब तक पहुँचें crontab -eया इसे crontab -lअपने सिस्टम क्रॉस्टैब के साथ दिखाएँ या संपादित करें/etc/crontab


डॉक सेवा से पहले क्रोन सेवा शुरू होती है ... इस मामले में यह विफल होगा ...
अखिल जलगम

1
@AkhilJalagam मुझे यकीन नहीं है कि मैं आपके मुद्दे को समझता हूं। "स्लीप 10" क्रोन को शुरू करने के लिए बहुत समय देता है, फिर सिस्टम बूट / रिबूट के बाद कंटेनर शुरू करता है। इस पद्धति को शुरू करने से पहले किसी को लॉगिन करने की आवश्यकता नहीं है और यह गन्दा, जटिल सिस्टमड सेवा इकाइयों से बचता है। सिस्टमड सर्विस यूनिट विधि मेरे उदाहरण की तुलना में और भी अधिक हैकरी महसूस करती है।
ट्रैविस रेनयार्ड

2

आप एक कंटेनर को चला सकते हैं जो हमेशा के लिए पुनरारंभ होता है:

$ docker run -dit --restart unless-stopped <image name OR image hash>

यदि आप एक रनिंग कंटेनर का कॉन्फिगर बदलना चाहते हैं, तो आपको इसे अपडेट करना चाहिए :

$ docker update --restart=<options> <container ID OR name>

और यदि आप कंटेनर की वर्तमान नीति देखना चाहते हैं, तो पहले स्थान पर ऊपर दिए गए से पहले निम्न कमांड चलाएँ:

docker inspect gateway | grep RestartPolicy -A 3

आखिरकार, सिस्टम बूट पर स्थापित डॉकटर डेमॉन इनेबल्ड को बनाना न भूलें :

$ systemctl enable docker

पुनरारंभ नीतियों की पूरी सूची देखने के लिए, नीतियां देखें: पुनः प्रारंभ करें


1

मेरे पास लिनक्स सिस्टम चलाने वाला एक समान मुद्दा है। सिस्टम बूट होने के बाद, "जब तक रोका नहीं" की पुनरारंभ नीति वाला एक कंटेनर स्वचालित रूप से पुनरारंभ नहीं होगा, जब तक कि मैंने एक कमांड टाइप नहीं किया है जो किसी तरह से "docker ps" का उपयोग करता है। मुझे आश्चर्य हुआ क्योंकि मुझे उम्मीद थी कि कमांड केवल कुछ स्टेटस की जानकारी देगी। इसके बाद मैंने कमांड "systemctl स्टेटस डॉकटर" की कोशिश की। ऐसी व्यवस्था पर जहां कोई डॉकटर कमांड नहीं चलाए गए थे, इस कमांड ने निम्नलिखित की सूचना दी:

● docker.service - Docker Application Container Engine

   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

     Active: inactive (dead)    TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

ऐसी प्रणाली पर जहाँ "docker ps" को अन्य डॉकटर कमांड के साथ नहीं चलाया गया था, मुझे निम्नलिखित मिला:

● docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

    Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago

TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

   Main PID: 3135 (dockerd)
      Tasks: 13

    Memory: 116.9M
     CGroup: /system.slice/docker.service
             └─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
 ... [various messages not shown ]

सबसे अधिक संभावना यह है कि डॉकटर कंटेनर को पूरी तरह से शुरू करने और शुरू करने से पहले कुछ डॉकटर कमांड का इंतजार करता है। आप संभवतः उन सभी सेवाओं के बाद एक बिंदु पर एक सिस्टमड यूनिट फ़ाइल में "docker ps" चला सकते हैं, जिन्हें आपके कंटेनरों की प्रारंभिक आवश्यकता है। मैंने निम्नलिखित के साथ निर्देशिका / lib / systemd / प्रणाली में docker-onboot.service नामक फ़ाइल डालकर इसका परीक्षण किया है:

[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run.  This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps

[Install]

WantedBy = multi-user.target

अब तक (एक परीक्षण, इस सेवा के साथ सक्षम), कंटेनर तब शुरू हुआ जब कंप्यूटर बूट किया गया था। मैंने docker.service पर निर्भरता की कोशिश नहीं की क्योंकि docker.service तब तक शुरू नहीं होगी जब तक कि docker कमांड नहीं चलती। अगला परीक्षण डॉकटर-ऑनबूट अक्षम के साथ होगा (यह देखने के लिए कि क्या वांटेडबी निर्भरता स्वचालित रूप से इसे शुरू करेगी)।


0

एक कंटेनर शुरू करने के लिए और सिस्टम रिबूट उपयोग पर स्वचालित रूप से पुनरारंभ करने के लिए इसे सेट करें

docker run -d --restart unless-stopped ecstatic_ritchie

ecstatic_ritchieब्याज में कंटेनर को निर्दिष्ट करने वाला एक उदाहरण नाम कहां है। उपयोगdocker ps -aसभी कंटेनर नामों को सूचीबद्ध करने के लिए ।

सिस्टम रिबूट पर विशेष रूप से चलने वाले कंटेनरों को स्वचालित रूप से शुरू करने के लिए

docker update --restart unless-stopped ecstatic_ritchie

सिस्टम रिबूट पर सभी चलने वाले कंटेनरों को स्वचालित रूप से शुरू करने के लिए

docker update --restart unless-stopped $(docker ps -q)

डॉकर होमपेज पर और देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.