2018-03-12 02:59

Docker:启动容器

Brief

:docker run,以镜像为基础启动生成容器

运行第一个Docker容器

docker run -it ubuntu bash

[root@tvl-cnss-uat-3127 pro]# docker run -it ubuntu bash
root@a2ca2202d464:/#

执行命令后可以看到进入了root@a2ca2202d464的容器中,就像远程ssh到ubuntu系统一样(实际这个容器只是ubuntu系统的一个极简缩版)。在容器里面可以像操作ubuntu系统一样操作。

退出 容器

root@a2ca2202d464:/# exit
exit
[root@tvl-cnss-uat-3127 pro]#
  • docker run

    启动一个容器

  • -it 等价于 -i -t

    -i  代表容器中STDIN为开启状态 可进标准输入shell交互

    -t 告诉容器需要创建一个伪tty终端 新创建的容器才能提供一个交互式shell

  • ubuntu 代表启动的容器基于这个镜像 没有指定tag则默认使用 latest 带tag的镜像指定 ubuntu:xxxx

  • bash 代表的是启动这个容器时初始化执行了一个 /bin/bash 命令

docker ps 查看本地宿主机上已经存在的容器

[root@tvl-cnss-uat-3127 pro]# docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS                     PORTS     NAMES
a2ca2202d464   ubuntu             "bash"                   6 minutes ago   Exited (0) 3 minutes ago             beautiful_swirles
  • CONTAINER ID

    容器ID 唯一

  • IMAGE

    容器基于什么镜像启动

  • COMMAND

    启动时执行的命令

  • CREATED

    创建时间

  • STATUS

    容器状态

  • PORTS

    容器的端口 可以通过docker run -p 指定或者通过Dockerfile主动暴露容器端口

  • NAMES

    容器名称 可通过 docker run --name 指定,容器名称不能重复

docker ps 默认查看正在运行的容器可以通过 -a 查看所有

创建一个守护线程类型的容器

刚才的命令虽然创建了一个容器,但是执行exit命令后,容器也随即停止运行。通过-d参数来创建后台执行的守护线程容器。

[root@tvl-cnss-uat-3127 pro]# docker run -d ubuntu tail -f /etc/hosts
41616ad592666e9c764fb0e3df70efb664c3ec969e8c9ccae2bb27d5bb5a6181
[root@tvl-cnss-uat-3127 pro]# docker ps
CONTAINER ID   IMAGE     COMMAND                CREATED         STATUS         PORTS     NAMES
41616ad59266   ubuntu    "tail -f /etc/hosts"   4 seconds ago   Up 3 seconds             interesting_tu
[root@tvl-cnss-uat-3127 pro]#

tail -f /etc/hosts 创建了一个持续交互的任务,并不是-d参数使用就永远容器挂载后台运行,当容器中任务完成时,容器也会正常退出。这里使用tail -f 创建一个不会立即停止的任务

通过-d传建的容器,通过docker ps可以看到即使没有进入容器,它也在后台运行。

进入一个正在运行的容器

docker exec

[root@tvl-cnss-uat-3127 pro]# docker exec -it 41616ad59266 bash
root@41616ad59266:/# ps       
  PID TTY          TIME CMD
    7 pts/0    00:00:00 bash
   15 pts/0    00:00:00 ps
root@41616ad59266:/# ps -ef | grep tail
root         1     0  0 14:32 ?        00:00:00 tail -f /etc/hosts
root@41616ad59266:/#

通过docker exec命令进入容器41616ad59266中,并创建了一个交互式伪终端,通过ps -ef | grep tail 查看到了容器创建时执行的命令,也证明进入了这个正在运行的容器

也可以通过docker attach命令进入一个正在运行的容器,且这个容器只在运行stdin任务,不能处理后台容器。attach命令会随着自主退出而结束整个容器的运行,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。 


容器管理

查看容器详细情况

docker inspect 容器ID/容器名称

[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266
[
    {
        "Id": "41616ad592666e9c764fb0e3df70efb664c3ec969e8c9ccae2bb27d5bb5a6181",
        "Created": "2021-03-12T14:32:15.914494107Z",
        "Path": "tail",
        "Args": [
            "-f",
            "/etc/hosts"
        ],

        .......
        
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "024c5445260a0a8dccf01c4294c3acef3f4ce436286dbc1a341efe2248017da1",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/024c5445260a",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "105ed0fc2d1bae3ddfb582b1e0a486db659aa339f2a1ef0b0129400e68eecc69",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "583342abfc06a9c6b702e6f5a27676dbfd6ad0a06a8df3c771ec2b826d611dca",
                    "EndpointID": "105ed0fc2d1bae3ddfb582b1e0a486db659aa339f2a1ef0b0129400e68eecc69",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@tvl-cnss-uat-3127 pro]#

通过docker inspect -f(--format) 格式化内容,定位关注数据

[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .NetworkSettings.Networks.bridge.NetworkID }}'             
583342abfc06a9c6b702e6f5a27676dbfd6ad0a06a8df3c771ec2b826d611dca
[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .State.Status }}'
running
[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .NetworkSettings.Networks.bridge.Gateway }}'        
172.17.0.1

重启/停止容器(守护线程类型的后台服务)

docker stop/start/restart 容器ID/容器名称

设置容器自动重启

docker run --restart={}

  • always

    无论容器退出时发出何种退出代码,立即重启

  • on-failure

    只有当退出代码不为0时,容器才会自动重启,on-failure:5 最多失败重启5次

容器删除

docker rm 容器ID、容器名称

目前docker没有直接删除所有容器的命令,但可以通过docker rm `docker ps -aq`删除所有容器,容器删除前必须处于停止状态。