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

  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/9169353.html
Copyright © 2011-2022 走看看