前言:我使用了宝塔,已经安装了docker. 可以使用docker -v 查看一下。
docker -v
一、安装MYSQL
-
拉取镜像
// 拉取最新版的mysql docker pull mysql //拉取指定版本的mysql docker pull mysql:5.7 ```
可以使用docker images 查看是否拉取镜像
- 运行MySQL
#运行最新版 Mysql docker run --name mysql --restart=always --privileged=true -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql #运行制定版本 docker run --name mysql_57 --restart=always --privileged=true -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7
参数说明:
-
run:创建一个新的容器
-
--name:指定容器的名称
-
-p:端口映射(宿主机端口:容器端口)
-
-e: 传入环境变量
-
-d: 后台运行
-
--restart=always ( Docker 重启时容器也跟随启动)
-
--privileged=true (Docker 为容易内的 root 用户赋予真正的 root 权限,不然会提示 log 目录权限不足)
-
-v docker/mysql/conf:/etc/mysql/conf.d (将配置目录挂载到容器内的配置目录)
-
-v docker/mysql/data:/var/lib/mysql (将数据存储目录挂载到容器内的出局存储目录)
-
-v /docker/mysql/log:/var/log/mysql (将日志目录挂载到容器内的日志目录)
没有报错忽略下面内容
常见的报错为Docker容器中的MySQL服务的3306端口映射到主机的3306端口,但宿主机这个端口已经被其他进程使用了。
解决办法有两种:
- 更改容器端口号例如( -p 3307:3306 )在运行前,查看当前所有容器docker ps -a,防止名字冲突,如果重复 使用 docker rm 容器id 删除。
- 关闭宿主机3306端口
sudo lsof -i :3306 sudo kill -9 <PID>
- 如果想要对默认数据进行修改,允许远程访问,需进入容器内执行操作
$ docker exec -it mysql bash
$ mysql -u root -p 12345678
$ mysql-> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
$ mysql-> FLUSH PRIVILEGES;
二、安装NGINX
- 拉取镜像
docker pull nginx
- 启动容器,并且访问 locahost:端口 就可打开nginx 欢迎页面了
# 如果80端口占用,根据个人实际情况修改,如果改为其他端口需要在服务器中心安全组开放对应端口号
docker run -d -p 80:80 --name nginx nginx
- 创建目录存储 Nginx 的配置和日志
mkdir -p /docker/nginx && cd /docker/nginx
mkdir conf log
#创建www目录
cd /docker
mkdir www
- 从容器内复制配置文件到宿主机,经配置文件映射到容器内对应的目录中
docker cp nginx:/etc/nginx/conf.d/default.conf /docker/nginx/conf/default.conf
- 重建容器
docker run --name nginx -p 81:80 -v /docker/nginx/conf:/etc/nginx/conf.d -v /docker/www:/usr/share/nginx/html -v /docker/nginx/log:/var/log/nginx -d nginx
6.查看容器 docker ps -a
三、安装PHP
- 拉取PHP镜像
#我拉取的是php7.4的,也可以拉取其他版本的
docker pull php:7.4-fpm
- 创建容器
#先查看一下php 的IMAGE ID
docker images
#把镜像id 填进去
docker run --name php-fpm -p 9000:9000 -d 38f2b691dcb8
- 创建目录存储php配置文件和日志
mkdir -p /docker/php && cd /docker/php
mkdir conf log
- 从容器中复制配置文件
docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf /docker/php/conf/www.conf
docker cp php-fpm:/usr/local/etc/php/php.ini-production /docker/php/conf/php.ini
- 重新启动容器
#删除原来的php容器
docker rm php-fpm
#重新启动容器 最后面-d 后面写php 镜像的id
docker run --name php-fpm --link mysql:mysql -v /docker/www:/var/www/html -v /docker/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf -v /docker/php/conf/php.ini:/usr/local/etc/php/php.ini -d 38f2b691dcb8(替换自己的php-fpm镜像id)
--link <name or id>:alias : 可以用来链接2个容器,使得源容器和接收容器之间可以互相通信
name和id是源容器的name和id,alias是源容器在link下的别名
连接 PHP 和 Mysql 容器后,PHP 脚本连接数据库时,host 的值为 'mysql'。
6.设置nginx 和 php 在同一个docker 网络
#创建网络
docker network create mynetwork
#设置它们在同一个网络
docker network connect mynetwork php-fpm
docker network connect mynetwork nginx
7.Nginx 容器支持 PHP-FPM 容器,修改 Nginx 的配置文件 default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
charset utf-8;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
#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 html;
}
location ~ \.php$ {
fastcgi_index index.php;
#php-fpm容器名:端口号
fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
在docker/www下创建index.php ,打开看是否正常
<?php
phpinfo();