zoukankan      html  css  js  c++  java
  • 四、【Docker笔记】Docker容器

    容器是Docker的另一个核心概念,容器就是镜像的一个运行实例,只是它具有一个可写的文件层,而镜像是一个只读的文件。

    一、创建容器

    1、新建容器

    我们可以使用 docker create 命令来创建一个容器。需要注意的是,此时新建的容器处于停止状态,若想让这个容器运行,则需要使用 docker start 命令。

    # 0. 查看本地有哪些镜像
    $ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              latest              4e5021d210f6        2 weeks ago         64.2MB
    
    # 1. 创建容器(第一步)
    $ sudo docker create -ti ubuntu:latest
    bb9c6f31d79d40f10e2fefbde17af35cd8457746211f214479258accab86dbc0
    
    # 2. 查看所有容器,此时容器状态为 Created
    $ sudo docker ps -a
    CONTAINER ID   IMAGE         COMMAND      CREATED      STATUS   PORTS    NAMES
    bb9c6f31d79d  ubuntu:latest  "/bin/bash" 7 seconds ago Created       flamboyant_almeida
    
    # 3. 运行容器(第二步)
    $ sudo docker start bb9c6f31d79d
    bb9c6f31d79d
    
    # 4. 查看容器,此时容器状态为UP
    $ sudo docker ps -a
    CONTAINER ID   IMAGE         COMMAND      CREATED      STATUS     PORTS    NAMES
    bb9c6f31d79d  ubuntu:latest  "/bin/bash" 7 seconds ago UP 5 seconds   flamboyant_almeida
    

    2、新建并启动容器

    在上一小节中,我们运行一个容器需要做两步走,先创建再运行。其实这两步,我们可以使用 docker run 这一个命令来代替上面的两个步骤。

    # 0. 查看所有容器
    $ sudo docker ps -a
    CONTAINER ID   IMAGE         COMMAND      CREATED      STATUS     PORTS    NAMES
    bb9c6f31d79d  ubuntu:latest  "/bin/bash" 7 seconds ago UP 5 seconds   flamboyant_almeida
    
    # 1. 运行一个容器,并立刻退出
    $ sudo docker run ubuntu /bin/echo 'Hello World...'
    Hello World...
    
    # 2. 查看容器
     docker ps -a
    CONTAINER ID   IMAGE       COMMAND      CREATED      STATUS       PORTS    NAMES
    924e13b84e9f  ubuntu  "/bin/echo 'Hello Wo…" 6s ago  Exited (0) 4 s ago loving_shannon
    bb9c6f31d79d  ubuntu:latest  "/bin/bash" 7 seconds ago UP 5 seconds   flamboyant_almeida
    

    当然,我们也可以在运行容器的时候,进入到容器内部,对容器进行操作。

    # 0. 运行容器并进入
    $ sudo docker run -t -i ubuntu:latest /bin/bash
    root@c6198d442bf9:/#
    
    # 1. 对容器进行操作
    root@c6198d442bf9:/# pwd
    /
    root@c6198d442bf9:/# ps
       PID TTY          TIME CMD
         1 pts/0    00:00:00 bash
        10 pts/0    00:00:00 ps
    root@c6198d442bf9:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    # 2. 退出容器
    root@c6198d442bf9:/# exit
    exit
    
    # 3. 查看刚才的容器状态为Exited
    $ sudo docker ps -a
    

    3、容器的守护态运行

    其实大多数时候,我们运行容器后都不会一直处于容器操作状态的,会让容器在操作系统后台运行,此时的容器就是处于守护态运行。这种启动方式就是在 docker run 运行时添加一个 -d 参数来实现。

    # 在后台运行一个容器,该容器每一秒打印一串字符
    $ sudo docker run -d ubuntu:latest /bin/bash -c "while true; do echo hello world; sleep 1; done"
    60b6384109fd350bc97040039277058428ffc0f7492cc22338f95be8357ea482
    
    # 查看当前正在运行的容器
    $ sudo docker ps
    CONTAINER ID      IMAGE    COMMAND         CREATED             STATUS      PORTS    NAMES
    60b6384109fd ubuntu:latest "/bin/bash -c 'while…"8 seconds ago  Up 6 seconds keen_swirles
    

    从上面的状态可以看到当前容器处于 UP状态,那么如何查看该容器是否在打印字符串呢?可以使用 docker logs命令。

    # 查看当前容器的输出信息
    $ sudo docker logs 60b6384109fd
    hello world
    hello world
    hello world
    ....
    

    二、终止容器

    当容器运行了一段时间后,对于该容器我们不再需要了,那么就需要终止容器,可以使用 docker stop 命令来终止一个正在运行的容器,语法为:docker stop [-t|--time[=10]]。它的执行逻辑为:首先会向容器发送SIGTERM信号,等待一段时间后(默认10s),再发送SIGKILL信号终止容器。除了我们直接终止容器,当Docker容器中指定的应用终结时,容器也会自动的终止。在上一小节中,当我们处于容器中时,用 exit 命令退出容器也会将容器给终止。

    # 终止我们上一小节中正在运行的守护态容器
    $ sudo docker stop 60b6384109fd
    60b6384109fd
    
    # 此时查看正在运行的容器已经没有了
    $ sudo docker ps
    ...
    

    当终止容器后,一段时间后,我们希望将刚才终止的容器再次启动,则使用 docker start 命令。

    # 0. 查看当前终止的容器
    $ sudo docker ps -a -q
    60b6384109fd
    
    # 1. 将终止的容器再次启动
    $ sudo docker start 60b6384109fd
    60b6384109fd
    
    # 2. 查看当前正在运行的容器,发现 60b6384109fd 该容器状态又处于 UP
    $ sudo docker ps
    

    若我们希望将一个正在运行的容器重启,则可使用 docker restart 命令。

    # 重启容器
    $ sudo docker restart 60b6384109fd
    

    三、进入容器

    在守护态运行容器时,此时容器处于操作系统的后台运行,此时我们想进入容器内部进行操作,可以通过以下集中方式。

    1、attach命令

    该命令时Docker自带的一个命令。此命令存在一个缺点,即当我们打开多个窗口进入容器中,当其中一个窗口在操作容器,其他窗口也会将这些操作信息给同步的显示,若此时其中一个窗口处于阻塞状态,则所有窗口都不可操作容器。若在容器中执行 exit 命令,则容器终止运行。

    # 进入上一节中运行运行态容器中
    $ sudo docker attach c6198d442bf9 #(容器ID或容器名称)
    root@c6198d442bf9:/#
    

    2、exec命令

    该命令是 Docker1.3版本新提供的,可有效解决 attach命令存在的问题。

    # 进入正在运行的容器内部,哪怕在容器内执行 exit 退出容器,此时容器也不会终止
    $ sudo docker exec -ti c6198d442bf9 /bin/bash
    root@c6198d442bf9:/#
    

    3、nsenter工具

    该工具在 util-linux包2.23版本中,若没有该包则需要安装。同时,使用该工具连接容器,需要知道容器的进程的PID。

    # 0. 查询当前运行态的容器
    $ sudo docker ps
    #得到容器ID为 bb9c6f31d79d
    
    # 1. 查询该容器的PID
    $ sudo echo PID=$(docker inspect --format "{{ .State.Pid}}" bb9c6f31d79d)
    PID=1525
    
    # 2. 通过nsenter工具进入容器
    $ sudo nsenter --target 1525 --mount --uts --ipc --net --pid
    root@bb9c6f31d79d:/#
    
    # 3. 使用 exit 退出容器后,容器不终止
    

    四、删除容器

    对于确定不在需要的容器,可以将其删除,注意删除容器之前将容器给终止。语法:docker rm [options] container [container...],可以一次删除多个容器。options选项包含:

    -f,--force=false 强行终止并删除一个运行中的容器(不推荐使用)

    -l,--link=false 删除容器的连接,但保留容器

    -v,--volumes=false 删除容器挂载的数据卷

    # 0. 查看所有容器
    $ sudo docker ps -a
    60b6384109fd    Exited (137) 47 minutes ago
    c6198d442bf9    Exited (0) 30 minutes ago
    924e13b84e9f    Exited (0) About an hour ago
    bb9c6f31d79d    Up About an hour
    
    # 1. 删除终止的容器
    $ sudo docker rm 60b6384109fd c6198d442bf9 924e13b84e9f
    60b6384109fd
    c6198d442bf9
    924e13b84e9f
    
    # 2. 二次查看所有容器
    $ sudo docker ps -a
    bb9c6f31d79d    Up About an hour
    
    # 3. 删除正在运行的容器(错误做法)
    $ sudo docker rm bb9c6f31d79d
    Error response from daemon: You cannot remove a running container bb9c6f31d79d40f10e2fefbde17af35cd8457746211f214479258accab86dbc0. Stop the container before attempting removal or force remove
    
    # 4. 强制删除正在运行的容器
    $ sudo docker rm -f bb9c6f31d79d
    bb9c6f31d79d
    
    # 5. 至此,所有容器删除完成
    $ sudo docker ps -a
    null
    

    五、导入和导出容器

    1、导出容器

    导出容器即将一个已经创建的容器导出到一个文件,不管此时容器是否处于运行中,都可以使用 docker export 命令来导出。

    # 0. 新建并启动一个容器,新建一个容器但不启动
    $ sudo docker run -tid ubuntu:latest /bin/bash
    4418f9c3e13a30e551a2a33d2e2c7cf73a122688aa09ca86a97f4ee8885d74a7
    $ sudo docker create ubuntu:latest
    4f3f1fe5bd66125b5e2c6693cefec4c403d396d5c2bd678f8371c38131611ddf
    
    # 1. 将两个容器导出
    $ sudo docker export 4f3f1fe5bd66 > no_run_container.tar
    $ sudo docker export 4418f9c3e13a > run_container.tar
    
    # 说明:此时这两个容器对应的tar,我们就可以将其放到其他机器上通过导入来使用。这即实现了容器的迁移。
    

    2、导入容器

    对于容器导出的文件,我们可以使用 docker import 命令来导入,使其成为镜像。

    # 0. 导入文件,成为镜像
    $ cat run_container.tar | sudo docker import - test/ubuntu:v1.0
    sha256:0f5b15a68f7640467f842635ec567bbd97dfc9485ff3d0eb083c6ad0781d7b3b
    
    # 1. 查看镜像
    $ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    test/ubuntu         v1.0                0f5b15a68f76        4 seconds ago       64.2MB
    

    说明:在前面我们使用过一个 docker load 命令来导入文件。这两者都可以实现导入,不过load体积更大,导入的镜像存储文件更彻底,而import导入的只是一个容器快照,它将丢弃所有的历史记录和元数据信息。

    欢迎志同道合朋友,加QQ群:119126035,QQ:1415583094,微信:cq1415583094
    我的GitHub:https://github.com/cq1415583094
    公众号欢迎关注

  • 相关阅读:
    Linux centos 安装 Node.js
    maven 常用命令
    linux centos 设置笔记本合盖不待机
    linux centos 网卡有关调试
    Linux centos 安装 maven 3.5.4
    Linux centos 安装 jenkins & 本地构建jar & 远程构建jar
    Linux centos 安装 tomcat 7
    Linux centos 安装 JDK 8
    JS正则 replace()方法全局替换变量(可以对变量进行全文替换)
    node:json与csv互转
  • 原文地址:https://www.cnblogs.com/chuanqi1415583094/p/12656751.html
Copyright © 2011-2022 走看看