2016
Jun
27

这篇文章将会带你一步一步的建立 Docker Container 并装好一个网页伺服器 (apache) ,如果你还没安装过 docker ,那么你可以先读文章 https://www.puritys.me/docs-blog/article-309

首先我使用的是 Mac 环境,如果你不是用 Mac 也不用担心,操作步骤是一样的,一开始要建立一个档案叫 Dockerfile,我想要安装的 OS 是最新版的 Centos ,所以第一行我要写 FROM centos ,如果你想指定 OS 版本,那么你也可以写 FROM centos:7,预设没有指定版号的话, Docker 会去抓最新版。

dockerfile init
  1. FROM centos
  2. MAINTAINER [email protected]

建好 Dockerfile 之后,我们输入指令 "docker build . " ,这时 docker 会自动帮我们下载 Centos image 然后安装在机器上,成功后,输入 docker images 就会看到安装好的 images 如下,整个 OS 只有 196.8 MB 是不是非常小巧的 Linux 系统呢,如果你的 Docker 设定档不是命名为 Dockerfile ,那么你可以自已指定 Dockerfile 名称: docker build -f myDockerfile

docker images
  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. centos latest 904d6c400333 4 weeks ago 196.8 MB

安装网页伺服器: Apache web service

上一步只是装好一个简单的 OS 系统,接著我们要装上一些必备软体, dockerfile 中可以使用 RUN 来执行 Linux 指令,所以我们用 RUN 加上 yum 就可以安装各种软体,一开始一定要先执行 yum update -y 先更新软体清单,再来使用 yum install -y ... 来安装我们需要的软体,这里我安装了 httpd (Web service) 与 PHP,MySQL 资料库 ,还有一些常用的小工具,方便我们测试如 vim, net-tool, telnet。

请在 dockerfile 中加下以下四行。

  1. RUN yum update -y
  2. RUN yum install -y httpd vim net-tools
  3. RUN yum install -y php-mysql php
  4. RUN yum install -y mariadb-server mariadb telnet

再执行一次 "docker build ." 这个指令,docker 会再建立一个 Centos image ,并且在这个 image 中,已经安装好我所指定的那些软体,这时我再输入一次 docker images 就会看到一个新的 image ,它的 ID 是 7513cc650b6f。

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. <none> <none> 7513cc650b6f 16 minutes ago 801.2 MB
  4. centos latest 904d6c400333 4 weeks ago 196.8 MB

启动 Apache server

这个新的 image 已经安装好 web service 了,我们就可以启动它,但是我们得先用 "docker run -t -i 7513cc650b6f /bin/bash" 这个指定开启 Centos Container 并且登入 ,然后再输入指令 "/usr/sbin/httpd -f /etc/httpd/conf/httpd.conf &" 来启动 Apache Server。

完成后,必须先确认 web server 80 port 是否有开启,这时我们刚刚安装的小工具就派上用场了,输入 telnet localhost 80 看看是否有连线成功。

Example
  1. [www@ /]# docker run -t -i 7513cc650b6f /bin/bash
  2. [root@828e8782d60d /]# /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf &
  3.  
  4. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
  5.  
  6. [1]+ Done /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
  7.  
  8. [root@828e8782d60d /]# telnet localhost 80
  9. Trying ::1...
  10. Connected to localhost.
  11. Escape character is '^]'.

这个 container 的 web server 已经启动,但是如果我想要从外部的机器连到 container 的 web server ,这是不允许的,Docker 预设是不允许任何外面的机器直接连线进 container 。

例如我在 Mac terminal 中先用 docker-machine ip 找出 docker host 的 IP,再用 telnet 192.168.99.100 80 ,会发现根本就无法连进这台机器,使用 "curl -k http://192.168.99.100" 也是无效。

Example
  1. [www]@ ~ $ docker-machine ip
  2. 192.168.99.100
  3.  
  4. [www]@ ~ $ telnet 192.168.99.100 80
  5. Trying 192.168.99.100...
  6. telnet: connect to address 192.168.99.100: Connection refused
  7. telnet: Unable to connect to remote host

如何打开 container port

打开 container 80 port 的方式很简单,使用 "-p 80:80" 即可,这句话是告诉 docker host ,host 的 80 port 会直接连进这个 container 80 port 。

所以我们用 exit 把 container 关掉,重新再启动一次 container 并指定打开 80 port 。

Example
  1. [www@ /]# docker run -t -i -p 80:80 7513cc650b6f /bin/bash
  2. [root@6629dcac3090 /]# /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf &

这时你在 Mac 用 "curl -k http://192.168.99.100/" 是不是就能顺利的收到 Container apache server 的 Response 了。

执行 PHP

再来我想要执行一个简单的 PHP 档,我写了一个 test.php ,内容只写一句简单的 echo "My first docker"; 。

建好这个档案之后,我们把 test.php 与 Dockerfile 放在同一个目录下,接著我想要把这个档案 copy 进 image 里面,并且自动 commit 。

我们只要在 Dockerfile 加入下面这行,然后再次执行 "docker build .",Docker 就会帮我们把这个档案 commit 到 7513cc650b6f 这个 image 里,而且更改 IMAGE ID 成 d95cd1ef50dc

Example
  1. COPY test.php /var/www/html/

查看新的 images 列表如下:

Example
  1. [www@ ] $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. <none> <none> d95cd1ef50dc 15 minutes ago 801.2 MB
  4. centos latest 904d6c400333 4 weeks ago 196.8 MB

你再重新启动一次新的 container,检查一下 /var/www/html 这个目录是不是已经存在 test.php 了呢。

在 container 中启动 apache server , 测试一下 PHP 是否也可以正确运作。

整个 Dockerfile 如下
  1. FROM centos
  2. MAINTAINER [email protected]
  3.  
  4. RUN yum update -y
  5. RUN yum install -y httpd vim net-tools
  6. RUN yum install -y php-mysql php
  7. RUN yum install -y mariadb-server mariadb telnet

Docker images list


回應 (Leave a comment)