彬彬有礼的! 通过复制粘贴介绍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 容器本身将停止,如前所述,因此
按住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 测试
数据成功返回。
顺便说一下,要检查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 容器提交。
就是这样。