前几天在腾讯购买了域名和云主机,尝试在docker容器内部署php+mysql+nginx,参考了https://notemi.cn/docker-quickly-set-up-php-nginx-mysql-environment.html,经过一番折腾,总算是成功了。这里把详细的过程写下来,供今后参考。
系统环境:
CentOS Linux release 7.7.1908 (Core)
Docker 19.03.2
安装docker
1. 添加repo
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2. 查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
3.推荐安装docker的最新稳定版本
$ sudo yum install docker-ce
4.安装好后使用下面命令检查确认docker版本
$ docker --version
创建资源文件夹
Docker安装好之后,我们可以创建一些文件夹,映射一些配置文件或网站程序文件到宿主机。
/data
/mysql 存放数据库备份
/nginx nginx配置文件
/conf
/rewrite 伪静态
/wwwroot 网站文件
/wwwlogs 日志
/source 程序源代码
/download 下载目录
部署Mysql
1. 拉取镜像
2 创建mysql容器,为了便于今后的管理和命令的重复使用,直接把命令放在sh脚本文件中
create_mysql.sh
echo "create mysql container"
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name m_mysql mysql:5.7
参数说明:
-d 容器后台运行
-p 添加主机到容器的端口映射,前面是映射到宿主机的本地端口,后面是容器内需要映射的端口
-e 设置环境变量, MYSQL_ROOT_PASSWORD这里设置了mysql的root用户初始密码
--name 容器的名字
之后需要进入容器执行mysql允许远程连接
3. 进入容器:
$ docker exec -it m_mysql /bin/bash
4. 开启Mysql远程连接
# 进入MySQL
$ MySQL -uroot -p123456
# 选择数据库
> use mysql
# 开启远程连接
> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
# 重启
$ service mysql restart
部署PHP
这里使用bitnami/php-fpm:7.1的镜像,比原生的php-fpm相比,默认安装了mysqli和pod扩展。
1. 拉取镜像
docker pull bitnami/php-fpm:7.1
2. 创建容器。下面给出创建php容器的脚本create_php_container.sh
echo "create php container"
docker run \
-d \
-p 9000:9000 \
-v /data/wwwroot:/usr/share/nginx/html \
--link m_mysql:mysql \
--name m_phpfpm bitnami/php-fpm:7.1
参数说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射
--name 容器的名字,随便取,但是必须唯一
--link link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子container db上的信息。
通过link的方式创建容器,我们可以使用被Link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。
部署NGINX
1.首先使用命令拉取镜像并运行容器
$ docker pull nginx:1.11.0
$ docker run -d -p 80:80 --name m_nginx nginx:1.11.0
2. 之后用docker cp命令复制配置文件到宿主机
# docker cp m_nginx:/etc/nginx/nginx.conf /data/nginx
# docker cp m_nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf
3. 删除之前运行的nginx
$ docker stop m_nginx && docker rm m_nginx
4. 重新运行nginx容器,这一步跟以前一样,建议保存为create_nginx_container.sh脚本
docker run -d -p 80:80 --name m_nginx \
-v /data/wwwroot:/usr/share/nginx/html \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf:/etc/nginx/conf.d \
-v /data/wwwlogs:/var/log/nginx \
--link m_phpfpm:phpfpm \
nginx
5. 编辑配置文件
修改/data/nginx/conf/default.conf
server {
listen 80;
server_name _;
#charset koi8-r;
access_log /var/log/nginx/default_nginx.log main;
location / {
root /usr/share/nginx/html/default;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html/default;
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
部署phpmyadmin
1. 拉取镜像
$ docker pull phpmyadmin/phpmyadmin
2. 创建容器
docker run -d -p 8080:80 \
--name m_phpmyadmin \
--link m_mysql:db \
phpmyadmin/phpmyadmin
注意:这一步我们把宿主机的8080端口映射到容器的80端口上。
最后测试
浏览器里输入http://主机地址:8080,用户名和密码需要跟mysql一致。
OK,成功