前段时间在做 Wechaty 相关的项目,使用 Docker 的体验远远要超出我之前的想象。不管是开发过程中还是开发之后交付的流程都会简化很多。
以下是我目前一些整理,之后可能会有更深度的学习吧!
Docker 是什么
Docker 是基于 Go 语言实现的云开源项目,诞生于 2013 年初,最初是由 dotCloud 公司发起。
通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里应用组件,即可以是 Web 应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。
Docker 由镜像(Image)、容器(Container)、仓库(Repository) 三大核心组成。
优势
- 更快速的交付和部署:
- 开发人员可以通过镜像来快速构建一套标准的开发环境;
- 开发完成之后,测试和运维人员也可以直接使用相同环境来部署代码。
- 更轻松的迁移和扩展: Docker 容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,在不同的平台可以很轻松地迁移应用。
- 更简单的更新管理: 使用 Dockerfile,只需要修改小小的配置,就可以替代以往大量的更新工作。
场景示例-传统开发流程
场景示例-Docker 环境开发流程
与传统虚拟机对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
常用指令
1 | # 查看docker版本 |
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
- **-a stdin:** 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- **-d:** 后台运行容器,并返回容器ID;
- **-i:** 以交互模式运行容器,通常与 -t 同时使用;
- **-p:** 端口映射,格式为:**主机(宿主)端口:容器端口**
- **-t:** 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- **--name="nginx-lb":** 为容器指定一个名称;
- **--dns 8.8.8.8:** 指定容器使用的DNS服务器,默认和宿主一致;
- **--dns-search example.com:** 指定容器DNS搜索域名,默认和宿主一致;
- **-h "mars":** 指定容器的hostname;
- **-e username="ritchie":** 设置环境变量;
- **--env-file=[]:** 从指定文件读入环境变量;
- **--cpuset="0-2" or --cpuset="0,1,2":** 绑定容器到指定CPU运行;
- **-m :**设置容器使用内存最大值;
- **--net="bridge":** 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- **--link=[]:** 添加链接到另一个容器;
- **--expose=[]:** 开放一个端口或一组端口;
1 | # 查看最新创建的容器 |