1.docker基础命令
在我们学习具体的命令之前,我们先要注册一个docker的账号
https://www.docker.com/(进入网址即可注册)
镜像仓库命令
下面是使用实战
docker login
关键参数
○ -u : 登陆的用户名
○ -p : 登陆的密码
docker pull
关键参数
○ -a : 拉取所有 tagged 镜像
○ --disable-content-trust : 忽略镜像的校验 , 默认开启
可以直接拉取对应的名字+标签或者对应的digest也可以。
docker push
○ -a : 推送所有 tagged 镜像
○ --disable-content-trust : 忽略镜像的校验 , 默认开启
(不过由于中国ip被墙了,暂时无法推送到docker的仓库,后期可以改成阿里云或者私人仓库)
docker search
关键参数
○ --no-trunc : 显示完整的镜像描述;
○ -f < 过滤条件 >: 列出收藏数不小于指定值的镜像。
# 从 Docker Hub 查找所有镜像名包含 nginx ,并且 star 数大于 10 的镜像
docker search -f stars=10 nginx
docker logout
docker logout即可登出仓库
2.Docker Image(镜像)
1.Docker 镜像是什么
• Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、
源码、库文件、依赖、工具等一些运行 application 所必须的文件。
• 我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多
容器。
• image 里面是一层层文件系统 Union FS 。联合文件系统,可以将几层目录挂载到
一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层 layer ,联合文件系统可以对每一层文件系统设置三
镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层
的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可
见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到
一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
2.为什么需要镜像
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端
和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操
作,非常费劲。
然而, Docker 镜像就是为了解决这个小小的 打包 功能,突然一夜之间成名。那么,你
可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如
何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成
一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环
境用的操作系统一摸一样。
是联合文件系统 (UnionFS) ,其文件系统是分层的。这样既可以充分利用共享层,又可
以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的
将其用于个人用途或与其他 Docker 用户公开 共享 。
删除本地镜像
镜像命令[部分]
1.docker images
关键参数
○ -a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
○ --digests : 显示镜像的摘要信息;
○ -f : 显示满足条件的镜像;
○ --format : 指定返回值的模板文件;
○ --no-trunc : 显示完整的镜像信息;
○ -q : 只显示镜像 ID 。
2.docker image inspect
查看镜像详细信息
3. docker tag
4.docker rmi
○ -f : 强制删除;
○ --no-prune : 不移除该镜像的过程镜像,默认移除;
5.docker save
○ -o : 输出到的文件。
6.docker load
○ --input , -i : 指定导入的文件,代替 STDIN 。
○ --quiet , -q : 精简输出信息
7.docker history
○ -H , --human : 大小和日期采用人容易读的格式展现
○ --no-trunc : 显示全部信息,不要隔断;
○ -q, --quiet: 只显示镜像 id 信息;
8.docker image prune
删除不使用的镜像。
○ -a , --all : 删除全部不使用的镜像;
○ --filter filter: 指定过滤条件;
○ -f, --force : 不提示是否删除;
3.容器
什么是容器?
器有初建、运行、停止、暂停和删除五种状态。
源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,
这是容器与直接运行在主机上进程的本质区别。
容器层,该层允许修改镜像的整个副本
为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,
只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
容器的生命周期
1. created :初建状态
2. running :运行状态
3. stopped :停止状态
4. paused : 暂停状态
5. deleted :删除状态
各生命周期之间的转换关系如图所示:
容器命令[部分]
1. docker run
功能
创建一个新的容器并运行一个命令
关键参数
○ -e username="ritchie": 设置环境变量;
○ --volume , -v: 绑定一个卷
我们先先拉一个centos:7下来,然后运行这个容器。
映射端口的使用
其余的大家可以自己尝试,不过多赘述
2.docker ps
关键参数
○ -f : 根据条件过滤显示的内容。
○ --format : 指定返回值的模板文件。如 json 或者 table
○ --no-trunc : 不截断输出。
○ -s : 显示总的文件大小。
3.docker create
创建一个新的容器但不启动它
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -e username="ritchie": 设置环境变量;
○ --volume , -v: 绑定一个卷
○ --restart : 自动重启
与docker run几乎一样,只是少一个-d选项。
4.docker logs
○ -f ,--follow: 跟踪日志输出
○ --since : 显示某个开始时间的所有日志
○ -t,--timestamps : 显示时间戳
.
5. docker attach
连接到正在运行中的容器
○ --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的 话不会影响容器,否则退出会导致容器退出。
6. docker exec
在容器中执行命令
○ -d : 分离模式 : 在后台运行
○ -i : 即使没有附加也保持 STDIN 打开
○ -t : 分配一个伪终端
○ -e : 设置环境变量
○ -u,--user : 指定用户 "<name|uid>[:<group|gid>]"
○ -w,--workdir: 指定工作目录
(通常使用-it配合bash命令,进入容器进行操作)
7. docker start
8. docker stop
-s 发送SIGTERM信号
9. docker kill
-s发送SIGKILL信号
Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号
10. docker restart
11. docker top
12. docker stats
○ --format : 指定返回值的模板文件。如 table,json
○ --no-stream : 展示当前状态就直接退出了,不再实时更新。
○ --no-trunc : 不截断输出。
返回报文
MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。
NET I/O: 容器通过其网络接口发送和接收的数据量。
BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。
PIDs: 容器创建的进程或线程数。
13. docker container inspect
○ -f : 指定返回值的模板文件。如 table 、 json
○ -s : 显示总的文件大小。
14. docker port
的端口。
15. docker cp
在容器和宿主机之间拷贝文件
16. docker diff
检查容器里文件结构的更改
17. docker commit
从容器创建一个新的镜像。
○ -a : 提交的镜像作者;
○ -c : 使用 Dockerfile 指令来创建镜像;可以修改启动指令
○ -m : 提交时的说明文字;
18.docker pause
暂停容器中所有的进程。
19. docker unpause
恢复容器中所有的进程。
20. docker rm
○ -f :通过 SIGKILL 信号强制删除一个运行中的容器。
21. docker export/import
○ -o:写入到文件。
○ -m : 提交时的说明文字
22. docker wait
阻塞运行直到容器停止,然后打印出它的退出代码。
23. docker rename
重命名容器
24. docker container prune
○ -f, --force:不提示是否进行确认
25. docker update.
更新容器配置
○ --cpus:cpu 数量
○ --cpuset-cpus : 使用哪些 cpu
○ --memory : 内存限制
○ --memory-swap :交换内存
配
○ --cpu-quota : 是用来指定在这个周期内,最多可以有多少时间用来跑这个容
器
总结
常见问题
则可以使用此命令启动它。
取映像。
导出的文件大,很好理解,因为会保存镜像的所有历史记录。
会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将
保存完整记录,体积也会更大。
docker rmi : 删除一个或多个镜像
Docker Volume(存储卷)
什么是存储卷?
存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上
的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,
在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目
录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿
是同步的
为什么需要存储卷?
1. 数据丢失问题
容器按照业务类型,总体可以分为两类:
• 无状态的(数据不需要被持久化)
• 有状态的(数据需要被持久化)
意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL 、 Kafka 等有状
态的业务。因此为了解决有状态业务的需求, Docker 提出了卷( Volume )的概念。
2. 性能问题
UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如
redis 在实现持化存储时,是在底层存储时的性能要求比较高。
3. 宿主机和容器互访不方便
存储卷分类
建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定
那些使用目录,临时存储比较适合 ;
• bind mount 绑定数据卷 ,映射到宿主机指定路径下,在 宿主机上 的路径要人工的
联关系
mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。
管理卷 Volume
创建卷
方式一:Volume 命令操作
docker volume create
• 功能
○ 创建存储卷
○ -d, --driver : 指定驱动,默认是 local
○ --label : 指定元数据
创建匿名卷
创建命名卷
docker volume inspect
查看卷详细信息
• 关键参数
○ -f : 指定相应个格式,如 json
docker volume ls
• 功能
○ 列出卷
关键参数
○ --format : 指定相应个格式,如 json,table
○ --filter,-f: 过滤
○ -q: 仅显示名称
docker volume rm
• 功能
○ 删除卷,需要容器不使用。
• 关键参数
○ -f,--force: 强制删除
docker volume prune
• 功能
○ 删除不使用的本地卷
• 关键参数
○ --filter: 过滤
○ -f, --force : 不提示是否删除
方式二:-v 或者--mount 指定
-v 和 -mount 都可以完成管理卷的创建
-v 参数
• 功能:
完成目录映射
docker run -v name:directory[:options]
• 参数
○ 第一个参数:卷名称
○ 第二个参数:卷映射到容器的目录
○ 第三个参数:选项,如 ro 表示 readonly
--mount 参数
• 功能:
完成目录映射
• 关键参数
○ type : 类型表示 bind , volume , or tmpfs
○ source , src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
○ ro,readonly: 只读方式挂载
方式三:Dockerfile 匿名卷
中详细讲解。
绑定卷 bind mount
-v 和 -mount 都可以完成绑定卷的创建
创建卷
-v 参数创建卷
• 功能:
完成卷映射
临时卷 tmpfs
临时卷数据位于内存中,在容器和宿主机之外。
tmpfs 局限性
• 这个功能只有在 Linux 上运行 Docker 时才可用
创建卷
方式一:指定--tmpfs 创建
•
功能:
完成临时卷映射
方式二:--mount 指定参数创建
• 功能
完成目录映射
•
关键参数
○ type : 类型表示 bind , volume , or tmpfs
○ tmpfs-size : tmpfs 挂载的大小(以字节为单位)。默认无限制。
○ tmpfs-mode : tmpfs 的八进制文件模式。例如, 700 或 0770 。默认为 1777
或全局可写。
总结
常见问题
1. 什么时候用 Volume ,什么时候用 bind 、 tmpfs ?
景
bind : bind mount 完全是依赖于主机的目录结构和操作系统,用于目录需要提前规划,
比如 mysql 的目录需要个空间大的,其他服务有不占用的时候,用 volume 就不太合
适了
tmpfs :用于敏感文件存储,文件不想存储的宿主机和容器的可写层之中
扩展思考:存储卷在实际研发中带来了哪些问题
1. 跨主机使用
docker 存储卷是使用其所在的宿主机上的本地文件系统目录,也就是宿主机有一块磁
所以未来应用的存储和数据往往分离,越来越多的分布式存储方案出现,如 s3 系列,
nfs 等。
2. 启动参数未知
这就是容器编排工具的作用。
就需要 专业的容器编排工具
这种一般像开源的 k8s ,各个云厂商也有自己的企业版编排软件。
3. 复杂场景仍然需要运维
对于有状态要持久的集群化组件,如 mysql 的主从。部署维护一个 Mysql 主从需要运
维知识、经验整合进去才能实现所谓的部署,扩展或缩容,出现问题后修复,必须要
了解集群的规模有多大,有多少个主节点,有多少个从节点,主节点上有多少个库,
这些都要一清二楚,才能修复故障,这些就 强依赖于运维经验
这种复杂的场景往往还是需要人力,很难有完美的工具出现。
Docker Network(网络)
Docker 为什么需要网络管理
问题, 比如
• 多个容器之间是如何通信的
• 容器和宿主机是如何通信的
• 容器和外界主机是如何通信的
以访问这些容器内运行的网络应用应该如何实现
• 容器根本不需要网络的时候应该如何实现
该如何实现
• 上述的这些问题都需要我们对容器的网络进行合理的管理才能解决,这就体现出了容
器网络管理的重要性。
Docker 网络架构简介
Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作
路由表、防火墙等等与网络相关的模块。
CNM
Docker 网络架构采用的设计规范是 CNM ( Container Network Model )。 CNM 中规定
了 Docker 网络的基础组成要素: Sandbox 、 Endpoint 、 Network 。
环境。
• Network: Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
• Endpoint:就是虚拟网络的接口,就像普通网络接口一样, Endpoint 的主要职责
是负责创建连接。 Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只
Libnetwork
Libnetwork 是 CNM 的一个标准实现。 Libnetwork 是开源库,采用 Go 语言编写(跨
平台的),也是 Docker 所使用的库, Docker 网络架构的核心代码都在这个库中。
Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基
驱动
驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。
驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。
Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver 、
Host Driver 、 Overlay Driver 、 MacVLan Driver 、 IPVLan Driver 、 None Driver 等
等。每个驱动负责创建其上所有网络资源的创建和管理。
常见网络类型
1. bridge 网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上
接网络是最佳选择。
2. host 网络
是最佳选择。
3. container 网络
4. none 网络
隔离。
5. overlay 网络
借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个
Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同
Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆
盖网络是最佳选择。
另外,在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,它是一个网 桥设备,主要用于 Docker 各容器及宿主机的网络通信。
docker 网络管理命令
docker network create
• 功能
○ 创建自定义网络
•
关键参数
○ -d, --driver : 网络驱动
○ --gateway : 网关地址
○ --subnet : 表示网段的 CIDR 格式的子网
○ --ipv6 : 启用 ipv6
• 样例
Shell
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
docker network inspect
• 功能
○ 查看网络详情.
• 关键参数
○ -f,--format: 指定格式
• 样例
Shell
docker network inspect mynetwork
docker network connect
• 功能
一网络中的其他容器通信。
• 关键参数
○ --ip : 指定 IP 地址
○ --ip6 : 指定 IPv6 地址
• 样例
Shell
将正在运行的容器连接到网络
$ docker network connect multi-host-network my_container1
启动时将容器连接到网络
接到网络。
$ docker run -itd --network=multi-host-network busybox-container
$ docker network connect --ip 10.10.36.122 multi-host-network container2
docker network disconnect
• 功能
○ 断开网络
• 语法
Shell
docker network disconnect [OPTIONS] NETWORK CONTAINER
• 关键参数
○ -f: 强制退出
• 样例
Shell
$ docker network disconnect multi-host-network my_container1
docker network prune
• 功能
○ 删除不使用的网络
• 语法
Shell
docker network prune [OPTIONS]
• 关键参数
○ -f, --force : 不提示
Shell
docker network prune
docker network rm
• 功能
○ 删除 1 个或者多个网络
• 语法
Shell
docker network rm NETWORK [NETWORK...]
• 关键参数
○ -f: 强制退出
docker network rm br0
docker network ls
• 功能
○ 列出网络
• 语法
Shell
docker network ls [OPTIONS]
• 别名
Shell
docker network list
• 关键参数
○ -f, --filter: 指定过滤条件
○ --format: 指定格式
○ --no-trunc: 不截断
○ -q, --quiet : 仅仅显示 id
• 样例
Shell
docker network list
网络详解
docker Bridge 网络
网络介绍
Docker Bridge 网络采用内置的 bridge 驱动, bridge 驱动底层采用的是 Linux 内核中
Linux bridge 技术。就网络而言, bridge 网络是在网络段之间转发流量的链路层设备,
而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使
接到该网桥网络容器的隔离。
默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络。
docker Host 网络
网络介绍
用宿主机的 IP 和端口。
们可以通过 --network=host 指定使用 host 网络。
docker none 网络
网络介绍
网卡。
使用场景
• 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 比
如生成随机密码, 避免生成密码被第三方获取。
方自己来配置。
Docker Compose(容器编排)
什么是 Docker Compose
Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器
的应用。
•
•
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周
期管理。 通过 compose 可以方便的管理多个服务。
为什么要 Docker Compose
个进程 。
• 如果一个应用需要涉及到 MySQL 、 nginx 等环境, 那么我们需要分别为应用、数
三次, 或者写一些脚本来实现, 这样会比较繁琐。
compose 来解决这类型的问题
Docker Compose 的功能
1. 使用步骤
Compose 使用的步骤:
一起运行。
2. 核心功能
Compose 具有管理应用程序整个生命周期的命令:
• 启动,停止和重建服务
• 查看正在运行的服务的状态
• 流式传输运行服务的日志输出
• 在服务上运行一次性命令
文件基本结构及常见指令
YAML
version: "3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本
services: # 服务,可以存在多个
servicename: # 服务名字,它也是内部 bridge 网络可以使用的 DNS name,
如果不是集群模式相当于 docker run 的时候指定的一个名称,#集群(Swarm)模式是多个容器的逻辑抽象image: # 必选,镜像的名字command: # 可选,如果设置,则会覆盖默认镜像里的 CMD 命令environment: # 可选,等价于 docker container run 里的 --env 选项
设置环境变量volumes: # 可选,等价于 docker container run 里的 -v 选项 绑定数据
卷networks: # 可选,等价于 docker container run 里的 --network 选项
指定网络ports: # 可选,等价于 docker container run 里的 -p 选项指定端口映
射expose: # 可选,指定容器暴露的端口build: #构建目录depends_on: #服务依赖配置env_file: #环境变量文件servicename2:image: command: networks: ports: servicename3:#...
volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create
常见字段格式语法
image
指定容器运行的镜像。以下格式都可以:
command
覆盖容器启动的默认命令。
entrypoint
也可以是以下格式:
Shell
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以
确保 YML 解析器不会将其转换为 True 或 False 。
networks
指定容器运行的网络:
配置容器网络
如果要配置更多的信息,例如下图配置ipv4地址的信息
volumes
将主机的数据卷或者文件挂载到容器里。
ports
指定端口映射。以下格式都可以:
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
• context:上下文路径。
• args:添加构建参数,这是只能在构建过程中访问的环境变量。
• labels:设置构建镜像的标签。
depends_on
设置依赖关系。
redis ,才会启动 web 。
redis 之前停止。
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
Docker Compose 命令清单
官网参考地址:https://docs.docker.com/compose/reference/
命令格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的
服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服
务都会受到命令影响。
docker-compose 命令的基本的使用格式为