教程

docker compose 功能速查

docker 命令速查手册 cheat sheet

container

快捷创建 container

  • docker run

创建后台 container

  • docker run -d

后台运行,detach container

  • Ctr + P Ctrl + Q

前台运行 container

  • docker attach

执行命令,开启的 container

  • docker exec <container> <your-command>

运行状态查询 container

  • docker ps -a

列出 container

  • docker ps
  • docker container ls

重命名 container

  • docker rename

删除 container

  • docker rm -f <container>
删除所有终止的容器
  • docker container prune
  • 我的命令

    1
    
    docker ps -a  -f status=exited --format "{{.Names}}"|xargs docker container rm

输入 输出 logs

  • docker logs

检查信息

  • docker inspect

端口

制作端口映射
  • docker run

    • -p
    • -P
查看端口映射
  • docker port <container>

启动,停止,暂停

  • docker start
  • docker stop
  • docker pause

导入 导出,持久化

  • 以镜像的形式

导出

  • docker export <container>

导入

  • docker import

镜像 image

拉取镜像

  • docker pull <image-name>

镜像列表

  • docker images
  • docker image ls

删除镜像

  • docker rmi

创建镜像

更新法
  • docker commit
构建法
  • docker build

命令镜像

  • docker tag

网络

  • docker network

创建

  • docker network create -d bridge <network-name>

已有网络列表

  • docker network ls

指定 dns

  • docker run –dns=8.8.8.8

指定 hostname

  • docker run -h <hostname>
  • docker run –hostname=<hostname>

指定网络

  • docker run –network <network-name>

docker hub 仓库

登录

  • docker login

登出

  • docker logout

拉取

  • docker pull

上传

  • docker push

attach Vs detach

detach

  • 创建时

    1
    
    docker run -i -t -d ubuntu /bin/bash
  • 在启动的命令行中

    • 使用快捷键

      • Ctr + p Ctrl + q

docker run -d

  • 作用:后台运行 container

attach

  • docker attach 命令

    1
    
    docker attach <your-container>

docker exec

  • 作用

    • 使用已经启动的 container
    • 执行命令

container 导入 Vs 导出

  • 作用

    • 把容器快照以镜像的形式保存

导出

  • docker export

    1
    
    docker export <container> > ubuntu.tar

导入

  • docker import

    • 参数解说

      1
      
      docker import [options] [<file> or <http>] [- <respository[:tag]>]
      • 输入内容

        • 文件
        • 或 http
      • 设置导入后的名称

        • '-' 符号不可缺少

image 导出导出

docker save Vs docker load

docker run

  • 选项 options

    • -i

      • interactive
    • -t

      • terminal
    • -d

      • detach
    • –rm

      • 完成后自动删除,生成的 container
    • -P

      • container “所有” 内部网络端口,“随机” 映射到 host
    • -p <host-port>: <internal-port>

    • –name

      • 指定创建的 container 的名字
    • -v <host-path>:<container-path>

      • –volume
      1
      
      docker run -v /home/my_host_data:/data/container_path ubuntu echo hello
      • 匿名卷

        • 不指定主机目录
        • docker run -v <container-path>
        • 作用

          • 防止容器停止时,数据丢失
    • –entrypoint

      • 参考:

      • 用来覆盖 dockerfile 中的 ENTRYPOINT 设定
      • eg:

        1
        2
        3
        4
        5
        
        docker run -it --entrypoint /bin/bash example/redis -c ls -l
        docker run -it --entrypoint /usr/bin/redis-cli example/redis --help
        
        # reset
        docker run -it --entrypoint="" mysql bash

docker port

镜像 images

名称

  • 组成部份

    • Repository 仓库源

      • 格式,可以包含‘/’
      • eg:

        • ubuntu
        • trainning/webapp
    • Tag 标签
  • 例子

    • trainning/webapp:latest

拉取

  • docker pull

    1
    
    docker pull ubuntu:18.04

查找

  • 网站:docker hub

  • 命令

    • docker search

      1
      2
      3
      
      docker search <keyword>
      
      docker search ubuntu

删除

  • docker rmi

创建

  • 两种方式

    1. 更新镜像

      • 运行镜像,变成 container,执行一些命令,完成修改
      • 再保存成镜像
      • 命令:docker commit
    2. 构建镜像

      • 使用 dockerfile 创建,从零开始创建
      • 命令:docker build

更新法 docker commit

1
docker commit -m="my message" -a="author name" <container-hashID> <new-image-name>
  • -m

    • message
  • -a

    • 制定作者

构建法 dockerfile

  1. dockerfile 编写

    • 例子

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      
      FROM    centos:6.7
      MAINTAINER      Fisher "fisher@sudops.com"
      
      RUN     /bin/echo 'root:123456' |chpasswd
      RUN     useradd runoob
      RUN     /bin/echo 'runoob:123456' |chpasswd
      RUN     /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local
      EXPOSE  22
      EXPOSE  80
      CMD     /usr/sbin/sshd -D
  2. 构建 docker build

    1
    
    docker build -t <tag-name> <context-path>
    • -t

      • 指定名称标签
    • -f

      • 指定 Dockerfile 路径

命令和标签

  • docker tag

    1
    
    docker tag 860c279d2fec runoob/centos:dev

Exec 模式 Vs Shell 模式

Exec 模式

1
2
FROM ubuntu
CMD ["top"]
  • 作用

    • 把 CMD 指定的命令,设置 PID 为 1
  • 效果

    • 因为是一号进程,其它环境还不存在
    • 因此,获取不到环境变量,如:$HOME
  • 注意:

    • 这里使用的时双引号"", eg: ["top"]

Shell 模式

1
2
FROM ubuntu
CMD top
  • 作用

    • 把 CMD 指定的命令,传递给 shell -c " your-command options"
  • 效果

    • 一号进程不是指定命令
    • 而是,bash 命令
    • 这样,执行 CMD 指定命令时,环境已经构建
    • 因此,可以获取 环境变量,如:$HOME

CMD Vs ENTRYPOINT

CMD

  • 作用

    • 指定命令,或给 ENTRYPOINT 补充提供命令的默认可选参数

ENTRYPOINT

  • 使用模式

    • Exec 模式
    • Shell 模式
  • 什么时可选参数

    1
    2
    3
    
    FROM ubuntu
    
    ENTRYPOINT ["top", "-b"]
    • 运行命令

      1
      2
      3
      4
      5
      
      # 构建
      docker build -t my-test .
      
      # 运行
      docker run my-test -c
      • 解说

        • 注意这里的 选项 "-c"

          • 它会被添加到 ENTRYPOINT 指定的命令
          • 命令变成:["top", "-b", "-c"]
          • 然后被执行
  • 如何设置默认参数

    1
    2
    3
    
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    • 解说

      • 如果在 docker run 时, 没有指定可选参数

        • ENTRYPOINT 自动变成 ["top", "-b", "-c"]
        • 相当于 python: dict.get("-c", "-c")

          • 没设定,给出默认值
      • 如果在 docker run 时,指定了可选参数

        • CMD ["-c"] 就被丢弃,无用了
        • 而是,使用用户给出的参数
        • eg:

          • 用户给定命令

            1
            
            docker run my-test -n 1
            • 解说

              • 这里 可选参数是 ["-n", "1"]
              • 这样 CMD 指定的 ["-c"] 就无效了
              • 最终变成,ENTRYPOINT ["top", "-b", "-n", "1"]

可选参数 Vs 必需参数

  • ENTRYPOINT 指定必需参数

    • eg: ENTRYPOINT ["top"]
  • CMD 指定可选参数

    • eg: CMD ["-c"]

网络,容器互联

  • docker network

和 host (宿主机) 共享 ip :

  • --network=host

    docker run --network=host
    

创建网络

1
docker network create -d bridge <network-name>

网络列表

  • docker network ls

指定容器网络

  • docker run –netowrk <network-name>

配置容器的 dns

配置使用 容器

  • 配置文件 /etc/docker/daemon.json

    1
    2
    3
    4
    5
    6
    
    {
      "dns" : [
        "114.114.114.114",
        "8.8.8.8"
      ]
    }
  • 重启 docker 生效

配置指定容器的 dns

  • docker run

    • -h hostname

      • –hostname=given-hostname
      • 指定容器的 hostname
      • 实现

        • 修改/etc/hostname 和 /etc/hosts
    • –dns=8.8.8.8

      • dns 服务器
      • 实现

        • 修改 /etc/resolv.conf 实现
    • –dns-search=test.com

      • 对于一个 hostname

        • 不仅搜索 hostname
        • 还要搜索 hostname.test.com

仓库

  • docker hub

登录

  • docker login

登出

  • docker logout

搜索镜像

  • docker search <pattern>

拉取镜像

  • docker pull <image-name>

推送镜像,上传

  • docker push <image-name>

相关命令 docker tag

1
docker tag 33ljlrl3r hello:v1 my-name/hello:v1

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
COPY hom* /mydir/
COPY hom?.txt /mydir/
ENV NODE_VERSION 7.2.0
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
  • 注意

    1. RUN 命令,不能修改 /etc/hostname

指令

  • FROM

    • 指定上一层镜像
  • MAINTAINER

    • 作者
  • RUN

    • 再镜像内执行命令,如:安装软件,配置参数
    • 作用时间:docker build 下
  • EXPOSE

    • 暴露端口
  • CMD

    • 默认启动执行的命令
    • 作用时间:docker run 下
    • 注意:docker run 有指定命令,会覆盖 CMD 指定的命令
    • 还可以指定 可选参数,与 ENTRYPOINT 连用
  • ENTRYPOINT

    • 类似 CMD

      • 但是,使用指定命令的 1)入口命令 2) 必须参数
  • COPY

    • 复制指令
    • [–chown=<user>:<group>]

      • 可选参数,改变文件的拥有者和组
    • 支持通配符
  • ADD

    • 类似 COPY

      • 但是,对于 tar(gzip, bzip2, xz 压缩),可以自动解压缩到目标文件夹
    • 注意:想要保持 tar 文件原样不被解压复制,是不可以的
  • ENV

    • 设置环境变量
    • 格式

      1
      2
      
        ENV <key> <value>
        ENV <key1>=<value1> <key2>=<value2>...
  • ARG

    • 类似 ENV

      • 但是,作用域只在 Dockerfile
    • 使用 docker build –build-arg <key>=<value> 覆盖
    • 格式

      1
      2
      
        ARG key  # 没有初始化
        ARG <key>=<value>  # 默认值形式
  • VOLUME

    • 创建共享卷
    • 格式

      1
      2
      
        VOLUME /demo01
        VOLUME ["/demo02", "/demo03"]
  • WORKDIR

    • 为 RUN,CMD 指定工作目录
    • 类似 linux, cd 命令
  • USER <user>[:<group>]

    • 指定 RUN, CMD, ENTRYPOINT 操作的 所属用户
  • LABLE

    • 为 image 添加 metadata

more than one from directive

docker 的 卷 volume

共享卷

  • 创建方法

    1. docker run

      1
      
      docker run -v /container_path ubuntu bash
      • 注意: 只给出了 容器中的目录
    2. Dockerfile VOLUME 指令

      1
      2
      3
      
      FROM ubuntu
      VOLUME /demo01
      VOLUME ["/demo02", "/demo03"]
    3. 独立卷

      1
      
      docker volume create <volume-name>
  • 挂载到别的 container

    1
    
    docker run --volume-from <other-container> ubuntu bash
    • 自动挂载给定 container 上的所有共享卷

docker ps

  • docker ps -a
  • docker ps
  • docker ps -a -f

格式化输出

过滤输出

删除所有终止的容器

1
2
docker container prune
docker image prune

docker registry 源

获取 registry 上的镜像列表

  1. 镜像列表

    curl -X GET http://localhost:5000/v2/_catalog
    
  2. 获取给定 docker image TAGs 列表

    curl -X GET http://localhost:5000/v2/gpu_test/tags/list
    

加速镜像

设置时区 timezone

1
2
3
ENV TZ "Asia/Shanghai"
ENV DEBIAN_FRONTEND "noninteractive"
RUN apt-get -y install tzdata #  && ln -s -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如何覆盖 ENTRYPOINT 命令

  • 在 Dockerfile 中

    1
    2
    3
    
    FROM prev_image
    
    ENTRYPOINT []
  • 在 docker run 时

    1
    
    docker run -it --entrypoint /bin/bash GivenImage

docker build 代理问题

1
2
docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \
  -t alexellis2/href-counter:build . -f Dockerfile.build

docker run 代理问题

1
docker run -e http_proxy=$http_proxy -e https_proxy=$https_proxy <image>

复制文件到外部

  • docker container cp image-name:/path/in/container /path/in/local

    1
    2
    
    docker container create --name extract alexellis2/href-counter:build
    docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app

docker pull 使用代理问题

配置方法—-一般安装(root 安装)

  1. 创建配置文件

    1
    2
    
    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo emacs /etc/systemd/system/docker.service.d/http-proxy.conf
  2. 修改内容

    1
    2
    3
    4
    
    [Service]
    Environment="HTTP_PROXY=http://192.168.102.1:7890"
    Environment="HTTPS_PROXY=http://192.168.102.1:7890"
    Environment="NO_PROXY=localhost,127.0.0.1"

绕开 docker pull 命令下载镜像

使用 moby download-frozen-image-v2.sh

使用步骤:

1
2
3
4
5
# 1. 下载
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...

# 2. 加载
tar -cC 'target_dir' . | docker load

国内镜像加速

  • 我的

    1
    2
    3
    4
    5
    6
    7
    8
    
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
      {
    "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
      }
      EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    • fish shell

      1
      2
      3
      4
      5
      6
      7
      
        sudo mkdir -p /etc/docker
        echo '
        {
        "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
        }' | sudo tee /etc/docker/daemon.json
        sudo systemctl daemon-reload
        sudo systemctl restart docker
  • 参考

解决 TLS index.docker.com 错误

  • 修改 /etc/hosts

    • 添加 index.docker.com

      1
      
      54.84.81.66 index.docker.io

私有镜像仓库搭建 Registry 使用

Volume

  • 创建

    1
    
    docker volume create
  • 共享 volume

    • 使用 driver

      • vieux/sshfs
      • nfs
      • Amazon S3
  • 用于 docker host

    1
    
    docker run --rm -v sshfs-volume:/tmp/share nginx
  • docker swarm

    1
    2
    3
    
    docker service create --replicas=3 --publish 8080:80 \
       --name nginx \
       --mount type=volume,volume-driver=vieux/sshfs,src=ssh-volume,target=/tmp/share,volume-opt=sshcmd=sawyer@192.168.99.1:/home/sawyer/temp/ssh-volume,volume-opt=password=<PASSWORD>  nginx
    • 注意

      • driver 非 local 时,需要特别指定它
    • volume-driver=vieux/sshfs
    • sshcmd 指定

      • volume-opt=sshcmd=<User>@<Host>:/Path/To/Your/Folder
      • 这个路径一定要存在,否则引发错误

docker Swarm 注意

创建 Service 时

  • 自带 docker service 错误提示功能太弱
  • 最好使用 docker run 自行测试

信号接收问题

压缩 镜像

  • 分布编译
  • pip

    1
    
    pip install -i  https://pypi.tuna.tsinghua.edu.cn/simple -r /tmp/requirements.txt --no-cache && /make_venv/venv/bin/cde data download
    • --no-cache 选项
  • apt

    1
    
    &&  apt-get install -y openjdk-11-jre-headless --no-install-recommends --no-install-suggests

安装

without sudo 配置

  • 命令

    1
    2
    3
    4
    
    sudo groupadd docker
    sudo gpasswd -a $USER docker
    sudo systemctl restart docker.service
    sudo chmod a+rw /var/run/docker.sock

gpu 支持

参考:

nvidia 制作好的 gpu docker images:

安装和配置

  1. 安装 nvidia-container-toolkit 包

    • 注意:先要安装 nvidia driver, 即显卡驱动
  2. 设置 docker 运行时

    • docker, podman 或者 containerd 等
    • 即,把 /etc/docker/daemon.json 中添加下述内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      {
        "runtimes": {
              "nvidia": {
                  "args": [],
                  "path": "nvidia-container-runtime"
              }
          },
          "default-runtime": "nvidia"
      }
      • default-runtime 字段设置可选

运行 docker gpu 容器

注意:如果没有设置 default-runtime, 需要添加参数 --runtime=nvidia

  1. 测试可以使用 GPU

    1
    2
    
    docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
    docker run --runtime=nvidia --gpus all nvidia/cuda:11.0-base nvidia-smi
  2. 使用所有 GPU

    1
    2
    
    docker run --gpus all --rm -it tensorflow/tensorflow:latest-gpu
    docker run --runtime=nvidia --gpus all --rm -it tensorflow/tensorflow:latest-gpu
  3. 使用指定 device gpu

    1
    2
    
    docker run -it --rm --gpus '"device=0,2"' tensorflow/tensorflow:latest-gpu nvidia-smi
    docker run --runtime=nvidia -it --rm --gpus '"device=0,2"' tensorflow/tensorflow:latest-gpu nvidia-smi

docker gpu + compose

1
2
3
4
5
6
7
8
9
services:
  my_llm:
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: ["gpu"]
              driver: 'nvidia'
              device_ids: ['1']

docker build 设置缓存(pip, apt 等)

参考:

注意:

  1. 不可忽略文件开头的 # syntax=docker/dockerfile:1 声明信息

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# syntax=docker/dockerfile:1
FROM ubuntu

# * apt 使用例子
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
    apt update && apt-get --no-install-recommends install -y gcc

# * pip 使用例子
RUN --mount=type=cache,target=/root/.cache/pdm/ \
    /root/.local/bin/pdm sync

RUN --mount=type=cache,mode=0755,target=/root/.cache/pip \
    pip install scipy

paddle + docker

参考:

paddlepadle + cuda + docker 镜像:

buildkit

如何显示中间步骤输出

参考:

方法:

  • 使用 --progress=plain
1
DOCKER_BUILDKIT=1 docker build --progress=plain -t test_buildkit .

history

作用:

  • build 过程的记录,可以查看镜像的 Dockerfile 内容和每一层的 size
1
2
3
4
docker history [container-name]


docker history [container-name] --no-trunc

docker compose

辨析 start Vs up 和 stop Vs down

  1. start/stop 操作的是服务 service
  2. up/down 创建销毁的是容器 container

service 依赖关系 depends_on

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  db:
    ...
  backend:
    ...
  frontend:
    ...
    depends_on:
      - db
      - backend

docker gpu

1
2
3
4
5
6
7
8
9
services:
  my_llm:
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: ["gpu"]
              driver: 'nvidia'
              device_ids: ['1']

网络

container 之间连接

  1. 使用 service 名称连接

    • 注意:不是 container 名或者镜像名
  2. 默认的网络

    • docker compose 会自动创建一个网络:

      • 名称:default
      • driver 类型:bridge
  3. 手动创建网络

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    services:
      db:
        ...
        networks:
          - my_net
      backend:
        ...
        environment:
          - DB_URL: http://db:5432/path/to/db
        networks:
          - my_net
    
    
    networks:
      my_net:
        - driver: bridge

entrypoint 复写 override

docker run –entrypoint

参考:

使用模式:

1
docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>

使用两个命令:

docker run --entrypoint '/usr/bin/bash' --rm -it pyencrypter:centos7.9  -c 'ls / && /root/miniconda3/envs/env/bin/python -m http.server'

使用 docker compose 复写

1
2
3
4
5
6
services:
  app:
    image: "pyencrypter:centos7.9"
    entrypoint: '/usr/bin/bash -c "ls / && cd /root/miniconda3/ && /root/miniconda3/envs/env/bin/python -m http.server 8553"'
    ports:
      - 8553:8553
  • 测试通过

docker 内部程序接收 SIGTERM 信号

  1. 信号传递

    • docker stop, docker compose stop, docker compose restart 等命令,会传递 SIGTERM 信号给内部的 pid=1 的进程

  2. Dockerfile 编写注意事项

    • 需要使用 CMD ["/usr/bin/python", "app.py"] 类似的形式
    • 无效方式 : CMD ["sh", "start.sh"]

      • 即使在 start.sh 启动了 app.py 服务,app.py 也不能接收到 SIGTERM 信号

国内镜像

https://docker.1ms.run


国内有gitee 为什么没有 dockerhub


可用的国内 DockerHub 镜像加速源
DaoCloud 镜像加速器
地址:https://docker.m.daocloud.io。
南京大学镜像站
地址:https://ghcr.nju.edu.cn。
毫秒镜像加速
地址:https://docker.1ms.run。
AtomHub 可信镜像仓库平台
地址:https://atomhub.openatom.cn。
其他加速源
https://docker.1panel.dev
https://dockerpull.org
https://hub.geekery.cn
https://docker.linkedbus.com
配置 Docker 使用加速源
要使用上述加速源,可以通过以下步骤配置 Docker:
创建或修改 /etc/docker/daemon.json 文件:
JSON复制
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run",
    "https://ghcr.nju.edu.cn"
  ]
}
重启 Docker 服务:
bash复制
sudo systemctl daemon-reload
sudo systemctl restart docker
注意事项
部分加速源可能仅支持基础镜像或白名单镜像,如果某个加速地址无法拉取到所需的镜像,可以尝试切换到其他地址。
由于网络环境的变化,某些加速源可能会失效,建议定期检查可用性。
通过以上方法,国内用户可以更高效地使用 DockerHub 镜像资源。

docker container unhealthy 重启

unhealthy 检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
services:
  mdq-table:
    image: myimage
    restart: always

    # 检查健康
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8088/table/is_healthy"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

unhealthy 重启

docker 和 docker compose 不会实现 unhealthy 的 container 自动重启

通过 docker swarm 实现 unhealthy 自动重启

通过 unhealty + 脚本检查 unhealthy container 定期检测重启

步骤:

  1. docker inspect 获取 container 是否 unhealthy 状态
  2. docker restart container-name 实现重启

弊端:

  1. 需要手动输入 container-name
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
services:
  mdq-table:
    image: myimage
    restart: always

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8088/table/is_healthy"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  mdq-table-monitor:
    image: docker:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: >
      sh -c "
        while true; do
          sleep 60
          if [ \"$(docker inspect --format='{{.State.Health.Status}}' scripts-mdq-table-1)\" = \"unhealthy\" ]; then
            echo 'Container unhealthy - restarting...'
            docker restart scripts-mdq-table-1
          fi
        done
      "

unhealthy + docker label + autoheal 实现自动重启

参考:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
  app:
    extends:
      file: ${PWD}/services.yml
      service: app
    labels:
      autoheal-app: true        # 添加 label

  autoheal:
    deploy:
      replicas: 1
    environment:
      - AUTOHEAL_CONTAINER_LABEL=autoheal-app # 指定会重启,哪些 label 的 container
      - AUTOHEAL_INTERVAL=5                    # 检查周期
      - AUTOHEAL_START_PERIOD=20
      - AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 # docker stop sigterm --> sigkill 之间的等待时间
    image: willfarrell/autoheal:latest
    network_mode: none
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock

Dockerfile RUN –mount

参考:

例子:

  • RUN --mount=type=cache,target=/root/.npm npm install
  • RUN --mount=type=bind,target=./build_data/.npm npm install

使用 --mount=type=cache,target=/your/cache/dir 可以在多次 docker build 之间共享缓存数据