查看镜像
注意:本地镜像一般存储在/var/lib/docker
目录下
1 | docker images # 列出宿主机下的所有本地镜像,也可以使用命令`docker image ls` |
1 | # 输出信息 |
搜索镜像
1 | docker search 镜像名称 # 在远程仓库中通过名称搜索镜像 |
1 | # 输出信息 |
拉取镜像
1 | docker pull 镜像名称 # 从远程仓库中拉取镜像,默认拉取最新版本 |
上传镜像
1 | docker image push 镜像名称:标签 # 把镜像上传到镜像仓库 |
导出镜像
1 | docker image save 镜像名称:标签 -o 压缩包名 # 导出指定的镜像并命名,也可以根据镜像id导出 |
导入镜像
1 | docker image load -i 镜像压缩包名 # 导入一个镜像 |
给镜像打上标签
注意:镜像的标签一个重要作用是指定仓库信息,这在拉取和上传的时候非常关键
1 | docker image tag 镜像id 镜像名称:命名标签 # 给镜像命名一个标签,可以多次命名,会显示不同的镜像 |
删除镜像
注意:如果通过某个镜像创建了容器,则该镜像无法删除。需要先删除镜像中的容器,再删除该镜像。
1 | docker rmi 镜像id # 通过镜像id删除镜像,可以一次删除多个,以空格分隔不同的镜像id |
构建镜像
docker build
命令是根据 Dockerfile 和上下文构建镜像,Dockerfile和上下文目录中的全部文件会被发送到Docker的守护进程中,执行解析和分层构建镜像,构建完成之后发送给客户端。
1 | docker build 上下文路径 # 基于Dockerfile构建镜像,默认是上下文路径中的Dockerfile文件 |
查看镜像构建历史
1 | docker image history 镜像名称:标签 # 输出镜像历史 |
查看镜像属性
1 | docker image inspect 镜像名称:标签 # 输出镜像信息是json类型的数据 |
查看容器
1 | docker ps # 查看正在运行的容器,也可以使用命令`docker container ls` |
1 | # 输出信息 |
创建容器
1 | docker create 镜像名称:标签 # 基于镜像创建一个容器,优先选择本地镜像,如果本地不存在则自动去镜像仓库拉取 |
运行容器
1 | docker start 容器id # 基于容器id启动一个容器,也可以根据容器名称启动 |
创建并启动容器
1 | docker run [OPTIONS] 镜像名称:标签 [COMMAND] [ARG...] # 命令格式 |
停止容器
1 | docker stop 容器id/容器名称 |
强行停止容器
1 | docker kill 容器名称 # 不建议使用 |
重启容器
1 | docker restart 容器id/容器名称 |
暂停和继续容器
1 | docker pause 容器id/容器名称 # 暂停运行 |
删除容器
1 | docker rm 容器id/容器名称 |
重命名容器
1 | docker rename 原容器名 新容器名 |
显示容器信息
1 | docker inspect 容器id/容器名称 # 同样输出json数据,可以通过 -f 选项根据键值取出 |
查看容器端口映射关系
1 | docker port 容器id/容器名称 |
查看容器的资源占用情况
1 | docker stats # 查看正在运行的容器的资源占用情况 |
登录一个守护式进程
1 | docker exec -it 容器id/容器名称 /bin/bash |
文件拷贝
1 | # 将宿主机文件拷贝到容器内 |
查看日志
1 | docker logs 容器id/容器名称 # 查看容器日志,可通过选项控制显示时间戳和控制输出哪部分日志 |
导出镜像
1 | docker commit 容器id/容器名称 镜像名称:标签 # 根据容器导出镜像,通常不用此种方式,而是使用dockerfile |
首次创建并启动容器时,使用docker run
命令,可选选项比较多,所以单独拿出来介绍。
命令格式:
1 | docker run [OPTIONS] 镜像名称:标签 [COMMAND] [ARG...] |
常用选项:
1 | -i 表示运行容器,通常和 -t 搭配使用 |
为了保证容器运行时健壮性(自愈),Docker 为容器提供了重启策略,即让容器在退出时自动尝试重启。
实现方式
实现的方式是在运行docker容器时使用参数--restart
,注意:当手动执行容器 stop 时, --restart
失效,容器不再尝试重启。
1 | docker run -itd --restart=重启策略 镜像名称:标签 |
Docker容器的重启策略是基于容器的退出状态码,类似于Linux命令的退出状态码,具体如下:
1 | 0 表示容器正常退出,例如 stop 容器。非0表示容器退出异常,例如执行 docker run 失败后的容器退出。 |
获取退出状态码
1 | # 方式1 |
容器启动时忘记配置重启策略的解决方法
1 | # 方式1 |
当启动了Docker守护进程后,宿主机内部会多一块网卡docker0
,并随即分配了一个IP地址(通过NAT实现的),当我们启动一个docker容器之后,又会多出一块随机命名的虚拟网卡,这是通过docker内部的交换机实现的。如果启动容器时,不指定端口映射,那么容器内部是封闭的,无法通过外部网络访问到容器内部,所以启动docker时一般会指定端口映射。
启动了端口映射之后,docker会自动帮我们写好iptables规则,并且启动一个docker-proxy的进程来监听相应的端口,防止重复配置端口映射信息。
以下是docker中常见的端口映射写法(将以容器的80
端口为例):
自动随机端口映射
1 | docker run -d -P 容器id/容器名称 # 容器和宿主机的端口将随机映射 |
指定端口,绑定服务器所有网卡
1 | docker run -d -p 8888:80 容器id/容器名称 # 容器的80端口将绑定宿主机所有网卡的8888端口 |
绑定指定网卡的指定端口
1 | docker run -d -p 网卡IP:8888:80 容器id/容器名称 # 容器的80端口将绑定宿主机指定网卡的8888端口,这样的方式可以实现宿主机的多个网卡能够绑定不同容器的80端口。 |
绑定指定网卡的随机端口
1 | docker run -d -p 网卡IP::80 容器id/容器名称 # 容器的80端口将绑定宿主机指定网卡的随机端口 |
使用UDP协议的端口映射
1 | docker run -d -p 网卡IP::80/udp 容器id/容器名称 # 若不指定,默认是TCP协议,在实际工作中,很多服务都是基于udp的,比如DHCP,DNS(TCP/UDP的53d端口),chrony,SNMP(161端口) |
什么是存储卷
卷”是容器上的一个或多个目录,此类目录可绕过docker的UnionFS,与宿主机上的某个目录绑定关联,类似于挂载。这种在宿主机上能够被共享的目录(也可以是文件)就被称为存储卷(volume)。
Docker的存储卷是一种特殊的目录,可用于在容器和主机之间持久化和共享数据。它们允许容器中的数据在容器停止和删除后仍然存在,并允许多个容器共享同一个存储卷,使用存储卷可以使容器中的数据持久化,并且可以在多个容器之间共享相同的数据。这使得容器更加灵活和可靠,同时也简化了容器的管理和部署。
使用存储卷的意义
当我们希望在容器内更新代码时,比如容器运行着nginx业务,我们需要替换到nginx站点目录中的业务代码,应该怎么做?
我们知道容器中的文件,是可以在宿主机的指定目录中找到的,通过docker inspect -f '{{.GraphDriver.Data.MergedDir}}' 容器id/容器名称
命令可以查看,我们可以将代码文件放置到该目录下的指定文件夹中即可。另一种方式也很容易想到,就是容器的docker cp
命令,将宿主机上的文件复制到容器的指定目录。
使用上面的方法固然可以,但是如果存在多个容器,就需要将同一份数据拷贝到多个不同的容器内部,过于繁琐。所以推荐使用存储卷的方式。
使用存储卷的好处:
使用存储卷的方法
Docker的存储卷有两种挂载方法:匿名挂载和命名挂载。
匿名挂载
在上面的命令中提到过,在创建并运行容器的时候,可以指定目录挂载:
1 | docker run -d -v 宿主机目录:容器内目录 镜像id/镜像名称 # 启动时挂载了目录 |
命名挂载
1 | docker run -d -v 存储卷名称:容器内目录 镜像id/镜像名称 # 启动时使用存储卷挂载,存储卷需要提前创建 |
存储卷相关命令
1 | docker volume create 存储卷名称 # 创建一个存储卷,存储卷的存放位置在`/var/lib/docker/volumes` |
Docker 创建一个容器的时候,会执行如下操作:
网络类型
Docker有五种网络类型:
1 | bridge: 默认类型,桥接到宿主机docker0的网络,类似于VM的Nat模式。 |
指定网络类型的方法
在容器启动时指定网络类型
1 | docker run -itd --network 网络名称 镜像id/镜像名称 # 如果不指定,默认是bridge模式,可选:`none`,`host`,或者用户自定义的网络 |
在容器创建之后再指定网络类型
1 | docker network connect 网络名称 容器名称 # 如果容器已经建立,可以通过此命令来让这个容器加入网络,重新分配IP地址 |
Docker网络常用命令
Docker网络的命令格式为docker network command
1 | docker network connect 网络名称 容器名称 # 将一个容器连接进网络,如果容器已经建立,可以通过此命令来让这个容器加入网络,重新分配IP地址 |