docker 踩坑

assassin_cike

1. 运行导出的镜像报错:docker: Error response from daemon: No command specified.

上传了web到NGINX,通过 docker export -o mynginx.tar [contianer id]构建出container文件,将文件拷贝到另一台装有docker的机器,运行docker import mynginx.tar 得到
docker import
repository跟tag字段都是没有数据的,原来docker import 也有额外的参数
有值啦
但是通过该镜像启动容器又报错了
docker: Error response from daemon: No command specified.

docker run

查阅资料知道,运行导入的镜像必须带上command参数。但是通过docker ps查看是省略号
看到的是省略号
换个命令docker ps --no-trunc查看完整的命令,最后运行该镜像的容器带上command参数,成功运行
docker run

2. 执行docker load -i nuxt.tar后 repository tag 都为none

image.png

我以为load跟import一样可以有额外的参数,于是乎docker load -i nuxt.tar nuxt,然后

image.png

需要在docker save的时候加上参数docker save -o nuxt.tar nuxt:1.0.0冒号后面的tag版本必须是存在的,不然也没法正确执行。如果需要改镜像名称跟版本号可以使用docker tag [镜像id] [新镜像名称]:[新镜像标签]

3. volume设置后对应的宿主机目录删除,则需要重新关联

比如
docker-compose.yaml

version: "3.8"
services:
  cloud:
    image: cloud:latest
    volumes:
      - /data/dist:/app/web

然后我将宿主机中的dist目录删掉,重新建个dist目录,这个时候容器是读不到该目录的,遇到这种情况怎么办?

  • 不删除宿主机的dist目录,而是替换里面的内容
  • 停掉该容器,重新运行 docker-compose up -d

4. 多个docker-compose.yml 共享网络 实现通信

我有两个站点,都是前后端分离的项目,为了使两个站点使用同一个mariadb,需要两个不同的docker-compose中的容器通信

  • 站点a
    docker-compose.yaml

    version: "3"
    networks:
    aa-web:
      driver: bridge
    
    services:
    mariadb:
      image: mariadb
      ports:
        - 3306:3306
      restart: always
      container_name: mariadb
      environment:
        MYSQL_ROOT_PASSWORD: 123456
        MYSQL_DATABASE: testDB
        MYSQL_USER: ee
        MYSQL_PASSWORD: 123456
      volumes:
        - ./db/initdb.d:/docker-entrypoint-initdb.d
      networks:
        - aa-web
    front-rest:
      build: ../aa-fe-rest
      container_name: front-rest
      restart: always
      ports:
        - 3465:3465
      depends_on:
        - mariadb
      networks:
        - aa-web
    front-nuxt:
      build: ../aa-nuxt
      restart: always
      ports:
        - 8643:8643
      depends_on:
        - front-rest
      networks:
        - aa-web
    nginx-web:
      build: ../nginx-web
      restart: always
      ports:
        - 80:80
        - 443:443
      depends_on:
        - front-nuxt
      networks:
        - aa-web
  • 站点b
    docker-compose.yaml

    version: "3"
    
    services:
    bb-front-rest:
      build: ../bb-fe-rest
      container_name: bb-front-rest
      restart: always
      ports:
        - 8536:8536
      networks:
        - docker-compose-bb_bb-web
      external_links:
        - mariadb
    bb-front-nuxt:
      build: ../bb-nuxt-first
      container_name: bb-front-nuxt
      restart: always
      ports:
        - 2683:2683
      depends_on:
        - bb-front-rest
      networks:
        - docker-compose-bb_bb-web
      external_links:
        - mariadb
    networks:
    docker-compose-bb_bb-web:
      external: true

    在站点a中建立了网络aa-web 然后在站点b中配置网络

    networks:
    docker-compose-bb_bb-web:
      external: true

    docker-compose-bb_bb-web这个名字可以根据docker network ls 命令或者docker network inspect docker-compose-bb_bb-web 查看具体哪些容器在使用。这样我们就可以在b站点使用同一个mariadb了。容器之间通信可以直接用容器名,而不是ip地址。

阅读 729

前端大杂烩
前端随想,专注于react、vue技术栈

生活不是得过且过

1.3k 声望
65 粉丝
0 条评论
你知道吗?

生活不是得过且过

1.3k 声望
65 粉丝
文章目录
宣传栏