这将解决 PHP 版本升级问题!只需复制粘贴即可完成 Docker 入门介绍

大家好,
我是开发团队野生队的成员 Mandai。

PHP7 发布已经有一段时间了,但小版本更新仍然频繁发生,所以
我认为何时替换 PHP 是一个非常重要的问题。

频繁更新很麻烦,
但我想要使用最新版本。

在这种情况下,何不试试
Docker如今有了官方的 Docker 镜像,你至少应该尝试一次。

它带有复制和粘贴命令,让你感觉自己完成了一些事情!

Docker 配置

准备一台可运行的 Ubuntu 服务器

所以这次,我将使用 Vagrant 和 VirtualBox 来准备 Ubuntu Server 15.10,并在上面试用 Docker(在 Windows 上的命令相同)。

# 创建目录 mkdir ubuntu1510 cd ubuntu1510 vagrant init boxcutter/ubuntu1510 vagrant up --provider virtualbox #根据需要更改 --provider。

 

安装 Docker

基本上,这与 https://docs.docker.com/engine/installation/ubuntulinux/ 中描述的步骤相同。
接下来,我们将按照 Ubuntu 中的步骤进行操作。

 

获取 GPG 密钥

vagrant@vagrant:~$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

 

添加 apt 软件源

vagrant@vagrant:~$ echo "deb https://apt.dockerproject.org/repo ubuntu-wily main" | sudo tee /etc/apt/sources.list.d/docker.list

 

正在更新 apt 软件源

vagrant@vagrant:~$ sudo apt-get update

 

清除不必要的 apt 软件包

vagrant@vagrant:~$ sudo apt-get purge lxc-docker

 

正在安装 linux-image-extra

vagrant@vagrant:~$ sudo apt-get install linux-image-extra-$(uname -r)

 

安装 Docker

vagrant@vagrant:~$ sudo apt-get install docker-engine

 

将 vagrant 用户添加到 docker 组

vagrant@vagrant:~$ sudo usermod -aG docker vagrant # 如果未添加,则需要 sudo 才能运行 docker # 出于安全考虑,除了测试环境外,最好始终使用 sudo 运行

 

快速搭建 PHP7.0.2 环境

vagrant@vagrant:~$ docker pull php:7.0.2-apache # 这次选择可以在 Apache 环境中运行的 PHP 版本

所有下载完成后,检查 Docker 是否能识别它们。

vagrant@vagrant:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE php 7.0.2-apache 797e8c22cdde 6 days ago 521 MB

 

运行导入的 Docker 镜像

vagrant@vagrant:~/docker_php7$ docker run php:7.0.2-apache AH00558: apache2: 无法可靠地确定服务器的完全限定域名,使用 172.17.0.2。请全局设置“ServerName”指令以抑制此消息 AH00558: apache2: 无法可靠地确定服务器的完全限定域名,使用 172.17.0.2。全局设置“ServerName”指令以抑制此消息 [2016年2月16日 星期二 08:19:41.424790] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.2 已配置 -- 恢复正常运行 [2016年2月16日 星期二 08:19:41.426135] [core:notice] [pid 1] AH00094: 命令行:'apache2 -D FOREGROUND'

它似乎运行正常,但Ctrl + z,而且它不再接受输入,所以我将使用Ctrl + c

 

在后台运行 Docker 镜像

除了 Apache 正在运行之外,我对发生的情况一无所知,所以我将尝试在后台运行之前创建的 Docker 镜像。

docker run -d php:7.0.2-apache

让我们使用 docker ps 命令来检查一下它的运行情况。

vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cce300a61e5 php:7.0.2-apache "apache2-foreground" 8 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp small_lovelace

我确认它运行正常。我很兴奋。
不过我还没开始动手呢……

 

看看 Docker 容器内部。

我们来看看正在运行的 Docker 容器内部,检查一下它的设置。
接下来,我们停止之前在后台启动的 Docker 容器。
要停止正在运行的 Docker 容器,请使用 `docker stop` 命令。

vagrant@vagrant:~$ docker stop 5cce300a61e5 5cce300a61e5

运行 `docker ps` 命令时,`5cce300a61e5` 是容器 ID。我们之前输入的是完整的 ID,但如果只有一个 Docker 容器在运行,即使 ID 不完整,也可以使用 `docker stop 5cc` 来停止容器。容器
ID 是唯一的,在容器启动时分配,因此如果在不同的环境中运行,将会分配不同的容器 ID。

要查看 Docker 容器的内容,请在使用 `docker run` 命令时指定 `i` 和 `t` 选项。
启动 Docker 镜像的命令如下:

docker run -it php:7.0.2-apache /bin/bash

提示已更改为以下内容:

root@ac4e7280d147:/var/www/html#

使用 ps 命令检查当前正在运行的进程。

root@b679b610fdae:/etc/apache2# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3320 ? Ss 17:56 0:00 /bin/bash root 113 0.0 0.0 17500 2068 ? R+ 18:01 0:00 ps aux

看起来好像没有任何进程在运行。
可以看到容器中的进程与宿主机操作系统是隔离的。
现在,我们尝试启动 Apache。

root@b679b610fdae:/etc/apache2# /etc/init.d/apache2 start [...] 启动 Web 服务器:apache2AH00558:apache2:无法可靠地确定服务器的完全限定域名,使用 172.17.0.2。全局设置“ServerName”指令以抑制此消息。ok # 使用 ps 命令检查 apache 进程 root@b679b610fdae:/etc/apache2# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3320 ? Ss 17:56 0:00 /bin/bash root 130 0.0 0.3 166704 15264 ? Ss 18:02 0:00 /usr/sbin/apache2 -k start www-data 133 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 134 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 135 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 136 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 137 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start root 188 0.0 0.0 17496 2104 ? R+ 18:42 0:00 ps auxf

它似乎已经成功启动了。
有趣的是,我这次使用的 Docker 镜像内置了 curl,所以我将尝试使用它,看看是否可以在 Docker 容器内通过 HTTP 进行通信。

# 准备响应数据 root@b679b610fdae:/etc/apache2# echo "hogehoge test" > /var/www/html/index.html root@b679b610fdae:/etc/apache2# curl http://127.0.0.1/ hogehoge test

我们已确认内部 Apache 服务器返回了正常响应。
我们希望从外部访问它,但目前无法从外部连接到此 Docker 容器,因此我们将首先使用 exit 命令退出容器。

 

将 Docker 容器端口映射到主机操作系统

我们将再次启动 Docker 容器,但这次,作为测试,我们将添加一个设置,将 Docker 容器中的端口 80 映射到主机操作系统上的端口 8080,然后启动 Docker 容器。

vagrant@vagrant:~$ docker run -it -p 8080:80 php:7.0.2-apache /bin/bash # -p 8080:80 表示将主机操作系统上的 8080 端口映射到 Docker 容器上的 80 端口

启动后,使用 ps 命令检查 apache 进程。

root@949dd89c3341:/var/www/html# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3296 ? Ss 19:09 0:00 /bin/bash root 57 0.0 0.0 17496 2068 ? R+ 19:12 0:00 ps auxf

Apache 服务没有运行。
这实际上是 Docker 容器的一个重要特性:每次运行 `Docker Run` 时,都会从原始 Docker 镜像(本例中为 php:7.0.2-apache)创建一个容器。
因此,我之前在 `/var/www/html/index.html` 目录下放置文件的操作不会被保留。
每次运行 `Docker Run` 时,初始状态都相同。
这意味着每次都必须执行例行任务(在本例中为启动 Apache 服务并创建 index.html 文件)。
对于大规模开发而言,仅仅启动 Apache 服务并将文件传输到容器是不够的。
即使是例行程序也会随着时间推移而发生变化。
为了解决这个问题,你可以在 Dockerfile 中编写启动程序来自动执行这些操作,或者创建一个已经预先完成这些程序的 Docker 镜像。我们将在以后的文章中详细介绍。

目前,我们将手动启动 Apache 并放置内容。

root@949dd89c3341:/var/www/html# echo "hogehoge test" > /var/www/html/index.html root@949dd89c3341:/var/www/html# /etc/init.d/apache2 start

现在,要从外部访问 Docker 容器,我们需要退出 Docker 容器并返回到宿主机操作系统。
这个操作称为分离,并且有一个快捷键。如前所述
,输入 exit 命令会停止 Docker 容器本身,因此
这次,按住Ctrl 键PQ键即可返回到 Ubuntu 终端。

root@949dd89c3341:/var/www/html# # 在此状态下按 Ctrl+P,Q root@949dd89c3341:/var/www/html# vagrant@vagrant:~$

如您所见,它仍在运行。
顺便说一下,要再次返回 Docker 容器,

vagrant@vagrant:~$ docker attach 949dd

假设这样。分离是指从容器返回到宿主机操作系统,相反的操作是附加。949dd
是当前正在运行的 Docker 容器的容器 ID 的一部分。

现在,让我们尝试使用 ubuntu 上的 curl 向 8080 端口发送请求。

vagrant@vagrant:~$ curl http://localhost:8080 hogehoge test

数据已成功返回。
另外,要查看 Docker 容器端口映射到宿主机操作系统上的哪个端口,可以参考宿主机操作系统上的 iptables 配置。
网络设置可以通过 ip 命令或 iptables 命令查看,因此很容易理解。

 

PHP也可以吗?

这次使用的 Docker 镜像包含了撰写本文时最新的 PHP 7.0.2 版本。我原本只是想检查 PHP 的运行情况,所以会进行简单的运行检查。

连接到您刚刚创建的 Docker 容器。

vagrant@vagrant:~$ docker attach 949dd

这次,我们将尝试运行标准测试来检查 PHP 是否正常工作。

root@949dd89c3341:/var/www/html# echo "<?php phpinfo();" > /var/www/html/info.php

如果在控制台中看到 PHP 信息,则说明 PHP 运行正常。

嗯,我认为这就是 Docker 的起点。
下次我想谈谈 Dockerfile、目录共享和提交 Docker 容器。

就这样。

如果您想咨询开发专业人士

在 Beyond,我们将我们在系统开发方面的丰富经验、技术和专业知识与开源软件技术和云技术(如 AWS)相结合,以可靠的质量和卓越的性价比提供网络系统的合同开发服务。

我们还负责服务器端/后端开发和专有 API 协作开发,充分利用我们的技术和专业知识,为大规模、高负载的游戏、应用程序和数字内容构建和运营 Web 系统/应用程序基础设施。

如果您在开发项目方面遇到任何问题,请访问以下网站。

● Web系统开发
● 服务器端开发(API/数据库)

如果您觉得这篇文章有用,请点击【点赞】!
0
加载中...
0票,平均分:0.00/10
1,402
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但我也很荣幸能够从事其他各种工作,包括市场营销。
我在Beyond中的肖像权采用CC0协议。