• Docker使用小结(一)Docker镜像以及Docker容器


    1 Docker镜像

    Docker 镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。

    安装Docker

    apt install docker.io    
    

    获取镜像 ubuntu:16.04

    #docker pull ubuntu:16.04
    

    Docker帮助

    #docker --help
    

    查看Docker信息 包括:容器、镜像、配置的详细信息

    docker info
    

    下载镜像到本地后即可随时使用该镜像

    使用该镜像创建一个容器 在其中运行bash 应用 执行"Hello World"命令,并退出容器

    docker run -it ubuntu:16.04 bash
    echo "Hello World"
    exit 
    

    镜像信息

    #docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              16.04               5e13f8dd4c1a        6 weeks ago         120MB
    

    获取该镜像的详细信息 包括制作者 适应架构 各层的数字摘要

    docker inspect ubuntu:16.04
    

    查看镜像历史信息

    docker history ubuntu:16.04
    

    删除和清理镜像

    docker rmi myubuntu:lastest  #删除myubuntu:lastest镜像
    
    docker rmi busybox:latest  #删除只有一个标签的镜像
    
    docker ps -a #查看本机上存在的所有容器
    
    docker rmi -f ubuntu:16.04 #-f参数 强行删除镜像
    
    docker rm a21c0840213e #删除容器a21c0840213e
    
    docker rmi 8f1bd21bd25c #用ID删除镜像
    
    docker image prune -f #自动清理临时的遗留镜像文件层
    

    创建镜像——三种方法:基于已有镜像的容器创建 基于本地模板导入 基于Dockerfile创建
    (1 )基于已有容器创建:主要是使用docker [container] commt命令
    命令格式为docker [container] commit[OPTIONS] CONTAINER [REPOSITORY [:TAG]], 主要选项包括:

    D -a, --au吐or="": 作者信息;
    D -c, - -change=(] : 提交的时候执行Dockerfile指令, 包括CMDIENTRYPOINT 但
    NVIEXPOSEILABELIONBUILDIUSERIVOLUMEIWORKDIR等;
    D -m, - -message= 11 11: 提交消息;
    D -p, --pause式rue: 提交时暂停容器运行。
    

    演示如何使用该命令创建一个新镜像。启动一个镜像, 并在其中进行修改操作

    root@slave1:/home/xxx/Documents# docker run -it ubuntu:16.04 /bin/bash
    root@d65bd23fee24:/# touch test   #创建test文件
    root@d65bd23fee24:/# exit         #退出  容器ID:d65bd23fee24
    
    docker run -it ubuntu:18.04 /bin/bash
    root@a925cb40b3f0:/# touch test
    root@a925cb40b3f0:/# exit
    

    记住容器的ID 为a925cb40b3f0。

    此时该容器与原ubuntu:18.04 镜像相比, 已经发生了改变, 可以使用docker [container] commt命令来提交为一个新的镜像。提交时可以使用ID 或名称来指定容器:

    docker [container] commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0
    test:0.1
    9e9c814023bcffc3e67e892a235afe6lb02f66a947d2747f724bd317dda02f27
    

    顺利的话, 会返回新创建镜像的ID 信息, 例如9e9c814023bcffc3e67e892a235afe6lb02f66a947d2747f724bd317dda02f27

    此时查看本地镜像列表, 会发现新创建的镜像已经存在了:

    $ docker images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    test 0.1 9e9c814023bc 4 seconds ago 188 MB
    

    (2) 基于本地模板导入

    下载了ubuntu-18.04 的模板压缩包,之后使用以下命令导人即可:

    $cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:lB.04
    

    然后查看新导人的镜像,已经在本地存在了:

    $ docker images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    ubuntu 18.04 05ac7c0b9383 17 seconds ago 215.5 MB
    

    (3) 基于Dockerfile 创建
    Dockerfi le 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。下面给出Dockerfile 的一个简单示例,基于debian:stretch-slim 镜像安装Python 3环境,构成一个新的python:3 镜像:

    FROM debian:stretch-slim
    LABEL version ;” 1 . 。” maintainer =” docker user <docker_user@github >”
    .............................
    

    创建镜像的过程可以使用docker [image] build 命令,编译成功后本地将多出一个python : 3 镜像:

    $ docker [image] build -t python:3
    Successful ly built 4b10f46eacc8
    Successfully tagged python:3
    $ docker imageslgrep python
    python 3 4b10f46eacc8 About a minute ago 95.lMB
    

    存出和载人镜像

    1. 存出镜像
    docker save -o ubuntu_16.04.tar ubuntu:16.04  #导出本地的ubuntu:16.04镜像为文件ubuntu:16.04.tar 用户可以通过复制ubuntu:16.04.tar文件将该镜像分享给他人
    

    2)载人镜像

    root@slave1:/home/xxx/Documents# docker load -i ubuntu_16.04.tar       #从文件ubuntu_16.04.tar导入镜像到本地镜像列表
    Loaded image: ubuntu:16.04 
    

    这将导人镜像及其相关的元数据信息(包括标签等) 。导人成功后,可以使用docker images 命令进行查看, 与原镜像一致。

    上传镜像
    用户在Docker Hub 网站注册后可以上传自制的镜像。
    例如,用户user 上传本地的test :latest 镜像,可以先添加新的标签user/test:latest , 然后用docker [image ] push 命令上传镜像:

    $ docker tag test:latest user/test : latest
    $ docker push user/test:latest
    

    第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~ / . docker目录下。

    2 Docker容器

    新建容器

    docker create -it ubuntu:latest  #docker [container] create命令创建容器
    

    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                         PORTS               NAMES
    78c72848cb2a        ubuntu:latest       "/bin/bash"         About a minute ago   Created                                            xenodochial_mcclintock
    c73a4dc5a0fa        ubuntu:16.04        "/bin/bash"         About an hour ago    Exited (0) About an hour ago                       kind_davinci
    d65bd23fee24        ubuntu:16.04        "/bin/bash"         About an hour ago    Exited (0) About an hour ago                       loving_liskov
    c08c1cd0d93e        ubuntu:16.04        "bash"              2 hours ago          Exited (0) 2 hours ago                             trusting_mendeleev
    

    使用docker [container] create 命令新建的容器处于停止状态,可以使用docker [container] start 命令来启动它。

    root@slave1:/home/xxx/Documents# docker ps  #查看运行中的容器 此时没有容器在运行
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    root@slave1:/home/xxx/Documents# docker start 78c72848cb2a  #启动容器78c72848cb2a
    78c72848cb2a
    root@slave1:/home/xxx/Documents# docker ps  #查看运行中的容器 此时78c72848cb2a 在运行
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    78c72848cb2a        ubuntu:latest       "/bin/bash"         9 minutes ago       Up 6 seconds                            xenodochial_mcclintock
    

    新建并启动容器
    除了创建容器后通过start 命令来启动也可以直接新建并启动容器。所需要的命令主要为docker [container]run,等价于先执行docker [container] create 命令,再执行docker [container] start 命令

    root@slave1:/home/xxx/Documents# docker run ubuntu /bin/echo 'Hello world'
    Hello world
    

    这跟在本地直接执行/bin/echo 'hello world' 相比几乎感觉不出任何区别。

    在交互模式下,用户可以通过所创建的终端来输人命令:

    root@slave1:/home/xxx/Documents# docker run -it ubuntu:16.04 /bin/bash
    root@2f90a7b71f47:/# pwd
    /
    root@2f90a7b71f47:/# ls
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr
    root@2f90a7b71f47:/# ps
       PID TTY          TIME CMD
         1 pts/0    00:00:00 bash
        11 pts/0    00:00:00 ps
    root@2f90a7b71f47:/# exit
    exit
    

    在容器内用ps 命令查看进程,可以看到,只运行了bash 应用,并没有运行其他无关的进程。用户可以按Ctrl+d 或输入exit 命令来退出容器。

    守护态运行
    更多的时候,需要让Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d 参数来实现

    root@slave1:/home/xxx/Documents# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
    b35394dcea6f13826f5c5f54a83920b47f36ae0b80656fa8ac2d369c04823fe7
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            lucid_beaver
    

    查看容器输出
    要获得容器的输出信息,可以通过docker [container] logs 命令。

    停止容器
    1) 暂停容器
    可以使用docker [container] pause CONTAINER [CONTAINER ... ]命令来暂停一个运行中的容器。

    root@slave1:/home/xxx/Documents# docker pause 78c72848cb2a    #暂停容器78c72848cb2a
    78c72848cb2a
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
    b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   6 minutes ago       Up 6 minutes                                 lucid_beaver
    78c72848cb2a        ubuntu:latest       "/bin/bash"              38 minutes ago      Up 28 minutes (Paused)                       xenodochial_mcclintock
    

    2)终止容器
    可以使用docker [container] stop 来终止一个运行中的容器。该命令的格式为docker [container] stop [-t I - -time [=10]] [CONTA工NER ... ]
    该命令会首先向容器发送SIGTERM 信号,等待一段超时时间后(默认为10 秒),再发送SIGK工LL 信号来终止容器:

    root@slave1:/home/xxx/Documents# docker stop 78c72848cb2a
    78c72848cb2a
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   8 minutes ago       Up 8 minutes                            lucid_beaver
    

    此时执行docker container prune 命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过docker [container ] kill 直接发送SIGKILL 信号来强行终止容器。

    root@slave1:/home/xxx/Documents# docker container prune
    WARNING! This will remove all stopped containers.
    Are you sure you want to continue? [y/N] y
    Deleted Containers:
    b35394dcea6f13826f5c5f54a83920b47f36ae0b80656fa8ac2d369c04823fe7
    2f90a7b71f470d5782c62fc93cdb8c1552fa6e5e4e77d014ea9a4397364ae0ac
    c4956c2d6d28164e34454637d477f274fbac4be3d1b5eca70722b3ff68c5e23e
    78c72848cb2a8fe6258ceb37c6b6e9c2f8fbb025e70e4ac9358c979995ba5667
    c73a4dc5a0fa8939e6bec8eae6d4a7347dc675228592db7a11a546b314476ead
    d65bd23fee241d9ef63945e10aaf4763fccea1af29415c94b16565adc7a35795
    c08c1cd0d93eff53af2575b18c41ea3a5f20aa60b092406aca77b009c263e392
    
    Total reclaimed space: 71B
    

    Docker 容器中指定的应用终结时,容器也会自动终止。例如,对于上一章节中只启动了一个终端的容器,用户通过exit 命令或Ctrl+d 来退出终端时,所创建的容器立刻终止,处于stopped 状态。
    可以用docker ps -qa 命令看到所有容器的ID 。

    root@slave1:/home/xxx/Documents# docker ps -qa 
    b35394dcea6f
    2f90a7b71f47
    c4956c2d6d28
    78c72848cb2a
    c73a4dc5a0fa
    d65bd23fee24
    c08c1cd0d93e
    
    

    查看容器 发现此时没有不存在容器:

    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    root@slave1:/home/xxx/Documents# docker ps -qa
    

    处于终止状态的容器,可以通过docker [container] start 命令来重新启动:

    root@slave1:/home/xxx/Documents# docker start b35394dcea6f
    b35394dcea6f
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   13 minutes ago      Up 13 minutes                           lucid_beaver
    
    

    docker [container] restart 命令会将一个运行态的容器先终止,然后再重新启动:

    root@slave1:/home/xxx/Documents# docker start b35394dcea6f
    b35394dcea6f
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   14 minutes ago      Up 10 seconds                           lucid_beaver
    

    进入容器
    1) attach命令
    在使用-d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
    这个时候如果需要进入容器进行操作,推荐使用官方的attachexec 命令。

    root@slave1:/home/xxx/Documents# docker run -itd ubuntu
    b04603884b85b122f4ff32d935b4f18fabd0ba8a79d1954dc73da01d9fb7ca0a
    root@slave1:/home/xxx/Documents# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    b04603884b85        ubuntu              "/bin/bash"         4 seconds ago       Up 3 seconds                            compassionate_cartwright
    root@slave1:/home/xxx/Documents# docker attach compassionate_cartwright
    root@b04603884b85:/#
    

    然而使用attach 命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

    2)从Docker 1.3.0 版本起, Docker 提供了一个更加方便的工具exec 命令,可以在运行中容器内直接执行任意命令。
    该命令的基本格式为:

    docker [container] exec [-di -detach] [ detach-keys[;[]]] [-il--interactive]
    [ - -pii vileged][-t|-- tty] [ u I user (;USER]] CONTAINER COMMAND [ARG . . . ]
    

    比较重要的参数有:
    口- d, --detach : 在容器中后台执行命令;
    口-- detach-keys ="":指定将容器切回后台的按键;
    口- e, - - env= [):指定环境变量列表;
    口- i, --int eractive=true I false :打开标准输入接受用户输入命令, 默认值为
    false;
    口-- privileged=trueifalse : 是否给执行命令以高权限,默认值为false;
    口- t, --tty=trueifalse : 分配伪终端,默认值为false;
    口- u, --user ="":执行命令的用户名或ID 。
    进入到刚创建的容器中,并启动一个bash:

    root@slave1:/home/xxx/Documents# docker start b04603884b85b04603884b85
    root@slave1:/home/xxx/Documents# docker exec -it b04603884b85 /bin/bashroot@b04603884b85:/#
    

    可以看到会打开一个新的bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。通过指定-it 参数来保持标准输入打开,并且分配一个伪终端。通过exec 命令对容器执行操作是最为推荐的方式。

    在容器中查看容器中的用户和进程信息:

    root@b04603884b85:/# w
    09:27:27 up  7:41,  0 users,  load average: 0.54, 0.52, 0.54
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root@b04603884b85:/# ps -ef
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0 09:24 pts/0    00:00:00 /bin/bash
    root         12      0  0 09:24 pts/1    00:00:00 /bin/bash
    root         22     12  0 09:27 pts/1    00:00:00 ps -ef
    

    删除容器
    查看处于终止状态的容器,并删除:

    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    b04603884b85        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 7 seconds ago                       compassionate_cartwright
    root@slave1:/home/xxx/Documents# docker rm b04603884b85
    b04603884b85
    

    默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    b04603884b85        ubuntu              "/bin/bash"         About an hour ago   Up About an hour                        compassionate_cartwright
    root@slave1:/home/xxx/Documents# docker rm b04603884b85
    Error response from daemon: You cannot remove a running container b04603884b85b122f4ff32d935b4f18fabd0ba8a79d1954dc73da01d9fb7ca0a. Stop the container before attempting removal or force remove
    

    直接删除一个运行中的容器,可以添加 -f 参数。Docker 会先发送SIGKILL 信号给容器,终止其中的应用,之后强行删除。

    导入导出容器
    1)导出容器
    需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker 的导人和导出功能,这也是Docker 自身提供的一个重要特性。
    导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container] export 命令,该命令格式为:
    docker [container) export [-ol - -output [=””) ) CONTAINER

    可以通过-o选项来指定导出的tar 文件名,也可以直接通过重定向来实现。首先,查看所有的容器

    root@slave1:/home/xxx/Documents# docker run -d ubuntu:16.04
    56f6b04a4177e1817372cdba64eb4f458e5cceefe0e7f4507343ba15e810805d
    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    56f6b04a4177        ubuntu:16.04        "/bin/bash"         10 seconds ago      Exited (0) 8 seconds ago                       boring_kapitsa
    root@slave1:/home/xxx/Documents# docker export -o test_for_run.tar 56f6b04a4177   #导出56f6b04a4177容器到文件test_for_run.tar
    

    之后,可将导出的tar 文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移。

    2)导入容器
    导出的文件又可以使用docker [container] import 命令导人变成镜像,该命令
    格式为:docker import [-cl--change[=[]]] [-ml -- message[=MESSAGE]] filelURLI[REPOSITORY [:TAG]]
    用户可以通过-c, -change =[]选项在导人的同时执行对容器进行修改的Dockerfile指令将导出的test_for_run.tar 文件导人到系统中:
    docker import test_for_run.tar - test/ubuntu:vl.O

    实际上,既可以使用docker load 命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import 命令来导入一个容器快照到本地镜像库。这两者的区别在于: 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。
    查看容器
    Docker容器的inspect topstats子命令。
    1)查看容器详情
    查看容器详情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。

    root@slave1:/home/xxx/Documents# docker ps -a
    

    2)查看容器内进程
    查看容器内进程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER . .. ] 子命令。

    root@slave1:/home/xxx/Documents# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
    b46ec45174d1758dd4c12600fb93448b4f683d5b519a84b38c0c58ad5245873b
    root@slave1:/home/xxx/Documents# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
    b46ec45174d1        ubuntu              "/bin/sh -c 'while t…"   4 seconds ago
    root@slave1:/home/xxx/Documents# docker top b46ec45174d1   #查看容器内进程
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                15546               15508               1                   20:41               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
    root                15619               15546               0                   20:41               ?                   00:00:00            sleep 1
    

    3)查看统计信息
    查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER ... ] 子命令,会显示CPU 、内存、存储、网络等使用情况的统计信息。
    支持选项包括:
    口- a, -all :输出所有容器统计信息,默认仅在运行中;
    口- format string :格式化输出信息;
    口- no-stream :不持续输出,默认会自动更新持续实时结果;
    口- no-trunc :不截断输出信息。
    查看当前运行中容器的系统资源使用统计:

    #docker stats b46ec45174d1
    
    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
    b46ec45174d1        lucid_wilson        0.15%               1.926MiB / 3.839GiB   0.05%               3.38kB / 0B         0B / 0B             2
    

    参考:Docker技术入门与实战

  • 相关阅读:
    在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别
    RESTful 的总结
    Mvc项目部署IIS报错:没有为请求的URL配置默认文档,并且没有在服务器设置目录浏览
    Ajax的请求方式几传参的区别
    响应式布局中的CSS相对量
    理解 ES6 语法中 yield* 关键字的作用
    理解 ES6 语法中 yield 关键字的返回值
    配置IIS Express以便通过IP地址访问调试的网站
    在IntelliJ IDEA 13中配置OpenCV的Java开发环境
    iOS UITableView获取cell的indexPath及cell内部按钮点击事件处理
  • 原文地址:https://www.cnblogs.com/eugene0/p/11494371.html
Copyright © 2020-2023  润新知