代码之家  ›  专栏  ›  技术社区  ›  Igor

docker入门教程中是否缺少一些内容?

  •  0
  • Igor  · 技术社区  · 5 年前

    我正在学习入门教程( https://www.docker.com/101-tutorial -Docker桌面),他们在此处编写了此Docker:

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos
    
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment: 
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    

    然后我的应用程序无法连接到它,出现以下错误:

    app_1    | Error: ER_HOST_NOT_PRIVILEGED: Host '172.26.0.2' is not allowed to connect to this MySQL server
    app_1    |     at Handshake.Sequence._packetToError (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    app_1    |     at Handshake.ErrorPacket (/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
    app_1    |     at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    app_1    |     at Parser._parsePacket (/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
    app_1    |     at Parser.write (/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
    app_1    |     at Protocol.write (/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    app_1    |     at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:91:28)
    app_1    |     at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:525:10)
    app_1    |     at Socket.emit (events.js:310:20)
    app_1    |     at addChunk (_stream_readable.js:286:12)
    app_1    |     --------------------
    app_1    |     at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    app_1    |     at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
    app_1    |     at PoolConnection.connect (/app/node_modules/mysql/lib/Connection.js:119:18)
    app_1    |     at Pool.getConnection (/app/node_modules/mysql/lib/Pool.js:48:16)
    app_1    |     at Pool.query (/app/node_modules/mysql/lib/Pool.js:202:8)
    app_1    |     at /app/src/persistence/mysql.js:35:14
    app_1    |     at new Promise (<anonymous>)
    app_1    |     at Object.init (/app/src/persistence/mysql.js:34:12)
    app_1    |     at processTicksAndRejections (internal/process/task_queues.js:97:5) {
    app_1    |   code: 'ER_HOST_NOT_PRIVILEGED',
    app_1    |   errno: 1130,
    app_1    |   sqlMessage: "Host '172.26.0.2' is not allowed to connect to this MySQL server",
    app_1    |   sqlState: undefined,
    app_1    |   fatal: true
    app_1    | }
    

    docker run -d --network todo-app --network-alias mysql -v todo-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=todos mysql:5.7
    

    是否有任何命令已更新或在使用docker compose的windows上无法正常工作?

    0 回复  |  直到 5 年前
        1
  •  10
  •   β.εηοιτ.βε grigorevp    5 年前

    TL;博士

    运行命令

    docker-compose down --volumes
    

    Running our Application Stack


    我想你正在学习的教程是 this one .

    docker-compose up -d 在步骤1或2中,您可能已经创建了 volume 没有你的 todos

    就要走了 docker-compose down 用你现有的 docker-compose.yml 因为卷正是为此而创建的,所以卷是Docker的永久存储层。

    • 当容器不再存在时,数据不会持久化,如果另一个进程需要数据,则很难从容器中取出数据。
    • 写入容器可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供了一个联合文件系统。与直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能。

    Docker为容器提供了两个选项,用于在主机中存储文件,以便即使在容器停止后也能持久保存文件:卷和绑定装载。如果您在Linux上运行Docker,还可以使用tmpfs挂载。如果您在Windows上运行Docker,还可以使用命名管道。

    资料来源: https://docs.docker.com/storage/

    码头工人放下 :国旗 --volumes 简言之 -v

    -v, --volumes           Remove named volumes declared in the `volumes`
                                section of the Compose file and anonymous volumes
                                attached to containers.
    

    https://docs.docker.com/compose/reference/down/

    因此,您的修复应该简单到:

    1. docker-compose down --volumes
    2. docker compose up-d 运行我们的应用程序堆栈
    3. docker-compose logs -f 如本教程其余部分中的提示
        2
  •  0
  •   Wonkledge    5 年前

    事实上,您的问题来自mysql用户权限。

    在初始化todo数据库的文件末尾添加以下行

      CREATE USER 'newuser'@'%' IDENTIFIED BY 'user_password';
    

    该行将创建一个用户: 新用户 主办 (%)使用密码 用户密码

    跟着这条线走

    GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%';
    

    新用户 从任何

    最后,用您刚刚创建的新mysql环境变量mysql\u USER和mysql\u PASSWORD更改您的mysql环境变量

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: newuser
          MYSQL_PASSWORD: user_password
          MYSQL_DB: todos
    
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment: 
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    
    推荐文章