当前位置:   article > 正文

Docker的常用命令使用_以ubuntu镜像为基础,创建并在后台启动了一个名为firstcontainer的容器(-d看不懂没

以ubuntu镜像为基础,创建并在后台启动了一个名为firstcontainer的容器(-d看不懂没

Docker的常用命令使用

 

查看docker的详细信息

Docker info

Docker version

获取镜像pull

docker pull

从仓库获取所需要的镜像。

使用示例:

docker pull centos:centos6

实际上相当于 docker pull registry.hub.docker.com/centos:centos6
命令,即从注册服务器 registry.hub.docker.com 中的 centos 仓库来下载标记为 centos6 的镜像。
有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。

查看镜像列表images

docker images

列出了所有顶层(top-level)镜像。实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们
提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level
镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。

使用示例:

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos centos6 6a77ab6655b9 8 weeks ago 194.6 MB

ubuntu latest 2fa927b5cdd3 9 weeks ago 122 MB

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

来自于哪个仓库,比如 ubuntu

镜像的标记,比如 14.04

它的 ID 号(唯一)

创建时间

镜像大小

 

 

运行容器run

 

docker run 参数 <image-id> 命令

docker run就是docker createdocker start两个命令的组合,支持参数也是一致的,如果指定容器名字是,容器已经存在会报错,可以增加 --rm 参数实现容器退出时自动删除。

-i 选项告诉docker保持标准输入输出流对容器开放。

-t选项让docker分配一个伪终端(pseudotty)并绑定到容器的标准输入上。

--name 为容器设置容器名。

-d 使容器在后台运行。

 

运行示例:

docker create -it --rm --name centos6_container centos:centos6

 

运行实例

 

#创建并启动一个容器,容器名为firstContainer,具备busybox的运行环境。并输出hello world

#********** Begin *********#

docker run -it --name firstContainer busybox echo 'hello world'

#********** End **********#

 

 

查看容器列表ps

docker ps

docker ps 命令会列出所有运行中的容器。这隐藏了非运行态容器的存在,如果想要找出这些容器,增加 -a 参数。

 

Usage:    docker ps [OPTIONS]

 

List containers

 

Options:

-a, --all Show all containers (default shows just running)

-f, --filter filter Filter output based on conditions provided

--format string Pretty-print containers using a Go template

--help Print usage

-n, --last int Show n last created containers (includes all states) (default -1)

-l, --latest Show the latest created container (includes all states)

--no-trunc Don't truncate output

-q, --quiet Only display numeric IDs

-s, --size Display total file sizes

 

 

启动容器start

docker start <container-id>

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。

运行实例:

#通过名字启动

$ docker start -i centos6_container

 

#通过容器ID启动

$ docker start -i b3cd0b47fe3d

 

停止容器stop

docker stop <container-id> 注意这个命令里一般没有参数,有的话,就一个参数,-t

例子:

#以ubuntu镜像为基础,创建并在后台启动了一个名为firstContainer的容器(-d看不懂没关系,下一关会介绍的)

docker run -itd --name firstContainer ubuntu /bin/bash

#将firstContainer容器停止!

#********** Begin *********#

docker stop firstContainer

 

 

1、停用全部运行中的容器:

docker stop $(docker ps -q)

  • 1

    2、删除全部容器:

    docker rm $(docker ps -aq)

  • 1

    3、一条命令实现停用并删除容器:

    docker stop $(docker ps -q) & docker rm $(docker ps -aq)

    杀死所有正在运行的容器

    docker kill $(docker ps -a -q)

     

     

    删除容器rm

    docker rm <container-id>

     

     

    $(docker ps -a -q) 返回所有容器的container id

     

    示例

    删除如下的所有容器

     

    #创建两个容器

    docker run -itd ubuntu /bin/bash

    docker run busybox echo "hello world"

    #删除所有容器

    #********** Begin *********#

    docker stop $(docker ps -a -q)

    docker rm $(docker ps -a -q)

    #********** End **********#

     

    进入容器

     

    docker exec <container-id> 注意是先参数,后容器ID

    在当前容器中执行新命令,如果增加 -it参数运行bash 就和登录到容器效果一样的。

    docker exec -it centos6_container bash

     

    Docker attach

    Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。 
    但是需要注意的是,如果从这个stdinexit,会导致容器的停止。

    使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。

    因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

     

     

    [root@localhost temp]# docker ps
    

    CONTAINER ID        IMAGE                       COMMAND             CREATED              STATUS              PORTS               NAMES
    

    2327e7eab0ed        busybox:buildroot-2014.02   "/bin/sh"           About a minute ago   Up About a minute                       bb2
    

    [root@localhost temp]# docker attach bb2
    

    / # ls
    

    bin      dev      etc      home     lib      lib64    linuxrc  media    mnt      opt      proc     root     run      sbin     sys      tmp      usr      var
    

    / # pwd
    

    /
    

    / #
    

    Docker exec

    关于-i-t参数

    可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令 
    返回值都可以正确获取。

     

    [root@localhost temp]# docker exec -i bb2 /bin/sh
    

    date
    

    Tue Jul 14 04:01:11 UTC 2015
    

    echo $?
    

    0
    

    dir
    

    /bin/sh: dir: not found
    

    echo $?
    

    127
    

    使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致 整个容器退出。 这种方式可以替代ssh或者nsenternsinit方式,在容器内进行操作。

     

    [root@localhost temp]# docker exec -it bb2 /bin/sh
    

    / # pwd
    

    /
    

    / # echo $?
    

    0
    

    / # dir
    

    /bin/sh: dir: not found
    

    / # echo $?
    

    127
    

    如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin 的输出,无法看到命令执行情况。

     

    [root@localhost temp]# docker exec -t bb2 /bin/sh
    

    / # pwd
    

     

    hanging....
    

    [root@localhost temp]# docker exec -t bb2 pwd
    

    /
    

    [root@localhost temp]# echo $?
    

    0
    

    [root@localhost temp]# docker exec -t bb2 dir
    

    2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH
    

    [root@localhost temp]# echo $?
    

    0
    

    docker exec执行后,会命令执行返回值。(备注Docker1.3似乎有Bug,不能正确返回命令执行结果)

     

    [root@localhost temp]# docker exec -it bb cat /a.sh
    

    echo "running a.sh"
    

    exit 10
    

    [root@localhost temp]# docker exec -t bb /a.sh
    

    running a.sh
    

    [root@localhost temp]# echo $?
    

    10
    

    [root@localhost temp]# docker exec -it bb /a.sh
    

    running a.sh
    

    [root@localhost temp]# echo $?
    

    10
    

    [root@localhost temp]# docker exec -i bb /a.sh
    

    running a.sh
    

    [root@localhost temp]# echo $?
    

    10
    

    关于-d参数

    在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。 程序在后台运行。

     

    [root@localhost temp]# docker exec -d bb2 /a.sh
    

    [root@localhost temp]# echo $?
    

    0
    

    如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成 才返回。

     

    [root@localhost temp]# docker exec  bb2 /a.sh
    

    ^C[root@localhost temp]#
    

    [root@localhost temp]#
    

    [root@localhost temp]# docker exec -it  bb2 /a.sh
    

    ^C[root@localhost temp]#
    

    [root@localhost temp]# docker exec -i  bb2 /a.sh
    

    ^C[root@localhost temp]# docker exec -t  bb2 /a.sh
    

    ^C[root@localhost temp]#
    							

    运行示例:

    #基于ubuntu镜像创建并在后台启动一个名为container2的容器

    docker run -itd --name container2 ubuntu /bin/bash

    #由于测试环境不允许从终端输入,所以请使用docker exec完成任务,进入容器,新建一个问题1.txt

    #********** Begin *********#

    docker exec container2 touch 1.txt

    #********** End **********#

    attach VS exec

    attach exec 主要区别如下:

  1. attach 直接进入容器 启动命令 的终端,不会启动新的进程。
  2. exec 则是在容器中打开新的终端,并且可以启动新的进程。
  3. 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec

    当然,如果只是为了查看启动命令的输出,可以使用 docker logs 命令:

    -f 的作用与 tail -f 类似,能够持续打印输出。

    使用nsenter进入Docker容器

      使用nsenter进入Docker容器。关于什么是nsenter请参考如下文章:

    https://github.com/jpetazzo/nsenter

    在了解了什么是nsenter之后,系统默认将我们需要的nsenter安装到主机中

    如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像)

    具体的安装命令如下:

    1. $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
    2. $ tar -xzvf util-linux-2.24.tar.gz  
    3. $ cd util-linux-2.24/  
    4. $ ./configure --without-ncurses  
    5. $ make nsenter  
    6. $ sudo cp nsenter /usr/local/bin  

    安装好nsenter之后可以查看一下该命令的使用。

     

      nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID

    docker inspect命令使用如下:

    1. $ sudo docker inspect --help   

    inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器

       

    可以使用docker inspect来查看该容器的详细信息。

    1. $ sudo docker inspect 44fc0f0582d9  

       

    由其该信息非常多,此处只截取了其中一部分进行展示。如果要显示该容器第一个进行的PID可以使用如下方式

    1. $ sudo docker inspect -f {{.State.Pid}} 44fc0f0582d9  

     

       

    在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了。

    1. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  
    2. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  

    其中的3326即刚才拿到的进程的PID

    当然,如果你认为每次都输入那么多参数太麻烦的话,网上也有许多做好的脚本供大家使用。

    地址如下:

    http://yeasy.gitbooks.io/docker_practice/content/container/enter.html

    http://www.tuicool.com/articles/eYnUBrR

     

    使用SSH进入Docker容器

      在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入

    容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker

    器内。关于为什么不建议使用,请参考如下文章:

    为什么不需要在 Docker 容器中运行 sshd

    http://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker?cmp

    创建容器create

     

    docker create <image-id>

    docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。

    docker create 命令提供了许多参数选项可以指定名字,硬件资源,网络配置等等。

    运行示例:

    创建一个centos的容器,可以使用仓库+标签的名字确定image,也可以使用imageid指定image。返回容器id

    #查看本地images列表

    $ docker images

     

    #用仓库+标签

    $ docker create -it --name centos6_container centos:centos6

     

    #使用image-id

    $ docker create -it --name centos6_container 6a77ab6655b9 bash

    b3cd0b47fe3db0115037c5e9cf776914bd46944d1ac63c0b753a9df6944c7a67

     

    #可以使用 docker ps查看一件存在的容器列表,不加参数默认只显示当前运行的容器

    $ docker ps -a

    可以使用 -v 参数将本地目录挂载到容器中。

    $ docker create -it --name centos6_container -v /src/webapp:/opt/webapp centos:centos6

    这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

    commit容器#定制一个WEB服务器镜像

    docker commit <container-id>

    将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。

     

    示例

    #以busybox镜像创建一个容器,在容器中创建一个hello.txt的文件。

    docker run --name container1 busybox touch hello.txt

    #将对容器container1做出的修改提交为一个新镜像,镜像名为busybox:v1

    #********** Begin *********#

    docker commit container1 busybox:v1

    #********** End **********#

    基于save保存镜像与基于load加载镜像

     

    示例

    首先拉取一个busybox镜像

    docker pull busybox:latest

     

    #1.将busybox:latest镜像保存到tar包

    #********** Begin *********#

    docker save busybox:latest > busybox.latest.tar

    #********** End **********#

     

    #删除busybox:latest镜像

    docker rmi busybox:latest

     

    #2.从tar包加载busybox:latest镜像

    #********** Begin *********#

    docker load < busybox.latest.tar

    #********** End **********#

    镜像保存#

    docker save <image-id>

    创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。

    使用示例:

    #保存centos镜像到centos_images.tar 文件

    $ docker save -o centos_images.tar centos:centos6

     

    #或者直接重定向

    $ docker save -o centos_images.tar centos:centos6 > centos_images.tar

     

    容器导出export—注意导出的是容器

    docker export <container-id>

    创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到
    的内容。expoxt后的容器再importDocker中,只有一个容器当前状态的镜像;而save后的镜像则不同,
    它能够看到这个镜像的历史镜像。

     

     

    示例

     

    #busybox为镜像创建一个容器,容器名为busyboxContainer

    docker run --name busyboxContainer busybox echo "hello"

    #1.然后将busyboxContainer导出为容器快照:busybox.tar

    #********** Begin *********#

    docker export busyboxContainer >busybox.tar

    #********** End **********#

     

    #2.最后使用该容器快照导入镜像,镜像名为busybox:v1.0

    #********** Begin *********#

    cat busybox.tar |docker import - busybox:v1.0

    #********** End **********#

    删除镜像

    docker rmi <image-id>

    删除构成镜像的一个只读层。你只能够使用docker rmi来移除最顶层(top level layer
    (也可以说是镜像),你也可以使用-f参数来强制删除中间的只读层。

    示例

    #!/bin/bash

    #以busybox为基础镜像创建一个容器,容器名为container3

    docker run --name container3 busybox:latest echo "hello"

    #然后将busybox:latest镜像删除

    #********** Begin *********#

    docker rmi -f busybox:latest

    #********** End **********#

    上传镜像

     

    docker push

    用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

    运行实例:

    $ docker push hainiu/httpd:1.0

    Inspect

     

    docker inspect <container-id> or <image-id>

    docker inspect命令会提取出容器或者镜像最顶层的元数据

    利用 Dockerfile 来创建镜像

    docker build

    使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用
    docker build
    来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的
    指令。新建一个目录和一个 Dockerfile

    mkdir hainiu

    cd hainiu

    touch Dockerfile

    Dockerfile 中每一条指令都创建镜像的一层,例如:

    FROM centos:centos6

    MAINTAINER sandywei <sandy@hainiu.tech>

    # move all configuration files into container

     

    RUN yum install -y httpd

    EXPOSE 80

    CMD ["sh","-c","service httpd start;bash"]

    Dockerfile 基本的语法是

    使用#来注释

    FROM 指令告诉 Docker 使用哪个镜像作为基础

    接着是维护者的信息

    RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用yum来安装了一些软件

    更详细的语法说明请参考 Dockerfile

    编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

    $ docker build -t hainiu/httpd:1.0 .

     

    Sending build context to Docker daemon 2.048 kB

    Step 1 : FROM centos:centos6

    ---> 6a77ab6655b9

    Step 2 : MAINTAINER sandywei <sandy@hainiu.tech>

    ---> Running in 1b26493518a7

    ---> 8877ee5f7432

    Removing intermediate container 1b26493518a7

    Step 3 : RUN yum install -y httpd

    ---> Running in fe5b6f1ef888

     

    .....

     

    Step 5 : CMD sh -c service httpd start

    ---> Running in b2b94c1601c2

    ---> 5f9aa91b0c9e

    Removing intermediate container b2b94c1601c2

    Successfully built 5f9aa91b0c9e

    其中 -t 标记来添加 tag,指定新的镜像的用户信息。 "." Dockerfile 所在的路径(当前目录),
    也可以替换为一个具体的 Dockerfile 的路径。注意一个镜像不能超过 127 层。

    docker images 查看镜像列表

    $ docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE

    hainiu/httpd 1.0 5f9aa91b0c9e 3 minutes ago 292.4 MB

    centos centos6 6a77ab6655b9 8 weeks ago 194.6 MB

    ubuntu latest 2fa927b5cdd3 9 weeks ago 122 MB

    细心的朋友可以看到最后一层的ID5f9aa91b0c9e)和 image id 是一样的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/284078
推荐阅读
相关标签
  

闽ICP备14008679号