docker

Posted by jabin on January 5, 2019

一、 定义和实现技术—整合现有的

  1. 定义:以容器技术为核心的IT标准化构建体系
  2. 隔离和资源限定: LXC
  3. 安全:GRSec
  4. 镜像文件:AUFS some_text

二、目的

  1. 开发环境和生产环境一致! Build once, run anywhere(轻量)
  2. 独立的服务/应用在不同的环境中, 得到相同的运行结果

三、常用命令、实例

https://github.com/deeponder/dockerbook-code

四、核心组件

  1. Docker客户端和服务器
  2. Registry—镜像仓库
  3. Docker镜像—由基础镜像(FROM), 一层层叠加镜像,最后在最顶层加载一个读写层,运行程序,写时复制 图片描述

  4. docker容器—镜像是docker生命周期中构建和打包阶段,容器是启动和执行阶段

五、容器的使用

https://github.com/deeponder/dockerbook-code/tree/master/3 建议单个容器只运行一个服务或者进程, 微服务、分布式、扩展

  1. 自动重启容器 –restart
  2. 容器的监控统计 docker stats xxxx
  3. 日志驱动 若启用syslog, 则docker logs无日志
  4. 要保持容器的活跃装填, 运行的程序不能中断!
  5. 容器和宿主端口映射 -p 8080:80 容器80端口绑定到主机8080
  6. 特权模式(容器中运行容器) –privileged

六、镜像的使用

https://github.com/deeponder/dockerbook-code/tree/master/4

  1. 同个仓库(服务/应用)可以有多个镜像 tag

七、镜像的构建

1. 方式

  1. commit命令
  2. Dockerfile(推荐)

2. Dockerfile 构建步骤

  1. 创建一个目录(如:webapp)作为我们的构建环境
  2. 在构建环境新建Dockerfile文件, 编写构建指令, 每条指令都创建一个新的镜像层并提交
  3. 通过docker build -t deeponder/webapp:v1 . 完成基于Dockerfile的镜像构建
  4. Push到指定的镜像仓库

3. 常用Dockerfile指令

  1. 除非用host网络模式,否则需要通过EXPOSE 暴露需要用到的端口, 特别注意程序的默认端口
  2. CMD, ENTRYPOINT, WORKDIR, ENV(设置一些环境变量,代理等), USER(指定用户运行), VOLUME(目录挂载),ADD(自动解压)/COPY(自动创建目录)

八、卷

1. 是什么

存在于宿主机器中, 被一个或多个容器选定的目录,用于共享和持久化数据, 不跟镜像走。

2. 场景

  1. 多个容器共享的配置/代码
  2. 不想改动,就重新构建镜像

3. 示例

$ sudo docker run -d -p 80 --name website \
	  -v $PWD/website:/var/www/html/website \
	  deeponder/nginx nginx:v1

九、网络

1. 内部如何联网—未指定net, 默认用这种bridge

  1. 通过veth*接口绑定到docker0网桥,创建了一个虚拟子网,该子网由宿主机和各个容器共享
  2. 容器地址的下一跳都是先到docker0, 通过traceroute 跟踪
  3. IPTables NAT 路由配置

2. container

  1. 先创建一个网络, 在这个网络下启动容器
  2. 支持随时加入和退出这个桥接网络
  3. 本地访问

3. Host

直接用宿主机的IP地址, 隔离型不好。

十、Docker编排

K8s, swarm, mesos, Docker Compress (待续)