所以这就是我要做的事情:我需要使用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服务器正常工作。我究竟做错了什么? 另一个问题是,容器正在运行,但我无法附加它。我运行此命令
sudo docker attach CONTAINER_ID
然后没有任何反应,不能从那里做任何其他事情,我做错了什么?
我必须构建更多与此类似的dockerfiles来创建容器。所有这些必须托管在ZFS文件系统上,我必须根据它配置50gb的容器存储库,这是什么意思,我该怎么做是什么?
我很抱歉我的英语,这不是我的母语:( 提前谢谢
答案 0 :(得分:1)
$connect=mysql_connect("localhost:1500","root","") or die("Unable to Connect");
localhost
指的是容器IP地址。由于该容器中没有运行MySQL服务器,因此连接将失败。
在this gist中,我改变了一些你的例子让容器启动MySQL和Apache(我认为这是你的第一个意图)使用以下指令:CMD bash -c '(mysqld &); /usr/sbin/apache2ctl -D FOREGROUND'
并改变了PHP代码连接到localhost:3306
上的MySQL服务器。
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,我不知道这一切意味着什么。另请注意,一次提出3个问题会让社区难以找到能够回答所有问题的单一答案;也许可以考虑为这些人发布一个新问题。
如果我对你如何运行MySQL的假设或docker attach
的意图是错误的,请发表评论。