supervisord多服务启动
如果需要一个容器中运行多个服务,可以使用Supervisord 来进行进程管理,方式就是将多个
启动命令放入到一个启动脚本中。
##需要准备的文件
[root@18 docker]# tree .
.
├── Dockerfile ##build时编译文件
├── dvd.repo ##主机yum源
├── ssh
│ └── Dockerfile
├── supervisord.conf
└── web
└── index.html
配置:
[root@18 docker]# cat Dockerfile
FROM rhel7
ENV HOSTNAME server2
EXPOSE 80 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum clean all && yum install -y httpd openssh-clients openssh-server supervisor && mkdir -p /var/log/supervisor && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
RUN echo root:westos | chpasswd
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"]
[root@18 docker]# cat ssh/Dockerfile
FROM rhel7
ENV HOSTNAME server2
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server && yum clean all
RUN echo root:westos | chpasswd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -q -N ""
CMD ["/usr/sbin/sshd", "-D"]
[root@18 docker]# cat supervisord.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:httpd]
command=/usr/sbin/httpd
[root@18 docker]# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.254.250/rhel7.3
gpgcheck=0
[docker]
name=docker
baseurl=http://172.25.254.250/pub/docker/
gpgcheck=0
[root@18 docker]# cat web/index.html
<h1>Docker</h1>
1.编译
[root@18 docker]# docker build -t rhel7:v1 .
2.运行
[root@18 docker]# docker run -d --name vm1 -v /tmp/docker/web:/var/www/html rhel7:v1
3.测试
[root@18 ssh]# curl 172.17.0.2
<h1>Docker</h1>
[root@18 ~]# ssh -l root 172.17.0.2
root@172.17.0.2's password:
-bash-4.2#
CMD 与 ENTRYPOINT
ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与
CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给
ENTRYPOINT 指令的参数。Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,
只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给
ENTRYPOINT。
首先测试下CMD的功能:
[root@18 test]# cat Dockerfile
FROM rhel7
CMD echo "hello world"
[root@18 test]# docker run --rm rhel7:v2
hello world
##验证CMD命令可被覆盖
[root@18 test]# docker run --rm rhel7:v2 echo westos
westos
##显然,使用ENTRYPOINT可以让操作不受到干预。
[root@18 test]# cat Dockerfile
FROM rhel7
ENTRYPOINT echo "hello world"
[root@18 test]# do