在Centos7 上利用Docker搭建LNMP环境

常用命令

docker pull pkg:version     # 拉取 image
docker images               # 查看所有 image
docker rmi myphp            # 删除 image
docker ps                   # 查看运行中的 container
docker ps -a                # 查看所有 container
docker inspect myphp        # 查看 container 配置
docker logs myphp           # 查看 container 日志
docker restart myphp        # 重启 container
docker stop myphp           # 停止 container
docker rm myphp             # 删除 container
docker exec -it myphp bash  # 进入到 container 
docker build -t repository_name[:tag_name] Dockerfile_dir # 构建 image
docker volume ls            # 查看数据卷
docker volume prune         # 删除所有数据卷!!!!!!超级危险,生产环境不要执行!!!!!!
  1. 先配置阿里云的容器镜像服务
    阿里云镜像加速器
    其实就是在linux里执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e5w39ty6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.下载镜像

docker pull php:7.2-fpm     # 冒号后选择版本

docker pull nginx

docker pull mysql:5.7       # 不需要本地数据库可忽略

docker pull redis:3.2       # 不需要本地redis可忽略

docker images               # 查看已下载的所有镜像

3.创建容器
要注意容器的启动顺序
参数解释:

注:
-i 表示允许我们对容器进行操作
-t 表示在新容器内指定一个为终端
-d 表示容器在后台执行
/bin/bash 这将在容器内启动bash shell
-p 为容器和宿主机创建端口映射     -p 8081:8080 用于将容器内的8080端口映射到主机的8081端口
--name 为容器指定一个名字
-v 将容器内路径挂载到宿主机路径
--privileged=true 给容器特权,在挂载目录后容器可以访问目录以下的文件或者目录
--link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,解除了容器之间通信对容器IP的依赖 
格式:原容器名:设置的别名
在nginx配置文件中,监听php的ip,就可以使用别名,而不使用ip

4.先创建php ,nginx的映射目录

/**nginx映射的宿主机目录*/
mkdir -p /usr/local/lnmp/nginx/conf.d     /usr/local/lnmp/www  /usr/local/lnmp/logs
/**php映射的宿主机目录*/
mkdir -p /usr/local/lnmp/php  

首先创建一个测试的nginx
因为不能挂载文件,只能挂载文件夹,所以先在一个test容器中复制一份配置文件。
复制一份 nginx.conf和default.conf

docker run --name test -d nginx 

docker cp test:/etc/nginx/nginx.conf  /usr/local/lnmp/nginx/
docker cp test:/etc/nginx/conf.d/default.conf  /usr/local/lnmp/nginx/conf.d

如果不知道配置文件的存放目录,可以进去容器查看一下。

docker exec -it test /bin/bash

启动容器

###### mysql容器
docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# 注:-MYSQL_ROOT_PASSWORD=123456 给mysql设置初始密码,如果不需要搭建本地数据库直接下一步

###### php容器容器
docker run --name myphp -d -p 9000:9000 -e TZ=Asia/Shanghai -v /usr/local/lnmp/www:/var/www/html -v /usr/local/lnmp/php:/usr/local/etc/php --privileged=true php:7.2-fpm
#注意-v 挂载一个空文件夹是会覆盖容器中的内容,所以配置文件要事先准备好

###### nginx容器
docker run --name mynginx -d -p 80:80 -e TZ=Asia/Shanghai -v  /usr/local/lnmp/www:/usr/share/nginx/html  -v /usr/local/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/lnmp/nginx/conf.d:/etc/nginx/conf.d  -v /usr/local/lnmp/logs/nginx:/var/nginx/logs --link myphp:myphp --privileged=true nginx
#注:
#-v语句冒号后是容器内的路径 我将nginx的网页项目目录 配置目录 日志目录分别挂载到了我事先准备好的/usr/local/lnmp/nginx目录下
#--link myphp:myphp 将nginx容器和php容器连接 通过别名myphp就不再#需要去指定myphp容器的ip了 

查看所有容器运行成功 这里环境也就基本搭建完成了

docker ps -a

如果有容器创建失败,则可以使用docker logs name 查看日志,按照日志报错解决问题
在宿主主机的nginx工作目录里写一个phpinfo.php文件
我的在/usr/local/lnmp/www目录里


nginx配置修改 (因为之前是拷贝的test容器的nginx的配置文件,当作mynginx容器的主机映射配置文件,所以要修改)
我的在/usr/local/lnmp/nginx/conf.d文件夹下的default.conf文件

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        #这里是工作目录指定,已经映射到宿主主机的自定义文件夹
        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           /var/www/html;  #php的工作目录
        fastcgi_pass   myphp:9000;
         #php容器的名字和端口,容器与容器之间建立连接必须指定对方ip 使用命令 docker inspect --format='{{.NetworkSettings.IPAddress}}' myphp就可以
        # 我们在创建容器时,已经通过 --link 的方式创建容器,我们可以使用被link容器的别名进行访问,而不是通过ip,解除了对ip的依赖
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$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;
    #}
}

在浏览器里访问就可以了

最后把 test的容器删掉
完结,撒花。
https://github.com/assoyuan/docker_example/blob/master/README.md
https://segmentfault.com/q/1010000016515320
https://blog.csdn.net/qq_42114918/article/details/85238011

你可能感兴趣的:(Docker)