docker知识点整理

前段时间在做 Wechaty 相关的项目,使用 Docker 的体验远远要超出我之前的想象。不管是开发过程中还是开发之后交付的流程都会简化很多。

以下是我目前一些整理,之后可能会有更深度的学习吧!

Docker 是什么

  Docker 是基于 Go 语言实现的云开源项目,诞生于 2013 年初,最初是由 dotCloud 公司发起。
  通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里应用组件,即可以是 Web 应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。
  Docker 由镜像(Image)、容器(Container)、仓库(Repository) 三大核心组成。

优势

  1. 更快速的交付和部署:
    • 开发人员可以通过镜像来快速构建一套标准的开发环境;
    • 开发完成之后,测试和运维人员也可以直接使用相同环境来部署代码。
  2. 更轻松的迁移和扩展: Docker 容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,在不同的平台可以很轻松地迁移应用。
  3. 更简单的更新管理: 使用 Dockerfile,只需要修改小小的配置,就可以替代以往大量的更新工作。

场景示例-传统开发流程

传统开发

场景示例-Docker 环境开发流程

Docker环境开发

与传统虚拟机对比

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于原生
系统支持量 单机支持上千个容器 一般几十个

常用指令

1
2
3
4
5
6
# 查看docker版本
docker version
# 显示docker系统的信息
docker info
# 日志信息
docker logs
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
2
3
4
5
6
7
8
# 查看最新创建的容器
docker ps -l
# 启动一个或多个已经被停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 停止一个或多个运行中的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]