0

所以这就是我要做的:我需要使用 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 的容器存储库,这是什么意思,我该怎么做?

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

4

1 回答 1

1

MySQL问题

在 PHP 代码中

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

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

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

码头工人附加

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

举个例子:

启动一个运行 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

如果您现在通过键入退出 shell,exitshell 进程将结束,并且因为这是在容器的前台运行的进程,该容器将停止。

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

现在再次启动一个名为testrunning bash 的新容器:

docker run -it --name test base bash

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

验证命名的容器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 是错误的,请发表评论。

于 2014-09-28T18:43:46.890 回答