这篇文章将会带你一步一步的建立 Docker Container 并装好一个网页伺服器 (apache) ,如果你还没安装过 docker ,那么你可以先读文章 https://www.puritys.me/docs-blog/article-309 。
首先我使用的是 Mac 环境,如果你不是用 Mac 也不用担心,操作步骤是一样的,一开始要建立一个档案叫 Dockerfile,我想要安装的 OS 是最新版的 Centos ,所以第一行我要写 FROM centos ,如果你想指定 OS 版本,那么你也可以写 FROM centos:7,预设没有指定版号的话, Docker 会去抓最新版。
- FROM centos
- MAINTAINER xxx@gmail.com
建好 Dockerfile 之后,我们输入指令 "docker build . " ,这时 docker 会自动帮我们下载 Centos image 然后安装在机器上,成功后,输入 docker images 就会看到安装好的 images 如下,整个 OS 只有 196.8 MB 是不是非常小巧的 Linux 系统呢,如果你的 Docker 设定档不是命名为 Dockerfile ,那么你可以自已指定 Dockerfile 名称: docker build -f myDockerfile 。
- REPOSITORY TAG IMAGE ID CREATED SIZE
- 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 中加下以下四行。
- RUN yum update -y
- RUN yum install -y httpd vim net-tools
- RUN yum install -y php-mysql php
- RUN yum install -y mariadb-server mariadb telnet
再执行一次 "docker build ." 这个指令,docker 会再建立一个 Centos image ,并且在这个 image 中,已经安装好我所指定的那些软体,这时我再输入一次 docker images 就会看到一个新的 image ,它的 ID 是 7513cc650b6f。
- docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- <none> <none> 7513cc650b6f 16 minutes ago 801.2 MB
- 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 看看是否有连线成功。
- [www@ /]# docker run -t -i 7513cc650b6f /bin/bash
- [root@828e8782d60d /]# /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf &
- 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
- [1]+ Done /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
- [root@828e8782d60d /]# telnet localhost 80
- Trying ::1...
- Connected to localhost.
- 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" 也是无效。
- [www]@ ~ $ docker-machine ip
- 192.168.99.100
- [www]@ ~ $ telnet 192.168.99.100 80
- Trying 192.168.99.100...
- telnet: connect to address 192.168.99.100: Connection refused
- 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 。
- [www@ /]# docker run -t -i -p 80:80 7513cc650b6f /bin/bash
- [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
- COPY test.php /var/www/html/
查看新的 images 列表如下:
- [www@ ] $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- <none> <none> d95cd1ef50dc 15 minutes ago 801.2 MB
- centos latest 904d6c400333 4 weeks ago 196.8 MB
你再重新启动一次新的 container,检查一下 /var/www/html 这个目录是不是已经存在 test.php 了呢。
在 container 中启动 apache server , 测试一下 PHP 是否也可以正确运作。
- FROM centos
- MAINTAINER xxx@gmail.com
- RUN yum update -y
- RUN yum install -y httpd vim net-tools
- RUN yum install -y php-mysql php
- RUN yum install -y mariadb-server mariadb telnet