[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

彬彬有礼的! 通过复制粘贴介绍docker

你好。
我是Mandai,负责Wild 开发团队。

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

频繁的更新是一种痛苦。
但我想使用最新版本。

在这种时候使用 docker 怎么样?
在当今时代,有一个官方的 docker 镜像,我认为你至少需要尝试一次。

它带有复制和粘贴命令,会让您想尝试一下!

 

准备 Ubuntu 服务器以供工作(即使在 Windows 上命令也是相同的)

所以,这一次,我想使用 Vagrant 和 virtualbox 来准备 Ubuntu Server 15.10,并在上面使用 Docker。

# 创建适当的目录 mkdir ubuntu1510 cd ubuntu1510 vagrant init boxcutter/ubuntu1510 vagrant up --provider virtualbox #--根据需要更改提供程序。

 

安装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)

 

安装泊坞窗

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

 

将vagrant用户添加到docker组

vagrant@vagrant:~$ sudo usermod -aG docker vagrant # 如果不添加,运行 docker 需要 sudo # 除了验证环境之外,总是使用 sudo 运行似乎更安全

 

快速搭建PHP7.0.2环境

vagrant@vagrant:~$ docker pull php:7.0.2-apache # 这次选择可以在apache环境下执行的PHP

 
各种下载完成后,检查docker是否能识别。

vagrant@vagrant:~$ docker images 存储库标签 创建的图像 ID 虚拟大小 php 7.0.2-apache 797e8c22cdde 6 天前 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”指令来抑制此消息 [Tue Feb 16 08:19:41.424790 2016] [mpm_prefork:notice] [pid 1] AH00163 : Apache/2.4.10 (Debian) PHP/7.0.2 配置 -- 恢复正常操作 [Tue Feb 16 08:19:41.426135 2016] [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 容器 ID 图像命令创建状态端口名称 5cce300a61e5 php:7.0.2-apache "apache2-foreground" 8 秒前 6 秒前 0.0.0.0:80->80/tcpsmall_lovelace


 我能够确认它暂时有效。我很兴奋。
虽然我什么也没做。 。 。

 

查看docker容器内部

让我们看一下正在运行的 docker 容器的内部,看看它有哪些设置。
让我们停止之前在后台启动的 docker 容器。
要停止正在运行的 docker 容器,请使用 docker stop 命令。

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


 5cce300a61e5 是运行 docker ps 时的容器 ID,之前输入的是整个 ID,但如果只有一个 docker 容器正在运行,则可以输入不完整的字符串,如 docker stop 5cc 就可以停止具有匹配 ID 的容器。
这个容器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 用户 pid %cpu %mEM vsz rss 时间命令 root 1 0.0 0.0 0.0 T 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 启动 www-data 133 0.0 0.2 166728 8548 ? 00 _ /usr/sbin/apache2 -k 启动 www-data 134 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k 启动 www-data 135 0.0 0.2 166728 8548 ? 0 :00 _ /usr/sbin/apache2 -k 启动 www-data 136 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k 启动 www-data 137 0.0 0.2 166728 8548 ? : 02 0:00 _ /usr/sbin/apache2 -k 启动 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 用户 PID %CPU %MEM VSZ RSS TTY STAT 启动时间命令 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 辅助


 阿帕奇没有启动。
实际上,这是 docker 容器的一个重要属性;每次运行 docker 时,都会从原始 docker 镜像(本例中为 php:7.0.2-apache)创建一个容器。
因此,我上次将文件放入 /var/www/html/index.html 时所做的工作将不会保留。
当你运行docker时,状态将始终与启动时相同。
这样,您每次都需要执行例行任务(在本例中,启动 apache 并创建 index.html)。
如果您使用它进行全面开发,则不能只启动 apache 并将文件传输到容器。
此外,即使是常规程序也会随着时间而改变。
为此,我们将创建一个包含启动过程的 Dockerfile 并自动运行它们,并且我们将在完成这些过程后创建一个 docker 映像,但我们计划下次这样做。

首先,这一次,我们将手动启动apache并放置内容。

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


 现在,为了从外部访问 docker 容器,请退出 docker 容器并返回到主机操作系统。
这个动作称为分离,并提供了快捷键。
如果输入 exit 命令,docker 容器本身将停止,如前所述,因此
按住CtrlPQ返回到 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 测试


 数据成功返回。
顺便说一下,要检查docker容器端口映射到主机操作系统上的哪个端口,可以检查主机操作系统上的iptables。
可以使用 ip 和 iptables 命令检查网络设置,使其易于理解。

 

PHP 也可以工作吗?

我这次使用的docker镜像是PHP 7.0.2的docker镜像,这是撰写本文时的最新版本。本来是想检查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 容器提交。

 
就是这样。

如果您觉得这篇文章有帮助,请点赞!
0
加载中...
0 票,平均:0.00 / 10
1,121
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。