• Docker容器操作


    一、简介

    容器:容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在不同的地方以相同的方式运行。本质就是镜像文件运行后的实例,具有一定的生命周期。

    容器的生命周期如下

     二、容器与虚拟机的比较

    1、相似或相同点

    • 都是对物理硬件资源进行共享使用
    • 生命周期也比较相似
    • 可以安装各种应用,如redis、python、mysql等
    • 创建后会存储在宿主机上,linux上是位于/var/lib/docker/containers下

    2、不同点

    • 虚拟机是基于一个完整的操作系统,即一个虚拟机一个操作系统,容器则是基于宿主机的内核上,即多个容器共用主机的操作系统,本质上有点类似于进程。
    • 容器是属于轻量级的,虚拟机是属于重量级的,因为容器不需要额外的资源来管理(如Hypervisor等),虚拟机需要,操作也比虚拟机方便。

     三、容器的操作

    1、容器创建和启动

    (1)创建docker create

    # 命令格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    # OPTIONS:
        -t, --tty               分配一个伪TTY,也就是分配虚拟终端
           -i, --interactive   即使没有连接,也要保持STDIN打开
           --name              为容器起名,如果没有指定将会随机产生一个名称
    # 命令参数(COMMANDARG):
        COMMAND 表示容器启动后,容器会执行该命令命令,如ps、ls 等命令
        ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    # 案例:
    [root@192 ~]# docker create --name=hello hello-world ps -A
    6b72d911e4aad66bcd088b6f0fe07c306db94322065507fc446a2cecd26bd4d9
    
    docker create -ti --name test-container2 centos /bin/bash

    (2)容器启动 docker start

    # 命令格式:
        docker start [OPTIONS] CONTAINER [CONTAINER...]
    #OPTIONS:
        -a, --attach        将当前shell的 STDOUT/STDERR 连接到容器上
        -i, --interactive        将当前shell的 STDIN连接到容器上    

     2、容器创建并启动 docker run(重点)

    参数说明:

    • -i:表示运行容器
    • -t:表示容器启动后会进入其命令行(类似我们在cmd执行mysql一样)。加入ti这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    • --name :为创建的容器命名。
    • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
    • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

    其他常见参数:

    -u, --user="", 指定容器的用户
        -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
        -w, --workdir="", 指定容器的工作目录
        -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
        -e, --env=[], 指定环境变量,容器中可以使用该环境变量
        -m, --memory="", 指定容器的内存上限
        -P, --publish-all=false, 指定容器暴露的端口
        -p, --publish=[], 指定容器暴露的端口
        -h, --hostname="", 指定容器的主机名--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
        --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
        --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
        --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
        --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
        --device=[], 添加主机设备给容器,相当于设备直通
        --dns=[], 指定容器的dns服务器
        --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
        --entrypoint="", 覆盖image的入口点
        --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
        --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
        --link=[], 指定容器间的关联,使用其他容器的IP、env等信息
        --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
        --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
        --net="bridge", 容器网络设置:
            bridge 使用docker daemon指定的网桥
            host //容器使用主机的网络
            container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
            none 容器使用自己的网络(类似--net=bridge),但是不进行配置
        --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
        --restart="no", 指定容器停止后的重启策略:
            no:容器退出时不重启
            on-failure:容器故障退出(返回值非零)时重启
            always:容器退出时总是重启
        --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
        --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

    (1)交互式方式创建容器

    (2)守护式方式创建容器,也就是挂后台

    [root@192 ~]# docker run -di --name=python1 python:3.6
    21030b865834a84f29d7dd536f1b4d937b4256e081ad98a0542eb76af54d9609

    (3)目录挂载创建容器

    docker run -di -v 宿主机目录:容器目录 --name=mycentos centos:7
    # 注意:centos7中安全模块selinux把权限禁掉了,可以通过添加参数 --privileged=true来解决挂载的目录没有权限的问题

    (4)端口映射创建容器

    docker run -di -p 6377:6379 redis:latest

    3、容器查看

    docker ps  #查看正在运行的容器
    docker ps -a # 查看所有容器
    docker ps -l  #查看最后一次运行的容器
    # -f 是筛选的指定的容器
    docker ps -f status=exited # 查看停止的容器

    4、容器删除、重启

    # -----------容器删除------------
    docker rm 容器名字/容器ID
    # -f 强制删除   -v 同时删除绑定在容器上的数据卷
    
    # -----------容器重启----------------
    docker restart 容器名字/ID
    参数 -t , --time int  重启前,等待的时间,单位秒,默认是10s

    5、容器暂停与关闭、终止

    # --------容器暂停----------
    docker pause 容器名字/ID   #容器暂停
    docker unpause 容器名字/ID # 容器取消暂停
    
    # ---------容器关闭----------
    docker stop 容器名字/ID
    # 参数 -t, --time int  关闭前等待的时间,单位秒,默认是10s
    
    # ---------容器终止----------
    docker kill 容器名字/ID
    # 参数 -s ,--signal string 指定发送给容器的关闭信号,默认是kill信号
    
    #----------socker kill 和socker stop的区别--------
    '''
    1、kill 是直接发送SIGKILL信号关闭容器,可以通过参数-s修改发出的信号
    2、stop 是先发出SIGTERM信号给进程,告诉进程即将会被关闭,在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器
    3、stop在等待时间内,如果终止等待,则容器没有关闭,而kill是无法撤销的
    '''

    扩展知识点

    linux的两种终止进程的信号:SIGTERM和SIGKILL

    SIGKILL信号:立即终止进程,不进行清理和暂存工作,该信号无法被阻塞、忽略、处理,也就是一发出就无法停止,它可以杀死任何进程

    SIGTERM信号:程序终结信号,它可以被阻塞和终止,程序在退出前可以保存工作或清理临时文件等。

    6、容器信息查看

    (1) 查看容器详细信息 

    docker container inspect 容器名字/ID
    # 参数:-f, --format string  利用特定Go语言的format格式输出结果
    #      -s, --size   显示总大小

    (2)查看容器日志信息

    docker logs 【参数】 容器名字/ID
    ''' 参数
    --details        显示日志的额外信息
    -f, --follow                 动态跟踪显示日志信息
    --since string      只显示某事时间节点之后的    
    --tail string            显示倒数的行数(默认全部)
    -t, --timestamps         显示timestamps时间
    --until string       只显示某事时间节点之前的
    # 注意:容器日志中记录的是容器主进程的输出STDOUTSTDERR
    '''

    (3)容器重命名

    docker rename 容器名字/ID 新的容器名
    [root@192 ~]# docker rename 21030 python3

    7、运行中的容器操作

    (1) 容器连接

    将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接

    docker attach [options] 容器名字/ID
    # 参数:--no-stdin  不绑定STDIN

    例子:

    [root@192 ~]# docker attach --no-stdin e181da
    [root@e181da14a5da /]# 
    [root@192 ~]# docker attach e181da
    [root@e181da14a5da /]# 

    (2)容器中执行新命令

    docker exec [options] 容器名字/ID 新的命令
    '''   参数
    -d, --detach             后台运行命令
    -i, --interactive        即使没连接容器,也将当前的STDIN绑定上
    -t, --tty                分配一个虚拟终端
    -w, --workdir string     指定在容器中的工作目录
    -e, --env list           设置容器中运行时的环境变量
    '''

    8、docker文件拷贝

    # 将文件拷贝到容器内
    docker cp 需要拷贝的文件或目录 容器名字:容器目录
    # 将文件从容器内拷贝出来
    docker cp 容器名字:容器目录 需要拷贝的文件或目录

    四、容器与镜像

    1、容器与镜像之间的关系

    2、容器提交

    docker commit [options] 容器名字/ID 镜像名字:标签
    ''' options:
    -a, --author string   作者
    -c, --change list     为创建的镜像加入Dockerfile命令
    -m, --message string  提交信息,类似git commit -m
    -p, --pause           提交时暂停容器 (default true)
    '''
    # 例子:
    [root@192 ~]# docker commit -m 'test' 2c802254 testcentos:lastest
    sha256:e301ffd319d50b33196ac49c20fcd3d78fcc242836fe9390f2a8ba72b4c77bb2
    [root@192 ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    testcentos    lastest   e301ffd319d5   6 seconds ago   204MB

    3、容器导出、导入

    # ----------------容器导出---------------
    docker export [option] 容器名字
    # 参数:-o, --output string  指定写入的文件,默认是STDOUT
    # 例子
    [root@192 ~]# docker export -o test.tar redis1
    [root@192 ~]# ls
    anaconda-ks.cfg  nginx-1.15.12  nginx-1.15.12.tar.gz  test.tar
    
    # ----------------容器包导入---------------
    docker import [option] file/url 镜像名字:标签
    ''' option
    -c ,--change list    为创建的镜像加入Dockerfile命令
    -m, --message string  导入时,添加提交信息
    
    '''
    # 例子
    [root@192 ~]# docker import test.tar redis1:laste
    sha256:229019cc634aebce781dca74454a0c641097bb342d5c7650eb0fa2fc00899cec
    [root@192 ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
    redis1        laste     229019cc634a   11 seconds ago   101MB

    五、总结:

    注意事项:容器必须要有夯住的命令,不然它不会一直运行,如果是我们自己制作的镜像,运行容器的时候,必须要有个可以夯住的命令

    不将就
  • 相关阅读:
    推荐系统实践
    python实现itemCF and userCF
    Mahout分步式程序开发 基于物品的协同过滤ItemCF
    用Maven构建单机Mahout项目
    Apache Mahout:适合所有人的可扩展机器学习框架
    mahout0.7 示例运行纪实
    win7基于mahout推荐之用户相似度计算
    cygwin
    Mahout初体验
    Android慎用layout嵌套, 尽量控制在5层下面java.lang.StackOverflowError
  • 原文地址:https://www.cnblogs.com/nq31/p/14406402.html
Copyright © 2020-2023  润新知