首页 > 其他分享 >【Docker】Docker 基础知识及 cli 命令快查

【Docker】Docker 基础知识及 cli 命令快查

时间:2022-09-23 15:00:07浏览次数:77  
标签:容器 cli 快查 && 镜像 Docker docker name

常用命令

# 显示 docker 信息
$ docker info

# 显示容器列表
$ docker ps [-a]

# 拉取镜像
$ docker pull 

# 查看本地镜像
$ docker images 

# 文件拷贝
$ docker cp a.txt container_name:/tmp

# 运行容器
$ docker run [-it|-d|-itd|-v|-p|--gpu|--name|-h] $image 
    -it         交互式命令行
    -d          后台运行
    -itd        打开交互式命令行后进入后台
    -v          指定文件夹映射   /host_dir:/container_dir  
    -p          指定端口映射     /host_port:/container_port
    --name      指定容器名字
    --gpus      指定GPU,需要安装 nvidia-container-toolkit
    -h          设置容器的运行参数

# 进入后台运行的容器
$ docker attach $container_name

# 删除容器
$ docker rm $container_name

# 删除镜像
$ docker rmi $image_name

# 检查容器配置
$ docker inspect [$container_name|$image_name]

# 运行一个容器内的命令(交互式地)
$ docker exec -it $container_name /bin/bash

# 启动和停止容器
$ docker start $container_name
$ docker stop $container_name

架构

Docker 是典型的 C/S 架构

image

image

该图示其实并不太准确,容器并不直接运行在 Docker 上,Docker 只是辅助建立隔离环境,让容器基于 Linux 操作系统运行

Docker的隔离依靠 namespace cgroup chroot实现 其中 namespace 用于创建独立的文件系统 主机名 进程号 还有网络 cgroup 实现对进程的CPU 内存等资源进行配额限制 chroot 则限制进程访问原有的文件系统

*当然,现在容器大多数用的是现代化的 pivot_root

现在,Docker 底层使用 containerdrunc

应用容器化

容器就是一个系统中被隔离的特殊环境,进程可以在其中不受干扰地运行。我们也可以把这段描述再简化一点:容器就是被隔离的进程。

容器是由操作系统动态创建的,那么必然就可以用一种办法把它的初始环境给固化下来,保存成一个静态的文件,相当于是把容器给“拍扁”了,这样就可以非常方便地存放、传输、版本化管理了。它里面不仅有基本的可执行文件,还有应用运行时的整个系统环境。这就让镜像具有了非常好的跨平台便携性和兼容性。

所谓的“容器化的应用”,或者“应用的容器化”,就是指应用程序不再直接和操作系统打交道,而是封装成镜像,再交给容器环境去运行。

image

Dockerfile - 创建镜像

镜像的内部机制

镜像就是一个打包文件,里面包含了应用程序还有它运行所依赖的环境,例如文件系统、环境变量、配置参数等等。

容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成的,每层都是只读不可修改的一组文件,相同的层可以在镜像之间共享,然后多个层像搭积木一样堆叠起来,再使用一种叫“Union FS 联合文件系统”的技术把它们合并在一起,就形成了容器最终看到的文件系统。你可以用命令 docker inspect 来查看镜像的分层信息。

Docker 会检查是否有重复的层,如果本地已经存在就不会重复下载,如果层被其他镜像共享就不会删除,这样就可以节约磁盘和网络成本。

image

Dockerfile

Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤,最后就会创建出一个新的镜像出来。

  • 构建镜像的第一条指令必须是 FROM,所以基础镜像的选择非常关键。如果关注的是镜像的安全和大小,那么一般会选择 Alpine;如果关注的是应用的运行稳定性,那么可能会选择 Ubuntu、Debian、CentOS。

    FROM alpine:3.15 # 选择Alpine镜像
    FROM ubuntu:bionic # 选择Ubuntu镜像
    
  • 我们在本机上开发测试时会产生一些源码、配置等文件,需要打包进镜像里,这时可以使用 COPY 命令,它的用法和 Linux 的 cp 差不多,不过拷贝的源文件必须是“构建上下文”路径里的,不能随意指定文件。也就是说,如果要从本机向镜像拷贝文件,就必须把这些文件放到一个专门的目录,然后在 docker build 里指定“构建上下文”到这个目录才行。

    COPY ./a.txt /tmp/a.txt # 把构建上下文里的a.txt拷贝到镜像的/tmp目录
    COPY /etc/hosts /tmp # 错误!不能使用构建上下文之外的文件
    
  • Dockerfile 里最重要的一个指令 RUN ,它可以执行任意的 Shell 命令,比如更新系统、安装应用、下载文件、创建目录、编译程序等等,实现任意的镜像构建步骤,非常灵活。RUN 通常会是 Dockerfile 里最复杂的指令,会包含很多的 Shell 命令,但 Dockerfile 里一条指令只能是一行,所以有的 RUN 指令会在每行的末尾使用续行符 \,命令之间也会用 && 来连接,这样保证在逻辑上是一行。

    RUN apt-get update \
     && apt-get install -y \
     build-essential \ curl \
     make \
     unzip \
     && cd /tmp \
     && curl -fSL xxx.tar.gz -o xxx.tar.gz\
     && tar xzf xxx.tar.gz \ && cd xxx \ && ./config \ && make \ && make clean
    

    有的时候在 Dockerfile 里写这种超长的 RUN 指令很不美观,而且一旦写错了,每次调试都要重新构建也很麻烦,所以你可以采用一种变通的技巧:把这些 Shell 命令集中到一个脚本文件里,用 COPY 命令拷贝进去再用 RUN 来执行。

    COPY setup.sh /tmp/ # 拷贝脚本到/tmp目录
    RUN cd /tmp && chmod +x setup.sh \ # 添加执行权限 
        && ./setup.sh && rm setup.sh # 运行脚本然后再删除
    
  • RUN 指令实际上就是 Shell 编程,如果你对它有所了解,就应该知道它有变量的概念,可以实现参数化运行,这在 Dockerfile 里也可以做到,需要使用两个指令 ARG 和 ENV。

    它们区别在于 ARG 创建的变量只在镜像构建过程中可见,容器运行时不可见,而 ENV 创建的变量不仅能够在构建镜像的过程中使用,在容器运行时也能够以环境变量的形式被应用程序使用。

    ARG IMAGE_BASE="node"
    ARG IMAGE_TAG="alpine"
    
    ENV PATH=$PATH:/tmp
    ENV DEBUG=OFF
    
  • 还有一个重要的指令是 EXPOSE,它用来声明容器对外服务的端口号,对现在基于 Node.js、Tomcat、Nginx、Go 等开发的微服务系统来说非常有用。

  • 因为每个指令都会生成一个镜像层,所以 Dockerfile 里最好不要滥用指令,尽量精简合并,否则太多的层会导致镜像臃肿不堪。

  • 你可以在“构建上下文”目录里再建立一个 .dockerignore 文件,语法与 .gitignore 类似,排除那些不需要的文件。

  • 你可以加上一个 -t 参数,也就是指定镜像的标签(tag),这样 Docker 就会在构建完成后自动给镜像添加名字。

*reference: Dockerfile reference | Docker Documentation

# Dockerfile
# docker build -t ngx-app .
# docker build -t ngx-app:1.0 .
ARG IMAGE_BASE="nginx"
ARG IMAGE_TAG="1.21-alpine"
FROM ${IMAGE_BASE}:${IMAGE_TAG}
COPY ./default.conf /etc/nginx/conf.d/RUN cd /usr/share/nginx/html \    && echo "hello nginx" > a.txt
EXPOSE 8081 8082 8083
  • Docker 镜像遵循的是 OCI 标准,即 Open Container Initiative

  • ENTRYPOINT 是一个与 CMD 相似的命令,相当于 docker run xxx ENTRYPOINT CMD

  • docker history 可以用于镜像构建过程回溯

  • Union FS 有多种实现,docker 使用 overlay2

网络互联

Docker 提供了三种网络模式,分别是 null、host 和 bridge。

  • null 是最简单的模式,也就是没有网络,但允许其他的网络插件来自定义网络连接。

  • host 的意思是直接使用宿主机网络,相当于去掉了容器的网络隔离(其他隔离依然保留),所有的容器会共享宿主机的 IP 地址和网卡。这种模式没有中间层,自然通信效率高,但缺少了隔离,运行太多的容器也容易导致端口冲突。

    host 模式需要在 docker run 时使用 --net=host 参数

  • bridge,也就是桥接模式,它有点类似现实世界里的交换机、路由器,只不过是由软件虚拟出来的,容器和宿主机再通过虚拟网卡接入这个网桥(图中的 docker0),那么它们之间也就可以正常的收发网络数据包了。不过和 host 模式相比,bridge 模式多了虚拟网桥和网卡,通信效率会低一些。

端口号映射需要使用 bridge 模式,并且在 docker run 启动容器时使用 -p 参数,形式和共享目录的 -v 参数很类似,用 : 分隔本机端口和容器。

$ docker run -d -p 8080:80 --rm nginx:alpine

标签:容器,cli,快查,&&,镜像,Docker,docker,name
From: https://www.cnblogs.com/joexu01/p/16722758.html

相关文章