Docker · 2023年4月9日

Docker创建有卷的MySQL容器!

最近,遇到一个问题:

之前项目所在的服务器,因同事有需求,在没有告诉我的情况下,他擅自重启了。

然后,在启动容器时,发现上面的MySQL容器启动不了。然后,又把该MySQL容器删除进行重新创建。

结果,MySQL容器虽然重新创建成功,但是容器里面之前挂载的 Volume 并未挂载成功。进而导致项目连接数据库时,怎么都连接不成功,一直报数据库连接失败!

那当然了,里面都没有项目需要的数据库,当然连接失败了。。。。。。

经此,我重新做了以下操作:

1)创建 Volume :

docker volume create mysql-data
docker volume ls

2)根据新 Volume 创建新 MySQL 容器:

sudo docker run --privileged=true \
 -p 3306:3306 --name app-fut-mysql \
 -v mysql-data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=数据库密码 \
 -d mysql:5.7

参考:

https://www.jianshu.com/p/84d66703be69

但是这样治标不治本啊,总不能每次容器出问题了,我都重新创建容器再复制数据吧!

所以,我采用了 docker-compose 方式,写了个 compose 文件:

version: '3'
services:  
  mysql57:
    image: mysql:5.7
    privileged: true
    restart: always
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 数据库密码
    volumes:
      - /opt/mysql/log:/var/log/mysql
      - /opt/mysql/data:/var/lib/mysql
      - /opt/mysql/conf:/etc/mysql/conf.d

  php74:
    image: app-gavin:php-7.4-fpm-gd
    ports:
      - 9000:9000
    volumes:
      - /opt/apps:/www

  nginx:
    image: nginx:latest
    volumes:
      - /opt/apps:/usr/share/nginx/html
      - /opt/docker/nginx/conf/conf.d:/etc/nginx/conf.d
      - /opt/docker/nginx/cert/:/cert
      - /opt/apps/keyfile/密钥文件.txt:/密钥文件.txt
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    depends_on:
      - mysql57
      - php74

如果挂载 docker volume 的则用下面的 Yaml:

version: '3'
services:  
  mysql57:
    image: mysql:5.7
    privileged: true
    restart: always
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 数据库密码
    volumes:
      - mysql-data:/var/lib/mysql

  php74:
    image: app-gavin:php-7.4-fpm-gd
    ports:
      - 9000:9000
    volumes:
      - /opt/apps:/www

  nginx:
    image: nginx:latest
    volumes:
      - /opt/apps:/usr/share/nginx/html
      - /opt/docker/nginx/conf/conf.d:/etc/nginx/conf.d
      - /opt/docker/nginx/cert/:/cert
      - /opt/apps/keyfile/密钥文件.txt:/密钥文件.txt
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    depends_on:
      - mysql57
      - php74

volumes:
     mysql-data: