当前位置: 首页 > 知识库问答 >
问题:

Docker Apache容器在Ubuntu 18.04上立即存在(从Docker文件构建)

纪实
2023-03-14

我的docker文件包含以下内容

FROM ubuntu <br>
RUN apt-get update <br>
RUN apt-get install apache2 -y <br>
RUN apt-get install apache2-utils -y <br>
RUN apt-get clean <br>
RUN rm -rf /var/lib/apt/lists/* <br>
EXPOSE 80 <br>
ENTRYPOINT ["apache2ctl"] <br>
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"] <br>

用于构建映像的命令是:sudo docker build-t myimage

运行容器的命令用户为:

sudo docker run -it -p 80:80 myimage
sudo docker ps -a <br>

请帮帮忙。

共有1个答案

汝臻
2023-03-14

Dockerfile中需要纠正的几个问题

为基本图像使用特定版本

from Ubuntu:18.04将特定版本添加到from映像中,这有助于理解Docker映像是用什么版本的基本映像(Ubuntu:18.04)构建的。

组合多个run命令

如果可能的话,将多个run命令组合到单个run命令有助于减少docker层的数量,从而减少图像的大小。

检查Dockerfile最佳实践-https://docs.docker.com/develop/develop-images/dockerFile_best-practices/#run

将此更改自

RUN apt-get update 
RUN apt-get install apache2 -y 
RUN apt-get install apache2-utils -y 
RUN apt-get update && \
    apt-get install -y apache2 apache2-utils && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

因为您已经在EntryPoint中提到了Apache2CTL,所以不需要在cmd中再次提到它。您的命令被解释为apache2ctl/usr/sbin/apache2ctl-dforeground。因此,dockerrun命令失败。

以下是您的DockerFile是如何修改的:

$ cat Dockerfile 
FROM ubuntu:18.04
RUN apt-get update && \
    apt-get install -y apache2 apache2-utils && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
EXPOSE 80
ENTRYPOINT ["apache2ctl"]
CMD ["-DFOREGROUND"]

现在构建Docker映像,就像您所做的那样。

$ docker build -t myimage:1.0 .
Sending build context to Docker daemon   38.3MB
Step 1/5 : FROM ubuntu:18.04
 ---> cf0f3ca922e0
Step 2/5 : RUN apt-get update &&     apt-get install -y apache2 apache2-utils &&     apt-get clean &&     rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 2f47b3a5e735
Step 3/5 : EXPOSE 80
 ---> Using cache
 ---> 5b395b19a0dc
Step 4/5 : ENTRYPOINT ["apache2ctl"]
 ---> Using cache
 ---> be1afc8d76c3
Step 5/5 : CMD ["-DFOREGROUND"]
 ---> Running in 3d0d78c566e2
Removing intermediate container 3d0d78c566e2
 ---> 00167996f7f3
Successfully built 00167996f7f3
Successfully tagged myimage:1.0

以分离模式(-d)运行容器,以便在后台运行进程。

$ docker run -d -p 80:80 myimage:1.0
eccb77059f9ce8628e7a47d64adb9d20a3ca6cb3cecce06935b46eb13652b992


$ docker ps | grep eccb77
eccb77059f9c        myimage:1.0       "apache2ctl -DFOREGR…"   14 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp                     charming_payne

$ docker ps | grep eccb77
eccb77059f9c        myimage:1.0       "apache2ctl -DFOREGR…"   27 seconds ago      Up 25 seconds       0.0.0.0:80->80/tcp                     charming_payne

$ docker ps | grep eccb77
eccb77059f9c        myimage:1.0        "apache2ctl -DFOREGR…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp                     charming_payne

点击带有localhost和端口80的URL

$ curl http://localhost:80

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu
    Last updated: 2016-11-16
    See: https://launchpad.net/bugs/1288690
  -->
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Apache2 Ubuntu Default Page: It works</title>
    <style type="text/css" media="screen">
  * {
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 0px;

也是从浏览器

 类似资料:
  • 容器总是在创建和运行后立即退出。 我尝试使用命令运行mssql实例 当尝试类似的SO link link时 它显示 但在run命令中我已经设置了'accept_eula=y'。

  • 我已经创建了两个docker容器,并尝试在ubuntu、debian和一些包上安装一些应用程序,如-mc、ping、traceroute。。但每当我从集装箱里出来,我就会把里面的东西都弄丢。。是否有docker命令保存我的配置?

  • 我试图在docker容器上运行我的java应用程序。我在本地使用tomcat服务器,它工作正常。我是java/tomcat/docker的新手,所以我可能会错过一些非常简单的东西,但我认为只要将我的本地war文件指向就足够了。 这是我的docker-compose.yml 我可以看到文件,但我无法访问我的应用程序。我的本地主机仍然显示tomcat页面,而不是从本地安装的tomcat运行时看到的“H

  • 问题内容: 我在后台运行一个容器 它迅速退出。但是,如果我在前台运行,则可以正常运行。我使用检查了日志 没有错误。有任何想法吗? DOCKERFILE start-all.sh 问题答案: 一个Docker容器的主要过程完成后退出。 在这种情况下,它将在脚本结束时退出。我对hadoop不太了解,无法在这种情况下告诉您如何做,但是您需要要么在前台运行某些东西,要么使用诸如runit或supervis

  • 我有一个容器,我想停止,但当我做一个它挂起,永远不会停止它。 我试过正常的和