【Docker 环境部署全流程 避坑指南】

一、项目背景

初衷

最近所做的一个项目用到了docker部署,首次在正式服务器使用docker搭建项目,遇到了很多坑,以此记录下来自己遇到的坑和最终的解决办法,如果你也遇到了同样的问题,希望这篇文章可以帮助更多的小伙伴们。

开发环境

php:7.2.4
mysql:5.7.29
node:10.15.3
redis:5.0.5

二、搭建流程

1、项目目标

在阿里云服务器搭建运行php项目

2、环境分析

登录到服务器后,发现给我的服务器上,安装了nginx、docker,docker运行了mysql8容器。然而,自己的项目是php项目,所要求的数据库是mysql5,为了避免与正式服务器原有业务冲突,选择docker下安装nginx容器、php容器、mysql容器、node容器、redis容器,并且版本也方便管理。

3、执行

确定好思路,下手干吧,进入最关键的环节:

a、docker安装信息确认

正式服务器已安装好了docker,执行命令:docker version

// 查看docker信息
# docker version

查看docker信息,确认docker正常运行

b、 安装docker-compose

(1)使用pip安装:

执行命令:pip install docker-compose

(2)执行结束后,查看安装信息

执行命令:docker-compose version

(3)进入到项目目录docker文件目录

安装启动容器
执行命令:docker-compose -p 【docker所在上级目录名】 down && docker-compose -p 【docker所在上级目录名】 up -d
注意:-d参数是让docker后台运行
在这里插入图片描述

问题一:容器安装失败,端口被占用

安装进行到这里,遇到了第一个坑。
nginx 443端口被占用;
mysql 3306端口被占用;
redis 6379端口被占用;
在这里插入图片描述
解决方式:
在docker-compose.yml文件修改对应容器端口号:

// docker-compose.yml文件内容
version: '3'

networks:
  likeshop:
    driver: bridge

services:

  nginx:
    container_name: likeshop-nginx
    image: nginx:1.17.0
    restart: always
    depends_on:
      - "php7.2.4"
    volumes:
      - ../server:/server
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - ./log/nginx/logs:/logs
    networks:
      - likeshop
    ports:
#      - "80:80"
#      - "443:443"
#      - "9001:9001"
      - "9001:9001"

  php7.2.4:
    container_name: likeshop-php7.2.4-fpm
    image: likeshop/php:7.2.4-fpm
    restart: always
    working_dir: /server
    volumes:
      - ../server:/server
      - ./config/php/php.ini:/usr/local/etc/php/php.ini
    networks:
      - likeshop
    ports:
      - "9004:9000"
    #user: "1000:1000"

  mysql:
    container_name: likeshop-mysql
    image: mysql:5.7.29 #X86架构
    #image: amd64/mysql:5.7.29 #arm架构
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./data/mysql5.7.29/lib:/var/lib/mysql5
      - ./config/mysql/mysqld.cnf:/etc/mysql5/my.cnf
    networks:
      - likeshop
    ports:
#      - "3306:3306"
      - "9002:9002"

  redis:
    container_name: likeshop-redis
    image: redis:5.0.5
    restart: always
    volumes:
      - ./data/redis:/data
    networks:
      - likeshop
    ports:
#      - "6379:6379"
      - "9003:9003"

  node:
    container_name: likeshop-node
    image: node:10.15.3
    restart: always
    volumes:
      - ../web:/web
    networks:
      - likeshop
    tty: true
    working_dir: /web
    ports:
      - "8080:8080"

修改后,重新执行安装命令,成功了:
在这里插入图片描述

问题二:访问页面404

在这里插入图片描述

修改服务器nginx配置后,问题解决:

宿主主机nginx配置

// 
server {
    listen      443 ssl;
    server_name  【阿里云配置的域名地址】;
    charset 'utf-8';
    ssl on;
    ssl_certificate      【证书的地址】;
    ssl_certificate_key  【证书key的地址】;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers on;
    
    location / {
#           proxy_set_header Host $proxy_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:9001/;  // 重要:代理代理到 nginx容器
     }                  
}

nginx容器配置

server {
    listen 9001;

    server_name  【阿里云配置的域名地址】;
    access_log /logs/www.dev.buleroot_access_nginx.log;
    error_log /logs/www.dev.buleroot_error_nginx.log;
    client_max_body_size 5M;

    location / {
        root   /server/public;
        index  index.html index.htm index.php;
        if (!-e $request_filename)
        {
            rewrite ^/(.*)$ /index.php?s=$1 last;
            break;
        }
    }
    location ~ /.*\.php/ {
        rewrite ^(.*?/?)(.*\.php)(.*)$ /$2?s=$3 last;
        break;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html;
    }

    location ~ \.php$ {
        fastcgi_pass   likeshop-php7.2.4-fpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /server/public$fastcgi_script_name;
        include        fastcgi_params;
    }
    location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
}

问题三:容器无法连接外网

页面能访问了,但是项目需要composer install来安装组件,提示联网超时,此时要解决容器内部连接外网的问题。

查看服务情况,执行命令:dockcer info

# dockcer info
// 发现如下预警信息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

// 查看 /etc/sysctl.conf配置是否包含:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1

// 没有需要添加,添加完执行
sysctl -p

最后重启docker

重启docker,使容器不受影响
让容器自动启动
docker update --restart=always mysql8

docker update --restart=always likeshop-nginx
docker update --restart=always likeshop-php7.2.4-fpm
docker update --restart=always likeshop-mysql
docker update --restart=always likeshop-redis
docker update --restart=always likeshop-node

重启docker
docker restart likeshop-php7.2.4-fpm
docker restart likeshop-mysql

docker restart likeshop-nginx
docker restart likeshop-redis
docker restart likeshop-node

问题解决。

  • 31
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a408492801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值