zoukankan      html  css  js  c++  java
  • Docker.容器管理

    容器管理

    0.前言

    <镜花缘>
    咱们世界也许也是在一个容器中...

    0.环境

    [root@VM_0_12_centos docker]# docker -v
    Docker version 19.03.11, build 42x35exxfx
    

    1.启动

    1.0.新建并启动(基于镜像)

    docker run -it  --rm -d -p 8888:8080 tomcat:8.0
      -i	:	交互式操作
      -t	:	终端
      -rm	:	容器退出后随之将其删除,可以避免浪费空间
      -p 	:	端口映射
      -d 	:	容器在后台运行
      -name	: 	容器名称
    
    [root@VM_0_12_centos ~]# docker run -it hello-world /bin/bash
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: "/bin/bash": stat /bin/bash: no such file or directory": unknown.
    

    经验+1...
    //这种情况,虽然报错了,但是容器创建成功了,
    //但是STATUS:::Created,已经创建,但是未启动,
    //这个演示镜像可能没有这么多不支持shell交互&bash交互...?

    1.该容器使用的不支持/bin/bash,只有/bin/sh ,或者压根都没有提供这种shell接口!

    #没有添加/bash/bash就可以了
    [root@VM_0_12_centos ~]# docker run -d --name Hw_01 hello-world
    378e29d0eeb9e150c113cb87e83777f984112c282b8e0d19e3e11ec81232a774
    #"docker ps -a"查看这个容器{378e29d0eeb9e},发现COMMAND:::"/hello"
    #再次run,将"/bin/bash"改为"/hello"成功.
    [root@VM_0_12_centos ~]# docker run -it --name Hw_02 hello-world /hello
    
    Hello from Docker!
    This message shows that ...
    ...
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    ...
    

    //不同用途的镜像的启动区别?


    1.1.启动

    #docker start {容器Id}
    [root@VM_0_12_centos ~]# docker start 378e29d0eeb9
    378e29d0eeb9
    

    1.2.启动.重启

    #docker restart {容器Id}
    [root@VM_0_12_centos ~]# docker restart 378e29d0eeb9
    378e29d0eeb9
    

    2.查看容器列表(不同状态)

    2.0.命令介绍

    docker ps [OPTIONS]
    [OPTIONS]说明:
    *	-a 			:显示所有的容器,包括未运行的。
    * 	-f 			:根据条件过滤显示的内容。
    * 	--format 	        :指定返回值的模板文件。
    * 	-l 			:显示最近创建的容器。
    * 	-n 			:列出最近创建的n个容器。
    * 	--no-trunc 	:不截断输出。
    * 	-q 			:静默模式,只显示容器编号。
    * 	-s 			:显示总的文件大小。
    
    

    2.1.所有的容器列表

    #所有
    [root@VM_0_12_centos ~]# docker ps -a
    #格式化
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | "
    NAMES | IMAGE |
    Hw_02 | hello-world |
    Hw_01 | hello-world |
    ...
    #非缩写形式
    [root@VM_0_12_centos ~]# docker ps --all
    

    经验+1
    "--option"为选项的全称?"-o"为选项的缩写?连"--"都缩写为了"-"...


    2.2.筛选filter

    #明明有这个名称{Hw_01}的容器,但是没有显示出来...
    [root@VM_0_12_centos ~]# docker ps --filter "name=Hw_01"
    #名称过滤=>{明明}有,但是不是所有...
    [root@VM_0_12_centos ~]# docker ps -a --filter "name=Hw_01" --format "table {{.Names}} | {{.Image}} | "
    NAMES | IMAGE |
    Hw_01 | hello-world |
    #标签过滤=>(打标签...docker tag...)
    [root@VM_0_12_centos ~]# docker ps -a -f "label=color"
    #状态过滤=>
    [root@VM_0_12_centos ~]# docker ps -a -f status=running
    [root@VM_0_12_centos ~]# docker ps -a -f "status=running"
    [root@VM_0_12_centos ~]# docker ps -a -f exited=0
    
    
    #在docker里面,下面的3条命令,是等价
    #1.=>双引号{"}和{'}
    #2.一个空格{ }和多个空格{          }
    [root@VM_0_12_centos ~]# docker ps -a --filter "name=Hw_01" 
    [root@VM_0_12_centos ~]# docker ps -a --filter 'name=Hw_01'
    [root@VM_0_12_centos ~]# docker       ps       -a          --filter 'name=Hw_01'
    
    #固定的格式,需要遵循,比如"-f"
    #错误示范↓
    [root@VM_0_12_centos ~]# docker ps -a -f status = running
    invalid argument "status" for "-f, --filter" flag: bad format of filter (expected name=value)
    #正确格式↓
    [root@VM_0_12_centos ~]# docker ps -a -f status=running
    

    经验+2...


    2.2.容器列表.正在运行

    [root@VM_0_12_centos ~]# docker ps
    
    

    2.3.容器列表.最近创建

    #列出最近创建的5个容器
    [root@VM_0_12_centos ~]# docker ps -a -n 5
    

    3.开机运行容器

    3.0.创建容器阶段.设置开机运行

    #
    [root@VM_0_12_centos ~]# docker run -d -it --name Hw_03 --restart=always hello-world
    448fffc49921f7d89368f74dd79058fd3d430cb4a4284a4f21d8dc7f026c2421
    #一直在尝试重启,哪怕真的起不来..."Restarting (0) 31 seconds ago"...它不知道它永远起不来,一下搞得好励志...
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | {{.Status}}|"
    NAMES | IMAGE | STATUS|
    Hw_03 | hello-world | Restarting (0) 31 seconds ago|
    Hw_02 | hello-world | Exited (0) About an hour ago|
    Hw_01 | hello-world | Exited (0) About an hour ago|
    ...
    #想让已经Exited的{Hw_02}也励志一下...
    [root@VM_0_12_centos ~]# docker update --restart=always Hw_02
    Hw_02
    #发现{Hw_02}励志已经晚了...说明励志要趁早...等你Exit的时候再励志就晚了...
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | {{.Status}}|"
    NAMES | IMAGE | STATUS|
    Hw_03 | hello-world | Restarting (0) 56 seconds ago|
    Hw_02 | hello-world | Exited (0) About an hour ago|
    Hw_01 | hello-world | Exited (0) About an hour ago|
    
    

    励志+1...
    经验+1...
    //docker服务设置开机自动启动...


    3.1.更改一个已经创建的容器

    #试图停止{Hw_03}的无效励志...失败...
    [root@VM_0_12_centos ~]# docker update --restart=no Hw_03
    Hw_03
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | {{.Status}}|"
    NAMES | IMAGE | STATUS|
    Hw_03 | hello-world | Restarting (0) 5 seconds ago|
    Hw_02 | hello-world | Exited (0) About an hour ago|
    Hw_01 | hello-world | Exited (0) About an hour ago|
    ...
    

    //搜到好几个都是"docker update --restart=no 容器名称",但是确实没有起作用...使用方式不对?
    //又搜到一个....

    #刚才搜到的docker命令没有起作用...又重新找到了一个...
    [root@VM_0_12_centos ~]# docker container update --restart=no Hw_03
    Hw_03
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | {{.Status}}|"
    NAMES | IMAGE | STATUS|
    Hw_03 | hello-world | Exited (0) 14 seconds ago|
    Hw_02 | hello-world | Exited (0) About an hour ago|
    Hw_01 | hello-world | Exited (0) About an hour ago|
    ...
    

    拯救迷途少年{Hw_03} +1...
    //故事不会告诉你们,拯救方式简单粗暴:Exited...


    4.容器后台运行

    4.1.创建阶段.后台运行

    [root@VM_0_12_centos ~]# docker run -d --name Hw_04 hello-world
    d2e22adac77f1e6399c890ed2a6d8416b3494a6405fc00afd80d188bf7affe6f
    

    4.2.已经运行容器,并且正在与容器进行交互...

    #先进去一个容器...
    [root@VM_0_12_centos ~]# docker attach coredocker5c
    #按下组合键:Ctrl+P+Q
    read escape sequence
    #要将这个组合键{Ctrl+P+Q}区别于{exit}
    
    #查看刚才的交互...↓
    [root@VM_0_12_centos ~]# docker logs -tf coredocker5c
    ...
    2020-09-15T15:16:12.864678231Z dotner^Ht^H^H^H^H^H^Z
    2020-09-15T15:16:16.101312196Z dotnet
    ...
    #"dotner^Ht^H^H^H^H^H^Z","dotnet"都是我输入的...都让logs记录下来了...
    
    #注意:组合键{Ctrl+C} = {exit}
    [root@VM_0_12_centos ~]# docker attach coredocker5c
    ^Cinfo: Microsoft.Hosting.Lifetime[0]
          Application is shutting down...
    

    5.端口映射

    #尝试将宿主机的12000端口,随机映射到容器一个端口...失败...
    [root@VM_0_12_centos ~]# docker run -it -d -p 127.0.0.1::12000 --name core091501 coredocker3
    3ae7086ccebf8bfb12337447fb8101c832b93ca65c29a4cfe76c70ce5842d5e1
    

    经验+1...

    #HOSTPORT:CONTAINERPORT
    [root@VM_0_12_centos ~]# docker run -it -d -p 11105:11001 --name core091505 coredocker3
    b1a61ae6a7707d5193ae325c9cc97bd5e5659a4be741489a5ca0d2b70165ff53
    
    #查看某一个容器的端口映射
    [root@VM_0_12_centos ~]# docker port core091505
    11001/tcp -> 0.0.0.0:11105
    

    //回过头来看下"docker ps -a".PORTS这一列...

    6.删除容器

    6.0.删除所有未使用的容器(不是处于运行状态)

    [root@VM_0_12_centos ~]# docker container prune
    WARNING! This will remove all stopped containers.
    Are you sure you want to continue? [y/N] y
    Deleted Containers:
    990f0eb42c97a4155d9dbc8dbf297726
    ...
    

    6.1.删除.指定容器

    #docker  rm  <容器ID/容器名字>
    #试图删除一个正在运行的容器...失败...
    [root@VM_0_12_centos ~]# docker rm core091505
    Error response from daemon: You cannot remove a running container b1a61ae6a7707d5193ae325c9cc97bd5e5659a4be741489a5ca0d2b70165ff53. Stop the container before attempting removal or force remove
    #强制删除一个正在运行的容器...成功...
    [root@VM_0_12_centos ~]# docker rm -f core091505
    core091505
    

    7.查看容器详细信息

    docker exec

    #exec一个dotnet core容器...
    [root@VM_0_12_centos ~]# docker exec -it 57eb5000e286 /bin/bash
    root@57eb5000e286:/app# dotnet --list-sdks
    root@57eb5000e286:/app# dotnet --list-runtimes
    Microsoft.AspNetCore.App 3.1.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
    Microsoft.NETCore.App 3.1.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
    ...
    #组合键{Ctrl+P+Q} =>
    root@57eb5000e286:/app# read escape sequence
    
    #不进入交互模式,直接获取一个信息...
    [root@VM_0_12_centos ~]# docker exec coredocker7c dotnet --list-runtimes
    Microsoft.AspNetCore.App 3.1.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
    Microsoft.NETCore.App 3.1.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
    

    docker inspect

    [root@VM_0_12_centos ~]# docker inspect coredocker7c       
    

    //返回一个json格式的信息...↓

    [
        {
            "Id": "a3ef00508650f8fd5236596da8356ac930bb81dc94cd74644e2740bd7293a20c",
            "Created": "2020-06-27T14:23:47.389045773Z",
            "Path": "dotnet",
            "Args": [
                "DockerCoreSample.dll"
            ],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 6387,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2020-06-27T14:23:47.654927608Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            }
            ...
    ] 
    

    8.设定容器名称

    #不设定容器名称,docker使用的默认名字比较随意...比如{interesting_jennings}...
    [root@VM_0_12_centos ~]# docker ps -a --format "table {{.Names}} | {{.Image}} | {{.Status}}|"
    NAMES | IMAGE | STATUS|
    interesting_jennings | coredocker3 | Up 3 minutes|
    coredocker7c | coredocker1i | Up 2 months|
    
    [root@VM_0_12_centos ~]# docker run --name Hw_01 --rm  hello-world
    
    Hello from Docker!
    ...
    #并且由于因为选项--rm,执行{docker ps -a}是看不到{Hw_01}这个容器的...
    [root@VM_0_12_centos ~]# docker ps -a
    
    

    摘抄文档

  • 相关阅读:
    ArcGIS Server 9.3 JavaScript API实战一个具体的小系统示例介绍
    感冒太难受了
    ACM考试的题目,收藏,有空做做
    用Java在Dos下,用纯字符画图
    考ACM需要的知识(转)
    换个风格,换种心情
    (C#)ACM考试题的第一题
    .net连Access的OleDb数据库连接字符串写法
    (C#)ACM考试题的第二题
    辗转相除
  • 原文地址:https://www.cnblogs.com/love-zf/p/13676556.html
Copyright © 2011-2022 走看看