zoukankan      html  css  js  c++  java
  • 第 4 章 容器

    运行容器

    docker run 是启动容器的方法。可用三种方式指定容器启动时执行的命令:

    1. CMD 指令。
    2. ENDPOINT 指令。
    3. 在 docker run 命令行中指定。
    1 root@ubuntu:~# docker run ubuntu pwd
    2 /                                      
    3 root@ubuntu:~# 

    #容器启动时执行 pwd,返回的 / 是容器中的当前目录

    执行 docker ps 或 docker container ls 可以查看 Docker host 中当前运行的容器:

    1 root@ubuntu:~# docker ps 
    2 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    3 f27eb6348026        registry:2          "/entrypoint.sh /etc…"   19 hours ago        Up 19 hours         0.0.0.0:5000->5000/tcp   vigilant_swartz
    4 root@ubuntu:~# 
    5 root@ubuntu:~# docker container ls
    6 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    7 f27eb6348026        registry:2          "/entrypoint.sh /etc…"   19 hours ago        Up 19 hours         0.0.0.0:5000->5000/tcp   vigilant_swartz
    8 root@ubuntu:~#

    如果没有容器。用 docker ps -a 或 docker container ls -a 看看。

     1 root@ubuntu:~# docker ps -a
     2 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
     3 8b312e89208b        ubuntu              "pwd"                    16 minutes ago      Exited (0) 16 minutes ago                            frosty_williams
     4 1b4e997bcfd3        ubuntu              "pwd"                    16 minutes ago      Exited (0) 16 minutes ago                            sad_brahmagupta
     5 f27eb6348026        registry:2          "/entrypoint.sh /etc…"   19 hours ago        Up 19 hours                 0.0.0.0:5000->5000/tcp   vigilant_swartz
     6 root@ubuntu:~# docker container ls -a
     7 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
     8 8b312e89208b        ubuntu              "pwd"                    16 minutes ago      Exited (0) 16 minutes ago                            frosty_williams
     9 1b4e997bcfd3        ubuntu              "pwd"                    16 minutes ago      Exited (0) 16 minutes ago                            sad_brahmagupta
    10 f27eb6348026        registry:2          "/entrypoint.sh /etc…"   19 hours ago        Up 19 hours                 0.0.0.0:5000->5000/tcp   vigilant_swartz
    11 root@ubuntu:~#

    -a 会显示所有状态的容器,可以看到,之前的容器已经退出了,状态为Exited。容器能够保持 runing 状态,才能被我们使用。

     

    让容器长期运行

    容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。

    理解了这个原理就可以通过执行一个长期运行的命令来保持容器的运行状态。例如:

    1 root@ubuntu:~# docker run ubuntu /bin/bash -c "while true ; do sleep 1 ;done"
    2   

    while 语句让 bash 不会退出。可以打开另一个终端查看容器的状态:

    1 root@ubuntu:~# docker ps 
    2 CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
    3 fa7407d1b483        ubuntu              "/bin/bash -c 'while…"   About a minute ago   Up About a minute                            jolly_kirch
    4 root@ubuntu:~# 

    可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端。

    我们可以加上参数 -d 以后台方式启动容器。通过 docker ps 查看容器:

    1 root@ubuntu:~# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ;done"
    2 d32b4710507d725fa0a4ed277f5433bfd1391571351fa75219fb03b3b7853681
    3 root@ubuntu:~# 
    4 root@ubuntu:~# docker ps
    5 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    6 d32b4710507d        ubuntu              "/bin/bash -c 'while…"   8 seconds ago       Up 6 seconds                                 trusting_panini
    7 fa7407d1b483        ubuntu              "/bin/bash -c 'while…"   3 minutes ago       Up 3 minutes                                 jolly_kirch

    现在有了两个正在运行的容器。这里注意一下容器的 CONTAINER ID和 NAMES 这两个字段。CONTAINER ID 是容器的 “短ID”,前面启动容器时返回的是 “长ID”。短ID是长ID的前12个字符。

    NAMES 字段显示容器的名字,在启动容器时可以通过 --name 参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。

    对于容器的后续操作,我们需要通过 “长ID”、“短ID” 或者 “名称” 来指定要操作的容器。比如下面停止一个容器:

    1 root@ubuntu:~# docker stop d32b4710507d
    2 d32b4710507d
    3 root@ubuntu:~# 

    这里我们就是通过 “短ID” 指定了要停止的容器。

    通过 while 启动的容器虽然能够保持运行,但实际上没有干什么有意义的事情。容器常见的用途是运行后台服务,例如前面我们已经看到的 http server:

     1 root@ubuntu:~# docker run --name myhttp -d httpd 
     2 Unable to find image 'httpd:latest' locally
     3 latest: Pulling from library/httpd
     4 177e7ef0df69: Pull complete 
     5 65e7b631411e: Pull complete 
     6 3249ef8b9272: Pull complete 
     7 43ed8fedd0f6: Pull complete 
     8 02d3f33bda9d: Pull complete 
     9 Digest: sha256:246fed9aa9be7aaba1e04d9146be7a3776c9a40b5cfb3242d3427f79edee37db
    10 Status: Downloaded newer image for httpd:latest
    11 8b62217b8d1dc3dad8c301a4dc1817c60e5030d58d08ee8821eb36d68102c35f
    12 root@ubuntu:~# 
    13 root@ubuntu:~# docker ps
    14 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    15 8b62217b8d1d        httpd               "httpd-foreground"       19 seconds ago      Up 18 seconds       80/tcp                   myhttp
    16 fa7407d1b483        ubuntu              "/bin/bash -c 'while…"   2 hours ago         Up 2 hours                                   jolly_kirch
    17 f27eb6348026        registry:2          "/entrypoint.sh /etc…"   21 hours ago        Up 21 hours         0.0.0.0:5000->5000/tcp   vigilant_swartz
    18 root@ubuntu:~# 

    这一次我们用 --name 指定了容器的名字。 我们还看到容器运行的命令是httpd-foreground,通过 docker history 可知这个命令是通过 CMD 指定的。

     1 root@ubuntu:~# docker history httpd:latest 
     2 IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
     3 ef1dc54703e2        2 weeks ago         /bin/sh -c #(nop)  CMD ["httpd-foreground"]     0B                  
     4 <missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 80                    0B                  
     5 <missing>           2 weeks ago         /bin/sh -c #(nop) COPY file:8b68ac010cb13f58…   133B                
     6 <missing>           2 weeks ago         /bin/sh -c set -eux;   savedAptMark="$(apt-m…   43.1MB              
     7 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV APACHE_DIST_URLS=http…   0B                  
     8 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV HTTPD_PATCHES=           0B                  
     9 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV HTTPD_SHA256=3498dc5c…   0B                  
    10 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV HTTPD_VERSION=2.4.37     0B                  
    11 <missing>           2 weeks ago         /bin/sh -c set -eux;  apt-get update;  apt-g…   33.3MB              
    12 <missing>           2 weeks ago         /bin/sh -c #(nop) WORKDIR /usr/local/apache2    0B                  
    13 <missing>           2 weeks ago         /bin/sh -c mkdir -p "$HTTPD_PREFIX"  && chow…   0B                  
    14 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/apach…   0B                  
    15 <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV HTTPD_PREFIX=/usr/loc…   0B                  
    16 <missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
    17 <missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:6d6f6f123e45697d3…   55.3MB  

    我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。

    ------------------------引用来自-----------------------

    https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587637&idx=1&sn=0b6ff34a4121676167589f9cf6275099&chksm=8d3080acba4709ba7ddc446e79fb5666f4da6783490053a94999dccaf1867d5033b13865d0e5&scene=21#wechat_redirect

  • 相关阅读:
    编程术语英汉对照
    asp.net常用函数
    好的博客地址
    读取项目中的txt文件内容
    Web Service的定义
    ADO.NET在开发中的部分使用方法和技巧
    如何实现文本框焦点自动跳转及通过回车键提交表单
    15位和18位身份证JS校验实例
    PL/SQL 操作数据库常见脚本
    android 隐藏标题栏
  • 原文地址:https://www.cnblogs.com/gsophy/p/10270595.html
Copyright © 2011-2022 走看看