zoukankan      html  css  js  c++  java
  • docker 003 基本操作

    docker 003 入门

    学习 docker 的基本工作流:创建-管理-停止-删除

    这里以

    确保 docker 已正常运行

    # 查看容器和镜像的数量,docker 使用的驱动及基本配置信息
    $ docker info
    Client:
     Debug Mode: false
    
    Server:
     Containers: 1
      Running: 0
      Paused: 0
      Stopped: 1
     Images: 1
     Server Version: 19.03.5
     Storage Driver: overlay2
      Backing Filesystem: xfs
      Supports d_type: true
      Native Overlay Diff: true
     Logging Driver: json-file
     Cgroup Driver: cgroupfs
     Plugins:
      Volume: local
      Network: bridge host ipvlan macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
     Swarm: inactive
     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
     runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
     init version: fec3683
     Security Options:
      seccomp
       Profile: default
     Kernel Version: 3.10.0-693.el7.x86_64
     Operating System: CentOS Linux 7 (Core)
     OSType: linux
     Architecture: x86_64
     CPUs: 1
     Total Memory: 992.4MiB
     Name: docker02
     ID: 23TL:WD67:K4HB:U2JK:2U5R:VSSQ:2VDM:M2M4:VZIK:Z5FW:5RWZ:RHN7
     Docker Root Dir: /var/lib/docker
     Debug Mode: false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Live Restore Enabled: false
    

    运行第一个容器

    # 运行容器 ubuntu,并使用为终端登录进容器内,运行/bin/bash启动一个 bash shell
    # -i : 保证容器中 stdin 是开启的
    # -t : 为创建的容器分配一个伪tty终端
    $ docker run -i -t ubuntu /bin/bash
    Unable to find image 'ubuntu:latest' locally
    latest: Pulling from library/ubuntu
    5c939e3a4d10: Pull complete
    c63719cdbe7a: Pull complete
    19a861ea6baf: Pull complete
    651c9d2d6c4f: Pull complete
    Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
    Status: Downloaded newer image for ubuntu:latest
    root@b0558195ad79:/#  # 这里已经是容器内部的 shell
    
    # 容器内部执行 hostname
    root@b0558195ad79:/# hostname
    b0558195ad79   # 这里主机名就是容器 ID
    
    # 查看 hosts 文件,本地有一个容器的 IP 和主机名的解析
    root@b0558195ad79:/# cat /etc/hosts
    127.0.0.1	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    ff00::0	ip6-mcastprefix
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    172.17.0.2	b0558195ad79
    
    # 查看运行的进程
    root@b0558195ad79:/# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.2  18496  2116 pts/0    Ss   02:01   0:00 /bin/bash
    root        20  0.0  0.1  34388  1460 pts/0    R+   02:07   0:00 ps aux
    
    # 安装 iproute2
    root@b0558195ad79:/# apt-get update
    root@b0558195ad79:/# apt-get install iproute2
    
    # 查看容器网络配置
    root@b0558195ad79:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    # 可以看到有一个回环接口,还有一个标砖 eth0网络接口,和宿主机一样
    

    我们可以继续在容器中进行各种操作,当所有工作结束后,输入 exit 就可以退出容器,回到宿主机。而这个容器也会停止运行,只有/bin/bash 处于运行状态的时候,容器才会处于运行状态,一旦退出,/bin/bash 命令结束,容器也就响应的停止了。

    但这时候,容器还是存在的,可以使用 docker ps -a 查看当前系统中容器的列表,如下:

    # 查看宿主机内所有容器,包括已停止运行的
    # 默认情况下 docker ps 只能看到正在运行的容器
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
    b0558195ad79        ubuntu              "/bin/bash"         53 minutes ago      Exited (0) 12 seconds ago                            vibrant_germain
    

    注意: 有三种方式唯一指定容器

    • 短 UUID
    • 长 UUID
    • 容器名称

    容器命名

    docker 会为每一个容器自动生产一个随机的名称,例如上面的vibrant_germain,如果想自己指定容器名称,可以使用 --name 参数,如下:

    # 运行容器并指定容器名称
    $ docker run --name ubuntu001 -i -t ubuntu /bin/bash
    
    # 查看容器信息
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    ffeedd9447b5        ubuntu              "/bin/bash"         16 seconds ago      Up 15 seconds                           ubuntu001
    
    

    容器的名称只能包含以下字符:

    • 大小写字母
    • 数字 0-9
    • 下划线
    • 远点
    • 横线(减号)

    在很多 docker 命令中,容器名称可以替代容器 ID,容器名称也可以让我们更容易分辨容器。推荐使用容器名称,以方便容器的管理。

    注意 :容器名称必须唯一,如果试图创建两个名称相同的容器,会命令失败,如果要使用已经存在的名称,可以使用 docker rm 命令先将已有的同名容器删除,在创建。

    # 删除容器
    # 使用容器 ID
    docker rm b0558195ad79 
    
    # 使用容器名称
    docker rm ubuntu001
    

    重启启动已停止的容器

    # 使用容器名称启动指定容器
    $ docker start ubuntu001
    
    # 使用容器 ID 启动指定容器
    $ docker start 74d08be02091
    
    # 使用 restart 重新启动容器
    $ docker restart ubuntu001
    

    重新登录到容器内

    # 登录到容器内
    $ docker attach ubuntu001
    

    注意:因为容器内部没有单独运行的程序,所以四处退出容易后,容器会再次停止运行

    创建守护式容器

    前面的操作使用的都是交互式运行的容器,我们还可以创建守护式容器。守护式容器没有交互式会话,适合运行应用程序和服务。大多数时候,我们需要使用守护式运行我们的容器。

    示例:

    # 创建一个守护式容器的示例
    # -d 参数: 让容器后台运行,并打印容器 ID
    $ docker run --name ubuntu02 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
    d326b1bbd1b718c525fd5503fc3d99b0fb610bdbbf8c3a31e88f32f796e2c381
    
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    d326b1bbd1b7        ubuntu              "/bin/sh -c 'while t…"   15 seconds ago      Up 15 seconds                           ubuntu02
    

    上面的示例中,容器内执行了一个while 死循环,该循环会每隔 1 秒打印一次”hello world“,知道容器或其内部的进程停止运行。

    ##查看容器内部的工作内容

    docker logs 可以获取容器的日志:

    # 查看容器的日志
    # 查看
    $ docker logs ubuntu02
    hello world
    hello world
    hello world
    ......
    
    # -f 参数可以让我们持续查看容器日志, 类似于 tail 命令的-f 参数
    $ docker logs -f ubuntu02
    hello world
    hello world
    hello world
    ......
    hello world
    
    # 查看最后 10 行日志
    $ docker logs --tail 10  ubuntu02
    
    # 查看最新的日志,并监控日志
    $ docker logs --tail 0 -f  ubuntu02
    
    

    在查看日志的过程中,通过 ctrl+c 来退出日志追踪。

    docker日志驱动

    自1.6 开始,docker 支持控制守护进程和容器所用的日志驱动,通过 --log-dirver 实现,可在启动docker 守护进程或者 docker run 时使用。

    --log-driver : 有如下选项

    • json-file :默认值
    • syslog : 该选项将禁用 docker logs 命令,并将所有容器的日志输出都重定向到 syslog,可在启动 docker 的守护进程时指定,也可以通过 docker run 对指定的容器进行日志重定向
    • none : 禁用容器中所有的日志,docker logs 命令也会被禁用。

    支持的选项:

    awslogs、fluentd、gcplogs、gelf、journald、json-file、local、logentries、splunk、syslog

    查看容器内的进程

    # 查看容器内的进程
    docker top ubuntu02
    

    docker 统计信息

    #  可动态查看一个或多个容器的统计信息
    $ docker status ubuntu02 ubuntu001
    
    #展示的信息包括 CPU、MEM、网络IO、存储IOdezhi
    

    在容器内部运行新进程

    # docker exec 可以在容器内部额外启动新进程(后台任务或交互式任务)
    # -d 表明要运行一个后台进程,其后跟荣启明和要执行的命令
    $ docker exec -d ubuntu02 touch /tmp/newfile
    
    # 在已运行容器上打开一个交互式shell
    # -i 保证 attach 期间 stdin 为打开状态
    # -t 分配一个伪tty
    $ docker exec -i -t ubuntu02 /bin/bash
    
    

    停止守护式容器

    # 发送 sigtrem 信号,停止容器 
    $ docker stop ubuntu02  # 容器名称
    $ docker stop d326b1bbd1b7  # 容器 ID
    
    # 发送 sigkill 信号停止容器,更快
    $ docker kill ubuntu01
    $ docker kill d326b1bbd1b7
    
    # 查看已停止容器的状态
    $ docker ps
    $ docker ps -n x  # 显示最后 x 个容器
    

    自动重启容器

    如果容器因为某种错误而停止运行,可以通过 --restart 参数,让 docker 自动重启容器,该参数会检查容器的退出代码,并据此来判断是否重启容器。docker 默认不会重启容器。

    # 
    $ docker run --restart=always --name ubuntu03 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
    

    这里 --restart参数的值为 always,无论容器的代码是什么都会自动重启;另外一个可设的值为 on-failure,即当容器退出代码未非 0 值时,才会自动重启,该值还可以设置重启次数,例:--restart=on-failure:5

    深入容器

    获取容器的更多信息:

    # 获取更多关于容器的信息
    # docker inspect 会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置等信息
    $ docker inspect ubuntu03
    
    # 查看选定内容的值: -f 或者  --format
    # 查看运行状态
    $ docker inspect -f '{{ .State.Running }}'  ubuntu03
    true
    
    # 查看IP
    $ docker inspect -f '{{ .NetworkSettings.IPAddress }}'  ubuntu03
    172.17.0.3
    
    # 同时查看多个容器中的指定信息
    $ docker inspect --format '{{.Name}} {{.State.Running}} {{.NetworkSettings.IPAddress}}' ubuntu03 ubuntu02
    /ubuntu03 true 172.17.0.3
    /ubuntu02 true 172.17.0.2
    

    注意:除了查看容器,也可以通过浏览 /var/lib/docker 下的文件来来了解 docker 的工作原理,其下存放有镜像、容器及容器配置等信息。

    目录结构如下:

    /var/lib/docker/ ├── builder ├── buildkit ├── containers ├── image ├── network ├── overlay2 ├── plugins ├── runtimes ├── swarm ├── tmp ├── trust └── volumes

    删除容器

    如果容器不在使用,可使用 rm 子命令删除容器:

    #  使用 ID 删除容器
    $ docker rm 88607d784af6
    
    # 使用容器名删除容器
    $ docker rm ubuntu03
    
    # 一次删除所有容器
    $ docker rm $(docker ps -a -q)
    
    # docker ps 可列出容器信息, -a 表示列出所有容器, -q 表示只显示容器 ID
    
  • 相关阅读:
    10-关于DOM的事件操作
    09-伪数组 arguments
    08-函数
    07-常用内置对象
    Django -- 2.http协议
    Django -- 1.web应用
    web前端 --- JavaScrip之BOM
    web前端 --- JavaScrip函数与对象
    web前端 --- JavaScrip基础
    web前端 --- CSS下篇
  • 原文地址:https://www.cnblogs.com/resn/p/12218368.html
Copyright © 2011-2022 走看看