[TOC]
docker 是什么
- docker 是一个基于镜像的应用容器引擎,它用于管理应用。
- 如虚拟操作系统一般,docker虚拟了进程,将程序运行环境和操作系统剥离。虚拟操作系统的虚拟是在硬件上,docker的虚拟是相当于在操作系统上多了一层。
- 有很多可以类比的,如JVM隔离了java程序和操作系统,实现了跨平台。又例如python的虚拟环境将程序执行环境和系统环境剥离。
docker优点
docker 解决的问题就是程序运行的环境问题,镜像一次创建,到处运行(因为有内核支持)
- 并且极高的启动速度。
- 和虚拟机相比,占用极少的io,磁盘资源。
虚拟化技术
沙箱
Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。其为一个独立的虚拟环境,可以用来测试不受信任的应用程序或上网行为。
例如:GreenBorder为IE和firefox构建了一个安全的虚拟执行环境。用户通过浏览器所作的任何写磁盘操作,都将重定向到一个特定的临时文件夹中。这样,即使网页中包含病毒,木马,广告等恶意程序,被强行安装后,也只是安装到了临时文件夹中,不会对用户pc造成危害。(这里的临时文件夹就是一个沙箱)。
LXC
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。镜像包含了容器应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
和虚拟化的区别
- 虚拟化使得许多操作系统可同时在单个系统上运行。
- 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。
docker使用
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。 Docker容器通过 Docker镜像来创建。容器(对象)与镜像(类)的关系类似于面向对象编程中的对象与类.。
Docker采用C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信。Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon 交互。
Dockerfile
Dockerfile一般包含下面几个部分:
- 基础镜像:以哪个镜像作为基础进行制作,用法是FROM 基础镜像名称
- 维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER 名字/邮箱
- 镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN 命令
- 容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD 命令或ENTRYPOINT
编写 Dockerfile 常用指令
1 | 指定容器运行的用户 |
Dockerfile golang代码示例
1 | FROM registry.cn-zhangjiakou.aliyuncs.com/xiaoduoai/golang:1.13-pulsar2.41 |
docker指令
1 | docker --help |
镜像指令
1 | 从Dockerfile创建镜像 |
容器指令
1 | 创建容器 |
启动 redis 容器
基本启动方式
1 | 镜像: redis:5.0.5。 或者国内镜像副本: daocloud.io/library/redis:latest |
指定配置文件
redis默认是没有配置的,需要手动加配置,然后后面加上配置。
从这里搞到配置文件:https://gitee.com/percyg/redis, 并修改对应的项
1 | docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis daocloud.io/library/redis:latest redis-server /usr/local/etc/redis/redis.conf |
启动 mongo 容器
1 | 关闭 |
docker的网络类型
docker四种网络模式如下:
- Bridge contauner 桥接式网络模式(默认)
- Host(open) container 开放式网络模式,和宿主机共享网络
- Container(join) container 联合挂载式网络模式,和其他容器共享网络
- None(Close) container 封闭式网络模式,不为容器配置网络
可以通过docker network命令查看
1 | docker network ls |
bridge网络模式—默认
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,所以有默认地址172.17.0.0/16的地址。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
Host类型
简介:与主机共享Network Namespace,–net=host, 容器IP、主机名与宿主机一致
docker-compose
1 | 方法一 |
镜像
大小
- 相同的基础镜像会被复用,减少文件占用
- 镜像的大小就是每一层大小的累加
镜像系统
- 首先需要区分Linux内核与Linux发行版
- Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等…
- Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等…
- Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块
- Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程
- Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数
容器的理解
- 基础镜像是一个包含rootfs的镜像。Kernel启动后是需要把启动文件解压到rootfs上的,然后kernel找到init文件启动就可以得到一个Linux环境了,Docker做的事情就是模拟这个过程,让kernel给出一个独立的隔离环境。
参考
docker镜像仓库:https://hub.docker.com/explore/
极客学院:http://wiki.jikexueyuan.com/project/docker-technology-and-combat/
dockerfile: https://www.cnblogs.com/wangmo/p/6811321.html
docker run:http://dockone.io/article/152