2015-08-23 5 views
1

Я начинаю работать с docker для автоматизации envorinments, тогда я пытаюсь построить простой LAMP поэтому Dockerfile является следующее:Docker Lamp Centos7: '/ bin/sh -c systemctl start httpd.service' возвратил ненулевой код: 1

FROM centos:7 

ENV container=docker 

RUN yum -y swap -- remove systemd-container systemd-container-libs -- install systemd systemd-libs 

RUN yum -y update; yum clean all; \ 
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ 
rm -f /lib/systemd/system/multi-user.target.wants/*;\ 
rm -f /etc/systemd/system/*.wants/*;\ 
rm -f /lib/systemd/system/local-fs.target.wants/*; \ 
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ 
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ 
rm -f /lib/systemd/system/basic.target.wants/*;\ 
rm -f /lib/systemd/system/anaconda.target.wants/*; 
VOLUME [ "/sys/fs/cgroup" ] 

RUN yum -y update && yum clean all 
RUN yum -y install firewalld httpd mariadb-server mariadb php php-mysql php-gd php-pear php-xml php-bcmath php-mbstring php-mcrypt php-php-gettext 

#Enable services 
RUN systemctl enable httpd.service 
RUN systemctl enable mariadb.service 

#start services 
RUN systemctl start httpd.service 
RUN systemctl start mariadb.service 

#Open firewall ports 
RUN firewall-cmd --permanent --add-service=http 
RUN firewall-cmd --permanent --add-service=https 
RUN firewall-cmd --reload 


EXPOSE 80 
CMD ["/usr/sbin/init"] 

поэтому, когда я создать образ

docker build -t myimage . 

Затем, когда я запускаю код, который я получаю следующую заблуждаться:

The command '/bin/sh -c systemctl start httpd.service' returned a non-zero code: 1 

Когда я вхожу в интерактивном режиме (прыжки команды после RUN systemctl start httpd.service и rebuidling изображение):

docker run -t -i myimage /bin/bash 

И после попытки запустить вручную службы httpd я получаю ошибки:

Failed to get D-Bus connection: No connection to service manager. 

так, я не знаю, что я делаю неправильно?

+0

Я понимаю, что докер не поддерживает автоматическую систему, но вы можете заставить ее работать с правильным файлом докеров. См. Https://hub.docker.com/r/centos/systemd/. Похоже, что требуется конкретный образ, но я так не думаю, учитывая то, что я видел на другой странице, которую я должен был бы занести в закладки! Во всяком случае, я сам не пробовал, потому что возвращаюсь в LXC. Systemd работает из коробки с контейнером LXC CentOS, и вы можете даже «yum install openssh-server» и SSH в контейнер, если хотите. – Nagev

ответ

2

Прежде всего, добро пожаловать в Докер! :-) Нагрузки загрузочных документов и документов Docker написаны вокруг контейнеров Ubuntu, но мне тоже нравится Centos.

Хорошо, есть несколько вещей, чтобы говорить о здесь:

  1. Вы работаете против a known issue с systemd -На Docker контейнеры, где они, кажется, нужны дополнительные привилегии для запуска, и даже тогда для их работы требуется множество дополнительных конфигураций. Команда Red Hat - experimenting with some fixes (mentioned in comments), но не знаю, где это.

    Если вы хотите попробовать его работать, these are the best instructions I've found, но я играл с этим несколько раз за последние пару недель и пока не получил его.

  2. То, что люди могут сказать, является «настоящей проблемой», заключается в том, что контейнер Docker не следует рассматривать как «мини-виртуальную машину». Docker - designed to run one "root" process per container, а система контейнеров упрощает компоновку нескольких контейнеров вместе - они небольшие на диске, облегчают использование памяти и легко объединяются в сеть.

    Адрес blog post from Docker which gives some background on this. Также есть документы «Основы докеров» на Dockerizing applications и Working with containers.

    Возможно, лучший способ продолжить настройку, которую вы пытаетесь создать здесь (хотя в начале это может показаться более сложным) состоит в том, чтобы разбить ваш «стек» на нужные вам службы, а затем использовать инструмент, такой как docker-compose (introduction, documentation) для создания контейнеров Docker для особого назначения.

    В вашем случае выше у вас есть две службы, веб-сервер и сервер базы данных. Поэтому два контейнера Docker должны работать хорошо, соединенные вместе сетевым подключением к базе данных.Вот некоторые примеры:

    Если запустить одну услугу за Докер контейнер, вам не нужно использовать systemd, чтобы управлять ими, как демон Docker управляет каждый контейнер вроде как это процесс Unix. Когда процесс умирает, контейнер Docker умирает, и это важно, потому что сервер Docker контролирует контейнеры и может автоматически перезапустить их или уведомить вас.

0

Это больше похоже на прекрасный пример, где мой docker-systemctl-replacement будет вписываться. Он легко может интерпретировать «systemctl start httpd.service» без активного SystemD. Я сделал то же самое для некоторых служб баз данных, но не специально для mariadb.service - может быть, вы могли бы попробовать.