Pre*_*and 10 containers docker
在我的Dockerfile中,我正在尝试安装多个服务,并希望在启动容器时自动启动它们.其中一个服务是mysql,当我启动容器时,我没有看到mysql服务启动.当我尝试手动启动时,我收到错误:
Failed to get D-Bus connection: Operation not permitted
Dockerfile:
FROM centos:7
RUN yum -y install mariadb mariadb-server
COPY start.sh start.sh
CMD ["/bin/bash", "start.sh"]
Run Code Online (Sandbox Code Playgroud)
我的start.sh文件:
service mariadb start
Run Code Online (Sandbox Code Playgroud)
Docker构建:
docker build --tag="pbellamk/mariadb" .
Run Code Online (Sandbox Code Playgroud)
Docker运行:
docker run -it -d --privileged=true pbellamk/mariadb bash
Run Code Online (Sandbox Code Playgroud)
我检查了centos:systemd图像,这也没有用.如何使用systemctl/service命令启动的服务启动容器.
Dim*_*vak 11
当您docker run使用bash命令时,init系统(例如SystemD)不会启动(您的启动脚本也不会启动,因为您传递的命令会覆盖CMDDockerfile中的命令).尝试更改您使用的命令/sbin/init,以守护进程模式启动容器-d,然后使用在shell中查看docker exec -it <container id> sh.
Docker是围绕每个容器一个服务/进程的想法设计的。尽管它绝对支持在容器中运行多个进程,并且绝不会阻止您这样做,但是您最终会遇到容器中的多个服务无法完全映射到Docker或外部工具期望的区域。转向服务扩展或跨主机使用Docker群之类的事情仅支持每个容器提供一项服务的概念。
Docker Compose允许您将多个容器组合成一个定义,这意味着您可以使用更多的标准,预构建容器(httpd,mariadb),而无需构建自己的容器。Compose定义相当容易地映射到Docker Swarm服务。另请参阅Kubernetes和Marathon / Mesos,以管理一组容器即服务。
可以在容器中运行systemd,但是它需要--privileged访问主机和已/sys/fs/cgroup安装的卷,因此对于大多数用例而言可能不是最合适的。
该s6-overlay项目使用s6提供了对docker更友好的流程管理系统。
您实际上确实需要对容器进行ssh访问,这种情况很少见,但是如果这很困难,那么您将被困在构建自己的容器和使用流程管理器中。
您可以完全避免在 docker 容器中运行 systemd 守护进程。您甚至可以避免编写特殊的 start.sh 脚本——这是使用docker-systemctl-replacement脚本时的另一个好处。
docker systemctl.py 可以解析正常的 *.service 文件,知道如何启动和停止服务。您可以将其注册为图像的 CMD,在这种情况下,它将查找所有启用 systemctl 的服务 - 这些服务将以正确的顺序启动和停止。
当前的测试套件包括 LAMP 堆栈的测试用例,包括 centos,因此它应该在您的设置中运行良好。
| 归档时间: |
|
| 查看次数: |
16719 次 |
| 最近记录: |