首页 > 代码库 > docker镜像与容器(二)

docker镜像与容器(二)

docker镜像与容器

docker改变了什么?

面向产品:产品交付

面向开发:简化环境配置

面向测试:多版本测试

面向运维:环境一致性

面向架构:自动化扩容(微服务)

 

获取镜像

可以使用 docker pull命令来从仓库获取所需要的镜像。

[root@localhost~]# docker pull centos#获取一个centos的镜像

[root@localhost~]# docker images#查看docker的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              a8493f5f50ff        12 days ago         192.5 MB

在列出信息中,可以看到几个字段信息,

来自于哪个仓库,比如centos,

镜像的标记,比如lastest

它的 ID 号( 唯一)

创建时间

镜像大小

 

dockerrmi + ID#删除镜像,如果这个镜像创建了容器就不能删除

创建并且启动第一个容器

[root@localhost ~]#docker run centos /bin/echo "hehe"

hehe

所有容器都是使用这个参数dockerruncentos指的是镜像的名称,后面跟的是命令(执行命令)

可以用dockerrun --help查看参数

4.1 docker help

docker command

docker   # docker 命令帮助
Commands:
    attach    Attach to a running container                 # 当前 shell 下 attach连接指定运行镜像
    build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
    commit    Create a new image from a container‘schanges # 提交当前容器为新的镜像
    cp        Copy files/folders from the containersfilesystem to the host path
              #从容器中拷贝指定文件或者目录到宿主机中
    create    Create a new container                        # 创建一个新的容器,同run,但不启动容器
    diff      Inspect changes on a container‘sfilesystem   # 查看 docker 容器变化
    events    Get real time events from the server          # 从 docker 服务获取容器实时事件
    exec      Run a command in an existingcontainer        #在已存在的容器上运行命令
    export    Stream the contents of a container as a tararchive  
              # 导出容器的内容流作为一个 tar 归档文件[对应import ]
    history   Show the history of an image                  # 展示一个镜像形成历史
    images    List images                                   #列出系统当前镜像
    import    Create a new filesystem image from thecontents of a tarball 
              # 从tar包中的内容创建一个新的文件系统映像[对应export]
    info     Display system-wide information               # 显示系统相关信息
    inspect   Return low-level information on a container   # 查看容器详细信息
    kill      Kill a running container                      # kill 指定 docker 容器
    load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应save]
    login     Register or Login to the docker registryserver  
              # 注册或者登陆一个 docker源服务器
    logout    Log out from a Docker registry server         # 从当前 Docker registry 退出
    logs      Fetch the logs of a container                 # 输出当前容器日志信息
    port      Lookup the public-facing port which isNAT-ed to PRIVATE_PORT
              #查看映射端口对应的容器内部源端口
    pause     Pause all processes within a container        # 暂停容器
    ps        List containers                               # 列出容器列表
    pull      Pull an image or a repository from thedocker registry server
              #从docker镜像源服务器拉取指定镜像或者库镜像
    push      Push an image or a repository to thedocker registry server
              #推送指定镜像或者库镜像至docker源服务器
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images                
              #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run      Run a command in a new container
              #创建一个新的容器并运行一个命令
    save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应load]
    search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 给源中镜像打标签
    top       Lookup the running processes of acontainer   # 查看容器中运行的进程信息
    unpause   Unpause a paused container                    # 取消暂停容器
    version   Show the docker version information           # 查看 docker 版本号
    wait      Block until a container stops, then printits exit code  
              # 截取容器停止时的退出状态值
Run ‘docker COMMAND --help‘ for more information on a comman

查看启动的docker

[root@localhost ~]#docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

6daf1bacfa9c        centos              "/bin/echo hehe"    15 minutes ago      Exited (0) 15 minutes ago                       cranky_darwin

参数介绍:

首先是一个容器的ID,然后是镜像,后面是命令(COMMAND),创建的时间,状态,端口,名称(docker有名称库,不指定名字的时候会自动帮我们产生名称)

 

创建一个指定名字的容器

[root@localhost ~]#docker run --name mydocker -t -i centos /bin/bash

参数介绍:

--name是指定docker的名字,-t 是让系统分配一个伪终端tty-i表示让这个容器的标准输入保持打开的状态(打开之后就可以登进去)(-t-i要一起使用),最后是?bin/bash表示执行一个命令,这个命令是/bin/bash.-h指定容器系统的主机名

[root@94ba510e3127 /]# ps -ef#可以查看这个容器运行了什么进程

UID        PID PPID  C STIME TTY          TIME CMD

root         1    0  0 10:43 ?        00:00:00 /bin/bash(这个进行是我启动容器的时候让他执行的)

root        13    1  9 10:48 ?        00:00:00 ps -ef

[root@localhost yum]#docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

94ba510e3127       centos             "/bin/bash"         7minutes ago       Up 7 minutes                            mydocker

可以看到docker的主机名跟容器的ID是一样的

当我们执行dockersrun的时候的流程:首先docker会检测本地有没有一个叫centos的镜像,如果没有他就会从公共的仓库(dockerhub)去下载,第二他就利用centos的镜像启动了一个容器

可以用exit推出这个容器

[root@localhost ~]#docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

94ba510e3127        centos              "/bin/bash"         12 minutes ago      Exited (0) 7 seconds ago                        mydocker

6daf1bacfa9c        centos              "/bin/echo hehe"    32 minutes ago      Exited (0) 32 minutes ago                       cranky_darwin

 

镜像操作的几个命令:

搜索镜像:dockersearch

获取镜像:dockerpull

查看镜像:dockerimages

删除镜像:dockerrmi

启动容器:dockerrun --name -hhostname

停止容器:docker stopCONTAINER ID

查看容器:dockersps-a-L(加了-a会显示所有的容器进程)

进入容器:dockerexec|dockerattach ID

删除容器:dockerrm

停止后启动容器:dockerstart ID

[root@localhost ~]#docker start 94ba510e3127

94ba510e3127

[root@localhost ~]#docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

94ba510e3127        centos              "/bin/bash"         28 minutes ago      Up 11 seconds                           mydocker

[root@localhost~]# docker attach  94ba510e3127#进入容器

[root@94ba510e3127 /]#ps aux

USER       PID %CPU %MEM    VSZ  RSS TTY      STAT START   TIME COMMAND

root         1 0.0  0.1  11768 1880 ?        Ss   11:12  0:00 /bin/bash

root        13 0.0  0.1  47440 1668 ?        R+   11:13  0:00 ps aux

用sttach进入的话有问题:如果你再开个窗户再进去的话他的显示是同步的,而且exit退出后这个容器就停了(因为我们退出了bash)

可以用nsenter来进入(不过需要知道进程的PID)(如果没有这个命令的话可以用yuminstall util-linux来安装)

查看PID

[root@localhost ~]# docker inspect --format"{{.State.Pid}}" 94ba510e3127(ID或者容器名)

20979

[root@localhost~]# nsenter -t 20979 -u -i -n -p#进入容器

[root@94ba510e3127 ~]#

[root@localhost ~]#nsenter -t 20979 -u -i -n -p

[root@94ba510e3127 ~]#nsenter --help

 

用法:

 nsenter [options] <program>[<argument>...]

 

Run a program withnamespaces of other processes.

 

选项:

 -t, --target <pid>     要获取名字空间的目标进程

 -m, --mount[=<file>]   enter mount namespace

 -u, --uts[=<file>]     enter UTS namespace (hostname etc)

 -i, --ipc[=<file>]     enter System V IPC namespace

 -n, --net[=<file>]     enter network namespace

 -p, --pid[=<file>]     enter pid namespace

 -U, --user[=<file>]    enter user namespace

 -S, --setuid <uid>     set uid in entered namespace

 -G, --setgid <gid>     set gid in entered namespace

     --preserve-credentials do not touch uidsor gids

 -r, --root[=<dir>]     set the root directory

 -w, --wd[=<dir>]       set the working directory

 -F, --no-fork          执行 <程序> 前不 fork

 -Z, --follow-context   set SELinux context according to --targetPID

 

 -h, --help    显示此帮助并退出

 -V, --version 输出版本信息并退出

可以把查找PID和登录容器的命令写成脚本

[root@localhost ~]# vins.sh

#!/bin/bash

PID=$(docker inspect--format "{{.State.Pid}}" $1)

nsenter -t $PID -u -i-n -p

这样子就只要传入一个容器IP就可以登陆了

[root@localhost ~]#./ns.sh 94ba510e3127

[root@94ba510e3127 ~]#

[root@94ba510e3127~]# docker run --rm centos /bin/echo "hehe"#执行容器并且删除容器

hehe

删除所有的容器

dockerkill $(docker ps -a -q)

[root@94ba510e3127 ~]# docker ps -a -q#只列出PID

94ba510e3127

6daf1bacfa9c


docker镜像与容器(二)