🖋️Docker 知识
2023-7-16
| 2024-7-9
0  |  阅读时长 0 分钟
type
status
password
date
slug
summary
category
URL
tags
icon

docker命令

  • docker ps -s:命令用于列出Docker容器占用的空间,有些容器不包括
  • docker system df: 查看内存
  • docker system prune -a清理内存
  • docker logs --since 30m CONTAINER_ID查看最近30分钟的日志
  • docker inspect --format '{{.LogPath}}' 97069f94437b:查看容器日志地址
  • docker run -itd --name test -p 6080:6080 arm64v8/ubuntu:22.04运行docker
  • docker exec -it openwrt bashdocker交互
  • docker login登录docker
  • docker commit vser vs:v1:dockers commit 容器名 镜像名:版本名
  • docker tag vs:v1 cccc/vserver:v1:docker的用户名/dockerhub上创建的仓库名:版本号
  • docker push cccc/vserver:v1:push本地镜像到仓库
  • docker build --network host:使用宿主机构建镜像
  • --rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统。

添加镜像源

创建或打开/etc/docker/daemon.json
运行docker

设置代理

  • 创建并编辑/etc/systemd/system/docker.service.d/proxy.conf
    运行docker

    拉取指定架构镜像

    镜像导入导出

    docker Compose 模板文件

    💡
    注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。

    DockerFile使用教程

    配置文件

    • FROM 指定基础镜像
    • 命令一般有两种。
      • shell 格式
      • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式

    RUN命令

    • RUN 指令是用来执行命令行,每一个 RUN 的行为都会新建立一层。但是曾是有最大限制,不能创建太多层

    COPY命令

    COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。

    ADD命令

    ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整。

    CMD 容器启动命令

    CMD 指令就是用于指定默认的容器主进程的启动命令的。CMD 指令的格式和 RUN 相似,也是两种格式:
    • shell 格式:CMD <命令>
    • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    在运行时可以指定新的命令来替代镜像设置中的这个默认命令,比如,ubuntu 镜像默认的 CMD/bin/bash,如果我们直接 docker run -it ubuntu 的话,会直接进入 bash。我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。 对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。而使用 service nginx start 命令,则是希望 init 系统以后台守护进程的形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:

    ENTRYPOINT 命令

    ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。但与CMD不一样的是,当存在 ENTRYPOINT 后,CMD 的内容将会作为参数传给 ENTRYPOINT
    CMD命令
    ENTRYPOINT命令

    ENV命令

    设置环境变量,格式有两种:
    • ENV <key> <value>
    • ENV <key1>=<value1> <key2>=<value2>...

    ARG 命令

    格式:ARG <参数名>[=<默认值>]
    ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
    ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。
    使用上述 Dockerfile 会发现无法输出 ${DOCKER_USERNAME} 变量的值,要想正常输出,你必须在 FROM 之后再次指定 ARG

    EXPOSE命令

    声明端口。格式为 EXPOSE <端口1> [<端口2>...]

    WORKDIR 命令

    指定工作目录。格式为 WORKDIR <工作目录路径>

    USER 命令

    指定当前用户格式:USER <用户名>[:<用户组>]

    HEALTHCHECK 命令

    健康检查,HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。有以下两种格式
    • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
    • HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
    在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。
    -interval=<间隔>
    两次健康检查的间隔,默认为 30 秒
    -timeout=<时长>
    健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒
    -retries=<次数>
    当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次
    HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效

    ONBUILD 命令

    ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

    LABEL 命令

    LABEL 指令用来给镜像以键值对的形式添加一些元数据(metadata)。

    SHELL 命令

    SHELL ["executable", "parameters"]SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shell,Linux 中默认为 ["/bin/sh", "-c"]

    多阶段构建镜像

    • COPY --from httpd:latest /usr/local/apache2/conf/httpd.conf ./httpd.conf:使用外部镜像名。

    创建镜像

    docker build -t myubuntu:v1 .
    • docker:docker命令。
    • build:编译。
    • t:镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag,参考docker build命令详解
    • myubuntu:生成镜像的名称。
    • v1:生成镜像的版本号。
    • docker images:查看镜像
    • docker run -it -p 8111:80 --name myubuntu_test myubuntu:v8 /bin/bash:运行容器
    • docker ps -a:查看容器

    Docker迁移镜像存储位置

    windows版本

    Docker Desktop默认安装在C盘,存储位置在C:\用户\Administrator\AppData\Local\Docker\wsl\。长期使用会占满C盘空间,所以我们需要修改Docker Desktop镜像的存储空间。

    Docker Desktop子系统

    Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。可以命令行执行 wsl --list -v 看到
    子系统
    内容
    文件
    docker-desktop
    程序
    \AppData\Local\Docker\wsl\distro\ext4.vhdx
    docker-desktop-data
    镜像
    \AppData\Local\Docker\wsl\data\ext4.vhdx

    迁移步骤

    1. 在Docker Desktop图标上,右键选择[Quit Docker Desktop],退出Docker。
      1. notion image
    1. 命令行执行 wsl --shutdown ,关闭WSL。命令行执行 wsl --list -v 查看状态STATE,是否已停止Stopped。
      1. notion image
    1. 从 wsl 把镜像 \data\ext4.vhdx 导出到压缩文件 docker-desktop-data.tar,导出路径应提前创建好,否则导出到不存在的路径会报错。命令行执行
      1. notion image
    1. 同理,导出把程序 \distro\ext4.vhdx 导出到压缩文件 docker-desktop.tar,命令行执行
      1. 命令行执行 wsl --unregister docker-desktop-data ,注销原来的 Docker 镜像。同理,执行 wsl --unregister docker-desktop
        1. notion image
      1. 从tar 文件,将导出的 Docker 镜像再导入回wsl,并设置挂载目录,命令行导入格式:wsl --import <Distribution Name> <InstallLocation> <FileName>如:
        1. 重新启动 Docker Desktop 完成。
          1. notion image
            💡
            重启之后C:\Users\用户名\AppData\Local\Docker\wsl\distro下的文件会恢复,这种情况不用管。因为镜像安装在C:\Users\用户名\AppData\Local\Docker\wsl\data

            清理 docker容器 占用的磁盘空间

            虚拟磁盘整理

            由于 WSL2 使用虚拟磁盘(VHDX)来存储文件系统,它可以自动扩容,但一般不会自动缩容。删除 Docker 镜像或容器后,即使清理了未使用的镜像层,虚拟磁盘的大小可能也不会自动减小。解决方法如下:
            1. 打开PowerShell,退出wsl
              1. 打开 PowerShell,启动 diskpart 收缩磁盘。
                1. 压缩虚拟硬盘
            2. 工具
            3. 行为树概述SCI/EI会议论文
              Loading...
              目录