一、卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
二、安装 Docker
使用 Docker 仓库进行安装之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令来设置稳定的仓库。
$ yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这时会出现按装不成功的错误,解决的办法是手动安装containerd.io
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
参考资料
更多下载包
centos8 安装docker与(containerd.io与podman-manpages问题解决)及镜像加速
修改国内docker image源,提高下载速度
# vi /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
systemctl restart docker
三、运行phpfpm
docker run --name php56fpm -v /var/www/html/xx/www/:/var/www/html/ --privileged=true -d phpdockerio/php56-fpm
解释:
docker run
运行镜像
--name php56fpm
将运行的容器命名为php56fpm
-v /var/www/html/xx/www/:/var/www/html/
映射本地目录到容器内部的/var/www/html/,php-fpm容器内部会通过这个目录访问PHP文件.
--privileged=true
增加特权,不然没有权限访问/var/www/html/这里的文件,会导致nginx也无法访问文件(File not found.).(共三种方法,见PS.1)
-d
后台运行
phpdockerio/php56-fpm
镜像的名字
可以不映射端口,如果需要映射,增加参数-p 9001:9000 本地的9001端口映射到容器内部的9000端口,但nginx只用内部的9000端口就够了.
五.修改宿主机的nginx配置
对nginx配置不熟练的小朋友,自行百度一行。
vi /etc/nginx/conf.d/xx.conf
location ~ \.php$ {
root /var/www/html/xx/www;
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
其中的fastcgi_pass和fastcgi_param和平时配置nginx的时候有所区别,
fastcgi_pass要指定容器的IP,通过 docker inspect php56fpm 可以查看具体IP("IPAddress": "172.17.0.2")
fastcgi_param SCRIPT_FILENAME 后面的值要改成容器内部的地址/var/www/html/
PS.1
在Cent OS 7中运行,如果不加--privileged=true,则会出现nginx没有访问内部文件的权限
原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
1,在运行容器的时候,给容器加特权:--privileged=true
2,临时关闭selinux:
su -c "setenforce 0"
3,添加selinux规则,将要挂载的目录添加到白名单:
chcon -Rt svirt_sandbox_file_t /var/www/html/xx/www/
PS.2
如果遇到明明没用开启端口却提示端口占用,有可能是之前删除的容器还没完全退出,重启一下docker就好了
比如提示:Error response from daemon: driver failed programming external connectivity......
iptables failed: iptables --wait -t nat -A DOCKER