Docker - 如何将 /var/lib/mysql 挂载到 Docker MySQL 容器中

5

是否有可能将已安装的mysql/var/lib/mysql数据挂载到docker mysql容器中?

因为我不想迁移所有的mysql和mongodb,因为我的数据已经达到了50+Gb,并且每天都在增长。

我已经设置了要挂载mysql数据文件夹的卷,但不幸的是它对我来说不起作用。

我已经尝试过了,但还是不行,我是漏掉了什么东西还是做错了什么?

version: "3"
services:
  app:
    build:
      context: ./app
      dockerfile: ./dockerfile      
    container_name: flaskPython
    links:
      - mysqldb
      - mongodb
    ports:
      - "5000:5000"
  myadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        ports:
            - "8282:80"
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=${MYSQL_HOST}
        restart: always
        depends_on:
            - mysqldb
            - mongodb  
  mysqldb:
        image: mysql:${MYSQL_VERSION}
        container_name: ${MYSQL_HOST}
        restart: 'always'
        expose:
            - '3306'
        env_file:
            - ".env"
        environment:
            - MYSQL_DATABASE=${MYSQL_DATABASE}
            - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
            - MYSQL_USER=${MYSQL_USER}
            - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        ports:
            - "8989:3306"
        volumes:
            #- ./data/db/mysql:/var/lib/mysql
            - /var/lib/mysql:/var/lib/mysql
  mongodb:
        image: mongo
        container_name: mongodb
        restart: always
        environment:

          - MONGO_INITDB_ROOT_USERNAME=root
          - MONGO_INITDB_ROOT_PASSWORD=root
        # if you wish to setup additional user accounts specific per DB or with different roles you can use following entry point
        #no --auth is needed here as presence of username and password add this option automatically
        command: mongod
        ports:
            - "27017:27017"
        volumes:
          - ./mongo-entrypoint/:/docker-entrypoint-initdb.d/
          - ./data/db/mongo:/usr/data/db

日志:

2019-02-01T16:08:20.100825Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-02-01T16:08:20.101919Z 0 [Note] mysqld (mysqld 5.7.22) starting as process 1 ...
2019-02-01T16:08:20.104031Z 0 [Note] InnoDB: PUNCH HOLE support available
2019-02-01T16:08:20.104043Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-02-01T16:08:20.104046Z 0 [Note] InnoDB: Uses event mutexes
2019-02-01T16:08:20.104048Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2019-02-01T16:08:20.104050Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2019-02-01T16:08:20.104052Z 0 [Note] InnoDB: Using Linux native AIO
2019-02-01T16:08:20.104214Z 0 [Note] InnoDB: Number of pools: 1
2019-02-01T16:08:20.104285Z 0 [Note] InnoDB: Using CPU crc32 instructions
2019-02-01T16:08:20.105476Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2019-02-01T16:08:20.110790Z 0 [Note] InnoDB: Completed initialization of buffer pool
2019-02-01T16:08:20.112288Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-02-01T16:08:20.123892Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
2019-02-01T16:08:20.139921Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-02-01T16:08:20.139996Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-02-01T16:08:20.170786Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-02-01T16:08:20.173104Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
2019-02-01T16:08:20.173143Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
2019-02-01T16:08:20.174483Z 0 [Note] InnoDB: Waiting for purge to start
2019-02-01T16:08:20.224878Z 0 [Note] InnoDB: 5.7.22 started; log sequence number 1529088986
2019-02-01T16:08:20.225403Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-02-01T16:08:20.225887Z 0 [Note] Plugin 'FEDERATED' is disabled.
2019-02-01T16:08:20.231185Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190201 16:08:20
2019-02-01T16:08:20.233231Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2019-02-01T16:08:20.233502Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2019-02-01T16:08:20.233535Z 0 [Note] IPv6 is available.
2019-02-01T16:08:20.233544Z 0 [Note]   - '::' resolves to '::';
2019-02-01T16:08:20.233556Z 0 [Note] Server socket created on IP: '::'.
2019-02-01T16:08:20.236451Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2019-02-01T16:08:20.248740Z 0 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.248832Z 0 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.248857Z 0 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.248875Z 0 [Warning] 'user' entry 'debian-sys-maint@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.248921Z 0 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.248935Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.249216Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.256300Z 0 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.256349Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-02-01T16:08:20.301149Z 0 [Note] Event Scheduler: Loaded 0 events
2019-02-01T16:08:20.301811Z 0 [Note] mysqld: ready for connections.
Version: '5.7.22'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

由于我进行了一些更改,导致出现不同的错误。 有时容器崩溃,有时无法连接到mysql(111)。


1
你确定你没有同时运行两个mysql实例吗?一个在主机上,另一个在docker中?你能否将/var/lib/mysql复制(移动)到新位置,然后将其挂载到docker中? - Alex Yu
@AlexYu 我没有问题,我会停止主机mysql,因为如果我的mysql容器将使用那些数据,我就不需要它...我已经将/var/lib/mysql复制到项目文件夹中的mysql容器中,然后它一次又一次地崩溃,无法启动任何mysql服务... - Muhammad Hamza Younas
你能在你的Docker化的MySQL中运行 docker run -it [你的mysql容器] bash,然后 chown 挂载的文件吗? - Alex Yu
@AlexYu 是的,我可以运行,请告诉我挂载的命令。 - Muhammad Hamza Younas
1
Docker卷中的文件可以称为“挂载”。因此,您已经将它们“挂载”了。我建议您采用Exadra37的答案。 - Alex Yu
1个回答

2

问题

问题可能是由Mysql和MongoDB的版本以及用户UID和GID导致的,涉及到/var/lib/mysql/data/db/mongo文件夹。

版本

首先,在容器中运行的Mysql版本和MongoDB版本需要与主机上运行的版本相同,才能使用主机中使用的相同文件夹。

请注意,您不能在主机和容器中同时运行Mysql服务器和MongoDB服务器,并共享相同的文件。

我指的是主机上的/var/lib/mysql/data/db/mongo文件夹。

如果您想在本地主机上继续运行服务器,则需要将这些文件夹复制到其他位置,并使用户的UID和GID相同。

用户UID和GID

docker容器和主机中的Mysql用户和Mongo DB用户必须具有相同的UID和GID。

在两者中均可检查:

$ sudo docker run --rm -it mysql bash
root@4c07b20e88c4:/# grep -irn mysql /etc/passwd
20:mysql:x:999:999::/home/mysql:
root@4c07b20e88c4:/# grep -irn mysql /etc/group
40:mysql:x:999:

最初的回答
或者使用:
root@4c07b20e88c4:/# id -u mysql
999
root@4c07b20e88c4:/# id -g mysql
999

你可以看到用户和组的UID均为999。现在在主机上重复相同的操作。

可能的解决方案

检查主机和容器中Mysql和MongoDB的版本,如果不匹配,请更新容器以运行与主机相同版本。

还需要在主机上设置Mysql和MongoDB的用户,使其具有与容器内使用的相同UID和GID,或者反过来...选择最适合您用例的方法。

更改用户的UID和GID

在shell中运行:

root@4c07b20e88c4:/# usermod -u 800 mysql
root@4c07b20e88c4:/# id -u mysql
800
root@4c07b20e88c4:/# groupmod -g 800 mysql
root@4c07b20e88c4:/# id -g mysql
800

800替换为您想要的id号,将mysql替换为您想要更改ids的用户名。
接下来,更新该用户的文件权限:
find / -user <OLDUID> -exec chown -h <NEWUID> {} \;

"最初的回答" - 以及对于这个群体:
find / -group <OLDGID> -exec chgrp -h <NEWGID> {} \;

More info here


如果我需要更改Dockerfile或docker-compose.yml文件,我将使用单独的文件来处理MySQL和MongoDB,但如何设置主机上的用户具有相同的gid和uid呢? - Muhammad Hamza Younas
我完成后会告诉你。 - Muhammad Hamza Younas
1
我在我的回答中还添加了有关Mysql和MongoDB版本的详细信息。 - Exadra37
我的本地机器:root@hamza-Inspiron-5570:/var/lib/mysql# grep -irn mysql /etc/passwd 40:mysql:x:121:129:MySQL服务器,,,:/nonexistent:/bin/false root@hamza-Inspiron-5570:/var/lib/mysql# grep -irn mysql /etc/group 68:mysql:x:129: root@hamza-Inspiron-5570:/var/lib/mysql# - Muhammad Hamza Younas
容器:root@aca566a0ea0c:/# grep -irn mysql /etc/passwd 20:mysql:x:999:999::/home/mysql: root@aca566a0ea0c:/# grep -irn mysql /etc/group 40:mysql:x:999: root@aca566a0ea0c:/# - Muhammad Hamza Younas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接