【问题标题】:dockerfile - Unable to connect errordockerfile - 无法连接错误
【发布时间】:2014-09-28 17:19:01
【问题描述】:

所以这就是我必须做的:我需要使用 docker 自动设置一些容器。其中之一是这样的: Debian Squeeze 具有有限的 CPU 份额和有限的内存(1 个 cpu 份额和 512 mb 内存),预装了 apache2、build-essential、php5、mysql-server-5.5、openssh-server 并打开了一些端口( Apache 为 8000,MySQL 为 1500)。所以我创建了以下 dockerfile :

FROM debian:squeeze

MAINTAINER Name < email : >

# Update the repository sources list

RUN apt-get update


# Install apache, PHP, and supplimentary programs. curl and lynx-cur are for debugging the container.
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 build-essential php5 mysql-server openssh-server libapache2-mod-php5 php5-mysql php5-gd php-pear php-apc php5-curl curl lynx-cur

# Enable apache mods.
RUN a2enmod php5
RUN a2enmod rewrite

# Manually set up the apache environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80

# Copy site into place.
ADD www /var/www/site

# Update the default apache site with the config we created.
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf

# By default, simply start apache.
CMD /usr/sbin/apache2ctl -D FOREGROUND

#CMD [ "mysqladmin -u root password mysecretpasswordgoeshere"]

EXPOSE 3306

apache-config.conf 的内容是这样的:

<VirtualHost *:80>

  ServerAdmin me@mydomain.com
  DocumentRoot /var/www/site

  <Directory /var/www/site/>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order deny,allow
      Allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

在 www 文件夹中,我使用以下代码放置了一个 php 文件:

<?php
        $connect=mysql_connect("localhost:1500","root","") or die("Unable to Connect");
?>

测试与mysql服务器的连接

然后

我将所有这些构建成这样的图像:

sudo docker build --rm --tag="tag_name" .

然后我像这样运行图像

sudo docker run -c=1 -m="512m" --net=bridge -p 8000:80 -p 1500:3306 -d --name="container_name" tag_name

它似乎可以工作,当我在浏览器中访问 localhost:8000/site 时,apache 服务器可以工作,但显示“无法连接”。我究竟做错了什么? 另一个问题是,contaienr 正在运行,但我无法附加到它。我运行这个命令

sudo docker attach CONTAINER_ID 

然后什么都没有发生,从那里不能做任何其他事情,我做错了什么?

我必须再构建几个与此类似的 dockerfile 来创建容器。所有这些都必须托管在 ZFS 文件系统上,并且我必须基于它配置一个 50gb 的容器存储库,这是什么意思,我该怎么做那个?

对不起,我的英语不是我的母语 :( 提前谢谢你

【问题讨论】:

    标签: mysql linux apache docker zfs


    【解决方案1】:

    MySQL 问题

    在 PHP 代码中

    $connect=mysql_connect("localhost:1500","root","") or die("Unable to Connect");
    

    localhost 指容器 IP 地址。由于该容器中没有运行 MySQL 服务器,因此连接将失败。

    this gist 中,我使用以下指令对您的示例进行了一些更改,以使容器同时启动 MySQL 和 Apache(我假设这是您的第一个意图):CMD bash -c '(mysqld &amp;); /usr/sbin/apache2ctl -D FOREGROUND' 并更改了要连接的 PHP 代码localhost:3306 上的 MySQL 服务器。

    Docker 附加

    docker attach 命令旨在让您与当前在容器前台运行的进程进行交互。除非该进程是 shell,否则它不会在该容器中为您提供 shell。

    举个例子:

    启动一个运行shell进程的容器

    docker run -it --rm base bash
    

    您现在处于交互模式您的容器中,并且可以在该容器的前台运行 shell:

    root@de8f16a13571:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
    

    如果您现在通过键入 exit 退出 shell,shell 进程将结束,并且由于该进程在容器的前台运行,该容器将停止。

    root@de8f16a13571:/# exit exit $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    现在启动一个名为 test 的新容器,再次运行 bash:

    docker run -it --name test base bash
    

    验证您可以与它交互,并通过按 Ctrl+p+q 键与它分离。你最终回到了 docker 主机 shell。

    验证名为 test 的容器是否仍在运行:

    $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 81f0f1094f4a base:latest "bash" 6 seconds ago Up 5 seconds test

    然后您可以使用docker attach 命令附加到容器中的 bash 程序:

    docker attach test
    
    root@81f0f1094f4a:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
    

    ZSH

    关于 ZSH,我也不知道这意味着什么。另请注意,一次有 3 个问题会使社区难以想出一个可以回答所有 3 个问题的单一答案;也许考虑为这些人发布一个新问题。

    如果我对您如何运行 MySQL 或您对 docker attach 的意图的假设有误,请发表评论。

    【讨论】:

    • 谢谢,mysql 现在可以工作了。我对 dokcker attach 的意图是这样的:我有一个在后台运行的容器,我想像在它的 CMD 中运行 /bin/bash 一样访问它(我希望你明白你的意思)。就像在它上面连接 SSH 但没有它 xD 对不起,如果我没有任何意义
    • 我编辑了答案以解释 docker attach 的用途。在您的情况下,它将附加到 apache 进程,该进程将忽略您输入的任何内容
    • 哦,我明白了,所以如果我想在硬币容器的后台运行 apache 和 mysql,最后一个“命令”是 bash,这样我每次都可以访问和修改容器中的内容,我意思是:启动 Apache,启动 MySQL 然后 /bin/bash,我该怎么做?
    • 事情不会那么简单。然后要遵循的路径是使用supervisor 或使用phusion/baseimage 启动您的服务,并让sshd 服务在mysql 和apache 之外运行。这样你就可以通过 ssh 连接在容器中拥有一个 shell
    • 你也可以试试nsenter,但我觉得这个工具有点难
    猜你喜欢
    • 2021-12-10
    • 2020-03-14
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2018-04-06
    • 2013-07-11
    • 2014-07-04
    • 2017-06-08
    相关资源
    最近更新 更多