• Docker的容器


    容器是一个打包了应用和服务的环境,是一个轻量级的虚拟机,每一个容器都由一组特定的应用和必要的依赖库组成。

    容器的管理操作

    容器常见的命令:查看、创建、启动、终止和删除

    创建容器

    docker create

    docker run

    二者的区别在于docker create创建的容器处于停止状态,docker run 创建的容器处于启动状态

    用docker create创建一个停止状态的容器

    [root@docker ~]# docker create centos:6.7
    Unable to find image 'centos:6.7' locally
    6.7: Pulling from centos
    
    3690474eb5b4: Pull complete 
    3624df1f7cf0: Pull complete 
    505dff91e9c8: Pull complete 
    2352e8cfa843: Pull complete 
    a8b4df3be85c: Pull complete 
    Digest: sha256:1fbc7ab8bd38dcb1c5b9608ac5358dbc1d3718b8e85c69bf5224d72e5f6d2e22
    Status: Downloaded newer image for centos:6.7
    a4cca9f1f77695ef11912963ec60b15e2fb4663c50792583c2e4fe2c375a35b6
    [root@docker ~]# 
    [root@docker ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    a4cca9f1f776        centos:6.7          "/bin/bash"         10 seconds ago                                              clever_pasteur      
    [root@docker ~]#

    创建成功后,Docker会返回容器的ID,如上述中的:a4cca9f1f77695ef11912963ec60b15e2fb4663c50792583c2e4fe2c375a35b6。ID是可以唯一标识一个容器,每个容器的ID都是唯一的。

    指定系统直接加centos,如果想要设置版本则需要centos:6.7

    提示:Unable to find image 'centos:6.7' locally,则是因为当执行docker run命令后,docker现在本地找指定的系统的镜像,如果找不到就会到共有的仓库Docker Hub中继续搜索,找到后下载并保存在本地

    容器的文件系统是在只读的镜像文件上增加一层可读写的文件层,这样可以保证镜像不变而只记录改变的数据,这对容器的共享和传输都非常有利。

    docker ps 可以查看正在运行的容器

    docker ps –a 可以查看所有容器

    docker run 相当于docker create 然后在使用docker start启动容器

    使用docker run 命令可以创建两种类型的容器:

    后台型、交互型容器

    交互型容器:运行在前台,通常会指定有交互的控制台,给容器输入,也可以得到容器的输出。创建该容器的终端被关闭,在容器内部使用exit命令或者调用了doker stop/docker kill命令后,容器会变成停止状态

    后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,该后台容器也依然存在,只有调用docker stop 或docker kill命令后,容器会变成停止状态

    创建交互型容器

    [root@docker ~]# docker run -i -t --name=inspect_shell centos:6.7 /bin/bash
    [root@285ee5d386cf /]#

    参数说明:

    1、-i用于打开容器的标准输入(STDIN)

    2、-t表示建立一个命令行终端

    上述的两个标志就表示创建了一个交互shell,是创建交互容器的基本设置

    3、--name表示为容器指定一个名字,如果不指定系统将随机产生一个名字

    4、centos表示要使用的镜像,:6.7表示要用的linux版本

    这样创建的交互容器通过ctrl+d或者exit命令退出该容器

    容器只是停止并没有销毁,只是不再是运行状态

    创建后台型容器

    通过参数-d 既可以实现创建后台型容器

    [root@docker ~]# docker run --name daemon_while -d centos:6.7 /bin/bash -c "while true;do echo hello world;sleep 1;done"
    35872eb5410af88fca93ab37aa38b79dfea1badbac91c90907bbbfa01e61f24e
    [root@docker ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
    35872eb5410a        centos:6.7          "/bin/bash -c 'while   15 seconds ago      Up 14 seconds                           daemon_while        
    [root@docker ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                          PORTS               NAMES
    35872eb5410a        centos:6.7          "/bin/bash -c 'while   17 seconds ago      Up 16 seconds                                       daemon_while        
    285ee5d386cf        centos:6.7          "/bin/bash"            9 minutes ago       Exited (0) About a minute ago                       inspect_shell       
    a4cca9f1f776        centos:6.7          "/bin/bash"            About an hour ago                                                       clever_pasteur      
    [root@docker ~]#

    这里也可以验证docker ps 以及docker ps –a的区别

    docker ps 显示的为正在运行的容器

    docker ps –a 显示所有的容器

    docker ps的其他参数:

    docker ps –l 显示最后创建的容器

    docker ps –n=x显示最后创建的x个容器

    docker ps –a –q 显示所有的容器名并只显示id

    关于docker ps命令输入解释:

    1. CONTAINER ID :唯一标识容器的ID,是一个64位的十六进制数
    2. IMAGE:创建容器时使用的镜像
    3. COMMAND:容器最后运行的命令
    4. CREATED:创建容器的时间
    5. STATUS:容器的状态。如果是运行状态,则类似Up 16 seconds 

    如果是停止状态,则是类似Exited (0) About a minute ago,其中0是容器退出的错误代码,0为正常退出,其他数字则表示容器内部出现错误

    1. PORTS:对外开放的端口
    2. NAMES:容器名。和容器ID一样都可以唯一标识一个容器,同一台宿主主机上不允许有相同的容器存在,否则会冲突

    启动容器

    docker start 容器名/ID

    容器运行过程中,总会有各种问题导致容器异常退出。默认情况下容器是不会重启的,为了让容器能够自动重启需要用—restart参数

    --restart标志会检查容器的退出码,并决定是否需要重启

    --restart=always:表示不管返回什么代码,Docker都会尝试重启容器

    --restart=on-failure:5 :表示接收到一个非0的返回代码时最多可以重启5次

    终止容器

    交互型容器退出容器的方法:

    ctrl+d

    exit

    交互型容器以及后台型容器都可以通过stop命令退出

    docker stop 容器名/ID

    强制退出:docker kill

    删除容器

    删除容器:docker rm 容器名 注意:这个命令无法删除正在运行的容器

    强制删除:docker rm –f 容器名

    如果想要删除所有的容器,可以:

    docker rm `docker ps –a -q`

    容器内信息获取和命令执行

    依附容器

    先启动交互型容器:docker start 容器名

    然后从宿主机进入到容器中

    docker attach 容器名

    注意:这里执行过docker attach 容器名 后,需要多按一次回车才会进入到容器的shell交互界面

    这里切记:attach是无法进入到后台型容器的

    后台型容器本身就不接受用户交互输入

    查看容器日志

    docker logs –f 容器名 可以查看容器的日志

    参数:

    -tail 可以查看输入日志的行数

    -f 将只需输入最新的日志

    查看容器进程

    docker top 容器名 可以查看容器中的进程

    查看容器信息

    docker inspect用于查看容器的配置信息,包含容器名、环境变量、运行命令,主机配置、网络配置合数据卷配置等

    [root@docker ~]# docker inspect centos
    [
    {
        "Id": "18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358",
        "Created": "2016-12-05T08:24:26.525587402Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8174,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2016-12-05T08:25:19.214428588Z",
            "FinishedAt": "2016-12-05T08:25:06.506871439Z"
        },
        "Image": "a8b4df3be85c08ad6b8331c700fc6d2f389795f6ad64a6b139775ff6592d5fa2",
        "NetworkSettings": {
            "Bridge": "",
            "EndpointID": "51415b7ddc2d36af63108f39d51afcc46736cbf9e7659daa4813be6f389896e3",
            "Gateway": "172.17.42.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "HairpinMode": false,
            "IPAddress": "172.17.0.7",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:11:00:07",
            "NetworkID": "c5fda424aba3566c01770cb53d21e94269c431daeb879936f52a236d2541d82d",
            "PortMapping": null,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/18a2b5dd12c1",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null
        },
        "ResolvConfPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/hostname",
        "HostsPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/hosts",
        "LogPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358-json.log",
        "Name": "/centos",
        "RestartCount": 0,
        "Driver": "devicemapper",
        "ExecDriver": "native-0.2",
        "MountLabel": "",
        "ProcessLabel": "",
        "Volumes": {},
        "VolumesRW": {},
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LxcConf": [],
            "Memory": 0,
            "MemorySwap": 0,
            "CpuShares": 0,
            "CpuPeriod": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "CpuQuota": 0,
            "BlkioWeight": 0,
            "OomKillDisable": false,
            "Privileged": false,
            "PortBindings": {},
            "Links": null,
            "PublishAllPorts": false,
            "Dns": null,
            "DnsSearch": null,
            "ExtraHosts": null,
            "VolumesFrom": null,
            "Devices": [],
            "NetworkMode": "bridge",
            "IpcMode": "",
            "PidMode": "",
            "UTSMode": "",
            "CapAdd": null,
            "CapDrop": null,
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "SecurityOpt": null,
            "ReadonlyRootfs": false,
            "Ulimits": null,
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "CgroupParent": ""
        },
        "Config": {
            "Hostname": "18a2b5dd12c1",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "PortSpecs": null,
            "ExposedPorts": null,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos:6.7",
            "Volumes": null,
            "VolumeDriver": "",
            "WorkingDir": "",
            "Entrypoint": null,
            "NetworkDisabled": false,
            "MacAddress": "",
            "OnBuild": null,
            "Labels": {
                "License": "GPLv2",
                "Vendor": "CentOS"
            }
        }
    }
    ]
    [root@docker ~]#
    View Code

    容器内执行命令

    [root@docker ~]# docker exec -d centos touch /home/fan.txt

    通过docker attach centos进入容器可以查看创建的文件是否存在

    如果想要交互型的执行命令可以通过

    [root@docker ~]# docker exec -t -i centos /bin/bash

    然后就可以交互性的执行命令

    容器的导入和导出

    Docker的导入和导出分别由import命令和export命令完成

    导出

    [root@docker ~]# docker export centos>my_centos.tar
    [root@docker ~]# ls
    anaconda-ks.cfg  install.log  install.log.syslog  my_centos.tar
    [root@docker ~]#

    导入

    [root@docker ~]# cat my_centos.tar|docker import - imported:centos
    4ef3250d4123fea1bb6c01b2436479889f90b434cee23ac62aad7a75a2956fa5
    [root@docker ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    imported            centos              4ef3250d4123        47 seconds ago      190.6 MB
    centos              6.7                 a8b4df3be85c        3 months ago        190.6 MB

    res和tag分别表示生成的镜像和标记

    同时可以通过网络导入镜像

    docker import url res:tag

  • 相关阅读:
    单核时代,PHP之类多线程或者多进程的,是怎么处理并发的?是排队吗?
    高并发下的Node.js与负载均衡
    telnet 查看端口是否可访问
    同步与异步--
    函数式编程沉思录(草稿)
    面向状态机编程
    promise是有状态的moand
    异步链式编程—promise沉思录
    同步与异步
    网络编程释疑之:同步,异步,阻塞,非阻塞
  • 原文地址:https://www.cnblogs.com/zhaof/p/6135971.html
Copyright © 2020-2023  润新知