Ubuntu使用Docker快速切换不同版本的PHP

概述

此教程在VMware虚拟机中的Ubuntu系统下实验通过,因为在Windows系统下无法完美将VMware和Docker同时运行,所以有了这种“曲线救国”的办法,适合需要快速切换或同时运行不同版本PHP环境的开发需求。

安装Docker

此处Docker安装过程参考 菜鸟教程

卸载旧版本

Docker 的旧版本被称为 dockerdocker.iodocker-engine 。如果已安装,请卸载它们:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

使用 Docker 仓库进行安装:在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。

设置仓库

更新 apt 包索引:

$ sudo apt-get update

安装 apt 依赖包,用于通过HTTPS来获取仓库:

$ sudo apt-get install \  
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

添加 Docker 的官方 GPG 密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

验证您现在是否拥有带有指纹的密钥:
指纹为:9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, 通过搜索指纹的后8个字符:

$ sudo apt-key fingerprint 0EBFCD88  

# 上面的命令执行后,应该会输出如下的信息 ####################################
# pub   rsa4096 2017-02-22 [SCEA]
#       9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
# uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
# sub   rsa4096 2017-02-22 [S]
#########################################################

设置稳定版仓库:

$ sudo add-apt-repository \  
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

安装 Docker Engine-Community

更新 apt 包索引:

$ sudo apt-get update

安装最新版本的 Docker Engine-Communitycontainerd

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

换源

可以换成国内源DaoCloud,地址:https://www.daocloud.io/mirror

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

安装 eriksencosta/php-dev

docker 运行的时候需要root权限,所以非root用户需要添加 sudo 运行

下载镜像

$ sudo docker pull eriksencosta/php-dev

运行容器

运行容器时有两种方式

方式一

官方方式,最后没有 /bin/bash

$ sudo docker run -i -t -p 88:80 -v ~/test:/var/www -d "eriksencosta/php-dev:latest"

对参数解释如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-i    打开STDIN,用于控制台交互
-t    分配tty设备,该可以支持终端登录
-p    设定映射的端口(即指定容器暴露的端口):宿主机端口:容器内端口
-v    给容器挂载存储卷,挂载到容器的某个目录:宿主机位置:容器内位置。像上面的命令,容器内打开 /var/www 文件夹,里面的内容就是宿主机 ~/test 目录里的内容。而且如果更改宿主机 ~/test 目录里的内容,容器内对应的文件会马上同步更改!
-d    指定容器在后台运行
"eriksencosta/php-dev:latest"    为需要启动的IMAGE

方法二

命令最后添加 /bin/bash

$ sudo docker run -i -t -p 88:80 -v ~/test:/var/www -d "eriksencosta/php-dev:latest" /bin/bash

两种方式的区别

①方法一
命令最后不添加 /bin/bash 时,如果要进入容器内部需要使用命令:

# <CONTAINER ID>是一个整体,实际情况中是一串整数,替换后不带< >  
$ sudo docker exec -it <CONTAINER ID> /bin/bash

②方法二
命令最后添加 /bin/bash 时,如果要进入容器内部使用命令:

# <CONTAINER ID>是一个整体,实际情况中是一串整数,替换后不带< >  
$ sudo docker attach <CONTAINER ID>

无论哪一种方法,创建后就可以在虚拟机的Ubuntu内使用 localhost:88 进行访问;在虚拟机外使用 虚拟机IP:88 进行访问(需提前将虚拟机网络设置成桥接模式)。

更换PHP版本

首先进入到容器内
查看可用的PHP版本:

$ phpenv versions  # version + s  

# 此时会输出当前可用的版本,带*号的是正在使用的版本:
* 5.3 (set by /opt/phpenv/version)
  5.3.29
  5.4
  5.4.38
  5.5
  5.5.22
  5.6
  5.6.6
############################################

更换使用的PHP版本:

$ phpenv global <版本>  
# 更换完版本后使用如下命令,重启Nginx和PHP-FPM才会生效:
$ webserver restart

Tips:每次重启容器后都需要手动启动webserver,进入容器执行命令:

$ webserver start

Docker其它常用命令

查看正在运行的容器:

$ sudo docker ps -a

停止一个正在运行的容器:

$ sudo docker stop <CONTAINER ID>

删除一个容器(删除前需要先停止运行):

$ sudo docker rm <CONTAINER ID>

查看已经下载的IMAGE:

$ sudo docker image ls

删除一个已经下载的IMAGE:

$ sudo docker image rm <REPOSITORY>

进入一个容器:

# 命令最后无 '/bin/bash',使用ps命令查看COMMAND为"/usr/local/bin/webs…"  
$ sudo docker exec -it <CONTAINER ID> /bin/bash
# 命令最后有 '/bin/bash',使用ps命令查看COMMAND为"/bin/bash"
$ sudo docker attach <CONTAINER ID>

退出容器:

# 退出一个容器,并结束运行该容器,使其变成Exited状态  
$ exit
# 正常退出而不结束该容器,组合键:
# "ctrl + P + Q"

项目参考来源:https://hub.docker.com/r/eriksencosta/php-dev/

文章作者: Yihan
文章链接: https://crushonu.top/ubuntu使用docker快速切换不同版本的php-31/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yihan's Blog