美文网首页
2.镜像的简单操作2020-11-02

2.镜像的简单操作2020-11-02

作者: 青山有扶苏 | 来源:发表于2020-11-02 00:32 被阅读0次

    2.基础入门

    这里将记录docker的基础命令,和一些常用的操作,包括查看镜像,容易,构建自己的镜像等操作

    将当前用户加入到docker组

    每次执行docker命令是都需要在前边加上 sudo命令,为了避免同样繁琐的步骤重复进行,可以将当前用户加入到docker组,方法如下:

    ➜  rootfs sudo groupadd docker
    ➜  rootfs sudo gpasswd -a ${USER} docker
    ➜  rootfs sudo systemctl restart docker
    ➜  rootfs newgrp docker
    

    docker的核心概念

    镜像

    就如同我们下载的操作系统镜像一样,提供运行时必须的文件,组件库等,是容器启动的基础。

    镜像是如何创建的:可以通过Dockerfile构建自己的镜像和从DockerHub下载别人制作好的常用镜像

    容器

    docker的镜像可以理解为一份静态文件合集,需要运行起来才能发挥作用,因此将镜像运行起来的运行实体被称为容器,容器在运行时,可以读写和更改里边的文件内容,简单来说,就是容器里面运行着应用。 容器包含 创建、运行、停止、暂停和删除五中状态。

    仓库

    Docker仓库类似github,等这样的代码仓库,用来存放别人或者组件官方制作的镜像,当然docker是支持自己搭建私有镜像仓库的(后面有学到在补充)

    镜像-容器-和仓库的关系

    容器是通过镜像创建的一个运行时,因此,一个镜像可以创建多个容器,并同时运行。

    仓库是用来存放镜像的,当用于需要获取一个镜像时,会从仓库拉取

    Docker的架构

    Docker整体架构是采用C/S(客户端/服务器)模式,主要由客户端和服务端两大部分组成。

    Docker 客户端

    docker客户端有官方实现的docker客户端,也有官方提供的REST API方式的代码SDK,包含了Go,Java,Python,PHP等主流语言。

    Docker服务端

    是Docker后台服务的统称,其中dockerd是一个非常重要的后台管理进行,它负责相应和处理来自Docker客户端的请求,然后将客户端的请求转化为Docker的具体操作。

    Docker 的重要组件

    Docker两个至关重要的组件

    runC 是官方按照OCI容器运行时标准的一个实现,通俗的说,runC是一个用来运行容器的轻量级工具,是用来运行容器的

    containerd是Docker服务端的一个核心组件,它是从dockerd中剥离出来的,为了遵循OCI标准,containerd通过 containerd-shim启动并管理runC,可以说containerd是管理了容器的生命周期。

    Docker的镜像操作

    这里那个docker常用的镜像操作整理成了一个表格,内容如下

    功能 指令
    拉取镜像 docker pull
    重命名镜像 docker tag
    查看镜像 docker image ls 或者 docker images
    删除镜像 docker rmi删除无用的镜像;
    构建镜像 基于Dockerfile的 docker<br />基于运行时的容器提交(在当前运行时的容器,构建)

    1.拉取镜像

    命令各式

    docker pull [Registry]/[Repository]/[image]:[tag]
    

    Registry Docker的服务器,默认为docker.io,如果有私服,可以这里使用私服的url

    Repository 镜像仓库 library为docker默认的镜像仓库

    image 镜像名称

    tag 镜像版本号(标签)

    拉取一个busybox的镜像为例

    ➜  ~ docker pull busybox
    Using default tag: latest
    latest: Pulling from library/busybox
    9758c28807f2: Pull complete
    Digest: sha256:a9286defaba7b3a519d585ba0e37d0b2cbee74ebfe590960b0b1d6a5e97d1e1d
    Status: Downloaded newer image for busybox:latest
    

    这里拉取到了latest版本的,也就是最新的busybox

    当镜像拉取成功之后, 如何查看拉取成功的镜像呢?

    2.查看镜像

    ➜  ~ docker images
    

    可以刚才拉取的busybox

    ➜  ~ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ss                  v1.0                280330c0ff8d        3 days ago          298MB
    ouruser/sinatra     v98                 b8f1814f3146        3 days ago          452MB
    busybox             latest              f0b02e9d092d        2 weeks ago         1.23MB
    ubuntu              14.04               df043b4f0cf1        6 weeks ago         197MB
    redis               5.0.9               f60d84d4d72c        2 months ago        98.3MB
    mysql               5.7                 9cfcce23593a        4 months ago        448MB
    hello-world         latest              bf756fb1ae65        10 months ago       13.3kB
    training/sinatra    latest              49d952a36c58        6 years ago         447MB
    

    也可以使用docker image ls结果是类似的

    当然,当镜像过多时,也可以使用grep来进行过滤,比如我只看busybox这个镜像有多少个

    ➜  ~ docker images | grep busybox
    busybox             latest              f0b02e9d092d        2 weeks ago         1.23MB
    

    这里就只能看到busybox的镜像啦

    我们需要给镜像起一个独特的名字

    重命名镜像

    ➜  ~ docker tag busybox:latest mybusybox:v7
    ➜  ~ docker images | grep busybox
    busybox             latest              f0b02e9d092d        2 weeks ago         1.23MB
    mybusybox           v7                  f0b02e9d092d        2 weeks ago         1.23MB
    

    查看,这里多了一个重命名的mybusybox,其实可以看到 镜像的ID是一样的,实际上,这里并没有创建新的镜像,知识做了别名映射(因为它知识重命名)

    当镜像过多,要删除一些不必要的镜像时,应该怎么做呢?

    删除镜像

    ➜  ~ docker rmi mybusybox:v7
    Untagged: mybusybox:v7
    ➜  ~ docker images | grep busybox
    busybox             latest              f0b02e9d092d        2 weeks ago         1.23MB
    

    调用images命令,在查询一次,可以看到现在机器上的busybox镜像就只有一个了,说明mybusybox已经被删除了。

    构建镜像

    构建镜像可以分为使用commit从运行中的容器中创建提交,以及使用build 基于Dockerfile构建镜像。

    1.使用commit从运行中创建提交

    step1 先运行一个容器

    ➜  ~ docker run --rm --name=busybox -it busybox sh
    

    step2 在容器中做少许修改

    / # touch hello.txt && echo "i wantto mls" > hello.txt
    / # cat hello.txt
    i wantto mls
    

    让这个容器保持运行,因为在创建容器时 添加了--rm参数(运行结束后删除容器)因此,这里重新开一个命令窗口,基于这个容器来创建镜像

    step3 基于运行时容器创建镜像

    ➜  ~ docker commit busybox busybox:mls
    sha256:583538bc286c68d1ec71fe845cd21ffa5553e07b91f1883cffd1eeb367b2aa50
    

    容器提交成功查看一下

    ➜  ~ docker image ls busybox
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    busybox             mls                 583538bc286c        30 seconds ago      1.23MB
    busybox             latest              f0b02e9d092d        2 weeks ago         1.23MB
    

    2.使用Dockerfile

    先看一个简单的例子

    FROM busybox
    COPY test /tmp/test
    RUN mkdir /tmp/testdir
    

    FROM:表示基于busybox这个镜像来创建

    COPY:复制外部文件到镜像内部,这里复制test这个文件到镜像的/tmp/test

    RUN:执行一个命令,这里指镜像在创建容器之后执行mkdir命令,创建后边的路径

    开始构建

    ➜  mybusybox docker build -t mybusybox .
    Sending build context to Docker daemon  3.072kB
    Step 1/3 : FROM busybox
     ---> f0b02e9d092d
    Step 2/3 : COPY test /tmp/test
     ---> e52723c73437
    Step 3/3 : RUN mkdir /tmp/testdir
     ---> Running in d88020552fc4
    Removing intermediate container d88020552fc4
     ---> e117c48925a4
    Successfully built e117c48925a4
    Successfully tagged mybusybox:latest
    

    这里要特别注意,build后面一定要跟路径,我这里是当前目录,所以用“.”表示

    Dockerfile中常用的指令(ps:表格内容转载自拉钩)

    Dockerfile指令 指令简介
    FROM Dockerfile 除了注释第一行必须是 FROM ,FROM 后面跟镜像名称,代表我们要基于哪个基础镜像构建我们的容器。
    RUN RUN 后面跟一个具体的命令,类似于 Linux 命令行执行命令。
    ADD 拷贝本机文件或者远程文件到镜像内
    COPY 拷贝本机文件到镜像内
    USER 指定容器启动的用户
    ENTRYPOINT 容器的启动命令
    CMD CMD 为 ENTRYPOINT 指令提供默认参数,也可以单独使用 CMD 指定容器启动参数
    ENV 指定容器运行时的环境变量,格式为 key=value
    ARG 定义外部变量,构建镜像时可以使用 build-arg = 的格式传递参数用于构建
    EXPOSE 指定容器监听的端口,格式为 [port]/tcp 或者 [port]/udp
    WORKDIR 为 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令设置工作目录。

    总结:通过对docker常用命令的学习,基本上对docker的操作已经有了一些简单的认知,

    镜像的常用操作

    images | image ls 查看镜像

    pull 拉取镜像

    rmi 删除一个不用的镜像

    以及采用两种方式构建镜像(从运行中的容器提交和从Dockerfile提交)

    祝大家变得更强~!

    相关文章

      网友评论

          本文标题:2.镜像的简单操作2020-11-02

          本文链接:https://www.haomeiwen.com/subject/jurpvktx.html