背景
# 背景
docker比虚拟机更加的轻量化,很适合在服务器或本地部署服务,且不会对其他应用造成影响。毕竟典型的应用,不如一个php的应用,要么使用LAMP,要么使用LNMP。如果是在云服务器上部署一个php环境,需要手动安装nginx 或 apache ,还有 mysql,毕竟繁琐,而使用社区已经打包好的镜像,通过docker部署,相对简单。
# 使用docker
# 安装
# Linux centos7
通过yum安装
yum install docker
启动docker
service docker start
# MacOS
直接下载对应的安装包,https://docs.docker.com/desktop/mac/install/ (opens new window)
安装完成后,启动docker应用。
# 下载镜像
比如,我们下载一个XAMPP的镜像,自带apache,mysql和phpMyAdmin。现在有三个版本,分别支持不容的php版本:
PHP version | Corresponding tag |
---|---|
8.0.2 | tomsik68/xampp:8 |
7.3.7 | tomsik68/xampp:7 |
5.6.40 | tomsik68/xampp:5 |
我们选择常用的php 7,那么就下载的时候,带上版本号。
docker pull tomsik68/xampp:7
下载完成后,可以看到类似的结果信息。
# 常用命令
# 镜像操作
# docker images ,列出本地镜像
- **REPOSITORY:**表示镜像的仓库源
- **TAG:**镜像的标签,同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本。
- **IMAGE ID:**镜像ID
- **CREATED:**镜像创建时间
- **SIZE:**镜像大小
# docker run 镜像,以某个镜像启动容器
docker run -t -i ubuntu:15.10 /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。如果不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
# docker pull 镜像,拉取某个镜像
# docker rmi 镜像,删除某个镜像
# docker build ,构建镜像,本次不会涉及到。
# 启动容器
容器是镜像的实例。
docker run --name myXampp -p 41061:22 -p 41062:80 -d -v /Users/hutaoer/Sites/test:/www tomsik68/xampp:7
通过宿主机的/Users/hutaoer/Sites/test 目录挂载到容器的/www 目录,可通过以下方式指定。这样的话,访问容器的 /www 目录,就对应的会访问到宿主机的 /Users/hutaoer/Sites/test 目录。需要注意的是,这里的 /www 目录,是我们自己在启动容器的时候创建生成的,并不是XAMPP默认的html目录。
-v /Users/hutaoer/Sites/test:/www
启动成功后,会生成一个容器id,通过 docker ps -a 可以查看活跃的容器。CONTAINER_ID 对应的就是容器id的hash缩写。docker ps 是查看所有运行的容器。
docker ps -a
启动成功后,访问 :http://localhost:41062(或者127.0.0.1, 或者局域网IP)
- 就可以访问到 XAMPP 的默认网页。
# 访问容器终端
# 有以下几种种方式
方式一:MacOS中,可以通过GUI界面,点击对应容器的【CLI】按钮,会唤起一个宿主机的终端,直接进入。 方式二:在命令行中输入
docker attach container_id
方式三:还是通过命令行输入
docker exec -it cd6ad6023 /bin/sh
好了,掌握了如何进入容器的方式,我们就可以进入到容器进行相应的一些操作。
通过查询XAMPP
文档,我们知道了XAMPP
的对应的配置目录为:/opt/lampp/etc/httpd.conf
, 找到 DocumentRoot
对应的目录为:DocumentRoot
"/opt/lampp/htdocs"
。这时候,我们把目录修改为 /www
。
DocumentRoot "/www"
<Directory "/www">
然后再重启XAMPP服务。
使用命令:
/opt/lampp/lampp restart
再把你想要部署的应用,比如 wordpress,解压后放到宿主机的目录下,我这里就是:/Users/hutaoer/Sites/test ,也就是我们把宿主机的目录挂载到了容器上。这样子,你就能通过docker的服务,访问到挂载目录中的应用咯。
# 查看挂载目录
docker inspect containerId | grep HostConfig -A 20
# 宿主机往docker实例传输文件
注意:这里的容器id需要写完整的id
docker cp php.tar 3ef75ddb2ce8cb29d71e479757ddc32fd797c96a7a4b2573b696ac7d44f21f31:/opt/lampp/htdocs
# 配置nginx代理docker
很多情况下,我们服务器或者本机都是装有nginx的,可以利用nginx强大的能力,帮我们做代理。比如把docker容器中的服务,通过nginx代理,实现docker服务的访问。
比如,我宿主机中,已经启动了一个docker容器,对外暴露端口为 41062,那么我们宿主机的nginx可以配置如下:
server {
listen 80;
server_name 192.168.0.101; # or localhost
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-SHA:AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA:ECDHE-RSA-AES256-SHA:AES256-SHA;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:41062; # 这里是关键
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
然后,重启你的nginx服务,便可以通过 localhost 或者 ip 或者域名的方式,访问docker暴露的服务了。
# 注意
如果你使用的是云服务器,云平台可能会有一些安全措施,导致你docker暴露的端口无法访问。这时候,就需要在你的ECS实例上面,打开相应的端口才行。