zoukankan      html  css  js  c++  java
  • Docker-容器

    简介

    容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其它系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必须的运行环境。


    创建容器

    新建容器
    可以使用docker create命令新建一个容器,例如

    FengZhen$ docker create -it ubuntu:latest
    Unable to find image 'ubuntu:latest' locally
    latest: Pulling from library/ubuntu
    6b98dfc16071: Pull complete 
    4001a1209541: Pull complete 
    6319fc68c576: Pull complete 
    b24603670dc3: Pull complete 
    97f170c87c6f: Pull complete 
    Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
    Status: Downloaded newer image for ubuntu:latest
    e8ead3ad28297f2a9ff80f8d1da8766159ef01103ca0a39b1aba05d19a6dfe3e


    因为本地没有ubuntu:latest的镜像,所以在创建该容器的时候先去DockerHub下载了ubuntu:latest的镜像

    FengZhen$ docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e8ead3ad2829 ubuntu:latest "/bin/bash" 3 minutes ago Created eager_bell


    使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
    Create命令和后续的run命令支持的选项都十分复杂,主要包括如下几大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关

    其他比较重要的选项还包括
    -l, --label=[] : 以键值对方式指定容器的标签信息
    --label-file=[] :从文件中读取标签信息

    启动容器

    使用docker start命令来启动一个已经创建的容器
    docker start e8ead3ad2829
    其中e8ead3ad2829为容器ID

    FengZhen$ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e8ead3ad2829 ubuntu:latest "/bin/bash" 5 hours ago Up 21 seconds eager_bell
    9accde73018b nginx "nginx -g 'daemon of…" 2 days ago Up 2 days 0.0.0.0:80->80/tcp webserver


    通过docker ps命令可以看到本地正在运行的容器

    新建并启动容器

    除了创建容器后通过start命令来启动,也可以直接新建并启动容器。所需要的命令主要为docker run ,等价于先执行docker create命令,在执行docker start命令
    例如,下面的命令输出一个hello world,之后容器自动终止

    FengZhen$ docker run ubuntu:latest /bin/echo 'hello world'
    hello world
    

    当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括
    1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载
    2. 利用镜像创建一个容器,并启动该容器
    3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
    4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
    5. 从网桥的地址池配置一个IP地址给容器
    6. 执行用户指定的应用程序
    7. 执行完毕后容器自动中止
    下面的命令启动一个bash终端,允许用户进行交互
    docker run –it ubuntu:14.04 /bin/bash
    其中,-t选项让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开
    在交互模式下,用户可以通过所创建的终端来输入命令,如下

    FengZhen$ docker run -it ubuntu:14.04 /bin/bash
    root@d982eec2d0ba:/# pwd
    /
    root@d982eec2d0ba:/# ls
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
    root@d982eec2d0ba:/# ps
    PID TTY TIME CMD
    1 pts/0 00:00:00 bash
    16 pts/0 00:00:00 ps
    

    在容器内用ps命令查看进程,可以看到,只运行了bash应用,并且没有运行其他的进程
    用户可以直接Ctrl+d或exit退出
    对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了,这是因为对Docker容器来说,当运行的应用退出后,容器也没有继续运行的必要了
    某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码
    默认情况下,常见的错误代码包括
    125:docker daemon执行出错,例如制定了不支持的docker命令参数
    126:所指定命令无法执行,例如权限出错
    127:容器内命令无法找到
    命令执行后出错,会默认返回错误码

    守护态运行

    更多的时候,需要让docker容器在后台以守护态(Daemonized)形式运行,此时,可以通过添加-d参数来实现
    例如下面的命令会再后台运行容器

    FengZhen$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    d2374b410b1e0840318ddc3ef395f81b799044e29c38a8174cb4f1630a21adcb
    

    此时通过docker ps命令查看运行中的容器

    FengZhen$ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    d2374b410b1e ubuntu:14.04 "/bin/sh -c 'while t…" 30 seconds ago Up 32 seconds practical_meninsky
    

    此时,要获取容器的输出信息,可以使用如下命令
    docker logs CONTAINER_ID

    FengZhen$ docker logs d2374b410b1e
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world

    终止容器

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

    FengZhen$ docker stop d2374b410b1e
    d2374b410b1e
    

    注意:docker kill命令会直接发送SIGKILL信号来强行终止容器
    此外,当docker容器中指定的应用终结时,容器也会自动终止
    docker restart命令会将一个运行态的容器先终止,然后再重新启动它

    进入容器

    在使用-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
    示例

    FengZhen$ docker run -itd ubuntu:latest
    69b9e319dff54577e7d2c96b34887666ca5d47e87778e9fd9e70892b97117e9a
    FengZhen$ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    69b9e319dff5 ubuntu:latest "/bin/bash" 49 seconds ago Up 48 seconds clever_chebyshev
    FengZhen$ docker attach clever_chebyshev
    root@69b9e319dff5:/#

    但是使用attach命令有时候并不方便,当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
    2. exec
    docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任意命令。命令格式如下
    docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARGS...]
    比较重要的参数有
    -i, --interactive = true|false:打开标准输入接收用户输入命令,默认false
    --privileged=true|false:是否给执行命令以高权限,默认false
    -t, --tty=true|false 分配伪终端,默认为false
    -u, --user = “” 执行命令的用户名或ID
    进入到刚创建的容器中,启动bash

    FengZhen$ docker exec -it 13459f377c42 /bin/bash
    root@13459f377c42:/#


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

    删除容器

    可以使用docker rm命令来删除处于终止或退出状态的容器,命令格式为
    docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
    主要支持的选项包括
    -f, --force=false:是否强行终止并删除一个运行中的容器
    -l, --link=false:删除容器的连接,但保留容器
    -v, --volumes=false:删除容器挂载的数据卷
    默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器
    如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除


    导入和导出容器

    某些时候,需要将容器从一个系统迁移到另一个系统,此时可以使用docker的导入和导出功能,这也是docker自身提供的一个重要特性
    导出容器
    导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,该命令的格式为
    docker export [-o|--output=[””]] CONTAINER,其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现
    如下

    FengZhen$ docker export -o ubuntu_14.04_export.tar 13459f377c42
    FengZhen$ docker export 037bd5cef0e9 >ubuntu_latest_withrdr.tar

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

    导入容器
    导出的文件又可以使用docker import命令导入变成镜像,命令格式为
    docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
    用户可以通过-c,--change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令
    下面将导出的ubuntu_14.04_export.tar文件导入到系统中

    FengZhen$ docker import ubuntu_14.04_export.tar - test/ubuntu:v1.0
    invalid reference format
    FengZhen$ docker import ubuntu_14.04_export.tar test/ubuntu:v1.0
    sha256:143b5076a0fba9dc0775e40e30a9dc16d0839ef8ebc296de8d57ece713b3d779
    

    导入命令如上,不带-

    FengZhen$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    test/ubuntu v1.0 143b5076a0fb 50 seconds ago 183MB
    

    导入成功
    既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库
    两者的区别在于容器快找文件将丢失所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整的记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

  • 相关阅读:
    寒宣资料汇编
    Windows邮件客户端
    Dear Menuhin
    2017-11-11 Sa Oct Spider
    2017-11-11 Sa Oct How to open a browser in Python
    skynet游戏服务器框架分享
    钉钉 机器人接入 自定义webhook
    golang语法笔记
    [学习笔记]尝试go-micro开发微服务<第一波>
    [学习笔记]Golang--基础数据类型
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/9169353.html
Copyright © 2011-2022 走看看