zoukankan      html  css  js  c++  java
  • docker 学习总结

    Docker 是一个容器工具,提供虚拟环境。解决了软件的环境配置和依赖问题,让软件可以带环境和依赖的安装。

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

    1. 注册 docker 账号

    想要使用docker,先注册一个docker账号,注册docker账号
    注册完成后,登录到 docker hub 就能看到自己的 docker 镜像了,docker hub 是 docker 官方存放 docker 镜像的仓库。如我的 hub 下列出了我push的镜像lxj327460773账号下的docker镜像

    2. docker 的安装

    注册完docker账号,然后安装docker:
    window 10
    Mac OS
    window 10 安装 docker 19.03.2 百度网盘地址
    安装完成后可以通过命令docker version来查看docker的版本号

    C:Userslixinjie>docker version
    Client: Docker Engine - Community
     Version:           19.03.2
     API version:       1.40
     Go version:        go1.12.8
     Git commit:        6a30dfc
     Built:             Thu Aug 29 05:26:49 2019
     OS/Arch:           windows/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.2
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.8
      Git commit:       6a30dfc
      Built:            Thu Aug 29 05:32:21 2019
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          v1.2.6
      GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc:
      Version:          1.0.0-rc8
      GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
    

    出现版本号,证明安装成功。

    下面使用 Mac OS 系统来演示命令,和输出结果。

    3. image文件

    docker主要有三部分核心内容,image 文件,容器文件和 Dockerfile 文件。image文件也称为镜像。

    运行这些 docker 命令行前,需要打开 docker 终端,也就是上一步下载的 docker app。否则将会报错

    ➜  ~ docker images
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    

    3.1. 列出所有 image 文件

    • 列出所有镜像,不包含中间层镜像

    docker image lsdocker images

    ➜  ~ docker images
    REPOSITORY                                               TAG                       IMAGE ID            CREATED             SIZE
    count-web_web                                            latest                    b9f43a85e594        4 days ago          106MB
    dockerhub.datagrand.com/datagrand/text_similarity_html   dev_20191022_103543       be10d00a971c        4 days ago          134MB
    redis                                                    alpine                    6f63d037b592        4 days ago          29.3MB
    python                                                   3.6-alpine                6ddaac33408f        4 days ago          95MB
    ubuntu                                                   18.04                     cf0f3ca922e0        7 days ago          64.2MB
    
    • 上面镜像只截取了部分
    • REPOSITORY 表示镜像名
    • TAG 表示镜像标记,通常是版本号,或者其他可以区别镜像不同版本的标记
    • IMAGE ID 表示镜像 ID,镜像可以通过<REPOSITORY>:<TAG>来识别,也可以通过<IMAGE ID>来识别
    • CREATED 表示这个镜像制作的时间
    • SIZE 表示这个镜像的大小
    • 列出所有虚悬镜像

    docker image ls -f dangling=true

    ➜  ~ docker images -f dangling=true
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    
    • 表示没有虚空镜像
    • 列出所有镜像,包含中间层镜像

    docker image ls -adocker images -a

    ➜  ~ docker images -a
    REPOSITORY                                               TAG                       IMAGE ID            CREATED             SIZE
    count-web_web                                            latest                    b9f43a85e594        4 days ago          106MB
    <none>                                                   <none>                    a1f88c27d11b        4 days ago          106MB
    <none>                                                   <none>                    a16622d4261d        4 days ago          95MB
    <none>                                                   <none>                    bff6538a770e        4 days ago          95MB
    dockerhub.datagrand.com/datagrand/text_similarity_html   dev_20191022_103543       be10d00a971c        4 days ago          134MB
    <none>                                                   <none>                    664a0ea6f623        4 days ago          126MB
    <none>                                                   <none>                    349fc9312606        4 days ago          134MB
    redis                                                    alpine                    6f63d037b592        4 days ago          29.3MB
    python                                                   3.6-alpine                6ddaac33408f        4 days ago          95MB
    ubuntu                                                   18.04                     cf0f3ca922e0        7 days ago          64.2MB
    

    出现了很多无标签的镜像,与之前的虚空镜像不同,这些无标签的镜像很多都是中间层镜像,是其他镜像的依赖对象,只要删除了这些中间层镜像,这些依赖他们的镜像也将会被删除。

    • 列出指定镜像

    docker images <image-name>根据镜像名来列出镜像

    ➜  ~ docker images ubuntu
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              18.04               cf0f3ca922e0        7 days ago          64.2MB
    ubuntu              latest              2ca708c1c9cc        5 weeks ago         64.2MB
    ubuntu              15.10               9b9cb95443b5        3 years ago         137MB
    ubuntu              13.10               7f020f7bf345        5 years ago         185MB
    
    • latest 表示当前最新版本的镜像

    3.2. 删除指定 image 文件

    删除image文件前,要先删除容器文件

    • 通过文件名:标签删除

    docker image rm <image name>:<tag>docker rmi <image name>:<tag>

    标签名缺省是latest,如果标签名是latest,则不用添加标签名

    docker rmi <image name>:latest 等价于 docker rmi <image name>

    ➜  ~ docker image rm ubuntu:13.10
    Untagged: ubuntu:13.10
    Untagged: ubuntu@sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
    Deleted: sha256:7f020f7bf34554411031ec0d4f2ab46a2976dad403e1c26bc21dc1bf4c48c8aa
    Deleted: sha256:2aac093d13faafda4d0da3534d30274bcc4e5475b1e126c84b9d670862f5e4ef
    Deleted: sha256:c676fe3dd3ceb6442e8b23350de88adc6546a52f75bd92dbb1a789b7c6de0fcf
    Deleted: sha256:7c6a37fb8fe6a41aaf7c6c7a2cc3d448c01df026b2056a9f35e490e7bf6285cc
    Deleted: sha256:b0e8be8278c28daa541ad564fc91dbea99263caa6e5e68db033061c5e08f0315
    Deleted: sha256:78dcbd700c6678a7af4422e0ad516628852973a255526f4b617f33db218e1075
    Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
    
    • Untagged,删除镜像是会先将满足我们要求的所有镜像标签都取消
    • Deleted,该镜像的所有的标签都被取消了,该镜像就失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此删除的时候也是从上层向基础层依次进行判断删除。并且给出了完整的sha256的摘要
    • 通过文件ID删除

    docker image rm <image ID>docker rmi <image ID>

    ➜  ~ docker image rm cf0f3ca922e0
    Untagged: ubuntu:18.04
    Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
    Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
    Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
    Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
    Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
    Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36
    

    删除了 ubuntu TAG 为 18.04 的镜像,之后在列出 ubuntu 镜像,就没有这个镜像了。

    ➜  ~ docker images ubuntu
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              latest              2ca708c1c9cc        5 weeks ago         64.2MB
    ubuntu              15.10               9b9cb95443b5        3 years ago         137MB
    ubuntu              13.10               7f020f7bf345        5 years ago         185MB
    

    3.3. 抓取 image 文件

    docker pull <image name>docker image pull <image name>

    抓取刚删除的 ubuntu:13.10 镜像。

    ➜  ~ docker pull ubuntu:13.10
    13.10: Pulling from library/ubuntu
    [DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the docker.io registry NOW to avoid future disruption.
    a3ed95caeb02: Pull complete
    0d8710fc57fd: Pull complete
    5037c5cd623d: Pull complete
    83b53423b49f: Pull complete
    e9e8bd3b94ab: Pull complete
    7db00e6b6e5e: Pull complete
    Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
    Status: Downloaded newer image for ubuntu:13.10
    docker.io/library/ubuntu:13.10
    
    • 默认抓取的地址是官方的 hub,docker hub,官方存放镜像的位置默认在 library 目录下
    • 在抓取的时候,先有一个下载的过程,镜像是多层存储所构成,分层下载,并非单一文件,下载过程中给出了每一层的前 12 位 ID
    • 下载结束后,显示 pull complete,并给出该镜像的完整 sha256摘要

    3.4. 运行 image 文件

    • 通过文件名运行

    docker run <image name>:<tag>docker container run <image name>:<tag>

    如果文件名不加标签,会使用 latest 标签

    docker run <image name>等价于docker run <image name>:latest

    ➜  ~ docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

    运行最简单的 hello-world, 运行完之后,自动停止了。

    • 通过文件ID运行

    docker run <image ID>docker container run <image ID>

    3.5. 创建 image 文件

    docker image build

    docker image build -t <image name>:<tag> .
    -t 指定 image 文件,最后的 . 表示上下文环境,Dockerfile 在当前路径

    docker build -t dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW} -f docker/Dockerfile .
    
    • 上面镜像名字中包含了镜像存储的地址,还包含了${TIMENOW}这个是一个变量,表示当前时间 TIMENOW=date +%Y%m%d_%H%M%S
    • -f 表示过滤条件

    3.6. 发布 image 文件

    当 image 文件创建成功后,就可以把它 push 到 hub 上,供其他人使用了。
    首先登录 hub,不指定 hub 时,将会登录到 docker hub。

    ➜  ~ docker login dockerhub.datagrand.com
    Username: lxj327460773
    Password:
    
    • 登录到 dockerhub.datagrand.com
    • 没有带参数时,会单独要求输入 Username 和 Password
    • 登录成功后会显示 Login Succeeded

    可以带参数登录,一次性输入账号和密码

    ➜  ~ docker login dockerhub.datagrand.com -u lixinjie@datagrand.com -p <password>
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    Login Succeeded
    

    不过这样不安全,因为直接把密码明文显示了,所以才会提示“通过CLI使用密码是不安全的”。

    登录成功后,可以 psuh 到 hub 了。

    docker push dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW}
    

    完成发布后,可以退出。

    ➜  ~ docker logout dockerhub.datagrand.com
    Removing login credentials for dockerhub.datagrand.com
    WARNING: could not erase credentials: error erasing credentials - err: exit status 1, out: `error erasing credentials - err: exit status 1, out: `The specified item could not be found in the keychain.`
    

    退出成功后会提示“删除登录凭证”。

    4. 容器文件(container)

    容器的实质是进程,容器进程运行于属于自己的独立的命名空间。容器也是分层存储,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层。

    4.1. 列出容器文件

    • 列出正在运行的容器文件

    docker container lsdocker ps

    ➜  ~ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    667e9e3802fb        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes       80/tcp              vigilant_ardinghelli
    
    • CONTAINER ID 表示容器 ID
    • IMAGE 表示运行的镜像,镜像和容器的关系,就像是面向对象程序设计中实例一样,镜像是静态的定义,容器是运行时的实体
    • CREATED 表示运行的时间
    • STATUS UP表示运行
    • PORTS 表示可以通过指定的端口号来访问
    • NAMES 表示对镜像容器的描述
    • 列出所有的容器文件(包括停止运行的容器)

    docker ps -adocker ps --alldocker container ls -adocker container ls --all

    ➜  ~ docker ps -a
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS                  NAMES
    abb2922a4208        hello-world            "/hello"                 11 minutes ago      Exited (0) 11 minutes ago                          lucid_gauss
    667e9e3802fb        nginx                  "nginx -g 'daemon of…"   16 minutes ago      Up 16 minutes               80/tcp                 vigilant_ardinghelli
    42f7edad7bfd        php                    "docker-php-entrypoi…"   16 minutes ago      Exited (0) 16 minutes ago                          elegant_mestorf
    4441f09a1cc1        httpd                  "httpd-foreground"       17 minutes ago      Exited (0) 16 minutes ago                          jolly_agnesi
    6a7f573b8164        ubuntu                 "/bin/bash"              4 days ago          Exited (0) 4 days ago                              nervous_pascal
    
    • COMMAND 表示表示容器启动后运行的命令
    • STATUS UP表示运行,Exited表示已经停止运行了

    4.2. 终止容器文件

    • 通过容器ID终止

    docker stop <container ID>docker kill <container ID>docker container stop <container ID>docker container kill <container ID>

    ➜  ~ docker stop 667e9e3802fb
    667e9e3802fb
    

    终止容器会显示容器 ID。

    • 通过容器名终止

    docker stop <container name>docker kill <container name>docker container stop <container name>docker container kill <container name>

    4.3. 删除容器文件

    删除容器前,必须先终止容器

    • 使用容器ID删除容器

    docker rm <container ID>

    ➜  ~ docker rm 667e9e3802fb
    667e9e3802fb
    

    删除容器也会显示容器 ID。

    • 使用容器名删除容器

    docker rm <container>

    4.4. 生成容器

    docker container run

    携带一些参数指明容器运行的端口和启动后执行的命令,如:

    docker container run -p 8000:3000 -it <image name>:<tag> /bin/bash

    • -p参数:容器的 3000 端口映射到本机的 8000 端口。
    • -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
    • /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
    ➜  ~ docker images koa-demos
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    koa-demos           v1                  0e9ae611c443        10 days ago         675MB
    
    ➜  ~ docker container run -p 8000:3000 -it koa-demos:v1 /bin/bash
    root@4e165e3a70a7:/app# pwd
    /app
    root@4e165e3a70a7:/app# ls
    Dockerfile  README.md  demos  logo.png	node_modules  package-lock.json  package.json
    root@4e165e3a70a7:/app#
    

    我先查找了我的镜像,然后运行了它,并启动了 bash,保证了 shell 命令可用。

    5. Dockerfile文件

    Dockerfile 中的每一条指令都会建立一个层。

    FROM nginx:stable
    RUN mkdir -p web/logs
    COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
    COPY dist web/dist
    EXPOSE 80
    

    如上的 Dockerfile 文件中

    • FROM 指定基础镜像为 nginx,版本为 stable
    • RUN 运行命令,新创建文件夹 web,并在其下创建文件logs
    • COPY 把 docker 下的 nginx.conf 文件,和 dist 文件夹拷贝到指定位置,这里因为项目使用的 angular 所以,build 之后的文件就存储在 dist 目录下
    • EXPOSE 申明容器使用 80 端口

    5.1.FROM指定基础镜像

    基础镜像必须指定,FROM指令指定基础镜像,因此一个 Dockerfile 文件中 FROM 是必备指令,而且是第一个指令。

    FROM scratch指定一个空白镜像,scratch 不以任何镜像为基础,接下来写的指令将作为镜像第一层开始存在。

    5.2. RUN执行命令行

    • RUN 是用来执行命令行命令的指令

    5.3. COPY复制文件

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

    5.4. ADD更高级的复制文件

    仅在需要自动解压缩的情况下才使用ADD指令,如果只是复制文件就使用COPY指令

    5.5. CMD容器启动命令

    用于指定默认的容器主进程的启动命令

    5.6. EXPOSE声明容器使用端口

    -p <宿主端口>:<容器端口>

    • -p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问
    • EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

    5.7. ENTRYPOINT入口点

    5.8. WORKDIR指定工作目录

    5.9. VOLUME 定义匿名卷

  • 相关阅读:
    绘图与滤镜全面解析
    排序算法——快速排序
    IOS QuartzCore核心动画框架
    const 笔记
    operation 多线程
    指针 总结
    问题 H: 老管家的忠诚(线段树)
    问题 H: 老管家的忠诚(线段树)
    Python——numpy(python programming)
    Python——numpy(python programming)
  • 原文地址:https://www.cnblogs.com/xinjie-just/p/11743250.html
Copyright © 2011-2022 走看看