Docker - 常用命令

1 - Docker命令分布示意图

Docker命令分布

2 - 帮助信息

查看docker基本信息:docker info
查看docker版本信息:docker version

查看docker的所有命令及选项:docker --help
查看docker具体命令的详细用法:docker COMMAND --help

查看docker daemon的用法:docker daemon --help
查看docker run的用法:docker run --help 或者 man docker-run

3 - 镜像操作

常用命令

根据镜像名称或关键字查找仓库中镜像: docker search IMAGE_NAME/KEYWORD
拉取仓库中镜像到本地:docker pull IMAGE_NAME
拉取仓库中指定镜像版本到本地:docker pull IMAGE_NAME:TAG

显示已经下载的镜像信息: docker images
显示已经下载的镜像摘要信息: docker images --digests
显示包括中间层镜像在内的所有镜像:`docker images -a`

设置镜像标签:docker tag source_IMAGE[:TAG] target_IMAGE[:TAG]

显示镜像细节信息:docker inspect IMAGE_NAME
显示镜像历史: docker history IMAGE_NAME

删除本地镜像:docker rmi IMAGE_NAME
同时删除多个本地镜像:docker rmi IMAGE_NAME1 IMAGE_NAME2 IMAGE_NAME3
构建镜像:docker build

示例:docker images

[root@CentOS-7 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
docker.io/eboraas/apache-php   latest              e95d111f807f        41 hours ago        283.9 MB
docker.io/python               2.7                 acf0d719f268        3 weeks ago         676.1 MB
docker.io/centos               latest              67591570dd29        4 weeks ago         191.8 MB
docker.io/redis                latest              d59dc9e6d0bf        4 weeks ago         182.9 MB
docker.io/ubuntu               15.10               9b9cb95443b5        5 months ago        137.2 MB
docker.io/hello-world          latest              c54a2cc56cbb        6 months ago        1.848 kB
[root@CentOS-7 ~]# 

####
# REPOSITORY --- 镜像名称
# TAG --- 镜像标签(区分同一镜像的不同版本),默认拉取最新的版本(latest)
# MAGE ID --- 镜像短ID
# CREATED --- 镜像在仓库的创建时间
# VIRTUAL SIZE --- 镜像所占空间大小
# 不加任何参数的情况下, docker images 会列出所有顶级镜像。
# 可以根据仓库名、指定仓库名和标签等方式列出部分镜像,也可以通过--filter、--format、-q等参数显示特定内容。

示例:docker rmi IMAGE_NAME

[root@CentOS-7 ~]# docker images ubuntu 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu        16.04               6a2f32de169d        12 days ago         117.2 MB
docker.io/ubuntu        latest              6a2f32de169d        12 days ago         117.2 MB
docker.io/ubuntu        14.04               302fa07d8117        12 days ago         188 MB
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker rmi ubuntu:14.04
Untagged: ubuntu:14.04
Untagged: docker.io/ubuntu@sha256:edf05697d8ea17028a69726b4b450ad48da8b29884cd640fec950c904bfb50ce
Deleted: sha256:302fa07d8117297adb599cc4ed7400348de5fe0f7950291e4bc32938324371b2
Deleted: sha256:58ee5e1ccda6163bca1c6d26e0d9a9ca954131ddbcadb1dfea39f33bc4d8587e
Deleted: sha256:e4bab9dc9558a6a82a7370c9018459b44a01fbf44224bf4a497007318ed587c8
Deleted: sha256:85124bfb4ca4773e3b6e84f403f53511a6a27a783d5178e2ca45bc9b02e6591f
Deleted: sha256:e421effca6fd5a1c5f1e36c006e1751e5fa163a110b763295a86116adcc6d4f3
Deleted: sha256:638903ee85790805193e2709746d311a0224178933e6ad4083fc0eda81e9dfcd
[root@CentOS-7 ~]# 
[root@CentOS-7 ~]# docker images ubuntu 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu        16.04               6a2f32de169d        12 days ago         117.2 MB
docker.io/ubuntu        latest              6a2f32de169d        12 days ago         117.2 MB
[root@CentOS-7 ~]# 

####
# 删除行为分为两类,一类是 Untagged ,另一类是 Deleted 。
# 镜像的唯一标识是其ID 和摘要,而一个镜像可以有多个标签
# 
# docker rmi命令删除镜像的时候,实际上是取消镜像标签。标签被取消,显示Untagged信息。
# 当镜像所有的标签都被取消,失去了存在的意义,才会触发删除行为,显示Deleted信息。
# 如果仍然有其它标签指向了这个镜像,那么Delete行为就不会发生。
# 所以并非所有的 docker rmi 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
# 
# 镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。
# 如果其它镜像正依赖于当前镜像的某一层,则不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。
# 这可以解释,某些无标签镜像仍然存在和删除镜像的层数和pull层数不一致的现象。
# 
# 容器依赖于镜像,因此删除镜像之前,为了保证系统数据的一致性,必须先删除这个镜像启动的容器(即使容器没有运行)。
#
# 删除所有ubuntu镜像:docker rmi $(docker images -q ubuntu)

3.1 镜像体积

Docker Hub 中显示的体积是压缩后的体积。
docker images显示的是镜像下载到本地后,展开后的各层所占空间的总和。
由于相同的层只需要保存一份,因此实际镜像硬盘占用空间可能比docker images 显示的镜像体积总和要小。

3.2 虚悬镜像

无标签镜像(既没有仓库名,也没有标签,显示为none)被称为虚悬镜像(dangling image)。一般来说,虚悬镜像没有存在价值,可以删除。

显示虚悬镜像:docker images -f dangling=true
删除虚悬镜像:docker rmi $(docker images -q -f dangling=true)

3.3 中间层镜像

显示包括中间层镜像在内的所有镜像:docker images -a
中间层镜像是其它镜像所依赖的镜像。无论中间层镜像是否有标签,都不应该删除,否则会导致上层镜像因为依赖丢失而出错。

4 - 容器操作

容器是独立运行的一个或一组应用,以及它们的运行态环境。

4.1 常用命令

查看运行状态的容器:docker ps
查看所有容器(包含exited状态):docker ps -a

查看容器细节信息:docker inspect <Name/ID>
查看容器日志: docker logs <Name/ID>
实时查看容器日志: docker logs -f -t <Name/ID>
查看容器里的进程: docker top <Name/ID>

创建容器: docker create [options] image
启动已停止的容器:docker start <Name/ID>
停止容器: docker stop <Name/ID>
等待多少秒后停止容器: docker stop -t <number> <Name/ID>
重启容器: docker restart <Name/ID>
强制结束容器: docker kill <Name/ID>
删除终止状态的容器:docker rm <Name/ID>
删除运行中的容器:docker rm -f <Name/ID>

创建并启动容器:docker run [options] image
在运行的容器中执行命令:docker exec
进入容器:docker exec -it <Name/ID> /bin/bash
退出容器:exit

4.2 创建并启动容器:docker run

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载
2. 利用镜像创建并启动一个容器
3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5. 从地址池配置一个 ip 地址给容器
6. 执行用户指定的应用程序
7. 执行完毕后容器被终止
[root@CentOS-7 ~]# docker run -it --rm ubuntu:16.04 bash
root@7f8001fb78da:/# cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04.2 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.2 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
root@7f8001fb78da:/# 
root@7f8001fb78da:/# exit
exit
[root@CentOS-7 ~]# 

####
# -i :打开并保持容器的标准输入
# -t :分配pseudo-TTY终端并绑定到容器的标准输入上
# -it 实际就是启动了一个可交互的容器,关联了终端和容器的stdin和stdout
# -d :后台运行
# --rm :容器退出后,自动删除容器
# ubuntu:14.04 :使用ubuntu:14.04镜像为基础启动容器
# bash :交互式bash Shell
# --name  指定容器名字,否则会自动分配一个字符串名称
# -P  随机端口映射
# -p  指定内外端口映射关系
# -net  网络模式
# --pid  如果--pid=host,那么将在容器里面共享主机的 pid namespace
# --device  指定容器可使用的主机设备
# -h 为容器指定主机名  

4.3 示例:docker exec(在运行的容器中执行命令)

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c37a36e56859        docker.io/centos    "/bin/bash"         4 minutes ago       Up 4 minutes                            demo
[root@localhost ~]# 
[root@localhost ~]# docker exec demo cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core) 
[root@localhost ~]# 
[root@localhost ~]# docker exec -it demo /bin/bash    # 通过docker exec命令执行/bin/bash来进入容器
[root@c37a36e56859 /]# cat /etc/redhat-release 
CentOS Linux release 8.0.1905 (Core) 
[root@c37a36e56859 /]# 
[root@c37a36e56859 /]# exit
exit
[root@localhost ~]# 

####
# -i :打开并保持容器的标准输入
# -t :为容器分配伪终端pseudo-TTY

5 - 网络

Docker安装完成后,都会在宿主机中创建一个虚拟网桥,实现容器之间以及容器与外部网络的连接。
通常情况下,虚拟网桥的名称为docker0,工作在OSI七层模型中的数据链路层,将网络中的多个网段在数据链路层连接起来。
也就是说,Docker中的各个容器是通过一个名为docker0的虚拟网桥实现互连的,可以设置IP地址,相当于一个隐藏的虚拟网卡。
可以通过brctl命令来查看虚拟网桥docker0的信息。

  • 查看网络信息:docker network ls
  • 查看网络详细信息:docker network inspect NET_NAME
[root@anliven ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242dcb1eb1f       no
virbr0          8000.525400505694       yes             virbr0-nic
[root@anliven ~]#
[root@anliven ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3a458120a664        bridge              bridge              local
16da6257c2fe        host                host                local
8699b063be64        none                null                local
[root@anliven ~]#
[root@anliven ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "3a458120a66434e4aa925e5f518765b04b2d2691dd2e7a3bdce77bd7dee5f8a0",
        "Created": "2020-09-08T10:31:18.686470758-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
[root@anliven ~]#
[root@anliven ~]# docker network inspect host
[
    {
        "Name": "host",
        "Id": "16da6257c2fe0327b3647145e4e3ddf799474b47337eebb29b0be67d6d7e53b1",
        "Created": "2020-06-01T11:37:48.765401737-04:00",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@anliven ~]#
posted @ 2016-12-24 14:21  Anliven  阅读(866)  评论(0编辑  收藏  举报