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地址。

5. Dockerfile RUN npm install yarn -g 报错

FROM node:14 as builder

WORKDIR /home/geek
COPY package*.json ./
COPY yarn.lock ./
RUN npm install yarn -g
RUN yarn
RUN yarn build

解决办法:
直接删除RUN npm install yarn -g node的docker镜像安装了yarn

EEXIST: file already exists for installing npm package globally in Dockerfile

5. 将本地镜像推送到私有仓库

  • 注册私有仓库地址

    /etc/docker/daemon.json
    {
     "insecure-registries": ["192.81.236.87:8765"]
    }

    如果私有仓库设置里密码,则需要登录docker login 192.81.236.87:8765分别输入用户名密码,登录成功后,后面推送镜像就不需要输入用户名密码了;如果没设置密码则不需要登录。

  • 构建本地镜像

    docker build -t geek:0.0.1 .
  • 对本地镜像打tag

    docker tag geek:0.0.1 192.81.236.87:8765/geek:0.0.1
  • 将镜像推送到私有仓库

    docker push 192.81.236.87:8765/geek:0.0.1

    6. docker compose 重新创建容器

image.png

有四个容器,ragflow-server被我玩坏了,我想给予image重新创建该容器。

docker-compose down service_name
docker-compose up -d service_name

kimi 给出的回答:

在使用 Docker Compose 时,如果你需要重新创建容器,通常有几种方法可以实现:

  1. 使用 docker-compose up 命令
    如果你只是想启动服务,可以使用 docker-compose up 命令。如果容器已经存在,Docker Compose 会尝试重启它们。

    docker-compose up
  2. 使用 docker-compose up -d 命令
    如果你的服务需要在后台运行,可以加上 -d 参数来启动服务。

    docker-compose up -d
  3. 使用 docker-compose down 命令
    如果你需要完全停止并移除服务中的所有容器,可以使用 docker-compose down 命令。之后,你可以再次使用 docker-compose up 来重新创建和启动容器。

    docker-compose down
    docker-compose up
  4. 使用 docker-compose downdocker-compose up 重新创建特定服务
    如果你只想重新创建特定的服务而不是整个应用,可以指定服务名称。

    docker-compose down service_name
    docker-compose up -d service_name
  5. 使用 docker-compose restart 命令
    如果你需要重启所有服务中的容器,可以使用 docker-compose restart 命令。

    docker-compose restart
  6. 使用 docker-compose build 命令
    如果你对 Dockerfiledocker-compose.yml 文件做了更改,并且需要重新构建镜像,可以使用 docker-compose build 命令。之后,使用 docker-compose up 来重新创建容器。

    docker-compose build
    docker-compose up
  7. 使用 docker-compose up --force-recreate 命令
    如果你需要强制重新创建所有服务中的容器,即使它们的配置和镜像没有改变,可以使用 --force-recreate 标志。

    docker-compose up --force-recreate

请根据你的具体需求选择合适的命令。如果你只是想重新创建容器而不需要重新构建镜像,通常使用 docker-compose downdocker-compose up 就足够了。如果你做了代码更改或更新了配置,可能需要先使用 docker-compose build 来重新构建镜像。


assassin_cike
1.3k 声望74 粉丝

生活不是得过且过


« 上一篇
webpack 相关
下一篇 »
styled-components