• Docker 笔记


    Docker

    环境:树莓派 Ubuntu 20.04 64位

    安装

    使用官方安装脚本自动安装,安装命令如下(亲测):

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    

    也可以使用国内 daocloud 一键安装命令:

    curl -sSL https://get.daocloud.io/docker | sh
    

    镜像加速

    阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://THIS_IS_MY_ID.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    常用命令

    帮助命令

    docker version

    查看 docker 版本信息

    docker info

    查看 docker 的详细信息

    docker --help

    查看 docker 帮助手册

    镜像命令

    docker images

    列出本地的镜像

    -a all

    列出本地所有的镜像(含中间镜像层)

    -q quiet

    静默模式,只显示容器编号

    --digests

    显示镜像的摘要信息

    --no-trunc

    显示完整的镜像信息(完整的 IMAGE ID)

    docker search xxx

    官网搜索镜像

    -f=stars=* filter

    列出收藏数不小于指定值的镜像

    --no-trunc

    显示完整的镜像描述

    --automated

    只列出 automated build 类型的镜像

    docker pull xxx[:TAG]

    下载镜像,省略 TAG 等价于 :latest

    docker rmi xxx remove image

    删除镜像

    -f force

    强制删除

    docker rmi -f $(docker images -qa)

    全部删除

    容器命令

    docker run

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    新建并启动容器

    -i interactive

    交互模式运行容器,通常与 -t 同时使用

    -t tty

    为容器重新分配一个伪输入终端,通常与 -i 同时使用

    --name

    为容器指定名称

    -d detach

    以后台模式启动容器

    Docker 容器后台运行,就必须有一个前台进程

    -p 宿主机ip:Docker内ip publish

    指定端口映射

    4 种格式:

    1. ip:hostPart:containerPort
    2. ip::containerPort
    3. hostPort:containerPort
    4. containerPort
    -P publish-all

    随机端口映射

    docker ps

    列出当前所有正在运行的容器

    -a all

    列出当前所有正在运行历史上运行过的容器

    -l latest

    列出最近创建的容器

    -n

    显示最近 n 个容器

    -q quiet

    静默模式,只显示容器编号

    --no-trunc

    不截断输出

    容器内:exit

    退出并停止容器(出门关灯

    容器内:Ctrl + P + Q

    退出但不停止容器(出门没关灯

    docker restart 容器id/name

    重启容器

    docker stop 容器id/name

    停止容器

    docker kill 容器id/name

    强制停止容器

    docker rm 容器id

    删除已停止的容器

    删除全部容器:

    1. docker rm -f $(docker ps -aq)
    2. docker ps -aq | xargs docker rm

    docker logs 容器id

    查看容器日志

    -t timestamps

    加入时间戳

    -f follow

    跟随最新的日志打印

    --tail n

    显示最后 n 条

    docker top 容器id

    查看容器内运行的进程

    docker inspect 容器id(inspect 检查)

    查看容器内部细节

    docker attach 容器id

    连接到正在运行中的容器(进入容器启动命令的终端,不会启动新的进程)

    docker exec 命令参数 容器id 执行命令 execute

    在运行的容器中执行命令(不需要进到容器内,隔山打牛

    -d detach

    以后台模式执行

    -i -interactive

    创建标准 IO 接口,如果只有 i,虽然也可以输入命令得到输出,但是结果很不友好

    -t tty

    伪造 tty 终端,如果只有 t,输入什么也没有反应,因为没有开放对应的输入接口

    docker exec -it 容器id bashShell

    在正在运行中的容器中打开一个新的终端并进入(一个新的进程)

    docker cp 容器id: 容器内文件 拷贝到宿主机的位置

    从容器内拷贝文件到主机上

    总结

    Docker 命令图表

    官方文档:Docker run reference | Docker Documentation

    镜像

    Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下都叫镜像层

    Commit

    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

    (message author)

    将容器封装为镜像

    容器数据卷 volumes

    类似 Redis 里面的 rdb 和 aof 文件(个人理解:类似 VMware 的共享文件夹)

    特点

    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止

    作用

    1. 容器的持久化

    2. 容器间继承、共享数据

    添加

    直接命令添加

    docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

    限制容器内对数据卷的只读权限:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 read only

    Dockerfile 添加

    此处不详细介绍 Dockerfile,详见下一节

    VOLUME ["/dataVolumeContainer1", "dataVolumeContainer2"]

    Docker 挂载主机目录 Docker 访问出现 cannot open directory . Permission denied
    解决办法:在挂载目录后多加一个 --privileged=true 参数即可

    数据卷容器

    命名的容器挂载数据卷,其它容器通过挂载这个“父容器”实现数据共享,挂载数据卷的容器,称之为数据卷容器

    活动硬盘上面挂活动硬盘,实现数据的传递依赖。——周阳

    插排上面插插排。——弹幕

    个人认为可以类比 Linux 中的硬连接。

    --volumes -from 父容器

    在运行容器的时候添加该命令可以使当前运行的容器继承父容器的数据卷,父容器即为“数据卷容器”

    Dockerfile

    定义:Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。

    构建过程

    (Dockerfile stackrel{build}longrightarrow Image stackrel{run}longrightarrow Container)

    从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段:

    • Dockerfile 是软件的原材料(Java 代码
    • Docker 镜像是软件的交付品(exe 文件
    • Docker 容器则可以认为是软件的运行态(加载到内存后的应用

    Dockerfile 面向开发,Docker 镜像称为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。

    体系结构(保留字指令)

    FROM

    指定基础镜像

    格式:FROM 敬香茗

    MAINTAINER

    标注镜像维护者的姓名邮箱地址

    格式:MAINTAINER 名称<邮箱地址>

    RUN

    添加容器构建时需要在容器内运行命令

    两种格式:

    1. shell 格式:RUN 命令
    2. exec 格式:RUN ["可执行文件", "参数1", "参数2" ...]

    EXPOSE

    指明当前容器对宿主机暴露出的端口

    格式:EXPOSE 端口号

    WORKDIR

    指定在创建容器后,终端默认登陆进来的工作目录,默认为根目录

    格式:WORKDIR 目录

    ENV

    在构建镜像过程中设置环境变量

    格式:ENV 环境变量名 路径

    ADD

    将宿主机目录下的文件拷贝进镜像,并自动处理 URL 和解压 tar 压缩包

    格式:ADD 宿主机文件 解压目录

    COPY

    将宿主机目录下的文件拷贝进镜像

    两种格式:

    1. COPY 宿主机文件 容器内位置
    2. COPY ["宿主机文件", "容器内位置"]

    VOLUME

    添加容器数据卷,用于数据保存和持久化工作

    格式:VOLUME ["容器内数据卷目录1", "容器内数据目录2"]

    CMD

    指定一个容器启动时要运行命令。只生效一条命令,意味着:

    1. Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效
    2. CMD 会被 docker run 之后的参数替换

    两种格式:

    1. shell 格式:CMD <命令>
    2. exec 格式:CMD ["可执行文件", "参数1", "参数2" ...]

    ENTRYPOINT

    指定一个容器启动时要运行命令,docker run 之后的参数会追加到命令中,形成新的命令组合

    两种格式:

    1. shell 格式:CMD <命令>
    2. exec 格式:CMD ["可执行文件", "参数1", "参数2" ...]

    ONBUILD

    当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子继承后父镜像的 onbuild 被触发,类似一个触发器

    格式:ONBUILD 其他指令,如 ONBUILD RUN echo "hello"

    其他相关命令

    docker build

    创建镜像

    -f file

    指明 Dockfile 文件的位置,不指明默认为当前目录的“Dockerfile”(规范名称)

    -t tag

    为当前构建的镜像命名并声明标签

    docker build -f Dockerfile路径 -t 新镜像名字:TAG .

    使用指定的 Dockerfile 再当前路径下构建镜像

    docker history 镜像id

    查看指定镜像的创建历史

    总结

    Dockerfile 命令图表

    常用安装

    整体步骤

    1. 索镜像
    2. 取镜像
    3. 镜像
    4. 启动镜像
    5. 停止容器
    6. 移除容器

    本地镜像发布到阿里云

    流程

    阿里云 ECS Docker 生态

    1. 在阿里云创建镜像仓库

      设置代码源选择本地

    2. 将镜像推送到镜像仓库

    1. 登录阿里云Docker Registry

    $ docker login --username=我的阿里云账号全名 registry.cn-hangzhou此处的域名与仓库所在地域有关.aliyuncs.com
    

    用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

    您可以在访问凭证页面修改凭证密码。

    2. 从Registry中拉取镜像

    $ docker pull registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]
    

    3. 将镜像推送到Registry

    $ docker login --username=我的阿里云账号全名 registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]
    

    请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

    4. 选择合适的镜像仓库地址

    从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

    如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

    5. 示例

    使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

    $ docker images
    REPOSITORY						TAG			IMAGE ID		CREATED 		VIRTUAL	SIZE
    registry.aliyuncs.com/acs/agent	0.7-dfb6816	37bb9c63c8b2	7 days ago		37.89 MB
    $ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
    

    使用 "docker push" 命令将该镜像推送至远程。

    $ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
    
  • 相关阅读:
    Node.js Net 模块+DNS 模块
    php程序报500错误
    Node.js 工具模块-OS模块+path模块
    Node.js GET/POST请求
    Canvas动画+canvas离屏技术
    Python OS 模块
    Python random 模块
    Python time 模块
    Python 迭代器
    Python 生成器
  • 原文地址:https://www.cnblogs.com/varc/p/15291486.html
Copyright © 2020-2023  润新知