一、创建网络
命令:docker network create my_net
docker network说明
-d bridge #用于管理网络的驱动程序 -
-subnet #CIDR格子的子网,代表网段, docker network create --driver=bridge --subnet=192.168.0.0/16 br0
具体查看:https://docs.docker.com/engine/reference/commandline/network_create/
二、安装nginx
1、远程拉取nginx镜像
docker pull nginx
2、运行nginx容器
- 前提
先进入nginx容器查看需要挂在的文件在哪里 docker run -itd docker.io/nginx:latest /bin/bash 然后docker exec -it 容器id /bin/bash 进入 然后需要把nginx.conf和default.conf拷贝出来
注意:此镜像可能是Ubuntu的,而且是简易的,很多命令不能使用。可能只能用cat查看文件内容,下面我会附一个ubuntu的基本几个操作命令
可以查看一下系统
在宿主机上建几个文件
/usr/local/nginx/conf/nginx.conf nginx的配置文件,内容是容器中拷贝出来的nginx.conf内容
/usr/local/nginx/logs 需要挂在的日志文件
/usr/local/nginx/conf.d 项目的配置文件
/usr/local/nginx/conf.d/default.conf 项目配置文件,内容由容器中拷贝的default.conf
/www/test1 项目代码文件
- 开始创建容器
docker run --name=nginx -itd -p 80:80 --network=my_net --network-alias=nginx -v /www/test1:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/var/log/nginx docker.io/nginx:latest /bin/bash
- 进入容器并启动nginx
docker exec -it cfd44052045c /bin/bash
容器中开启nginx:service nginx start
-p 80: 80 是为了让容器的80端口暴露出来,这样容器才能被外部访问
--network=my_net --network-alias=nginx 其中--network=my_net 是指容器使用my_net的网络,--network-alias=nginx 指给容器网络起一个别名
-v /www/test1:/usr/share/nginx/html 把nginx 放代码的/usr/share/nginx/html路径挂在到宿主机上的 /www/test1
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 把nginx的配置文件挂在到宿主机 /usr/local/nginx/conf/nginx.conf上
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d 把项目的conf配置文件也同步到宿主机上
-v /usr/local/nginx/logs:/var/log/nginx 把日志也挂在到宿主机上
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;
}
default.conf:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
#charset koi8-r;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
# error_log /usr/local/nginx/logs/nginx/devadmin.xiuxiutool.meitu.com-error.log error;
#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;
# }
sendfile off;
client_max_body_size 100m;
client_body_buffer_size 100m;
proxy_read_timeout 300;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000; #php-fpm的网络
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
#fastcgi_buffer_size 16k;
fastcgi_buffer_size 1024k;
#fastcgi_buffers 4 16k;
fastcgi_buffers 64 1024k;
fastcgi_param MY_ENV dev;
}
location ~ /\.ht {
deny all;
}
}
三、安装php
1、拉取远程php镜像
docker pull docker.io/bitnami/php-fpm #注意要拉取php-fpm 如果拉php则可能拉的镜像是不包含fpm,得自己安装
2、运行php容器
- 前提
先进入php容器查看需要挂在的www.conf文件在哪里
docker run -itd docker.io/bitnami/php-fpm:v1 /bin/bash
docker exec -it 0aeac71168c70335e773303400169719b4a238b540de4b08016034cd6cfa300b /bin/bash
find / -name www.conf
注意:此镜像可能是Ubuntu的,而且是简易的,很多命令不能使用。可能只能用cat查看文件内容,下面我会附一个ubuntu的基本几个操作命令
先进入php容器查看需要挂在的www.conf文件在哪里
docker run -itd docker.io/bitnami/php-fpm:v1 /bin/bash
docker exec -it 0aeac71168c70335e773303400169719b4a238b540de4b08016034cd6cfa300b /bin/bash
find / -name www.conf
docker run -itd -p 9000:9000 --name=php --network=my_net --network-alias=php -v /www/test1:/usr/share/nginx/html -v /usr/local/php/php-fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf docker.io/bitnami/php-fpm:latest /bin/bash
- 说明
-p 9000:9000 是为了让容器的9000端口暴露出来,这样容器才能被外部访问
--network=my_net --network-alias=php 其中--network=my_net 是指容器使用my_net的网络,--network-alias=php 指给容器网络起一个别名
-v /www/test1:/usr/share/nginx/html 把php 放代码的/usr/share/nginx/html路径挂在到宿主机上的 /www/test1,/usr/share/nginx/html这个是由nginx决定的
-v /usr/local/php/php-fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf 是为了把www.conf挂载到宿主机上
- 配置
vi /usr/local/nginx/conf.d/default.conf
fastcgi_pass php:9000;
- 进入容器
docker exec -it d72abe7274be /bin/bash
/opt/bitnami/php/sbin/php-fpm -c /opt/bitnami/php/etc/php.ini #在容器中启动php-fpm
telnet 172.18.0.3 9000 #看是否可以访问9000端口,如果可以的话,那就ok了
- 进入nginx容器,重启nginx: service nginx start
- 宿主机容器的一些操作
#显示某个容器ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
#显示所有容器IP地址:
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
- Ubuntu一些操作命令
apt-get update #更新源。
apt-get install telnet #安装telnet命令,用telnet 127.0.0.1 9000 可以看端口是否启动
apt-get install lsof #安装lsof lsof -i:9000可以查看9000端口是否启动
apt-get install vim #安装vim编辑
netstat -ap | grep 9000
四、安装mysql
1、拉取远程mysql镜像
docker pull mysql:5.6
2、建立需要挂在目录
cd /usr/local/
mkdir mysql
cd mysql
mkdir conf
mkdir data
mkdir logs
3、运行mysql容器
docker run -p 3306:3306 --name=mysql --network=my_net --network-alias=mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d 95e0fc47b096
4、说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v /usr/local/mysql/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v /usr/local/mysql/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v /usr/local/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
# 最后行数的日志
journalctl -n
docker rm -f $(docker ps -aq) #删除所有容器
注意:
nginx 和php都要把文件目录挂载在同一个地方(-v /www/test1:/usr/share/nginx/html)的原因:
我们知道,Nginx配置都有这样一项:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
其中,$document_root就是server块下root所指的路径:
server {
#... root /usr/share/nginx/html;
#...
}
这里$document_root就是/usr/share/nginx/html。
如果Nginx和PHP-FPM在同一主机,Nginx会通过9000端口把这个目录值和脚本URI传给PHP-FPM。
PHP-FPM再通过9000端口接收Nginx发过来的目录值和脚本URI,发给PHP解析。
PHP收到后,就到指定的目录下查找PHP文件并解析,完成后再通过9000端口返回给Nginx。
如果Nginx和PHP-FPM在同一个主机里面,PHP就总能找到Nginx指定的目录。
但是,如果他们在不同的容器呢?
未做任何处理的情况,Nginx容器中的站点根目录,PHP-FPM容器肯定不存在。
所以,这里需要保证Nginx和PHP-FPM都挂载了宿主机的/www/test1,并且都挂载在容器的:/usr/share/nginx/html
可以看:
https://www.awaimai.com/2120.html
执行顺序:
参考:
https://www.runoob.com/docker/docker-install-mysql.html