9.1-Docker-调研

优质
小牛编辑
121浏览
2023-12-01

1.1 定义

  • Docker 开发、打包、运行 APP 的平台。
  • 把 APP 和底层设备隔离开来。

    1.2 架构

    Docker Engine.PNG
    Docker Architecture.PNG

    1.2.1 重要概念

    1.2.1.1 Image

    Image.PNG

  • 文件和 meta data 的集合(root filesystem)。
  • 分层,每层可以添加删除修改文件,成为一个新的 image。
  • 不同的 image 可以共享相同的 layer。
  • image 本身是一个 read-only 的。
    1.2.1.1.1 常用命令
  • 查看 image
    docker image ls 
    docker images
    
  • 从 DockerFile 获取 Image
    # 安装编译工具
    yum install gcc glibc-static
    # 编写代码
    vim hello.c
    # 编译代码
    gcc -static hello.c -o hello
    # 编写 Dockerfile
    vim Dockerfile
    # 制作镜像
    docker [image] build -t wlj/hello-world .
    # 运行镜像
    

    代码

    #include <stdio.h>
    int main(){
          printf("hello docker\n");
    }
    

    Dockerfile

    # 无基础镜像
    FROM scratch
    # 将 hello 可执行文件添加到 / 目录
    ADD hello /
    # 运行 / 目录下 hello 命令
    CMD ["/hello"]
    
    FROM centos
    run yum install -y vim
    
  • 从 Registry 拉取 Image
    docker pull ubuntu
    

    默认从 docker hub 上拉取 Image

  • 根据 container 构建 image

    制作 container

    [root@node12 hello-world]# docker run -it centos
    [root@47299fe75b83 /]# yum install vim
    [root@47299fe75b83 /]# exit
    [root@node12 hello-world]# docker container ls
    [root@node12 hello-world]# docker commit serene_keldysh wlj/centos-vim
    docker images
    docker history 237f9ea41f40
    
docker [container] commit
  • 删除镜像
    docker image rm ${id}
    docker rmi ${id}
    

    1.2.1.2 Container

    Container.PNG

  • 通过 image 创建
  • 在 image layer 的基础上增加了一层 container layer(可读写)
  • 类比面向对象:类和实例
  • image 负责 app 的存储和分发,container 负责运行 app
    1.2.1.2.1 常用命令
  • 查看当前正在执行 container
    docker container ls 
    docker ps
    
  • 查看所有的 container
    docker container ls -a
    docker ps -a
    
  • 创建 container
    docker run hello
    
  • 创建交互式 container
    docker run -it ubuntu
    
  • 退出 container
    exit
    
  • 删除 container
    docker container rm ${id}
    
  • 批量删除 container
    docker rm $(docker container ls -aq)
    docker rm $(docker container ls -f "STATUS=exited" -q)
    

    1.2.1.3 Dockerfile

    1.2.1.3.1 语法
  • FROM
    FROM scratch
    FROM centos
    FROM ubuntu:14.04
    
  • LABEL
    LABEL maintianer:"wlj"
    LABEL version="1.0"
    description=""
    
  • RUN
    # 执行命令并创建新的 image layer
    RUN yum ......
    RUN /bin/bash -c ''
    
  • WORKDIR
    # 指定虚拟机的工作目录,相当于 RUN cd,自动创建不存在的目录。
    
  • ADD and COPY
    # 将本地文件上传到 image,ADD 同时解压文件
    add srcFile/srcDic desDic
    
  • ENV
    # 设置环境变量
    ENV JAVA_HOME /usr/lib/java
    
  • VOLUMN and EXPOSE
    # 存储和网络
    
  • CMD and ENTRYPOINT
    # CMD 设置容器启动后默认执行的命令和参数
    # 如过 docker run 指定了其他命令,CMD 命令会被忽略
    # 如果定义了多个 CMD,只有最后一个会被执行
    # ENTRYPOINT 设置容器启动时运行的命令
    

    1.2.1.3 Registry

    镜像仓库

    1.2.2 底层技术

  • NameSpaces:做隔离 pid,net,ipc,mnt,uts。
  • Control groups:资源限制。
  • Union file systems:做 Container 和 image 的分层。

    容器的资源限制

  • 容器
  • 镜像
  • 网络
  • 存储