Docker笔记
Docker引擎
Docker引擎是一个包含以下主要组件的客户端服务器应用程序。
- —种服务器,它是一种被称为守护进程(deamon)并且长时间运行的程序。
- REST API 用于指定程序可以用来与守护进程通信的接口,并指示它做什么。
- 一个有命令行界面( CLI )工具的客户端。
Docker架构
- Docker 使用客户端-服务器 ( C/S ) 架构模式,使用远程 API 来管理和创建 Docker 容器。
- Docker 容器通过 Docker 镜像来创建。
- 容器与镜像的关系类似于面向对象编程中的对象与类。---通过镜像生成容器。
标题 | 说明 |
---|---|
镜像(Images) | Docker镜像是用于创建Docker容器的模板。 |
容器(Container) | 容器是独立运行的一个或一组应用。 |
客户端(Client) | Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行Docker守护进程和容器。 |
仓库(Registry) | Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub (https://hub.docker.com)提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、Digital Ocean、Microsoft Azure。 |
Docker 操作镜像
获取镜像
从Docker镜像仓库获取镜像的命令是 docker pull
。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/仓库名[:标签]
具体的选项可以通过 docker pull --help
命令看到,这里说一下镜像名称的格式。
- 镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub。
- 仓库名:如之前所说,这里的仓库名是两段式名称,即
<用户名>/<软件名>
。对于Docker Hub,如果不给出用户名,则默认为library
,也就是官方镜像。
列出镜像
想要列出已经下载的镜像,可以使用 docker images
或者docker image ls
命令。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydemo1 latest 3b239960848d 2 months ago 647MB
<none> <none> 54300df71941 2 months ago 647MB
<none> <none> e7e0ba36be39 2 months ago 647MB
tomcat latest 2eb5a120304e 3 months ago 647MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
rabbitmq 3.7.3-management 2f415b0e9a6e 2 years ago 151MB
列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。
虚悬镜像
有时在镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为<none>
。
<none> <none> 54300df71941 2 months ago 647MB
这个镜像原本是有镜像名和标签的,原来为(例如)mongo: 3.2
,随着官方镜像维护,发布了新版本后,重新docker pull mongo:3.2
时,mongo:3.2
这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了<none>
。除了docker pull
可能导致这种情况,docker build
也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为<none>
的镜像。这类无标签镜像也被称为虚悬镜像(dangling image),可以用下面的命令专门显示这类镜像:
[root@localhost ~]# docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 54300df71941 2 months ago 647MB
<none> <none> e7e0ba36be39 2 months ago 647MB
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
[root@localhost ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] (输入)y
Deleted Images:
deleted: sha256:e7e0ba36be3927af3f1d7a0b99263d4aa6e6af1d93b9d3455c0a045d4f4a477a
deleted: sha256:05ff87569ed6bfdc38621112bea7aafffed7895538490748e85fdf00da19d3b6
Total reclaimed space: 12B
中间层镜像
为了加速镜像构建、重复利用资源,Docker会利用中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的docker image ls
表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加-a
参数。
[root@localhost ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 9e5197c9a0e5 2 months ago 647MB
mydemo1 latest 3b239960848d 2 months ago 647MB
<none> <none> 660dfcd0a262 2 months ago 647MB
<none> <none> 1b63db1e38f7 2 months ago 647MB
<none> <none> f1343ffd435c 2 months ago 647MB
<none> <none> 54300df71941 2 months ago 647MB
tomcat latest 2eb5a120304e 3 months ago 647MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
rabbitmq 3.7.3-management 2f415b0e9a6e 2 years ago 151MB
这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
镜像体积
如果仔细观察,会注意到,这里标识的所占用空间和在Docker Hub上看到的镜像大小不同。比如,ubuntu:16.04
镜像大小,在这里是127 MB,但是在Docker Hub显示的却是50 MB。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 docker images
显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是,docker images
列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于Docker镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于Docker使用Union FS
,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 5 798.4MB 647.3MB (81%)
Containers 6 0 4.806MB 4.806MB (100%)
Local Volumes 7 1 30.6MB 26.49MB (86%)
Build Cache 0 0 0B 0B
删除镜像
如果要删除本地的镜像,可以使用docker image rm
或者docker rmi
命令,其格式为:
[root@localhost ~]# docker image rm [选项] <镜像1> [<镜像2> <镜像3>...]
[root@localhost ~]# docker rmi [选项] <镜像1> [<镜像2> <镜像3>...]
其中,<镜像>
可以是镜像短ID
、镜像长ID
、镜像名
或者镜像摘要
。
Docker操作容器
启动容器
所需要的命令主要为docker run
。
参数:
- -i 以交互模式运行容器,通常与 -t 同时使用;
- -t 为容器重新分配一个伪输入终端;
- --name 为容器指定一个名称;
- -d 已守护方式启动容器
- -p 指定端口映射,格式为:
主机(宿主机)端口:容器端口
- -P 随机端口映射,容器内部端口随机映射到主机的端口
- --volume , -v 绑定一个数据卷
- --expose=[] 开放一个端口或一组端口;
实例
使用docker镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
使用镜像 nginx:latest 以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用镜像 nginx:latest 以交互模式启动一个容器,在容器内执行 /bin/bash 命令。
docker run -it nginx:latest /bin/bash
root@b8573233d675:/#
当利用 docker run 来创建容器时,Docker在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
start/stop/restart 命令
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
语法
[root@localhost ~]# docker start [选项] <镜像1> [<镜像2> <镜像3>...]
[root@localhost ~]# docker stop [选项] <镜像> [<镜像2> <镜像3>...]
[root@localhost ~]# docker restart [选项] <镜像1> [<镜像2> <镜像3>...]
实例
启动已被停止的容器 myrunoob
docker start myrunoob
停止运行中的容器 myrunoob
docker stop myrunoob
重启容器 myrunoob
docker restart myrunoob
查看容器
使用docker ps
命令可以查看正在运行的容器,格式为:
[root@localhost ~]# docker ps [选项]
选项:
- -a :显示所有的容器,包括未运行的。
- -f :根据条件过滤显示的内容。
- -l :显示最近创建的容器。
- -n :列出最近创建的n个容器。
- --no-trunc :不截断输出(打印完整的容器 ID)。
- -s :显示总的文件大小。
[root@localhost ~]# docker run -p 8080:8080 -d tomcat
ed8b228b1e55845241c26e8ede042bae4132700d7334ae44438ce0e60282ff3c
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed8b228b1e55 tomcat "catalina.sh run" 8 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp elastic_gauss
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
进入容器
docker exec :在运行的容器中执行命令
语法
[root@localhost ~]# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
- -d :分离模式(守护态): 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
实例
在容器 tomcat 中开启一个交互模式的终端:
[root@localhost ~]# docker exec -it tomcat /bin/bash
root@99da97385e5f:/usr/local/tomcat#
删除容器
可以使用docker container rm
来删除一个处于终止状态的容器。例如
[root@localhost ~]# docker container rm 99da97385e5f
如果要删除一个运行中的容器,可以添加-f
参数。Docker 会发送 SIGKILL( 终止进程)
信号给容器。
删除所有容器
docker rm $(docker ps -a -q)
清理所有处于终止状态的容器
用docker container ls -a
命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
[root@localhost ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] (输入)y
Deleted Containers:
82ab3ce8fee74e258d90ab6984ec5dc3e5cdf453e8a3c92a1b18ce054b6a5a56
ed8b228b1e55845241c26e8ede042bae4132700d7334ae44438ce0e60282ff3c
...
Total reclaimed space: 4.818MB