DockerforWindows安装与Linux+PHP开发环境搭建(一)


Docker是什么?

简单得来说,Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs); 目前云服务的基石是操作系统级别的隔离,在同一台物理服务器上虚拟出多个主机。Docker则实现了一种应用程序级别的隔离; 它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器”上来。

Docker的好处

Docker的优点:运行快、部署敏捷、灵活、轻量、开源免费。

Boot2Docker是一个专为Docker而设计的轻量级Linux发行包,解决Windows或者OS X用户不能安装Docker的问题。Boot2Docker完全运行于内存中,24M大小,启动仅5-6秒。Boot2Docker需要运行在 VirtualBox中。

Docker for Windows的安装使用步骤

检查系统版本与硬件虚拟化

首先,检查Windows操作系统版本号

Boot2Docker的运行,要求操作系统至少为Windows 7.1,8/8.1。实测Windows 7 旗舰版(Windows 7 Ultimate)也支持。

其次,需要确保你的系统支持硬件虚拟化,且虚拟化为已启用状态。

开启虚拟化技术支持,需几个方面的条件支持:芯片组自身支持、BIOS提供支持、处理器自身支持、操作系统支持。

操作系统方面,主流操作系统均支持VMM管理,因此无需考虑。而芯片组方面,从Intel 945(除上网本外)时代开始均已经支持,因此也无需考虑。CPU方面,可以通过Intel官方网站进行查询或者第三方检测软件进行判断。因此,更多的是查看BIOS方面是否支持。

对于Windows 8/8.1系统,打开任务管理器-“性能”选项卡-CPU,可以看到虚拟化的开启状态。如下图:

查看虚拟化是否开启

如果为“未启用”状态,需要到主板BIOS进行开启。

进入BIOS的方法:在计算机开机启动中,当屏幕下方出现“Press DEL to enter SETUP”提示时,立即按“Del”键就能进入BIOS设置程序。有些类型的BIOS,则需要在开启启动Logo画面按F2或F10键进入,具体根据屏幕提示操作就可以。

举例,找到Intel Virtual Technology设置项,将Disabled更改为Enabled。然后保存退出,即可开启VT功能。如下图:

Enable Intel Virtual Technology

对于Windows 7系统,需要安装微软的硬件虚拟化检测工具(Microsoft? Hardware-Assisted Virtualization Detection Tool)来判断处理器是否支持虚拟化,以及虚拟化是否已开启。下载安装HAV detection tool,检测结果遵照屏幕提示,然后参考HAV Detection Tool User Guide 进行下一步操作。

下载地址:

HAV Detection Tool
http://download.microsoft.com/download/1/9/F/19FD407F-A7E9-4393-A845-D0B1F539678E/havdetectiontool.exe

HAV Detection Tool User Guide
http://download.microsoft.com/download/1/9/F/19FD407F-A7E9-4393-A845-D0B1F539678E/HAV%20Detection%20Tool%20-%20User%20Guide.mht

如果屏幕提示如下图,则表明当前计算机处理器支持硬件虚拟化并已经启用。

Hardware-Assisted Virtualization Detection

安装Boot2Docker

接下来需要安装Boot2Docker与一些辅助性软件。具体包括:

Docker Client for Windows
Boot2Docker management tool and ISO
Oracle VM VirtualBox
Git MSYS-git UNIX tools

首先点击下载Boot2Docker for Windows。

下载地址:

https://s3.amazonaws.com/github-cloud/releases/18047765/825908bc-15b8-11e5-96cb-9a42a043cc39.exe?response-content-disposition=attachment%3B%20filename%3Ddocker-install.exe&response-content-type=application/octet-stream&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1437386585&Signature=wM%2BTTYN4yqc8fhh7WAEeZw7A5cE%3D

接着双击已下载的docker-install.exe安装文件,开始安装。安装过程最好提前关闭计算机的相关安全软件。

官方下载速度比较慢,可以尝试到国内的DaoCloud下载http://get.daocloud.io/

验证是否安装成功

安装完成后启动Boot2Docker。

Desktop Iconset

打开Boot2Docker终端后,如果系统出现用户账户控制(User Account Control)提示,请选择“是(Yes)”,以确保虚拟机VirtualBox 完成一些计算机配置的更改。若无提示,一般无需设置。

注:用户账户控制(UAC)是Windows Vista的一个新增的安全功能。它可以防止恶意软件获取特权,就算用户是以管理员帐户登录也可以起到保护作用。可在控制面板修改UAC,以Win7旗舰版为例是:控制面板(Control Panel ) → 所有控制面板项(All Control Panel Items) → 用户账户(User Account) → 更改用户账户控制设置(Change User Account Control setting)。

UAC Setting

终端需要一定初始化时间来启动Boot2Docker,执行Docker运行所需的环境变量bash脚本,如果成功启动,会出现一$提示符。

Boot2docker Start

使用boot2docker ssh命令可以进入VM。稍后需要用到该命令进行一些基础配置。

boot2docker ssh

现在可以直接使用docker命令了。

在终端执行命令docker run hello-world,回车。若运行正常,会输出如下内容:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository hello-world
91c95931e552: Download complete 
a8219747be10: Download complete 
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.


To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash


For more examples and ideas, visit:
 http://docs.docker.com/userguide/

了解容器与镜像

以命令docker run hello-world 为例:

docker run container

容器就是一个简化版的Linux操作系统,镜像就是装载到容器中的软件集合,此命令执行后,Docker会按照顺序发生以下行为:

a. 检查是否已安装hello-world镜像
b. 若未安装,则从Docker远程仓库(Docker Hub)下载该镜像
c. 加载该镜像到容器中,并运行。

创建Doker PHP容器,启用PHP开发环境

Docker Hub中有个人开发者提供的镜像,也有公司、组织结构上传的官方镜像,你可以使用Docker Hub的镜像,也可以使用自己本地私有的镜像(如local.registry.com:5000/php)。以PHP开发环境的搭建为例,继续说明Docker命令的使用方法。

这里使用的是自建私有镜像(已经集成Linux+PHP+Apache),私有镜像地址为:172.16.100.71:5000/php

1、设置Windows系统、boot2docker VM的host

a. 设置Windows系统本地host

设置Windows系统本地host主要是为方便在CMD命令提示符中进行操作。若是在Git Bash中操作则可以选择略过Windows系统本地host设置。

位置:C:\Windows\System32\drivers\etc\hosts

在文件中增加一行 172.16.100.71 local.registry.com

b. 设置boot2docker虚拟机的host

通过boot2docker ssh命令进入虚拟机,然后执行命令:

sudo vi /etc/hosts
在文件中增加一行: 172.16.100.71 local.registry.com
exit

也可使用组合命令:

boot2docker ssh "echo $'172.16.100.71 local.registry.com' | sudo tee -a /etc/hosts"

2、检查设置环境变量

在Git Bash中输入:

export

查看是否已自动设置环境变量:DOCKER_HOST,DOCKER_CERT_PATH,DOCKER_TLS_VERIFY

boot2docker shellinit 可以显示Docker客户端的环境变量,所以可使用以下命令自动设置环境变量

eval "$(boot2docker shellinit)"

若此命令不能成功设置,需要输入以下命令手动添加:

export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/c/Users/Administrator/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1

执行后输入export 查看是否写入成功。

若要使得Windows自身的CMD中也可以操作Docker命令,在cmd中键入以下命令:

set DOCKER_HOST=tcp://192.168.59.103:2376
set DOCKER_CERT_PATH=C:/Users/Administrator/.boot2docker/certs/boot2docker-vm
set DOCKER_TLS_VERIFY=1 

执行后输入set 查看是否写入成功。

不过通过set命令设置的环境变量是临时有效的,当关闭cmd命令行窗口后就不再起作用。

永久性环境变量的设置方法是:“计算机-属性-高级系统设置-高级-环境变量”,新建上述三个系统变量并填写对应值。设置完成后重新打开CMD即可生效。

另外,如果想在CMD要运行boot2docker ssh等命令,还需要设置Git相关的环境变量。方法是:

set PATH=%PATH%;"C:\Program Files (x86)\Git\bin"

永久环境变量设置方法同上,在系统变量PATH字段追加以下目录(具体目录根据自己Git安装目录进行添加)

;C:\Program Files (x86)\Git\bin;

然后重新启动cmd即生效。

3、设置–insecure-registry选项

从docker 1.3.1开始,连接不安全的私有镜像,默认是不允许的。现在我们要下载自建的私有镜像,需要通过以下方式设置:

boot2docker ssh
sudo vi /var/lib/boot2docker/profile

增加一行

EXTRA_ARGS="--insecure-registry local.registry.com:5000"

保存,然后重启docker服务:

sudo /etc/init.d/docker restart

也可以在Git Bash合并操作:

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry local.registry.com:5000\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"

说明:local.registry.com:5000这样的私有镜像地址也可用IP地址代替。
tee命令参数 -a为追加内容到文件,视情况使用。

insecure-registry-setting

sudo /etc/init.d/docker restart命令有时会重启失败,所以我们可以通过以下命令观察docker进程的信息:

ps -ef |grep docker

若docker主进程(/usr/local/bin/docker)PID比较小,且运行时间比较久,那么说明没有重启成功。需要强制杀死该进程后再重启。

sudo kill -9 pid
sudo /etc/init.d/docker restart

最后通过ps -ef |grep docker命令再检查一遍进程号和运行时间,保证docker重启成功。

ps -ef |grep docker
exit

4、将私有镜像下载到本地

docker pull local.registry.com:5000/php

在镜像运行前,先将其下载到本地,如果报错,参照之前步骤或错误处理进行解决,解决后继续执行后续步骤

5、检查、设置虚拟机共享文件夹

VirtualBox默认将宿主机目录C:\Users作为共享文件夹,并自动挂载到虚拟机c/Users路径。所以一般情况下我们通常选择将数据放在宿主机C:\Users目录,然后通过docker命令挂载到容器。但作为Windows用户,大家的C盘常作为系统盘,关键数据放在C盘是比较危险的,一旦Windows系统损坏无法启动有可能造成数据丢失。

所以,我们想到:能不能自己添加其他盘符下的共享文件夹,挂载到容器?

当然可以!!!步骤有些繁琐,继续往下看。

经过尝试,在C:\Users目录创建指向其他盘符共享文件夹的快捷方式这个方法是行不通的。

下面是正确的操作步骤:

打开boot2docker虚拟机GUI,点击“设置”-“共享文件夹”,在“固定分配”菜单右键“添加共享文件夹”,如图:

VitualBox ShareFolder

a. 执行boot2docker ssh 进入虚拟机,先确定要挂载到的目录,若目录不存在需要手动创建:

boot2docker ssh
sudo mkdir -p /f/projects/phpdev

b. 创建要挂载到的目录后,执行以下命令进行共享文件夹挂载。

sudo mount -t vboxsf f/projects/phpdev  /f/projects/phpdev

sudo mount -t vboxsf -o uid=1000,gid=50 f/projects/phpdev  /f/projects/phpdev

如下图:

mount-sharefloder

mount完成后退出, boot2docker ssh重新进入虚拟机,查看宿主机共享文件夹是否同步到挂载目录。

从图中可以看到,宿主机本地目录F:\projects\phpdev下的文件/文件夹已经同步显示到当前虚拟机挂载目录下,即/f/projects/phpdev路径下。

由于下文步骤六的docker容器是将/f/projects/phpdev挂载到容器Linux环境的/var/www/html路径,这一步操作就是为了接下来步骤做准备。

我们一般情况下,为了保证数据安全性和完整性,不会在docker创建的容器环境中永久保存数据。常见的方法是将本地宿主机的文件系统映射到容器环境的文件系统,这样能确保容器环境中生成的数据直接保存在用户主机的磁盘,而不会由于容器损坏或未及时将容器持久化而造成数据丢失。

根据boot2docker官方(https://github.com/boot2docker/boot2docker)的描述,boot2docker内置了一个专门用于虚拟机文件夹共享的客户端增强包(VirtualBox Guest Additions)。

若以下共享文件夹名称存在,则该共享文件夹则自动挂载到以下位置:

Users 挂载到 /Users
/Users挂载到 /Users
c/Users挂载到 /c/Users
/c/Users挂载到 /c/Users
c:/Users挂载到 /c/Users

如果需要共享其他文件路径,则需要执行以下命令:

boot2docker ssh
sudo mount -t vboxsf your-other-share-name /some/mount/location

boot2docker ssh
mount -t vboxsf -o uid=1000,gid=50 your-other-share-name /some/mount/location

注:Linux命令id可查看用户的UID(对应/etc/passwd)和GID(对应/etc/group)

不过,如果重启Windows,这些设置会被清除,需要再次进行挂载操作(当然,直接重启boot2docker-vm同样会清除所有配置数据)。如果你不想每一次都手动挂载,可以在/etc/fstab中添加一项

your-other-share-name /some/mount/location vboxsf rw,gid=100,uid=1000,auto 0 0

your-other-share-name /some/mount/location vboxsf defaults 0 0

这样就能够自动挂载了(需要安装客户端增强包VirtualBox Guest Additions)。

执行完手动挂载命令,正常情况下,/some/mount/location目录下已经可以显示共享文件夹的内容了。

由于boot2docker本身是虚拟机,docker也作为虚拟机环境,要使用docker run -v path1:path2成功挂载,实际需要进行两步映射:共享文件夹先由宿主机挂载到boot2docker虚拟机,再由boot2docker虚拟机挂载到docker容器环境。

挂载前先建立挂载目录:

sudo mkdir -p /some/mount/location

然后再执行上述mount挂载命令。

卸载共享文件夹,使用命令sudo umount -f /f/projects/phpdev

注意:

卸载共享文件夹需要先退出挂载目录,再卸载,否则会报错:
umount: can’t forcibly umount /f/projects/phpdev: No such file or directory

同时要注意卸载目录一定要写对,注意盘符F前的斜线/,如果要卸载的目录没有挂载过,则会报错:
umount: can’t forcibly umount /f/projects/phpdev: Invalid argument

6、根据所提供镜像,创建并运行一个容器

根据拉到本地的私有镜像(Linux+Apache+PHP集成镜像),创建并运行一个容器:

docker run -d -p 8000:80 -p 2222:22 --name php -v /f/projects/phpdev:/var/www/html local.registry.com:5000/php

其中80端口是HTTP/Nginx默认端口,22端口是Linux SSH默认端口。以后台运行方式,将宿主机本地目录/f/projects/phpdev挂载到容器。

注意:

若在Windows系统的Git bash下执行会挂载失败报错,因为msysgit会将/c/Users这样的目录自动转为c:\Users,所以需要使用双斜线,Git bash中输入命令为:

docker run -d -p 8000:80 -p 2222:22 --name php -v //f//projects//phpdev:/var/www/html local.registry.com:5000/php

然后,通过docker ps 命令,可以查看当前运行中的容器。

$ boot2docker.exe ip
192.168.59.103

我们可以通过ssh进入到当前php容器,也可使用XShell等SSH工具连接。

SSH登录命令为:

ssh -p 2222 root@192.168.59.103 

注:boot2docker ssh的账号密码为user/docker ,私有镜像为root/hellonihao

SSH登录后就可以看到我们熟悉的Linux目录结构了。

如果本地没有phpdev文件夹将会自动创建,在该目录下新建个phpinfo.php测试文件,用于输出php配置信息。

Docker的宿主机是boot2docker的虚拟机,因此需要使用虚拟机的ip进行访问,获取ip方式为boot2docker ip。

所以上述phpinfo.php文件访问地址:192.168.59.103:8000/phpinfo.php

PHPINFO-demo

举例,仅根据centos基础镜像建立一个容器,并建立一个数据卷/data,命令如下

$ docker run -it --rm  --name centos --volume=/data local.registry.com:5000/centos /bin/bash 

注意:在Git Bash需要用双斜线,执行

$ docker run -it --rm  --name centos --volume=//data local.registry.com:5000/ce
ntos //bin//bash

将宿主机目录挂载到数据卷,命令如下:

$ docker run -it --rm  --name centos -v /c/Users/phpdev:/data local.registry.com:5000/centos /bin/bash 

注意:在Git Bash下需要用双斜线,即:

$ docker run -it --rm  --name centos -v //c//Users//phpdev:/data local.registry.com:5000/centos //bin//bash 

附其他常用命令:

docker rm -f php
docker ps -l
docker images -a
docker rmi
docker stop
docker run
docker kill

以上是docker for Windows版本的安装方法和docker使用步骤的介绍。如果有错误疏漏,欢迎留言指正,一起探讨学习docker。

相关内容