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

目录
大家好,
我是Mandai,Wild团队负责开发工作的成员。
虽然 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 容器,所以我暂时退出容器。
将 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 键,按住P然后Q 键键盘上的
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 系统/应用程序基础设施。
如果您在开发项目方面遇到任何问题,请访问以下网站。
0
