win10通过Docker搭建LNMP环境全流程 入门版本
由于博主环境已经安装好了,一些异常设置,暂且略过
根据官方教程下载docker desktop执行文件.exe
注意尽量不要把docker安装到C盘,除非你的C盘很大,具体可以参考文章
把安装盘转移到F盘命令,安装前,PowerShell 管理员权限 执行
# 其实只是创建了一个快捷方式
mklink /j "C:\Program Files\Docker" "F:\environment\Docker"
把镜像文件下载到其他盘
mklink /j C:\Users\用户名\AppData\Local\Docker F:\dababase\Docker
设置国内加速镜像
登陆阿里云,找到容器服务
博主已经弄完,没有完整的流程,最后获取到个人专属的阿里云镜像加速
配置到docker desktop里面,如图所示
测试下docker环境是否已经备好,编程第一步,hello word起手
# 不需要去拉取镜像,docker发现没有hello-world镜像,会先自动拉取,然后运行
docker run hello-world
看到提示 hello from docker! docker环境搭建完毕
error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect
docker 官方镜像教程地址(需要特殊方式访问)
要啥搜索啥,官方权威
# 拉取镜像
docker pull mysql:5.7
# 查看镜像是否拉取成功
docker images
# 运行mysql
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
到这里就运行了一个简单的mysql容器,但是问题在于,我需要把三样东西挂载到宿主机:日志文件,数据库文件,配置文件
所以接下来需要确认这三个文件在容器中的位置,然后挂载到宿主机上
# 进入宿主机
docker exec -it test-mysql bash
docker run -d -p 3306:3306 --name mysql5.7 --privileged=true -v F:\docker-data\mysql-5.7\conf.d:/etc/mysql/conf.d -v F:\docker-data\mysql-5.7\logs:/var/log/mysql -v F:\docker-data\mysql-5.7\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在F:\docker-data\mysql-5.7\conf.d 下添加一个my.cnf文件,配置如下
[client]
port=3306
[mysql]
default_character_set=utf8
[mysqld]
port=3306
character_set_server=utf8
collation_server=utf8_general_ci
default_storage_engine=InnoDB
docker exec -it mysql5.7 bash
查看数据库字符编码
mysql -uroot -proot
# 查看数据库字符串编码
show variables like 'character%'
到这一步,你会发现指定的字符串还是默认的latin1。也就是说配置文件没有生效
这个时候打开docker desktop查看日志
发现问题,my.cnf is ignored
,权限太高
解决方案:将my.cnf设置为只读权限,然后重启容器
进入数据库,查看错误日志配置
# 查看数据库错误日志输出路径
show variables like 'err_log%';
结果为stderr
标准命令行输出
博主可以接受,就不进行更改了,直接通过docker容器查看日志
docker run -p 9002:9000 --name php7.4 -v F:\docker-data\nginx-1.15\html:/var/www/html -d php:7.4-fpm
docker 安装拓展还是很方便的
#相关依赖安装
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev
#安装mysqli
docker-php-ext-install mysqli
安装完毕后,重启PHP容器
有了Mysql安装的学习,这里就直接进入主题
run 方法其实不需要主动pull,没有镜像,程序会自动拉取
# 运行Nginx
docker run --name nginx1.15 -p 1200:80 -p 1201-1202:1201-1202 -v F:\docker-data\nginx-1.15\html:/usr/share/nginx/html:ro -v F:\docker-data\nginx-1.15\conf\nginx.conf:/etc/nginx/nginx.conf:ro -v F:\docker-data\nginx-1.15\conf\conf.d:/etc/nginx/conf.d:ro -d nginx:1.15
nginx.conf 配置文件内容如下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
可以到这里有一个 /etc/nginx/conf.d/*.conf
这里的意思就是引入.conf后缀的文件
于是我做了一个映射 -v F:\docker-data\nginx-1.15\conf\conf.d:/etc/nginx/conf.d:ro
并创建一个80端口的网站
80.conf内容如下
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
需要注意: 这里的IP写死并不好,因为重启或者容器删除后,这里的IP可能会进行改变,这里放到我的高级编,编排的时候再说
flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file
docker cp nginx1.15:/etc/nginx/nginx.conf F:\docker-data\nginx-1.15\conf\nginx.conf
多端口映射
访问index.html成功,访问index.php失败
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
进入 location ~ .php 后里面的脚本解析,如下
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
nginx 与 php 在同一台机器的时候,确实 $document_root php也是可以定位到相同路径下
但是目前用的是容器,相当于PHP只能找到自己容器的下的脚本路径
在Nginx容器里面这样配置,自然 PHP-fpm是找到文件路径的
所以这里根据PHP 容器挂载路径
docker run -p 9002:9000 --name php7.4 -v F:\docker-data\nginx-1.15\html:/var/www/html -d php:7.4-fpm
应该改为如下所示配置
server {
listen 80; # 1200
server_name localhost 127.0.0.1;
index index.html index.php;
root "/usr/share/nginx/html";
# 这里的IP 172.17.0.2 就是容器的IP
location ~ \.php(.*)$ {
fastcgi_pass 172.17.0.2:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
# 注意,这里的$document_root要改成PHP的路径映射目录
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# 注意,这里的$document_root要改成PHP的路径映射目录
fastcgi_param PATH_TRANSLATED /var/www/html$fastcgi_path_info;
include fastcgi_params;
}
location /nginx_status
{
stub_status on;
access_log off;
}
}
进入宿主机目录 F:\docker-data\tomcat,编写dockerfile文件
FROM centos
MAINTAINER fendouweiqian<[email protected]>
ADD jdk-8u351-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.70.tar.gz /usr/local
#声明工作目录,并通过WORKDIR命令,切换到工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:#JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.70
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.70
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.70/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.70/logs/catalina.out
运行dockerfile生成镜像
docker build -t tomcat:9.0 .
查看镜像
docker images
运行镜像
docker run -it -p 22233:8080 --name tomcat9 -v F:\docker-data\tomcat\webapps\test:/usr/local/apache-tomcat-9.0.70/webapps/test -v F:\docker-data\tomcat\logs:/usr/local/apache-tomcat-9.0.70/logs tomcat:9.0
测试是否成功,访问地址 http://22233,出现熟悉的猫就是成功了
首先在阿里云里面创建空间,路径:容器镜像服务/实例列表/镜像仓库
创建镜像仓库
创建完毕后,会出操作指南,根据操作指南处理
指定需要推送的镜像查看
docker images
命令其实可以参考git
# 本地打包镜像
docker commit -m="php7.4测试版本" -a="fendouweiqian" fendouweiqian/php7.4-fpm-test:1.0
# 登陆仓库(类似登陆git账号)
docker login --username=6742*****@qq.com registry.cn-hangzhou.aliyuncs.com
# 指定需要推送的镜像
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/fendouweiqian1/php7.4-fpm-1.0:[镜像版本号]
ping不同宿主机
如图:docker容器IP地址为172.17.0.2,宿主机的IP为192.168.43.51,相互不能ping通
解决办法: 不用管它,采用的是桥接模式,访问容器的方法是宿主机IP+映射端口。 而不是容器IP+端口
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因:端口被占用
解决办法:看看宿主机的端口进程是被什么占用了,或者改下映射端口。例如 -p 3306:3306 改成 -p 3307:3306
powershell 卡住不动
其实正在下载,只是没有显示出来,可以试试ctrl+c,这个对我有用
另外一种就是重启docker desktop
FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream
可能是两个容器相互之前映射的文件目录不一致引起的问题