Docker的常用命令使用

来源:互联网 发布:台湾直播软件 编辑:程序博客网 时间:2024/06/01 09:38

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 --namecentos6_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 是一样的

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为荣耀手机进水了怎么办 华为畅享7黑屏怎么办 华为畅玩7x黑屏怎么办 华为手机打电话时黑屏怎么办 三星a8手机黑屏打不开怎么办 华为手机恢复出厂后黑屏怎么办 华为荣耀4c白屏怎么办 华为荣耀6手机信号不好怎么办 华为荣耀8手机音量小怎么办 无法激活触控id怎么办 魅蓝2卡顿怎么办 小米max2玩王者荣耀卡怎么办 小米4玩王者荣耀卡怎么办 华为荣耀7i卡顿怎么办 华为荣耀7卡的怎么办 荣耀8手机有孤独怎么办 红米note4玩游戏卡怎么办 红米note4x玩游戏卡怎么办 华为4c死屏怎么办 华为4c充电很慢怎么办? 华为4c突然死机了怎么办 华为畅玩4c内存不足怎么办 荣耀4c一直亮屏怎么办 华为手机返回键失灵怎么办 荣耀6p死机了怎么办 荣耀6主板烧坏了怎么办 虚拟运营商倒闭了号怎么办 买到二次放号怎么办 新运动鞋鞋穿着有点紧怎么办 一件代发被买家退货后怎么办? 洗了翻毛的鞋子怎么办 猫眼竹芋泡根了怎么办 双线花叶子卷了怎么办 华为云收藏满了怎么办 小米6云空间满了怎么办 华为云存储已满怎么办 苹果云备份空间不足怎么办 oppor9指纹与密码忘记怎么办 oppo显示密码格式不对怎么办 oppo云服务密码忘了怎么办 小米云内存满了怎么办