我对Docker很陌生,并且完全不知道为什么我的容器在启动时会退出。
我已经构建了一个Ubuntu映像,在启动时启动Apache和fail2ban。我不确定这是Dockerfile的问题,还是我正在运行的命令来启动容器。
我试过了:
docker run -d -p 127.0.0.1:80:80 image
docker run -d -ti -p 127.0.0.1:80:80 image
docker run -d -ti -p 127.0.0.1:80:80 image /bin/bash
Dockerfile如下:
FROM ubuntu:latest
RUN \
apt-get update && \
apt-get -y upgrade && \
apt-get install -y build-essential && \
apt-get install -y iptables && \
apt-get install -y software-properties-common && \
apt-get install -y apache2 fail2ban && \
rm -rf /etc/fail2ban/jail.conf
ADD index.html /var/www/html/
ADD jail.conf /etc/fail2ban/
ENV HOME /root
WORKDIR /root
EXPOSE 80 443
ENTRYPOINT service apache2 start && service fail2ban start
CMD ["bash"]
我可以跳进容器本身:
docker exec -it image /bin/bash
但是当我试图在主机内部运行时,它失败了。救命?
考虑到你的问题,你提到“启动时”,我认为阅读https://docs.docker.com/config/containers/multi-service_container/会很有用。
简而言之,docker容器不像普通系统那样“启动”,它们启动一个进程并执行它直到它退出。
因此,如果要启动两个进程,可以执行包装脚本,如上面的链接所述。
从Dockerfile中删除以下行:
CMD ["bash"]
此外,当您想要将shell添加到容器中时,您必须覆盖Dockerfile的ENTRYPOINT
定义:
docker exec -it --entrypoint "/bin/bash" image
有关详细信息,请参阅Dockerfile "ENTRYPOINT" documentation