docker理念
docker解决的问题
docker解决了开发、部署各个环境的差异,将运行文档、配置环境、运行环境、运行依赖包、操作系统等都打一个镜像中整体交付,由原来的代码即应用转变的现在的镜像即应用。
docker是解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术(CICD)
CICD是通过构建流水线实现一系列自动化的动作,编译、打包、部署、单元测试、接口测试发布等;是实现devops的途径(开发运维一体化,开发自运维)
docker与虚拟机
参考文章docker的特点:轻量级虚拟化;容器间隔离(进程隔离),自己的文件系统,互不影响,计算资源隔离;启动快
- 虚拟机会虚拟硬件、内核,docker轻量级虚拟化,docker容器、进程隔离的一种方案, docker运行在宿主机内核。
- docker启动快,虚拟机分钟级,docker秒级
- 每个docker容器间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
docker核心概念
docker架构(组成)
docker包含client、host、registry三部分(C/S架构),docker host包含一个守护进程docker deamon,docker deamon上基于镜像运行成容器。(鲨鱼上的一个个集装箱)
- Docker宿主机(Host): 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node节点
- Docker服务器端(Server): Docker守护进程, 运行Docker容器
- Docker客户端(Client): 客户端使用docker命令或其他工具调用docker API
- Docker仓库(Registry): 保存镜像的仓库, 官方仓库:hub.docker.com, 可以搭建私有仓库harbor
- Docker镜像(Images): 镜像可以理解为创建实例使用的模板, 相当于RPM或者DEB包
- Docker容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务, 相当于RPM包中的程序运行起来
镜像: 只读的模板
容器:镜像的运行态,实例化;可以认为是一个简易的Linux系统
仓库:集中存储镜像的仓库
docker是一个c/s结构的系统,docker守护进程运行在主机上,然后通过socker连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时环境,就是集装箱。
Docker的核心技术有三个:NameSpaces做视图隔离、Cgroups做资源限制,UnionFS联合文件系统,统一mount。通俗理解:NameSpaces、Cgroups通给进程设置属性,实现进程的隔离与限制,UnionFS给进程构造文件系统。这三项技术均有linux内核提供,Docker本身并没有创造新的技术。
但是Docker创造性的通过镜像整体打包了应用的依赖环境,包括:操作系统文件、中间依赖层、APP。
docker帮助命令
docker version
docker info
docker --help
docker镜像
概念
- 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行软件所需得所有内容,包括代码、运行时、库、环境变量和配置文件。
- **镜像是一个只读的容器模板,**含有启动docker容器所需的文件系统结构及内容 Docker以镜像和在镜像基础上构建的容器为基础,以容器开发、测试、发布的单元将应用相关的所有组件和环境进行封装,避免了应用在不同平台间迁移所带来的依赖问题,确保了应用在生产环境的各阶段达到高度一致的实际效果。
- 镜像可以被创建、启动、关闭、重启以及销毁。
- 镜像是基于**联合文件系统(unionFS)**的一种层式结构,由一系列指令一步一步构建出来。最底部的镜像为基础镜像()
- 镜像是分层的,分层的原因是为了可复用。镜像run成容器后,最上层是读写层,当需要修改容器的文件时,只对最上层进行变动,不修改下面已于文件系统的内容。当提交修改过成容器为一个新镜像时,存的内容仅为最上层读写文件系统中被更新过的文件。
镜像命令
# 查看本地的镜像文件列表 responsitory 镜像源 tag标签 imageId 镜像id created镜像创建时间 size镜像大小
docker images (-qa a所有层;q只显示id)
# 从docker hup上查找镜像列表
docker search +镜像名
# 从仓库下载,默认lastest最新版,也可以指定版本
docker pull + 镜像名
# 删除某个镜像
docker rmi + 镜像名
# 推镜像到远程registry
docker push + 镜像名
docker容器
概念
容器是镜像启动起来的一个运行环境,镜像的运行时,镜像可以认为是构建打包阶段、容器是启动或执行阶段
常用命令
# 从镜像启动容器 docker run –it –p -d
docker run + 镜像 -i交互 -t 伪终端 -d 守护式容器
# 列出当前正在运行的容器
docker ps -a –q
# 退出交互容器
exit 停止退出;ctrl+P+Q不停止退出
# 启动容器
docker start +container Id
docker restart +container Id
# 停止容器
docker stop +container Id
# 强制停止容器
docker kill +container Id
# 删除容器
docker rm +container Id
# 查看容器日志
docker logs –t –f –tail +containerId
# 查看容器内的进程
docker top +containerid
# 查看容器内部的细节
docker inspect + containerid
# 重新进入容器伪终端,不会启动新进程
docker attach + containerid
# 在容器中打开新终端,并且可以打开新进程
docker exec + containerid
# 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 宿主机路径
# 提交容器成新的镜像
docker commit –m –a
Registry(仓库)
用于集中存放镜像,分为共有仓库(docker搭建运营的docker hub)和公司自建的私有仓库
容器数据卷
引入容器数据卷的目的是:1. 数据的持久化;2. 共享数据
有以下两种方式挂在容器数据卷:
- 命令添加容器数据卷
Docker run –it –v 宿主机目录:容器目录:rwo - dockerFile添加容器数据卷
使用volume指令添加一个或者多个容器数据卷
数据卷容器
命名的容器挂在数据卷,其他容器通过挂在这个父容器实现数据共享;这个挂在数据卷的容器,称之为数据卷容器
容器添加了数据卷,其他容器继承这个容器(volumes-from)形成新的容器,也会有那个卷,并且多个继承,数据卷会一直存在,不管容器是否停止
dockerFile
概念
Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
容器的构建过程:
- 编写dockerfile文件
- docker build 构建
- docker run 运行
dockerfile编写规范:
- 保留字指定必须大写,后面至少跟一个参数
- 指令按照从上到下顺序执行
表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
dockerfile的执行过程:
- 从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile的下一条指令直至所有指令都执行完成
dockerfile的保留字指令
FROM 基础镜像
MAINTAINER 作者、作者邮箱
RUN 容器构建时需要执行的命令
EXPOSE 暴露端口
WORKDIR 登录后默认的目录
ENV 设置环境变量
ADD 拷贝加解压缩
COPY 复制
VOLUME 容器数据卷
CMD 容器启动时运行的命令,多个cmd命令只有最后一个生效,会被docker run 后面的命令参数替换
ENTRYPOINT 与cmd一样,但docker run 后面的命令会追加
ONBUILD 父镜像被子镜像继承后,父镜像的onbuild将被触发