这将解决 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 键P → Q键即可返回到 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 系统/应用程序基础设施。
如果您在开发项目方面遇到任何问题,请访问以下网站。
0