docker部署网站环境
#查找镜像
#镜像下载地址默认为官方仓库
#官方镜像地址:https://hub.docker.com/
docker search nginx
#下载mysql镜像,:后面对应的是版本号,不加默认是下载最新版本
docker pull mysql:5.7.43
#下载Nginx镜像
docker pull nginx:1.24
#下载redis镜像
docker pull redis:7.0.12
#下载PHP镜像
docker pull php:7.4.33-fpm
#安装mysql容器
docker run -itd --name test-mysql -p 3306:3306 -v /www/wwwroot/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.43
-i #交互式操作
-t #终端
-d #后台运行
--name test-mysql #容器的别名
-p 3306:3306 #映射容器的服务端口到宿主机的服务端口,:前是宿主机的端口号,:后是容器的端口号,mysql默认调用3306端口
-v /www/wwwroot/docker/mysql:/var/lib/mysql #绑定数据卷,将宿主机的mysql目录挂在到容器下的mysql目录,若为提前创建目录,指令会自动创建。
###特别注意,因为容器版本不同,mysql存放数据的位置也不同,不可盲目照搬。
-e MYSQL_ROOT_PASSWORD=123456 #设置环境变量,设置mysql服务root用户的密码
#测试是否安装成功
docker ps
#进入容器且退出时不会关闭容器的方法
docker exec -it test-mysql /bin/bash
#退出容器
exit
#安装redis
docker run -itd --name test-redis -p 6379:6379 redis:7.0.12
#安装PHP
docker run --name test-php -v /www/wwwroot/docker/nginx/www:/var/www/html -d php:7.4.33-fpm
-v /www/wwwroot/docker/nginx/www:/var/www/html
:前是宿主机存放网站项目的位置,在后面安装Nginx时也会用到,若两者目录不一致会报错。
:后是容器存放文件的位置,因为版本不同,存放位置可能也不同,不可盲目照搬。
#因为PHP是执行代码语言,并非redis,mysql需要访问数据,所以可以不用专门设置对外端口,其默认端口号为9000。
#安装Nginx
docker run --name test-nginx -v /www/wwwroot/docker/nginx/www:/usr/share/nginx/html -v /www/wwwroot/docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro -p 80:80 -d --link test-php:php nginx:1.24
-p 80:80 #端口映射,宿主机端口:容器端口
-d #后台运行
-v /www/wwwroot/docker/nginx/www:/usr/share/nginx/html #:前的宿主机项目目录与上面PHP容器宿主机目录一致,:后的目录默认为Nginx容器的存放位置,因为版本不同,其存放位置也可能不同
-v /www/wwwroot/docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro #:前属于宿主机存放配置文件的目录,:后是容器默认存放配置的目录。
:ro #设置为只读文件,容器内无法修改宿主机目录内的数据,不添加此项默认是可以修改的。
###之所以前面的项目目录不添加此项,是因为网站会产生缓存文件,若是设置只读,那么缓存类文件无法创建,会报错。当然,你也可以设置为只读,然后在容器内对缓存目录设置权限即可,这样也更安全。
--link test-php:php #把test-php的网络并入nginx,并通过修改nginx容器下/etc/hosts文件,把域名php映射成 127.0.0.1,让容器通过php:9000即可访问test-php。
#查看/etc/hosts
cat /etc/hosts
#内容如下
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 php ab9f08686868 test-php
172.17.0.5 179e11cdb1d0
#/www/wwwroot/docker/nginx/www下创建index.php文件
#内容如下
<?php
echo phpinfo();
?>
#在/www/wwwroot/docker/nginx/conf/conf.d下创建nginx.conf
#内容如下
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000; #也可写作172.17.0.4:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
#浏览器访问http://宿主机ip:80/index.php
#如果显示PHP版本消息,则代表你以上配置成功了。
#一些常用指令
docker stop test-php #关闭容器
docker start test-php #开启容器
docker restart test-php #重启容器
docker exec -it test-php bash #进入容器
docker rm test-php #删除容器
docker rm -f test-php #强制删除正在运行的容器
docker rm -v test-php #删除与容器关联的数据卷
docker rm -l php #移除容器间的网络连接,并非删除该容器,这里的php对应了上面的--link test-php:php
docker inspect test-php #查看容器详情
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test-php #查看容器IP
docker images #查看下载的所有镜像
docker rmi php:7.4.33-fpm #删除PHP镜像
docker rm -f $(docker ps -a) #删除所有容器
docker rmi $(docker images) #删除所有镜像
docker system prune #清除所有不使用的资源
docker image prune -a #删除所有未被标记的镜像
docker volume prune #删除所有未被使用的数据卷
docker network prune #删除所有未被使用的网络
docker logs <容器名称> #查看容器日志,可以借此查看容器无法启动的原因
#php扩展安装,这也算是最重要的一个环节,docker官方为此提供了几个指令
docker-php-source #创建扩展源码目录
docker-php-ext-install #安装扩展
docker-php-ext-enable #启动扩展
docker-php-ext-configure #安装扩展时所需,类似编码安装时的./configure -with
#先说docker-php-source
#linux源码存放目录多在/usr/src
docker-php-source extract #在/usr/src目录下创建PHP扩展目录并初始化
docker-php-source delete #删除PHP扩展目录
#实例展示
#再说docker-php-ext-install
#该命令用来安装并启动PHP扩展的,通过docker-php-source extract指令,我们可以看到在/usr/src/php/ext目录下,已经包含了不少PHP扩展,方便我们安装。
#安装pdo_mysql扩展
docker-php-ext-install pdo_mysql
#若没有意外,echo phpinfo()就能看到扩展已经成功安装了,也可以php -m查看
#docker-php-ext-install在成功安装扩展后会自动启动扩展的,并且会在/usr/local/etc/php/conf.d/下创建对应的配置文件,若想关闭扩展,可以直接删除对应的配置文件或者前面加;即可。
#接下来我们试着安装redis扩展
docker-php-ext-install redis
#结果肯定是报错,原因是/usr/src/php/ext/下并没有redis扩展,所以我们需要自行下载redis扩展,然后才能安装。
#php扩展下载官网:https://pecl.php.net
#下载redis扩展,可根据自己需求选择不同版本
#容器可能没有安装wget扩展,安装的话又会增加容器体积,所以建议在宿主机下载,再转移到容器中
wget https://pecl.php.net/get/redis-5.3.7.tgz
#解压
tar -zxvf redis-5.3.7.tgz
#将扩展包复制到容器内
docker cp ./redis-5.3.7.tgz test-php:/usr/src/php/ext/redis
./redis-5.3.7.tgz #扩展包的位置
test-php: #容器名称
/usr/src/php/ext/redis # 容器内存放扩展的位置
#转移扩展包后,再次尝试安装
docker-php-ext-install redis
#php -m查看redis扩展安装成功
#也可以借助pecl安装扩展
pecl install redis-6.0.2
docker-php-ext-enable redis
#docker-php-ext-enable并不常用,其作用是开启扩展,但docker-php-ext-install往往在安装时便开启了扩展
#docker-php-ext-configure一般与docker-php-ext-install搭配使用,在安装扩展时,需要自定义配置时,就会用到它。
#下面安装PHP常用的gd扩展,就会用到docker-php-ext-configure
#安装gd扩展之前,需要先安装依赖包,虽然/usr/src/php/ext/下有gd扩展,但直接docker-php-ext-instal gd会提示缺少依赖。
#这里只介绍PHP7.4及以上版本如何安装依赖
#先更新扩展清单,避免找不到依赖包
apt-get update
#开始安装依赖
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev
#依赖包安装完成后,需要配置
docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg --with-webp
#最后再安装gd扩展
docker-php-ext-install -j$(nproc) gd
-j #就是make -j,允许n个编译命令同时执行,可以更有效的利用CPU资源
nproc #这是一个返回处理器数量的命令
-j$(nproc) #其实就是使编译过程充分利用您的计算机的多核处理能力,加快编译安装
#最后可以通过phpinfo()查看是否安装成功