zoukankan      html  css  js  c++  java
  • docker(4)

    docker容器

    1、创建容器

    1.新建容器

      可以使用docker create命令新建一个容器。

    复制代码
    [root@linux-node1 ~]# docker create -it ubuntu:latest 
    ffc9099be315f1b94876410c7d74dcd20e311e735e638080dd477534c063a6d6
    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    ffc9099be315        ubuntu:latest       "/bin/bash"         8 seconds ago       Created                                 optimistic_pare
    [root@linux-node1 ~]# 
    复制代码

      说明:用docker create命令创建的容器处于停止状态,可以使用docker start命令来启动它。

    2.启动容器

      使用docker start命令可以启动一个停止状态的容器。

    复制代码
    [root@linux-node1 ~]# docker start ffc9099be315
    ffc9099be315
    [root@linux-node1 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
    ffc9099be315        ubuntu:latest       "/bin/bash"         About a minute ago   Up 8 seconds                            optimistic_pare
    [root@linux-node1 ~]# 
    复制代码

    3.新建并启动容器

      除了可以用start命令来启动容器,也可以在新建的时候直接启动容器。使用docker run命令即可

    [root@linux-node1 ~]# docker run ubuntu:latest /bin/echo "Hello Docker"
    Hello Docker
    [root@linux-node1 ~]#

      说明:

    复制代码
    docker run启动容器时,docker在后台一共做了下面这些事:
        1.检查本地是否存在指定的镜像,不存在就从共有仓库下载;
        2.利用镜像创建一个容器,并启动该容器;
        3.分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
        4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
        5.从网桥的地址池配置一个IP地址给容器;
        6.执行用户指定的应用程序;
        7.执行完毕后,容器被终止。
    复制代码

      docker run -it ubuntu:latest /bin/bash 可以启动一个bash终端,允许用户交互:
          -t参数:让docker分配一个伪终端绑定到标准输出
          -i参数:让伪终端的标准输入保持开启状态,接收用户输入,实现交互
          用exit命令或者ctrl + d命令退出容器4.守护态运行

    4.守护态运行

      很多时候我们需要让容器在后台以守护态(Daemonized)形式运行。此时可以通过-d参数来实现。

    [root@linux-node1 ~]# docker run -d ubuntu:latest /bin/bash -c "while true;do echo hello docker;sleep 1;done"
    3778a35ff4bcbf8cbd3934601e9ca2bfd33034f8a4cc69b6d76e0811c910e1e0
    [root@linux-node1 ~]# 

      可以通过docker logs [ID]查看容器的输出信息:

    复制代码
    [root@linux-node1 ~]# docker logs 3778a
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    hello docker
    复制代码

    2、终止容器

      可以使用docker stop命令来停止一个正在运行中的容器。命令格式为:docker stop [-t|--time[=10]] [CONTAINER...]
      执行了docker stop命令之后,docker首先会向容器发送SIGTERM信号,等待一段时间(默认10秒)后,再发送SIGKILL信号来终止容器。

    [root@linux-node1 ~]# docker stop 3778a  #执行该命令后,终端会等待10秒才会有终止容器的返回信息3778a
    3778a
    [root@linux-node1 ~]#

      docker kill命令可以跳过SIGTERM信号,直接发送SIGKILL信号终止容器。

    [root@linux-node1 ~]# docker kill ffc    #该命令执行后,马上会返回终止容器的信息ffc
    ffc
    [root@linux-node1 ~]# 

    3、启动和重启容器

      docker start命令可以启动一个停止状态的容器。
      docker restart命令先会停止该容器,然后重新启动该容器。

    4、进入容器

      在使用-d参数启动容器后,容器直接运行在后台,用户无法看到容器中的信息,也无法进行操作。
      要进入容器有多种方法,其中最常见的是官方的attach或exec命令还有第三方的nsenter工具。

    1.attach命令

      attach是docker自带的命令,命令格式为:docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
      支持三个主要选项:

    --detach-keys[=[]]        指定退出attach模式的快捷键序列,默认是CTRL -p CTRL -q
    --no-stdin=true|false    是否关闭标准输入,默认是保持打开
    --sig-proxy=true|false    是否代理收到的系统信号给应用进程,默认为true。

      举例如下:

    复制代码
    [root@linux-node1 ~]# docker run -itd centos:latest 
    b73595139275b9feaf077c6c537e89ecb16e19b399217b0cacc71bea164acf50
    [root@linux-node1 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS           NAMES
    b73595139275        centos:latest       "/bin/bash"         11 seconds ago      Up 9 seconds                      gifted_hypatia
    [root@linux-node1 ~]# docker attach gifted_hypatia 
    [root@b73595139275 /]# pwd
    /
    [root@b73595139275 /]# exit
    exit
    [root@linux-node1 ~]# 
    复制代码

      使用attach命令并不是很方便,当多个窗口同时用attach命令连接到同一个容器的时候,所有窗口都会同步显示。无法独立操作。

    2.exec命令

      docker从1.3.0版本开始提供了一个更加方便的命令exec,可以直接在容器内执行任意命令。命令格式为:
      docker exec [-d|--detach] [--detach-keys=[[]]] [-i|--iteractive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
      参数说明:

    -i,--iteractive=true|false    打开标准输入接收用户输入的命令,默认为false
    --privileged=true|false        是否给执行命令以最高权限,默认为false
    -t,--tty=true|false            分配伪终端,默认为false
    -u,--user=""                   执行命令的用户名或ID

      举例如下:

    复制代码
    [root@linux-node1 ~]# docker run -itd centos:latest 
    c50284d43c2a00e10a8f02eca97c9404bf3bccb6c9759e6196b74ad31ddb42fd
    [root@linux-node1 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS           NAMES
    c50284d43c2a        centos:latest       "/bin/bash"         3 seconds ago       Up 2 seconds                      relaxed_lamport
    [root@linux-node1 ~]# docker exec -it c5028 /bin/bash
    [root@c50284d43c2a /]# 
    复制代码

    3.nsenter工具

      为了连接到docker的容器,还要先找出容器进程的PID,可以通过下面的命令获取:

    PID=`docker inspect -f "{{.State.Pid}}" c50284d43c2a`   #c50284d43c2a为容器的ID号

      为了方便使用写了一个脚本docker-pid直接可以输出指定容器进程的PID号:

    #!/bin/bash
    
    PID=`docker inspect -f "{{.State.Pid}}" $1`
    echo $PID
    #使用方法:./docker-pid 容器ID或者容器名

      举例如下:

    复制代码
    [root@linux-node1 ~]# docker-pid 50284d43c2a
    22375
    [root@linux-node1 ~]# nsenter --target 22375 --mount --uts --ipc --net --pid
    [root@c50284d43c2a /]# pwd
    /
    [root@c50284d43c2a /]# ip a
    -bash: ip: command not found
    [root@c50284d43c2a /]# 
    复制代码

    4、删除容器

      使用docker rm命令删除处于退出或者终止状态的容器,命令格式为:docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
      参数说明:

    -f,--force=false       是否强行终止并删除一个正在运行中的容器
    -l,--link=false        删除容器的链接,但保留容器
    -v,--volumes=false     删除容器挂载的数据卷

      举例如下:

    复制代码
    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    a6f06de9d30b        ubuntu:latest       "/bin/bash"         7 seconds ago       Exited (0) 5 seconds ago                       condescending_bassi
    c50284d43c2a        centos:latest       "/bin/bash"         23 minutes ago      Up 23 minutes                                  relaxed_lamport
    [root@linux-node1 ~]# docker rm a6f06de9d30b
    a6f06de9d30b
    [root@linux-node1 ~]# 
    复制代码

      docker rm只能删除退出或者终止状态的容器,并不能删除正在运行的容器,如果要删除正在运行的容器需要加-f参数

    复制代码
    [root@linux-node1 ~]# docker rm c50284d43c2a
    Error response from daemon: You cannot remove a running container c50284d43c2a00e10a8f02eca97c9404bf3bccb6c9759e6196b74ad31ddb42fd. Stop the container before attempting removal or force remove
    [root@linux-node1 ~]# 
    [root@linux-node1 ~]# docker rm -f c50284d43c2a
    c50284d43c2a
    [root@linux-node1 ~]# 
    复制代码

    5、导入和导出容器

      某些时候需要将容器从一个系统迁移到另一个容器,所以就需要将容器先导出,在新的系统导入。

    1.导出容器

      导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,命令格式为
      docker export [-o|--output[=""]] CONTAINER

      参数说明:

    -o,--output=""        指定打出的tar文件名,也可以直接重定向实现。

      举例如下:

    复制代码
    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    ca0f4155f3ff        centos:latest       "/bin/bash"         2 minutes ago       Up 2 minutes                                   nostalgic_golick
    2b9d24d61777        ubuntu:latest       "/bin/bash"         2 minutes ago       Exited (0) 2 seconds ago                       gallant_agnesi
    [root@linux-node1 ~]# docker export -o test_for_run.tar ca0f
    [root@linux-node1 ~]# ls
    anaconda-ks.cfg  docker-pid  test_for_run.tar  ubuntu-14.04-x86_64-minimal.tar.gz
    [root@linux-node1 ~]# docker export 2b9d > test_for_stop.tar
    [root@linux-node1 ~]# ls
    anaconda-ks.cfg  docker-pid  test_for_run.tar  test_for_stop.tar  ubuntu-14.04-x86_64-minimal.tar.gz
    [root@linux-node1 ~]#
    复制代码

    2.导入容器 

      导出的容器文件可以通过docker import导入变成镜像,命令格式为:
      docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|- [RESPOSITORY[:TAG]]
      参数说明:

    -c,--change=[]        在导入的同时执行对容器做出修改的Dockerfile指令。

      举例如下:

    复制代码
    [root@linux-node1 ~]# cat test_for_run.tar |docker import - test/ubuntu:0.2
    sha256:0a3bc658748d0a73798b2db3316c56020697ed4f4407992b1327e4714b09f190
    [root@linux-node1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    test/ubuntu         0.2                 0a3bc658748d        7 seconds ago       197MB
    test                0.1                 d751da3f9943        2 hours ago         221MB
    ubuntu              16.04               20c44cd7596f        10 days ago         123MB
    ubuntu              latest              20c44cd7596f        10 days ago         123MB
    ubuntu              14.04               d6ed29ffda6b        10 days ago         221MB
    staryjie/test       latest              d6ed29ffda6b        10 days ago         221MB
    centos              latest              d123f4e55e12        3 weeks ago         197MB
    [root@linux-node1 ~]#
    复制代码
  • 相关阅读:
    进制的转换
    输出蛇型矩阵
    输出弓形矩阵
    找出一个数组中出现次数最多的那个元素
    开灯问题
    find your present
    核反应堆
    Box of Bricks最小移动砖块数目
    超级楼梯
    Bootstrap中的 JavaScript 特效 — 下拉菜单和滚动监听插件
  • 原文地址:https://www.cnblogs.com/icat-510/p/10946969.html
Copyright © 2011-2022 走看看