一、Docker 的简介
什么是 Docker
docker 是一个开源的利用容器引擎,基于 go 语言开发并遵循了 apache2.0 协定开源。docker 是一种容器技术,它能够对软件及其依赖进行标准化的打包;容器之间先对独立,基于容器运行的利用之间也是互相隔离的;并且容器之间是共享一个 OS kernel 的,充分利用服务器资源,容器能够运行在很多支流的操作系统之上。
容器和虚拟机的区别
容器时在 linux 上运行,并与其它容器共享主机的内核,它运行一个独立的过程,不占用其它任何可执行文件的内存,十分轻量。虚拟机运行的是一个实现的操作系统,通过虚拟机管理程序对主机资源进行虚构拜访,相比之下须要的资源更多。
- 容器是 app 层面的隔离
- 虚拟机是物理资源层面的隔离
docker 架构和底层技术简介
docker 实质就是宿主机的一个过程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限度,通过写时复制技术(copy-on-write)实现了高效的文件操作(相似虚拟机的磁盘比方调配 500g 并不是理论占用物理磁盘 500g)
底层技术简介
namespace 名称空间
namespace 的六项隔离
namepace | 零碎调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、音讯队列和共享内存 |
PID | CLONE_NEWPID | 过程编号 |
NEWWORD | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8 当前的内核才反对) |
control group 控制组
cgroup 的性能
- 资源限度:能够对工作应用的资源总额进行限度
- 优先级调配:通过调配的 cpu 工夫片数量以及磁盘 IO 带宽大小,实际上相当于管制了工作运行优先级
- 资源统计:能够统计零碎的资源使用量,如 cpu 时长,内存用量等
- 工作管制:cgroup 能够对工作执行挂起、复原等操作
二、Docker 的环境搭建
CentOS 装置 docker
- 返回官网下载页
- 卸载 docker 及相干依赖
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 装置 yum-utils 工具包
sudo yum install -y yum-utils
- 增加 docker 仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 装置最新版 docker 引擎(社区版)
sudo yum install docker-ce docker-ce-cli containerd.io
- 装置指定版本的 docker 引擎
# 查问 docker 版本,版本从高到低排序
yum list docker-ce --showduplicates | sort -r
#装置指定版本的 docker,替换 <VERSION_STRING> 即可
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 启动 docker
sudo systemctl start docker
- 查看 docker 版本
sudo docker version
- 测验 docker 引擎被胜利装置
sudo docker run hello-world
三、Docker 的镜像、容器和仓库
docker 基于 linux 内核空间,在根底镜像的根底上一层层构建出用户镜像。容器是镜像的运行实例。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包含运行应用程序所须要的所有内容蕴含代码,运行工夫,库、环境变量、和配置文件。
Docker image 镜像
Docker 镜像是什么
docker 镜像就是一个只读模板,比方,一个镜像能够蕴含一个残缺的 centos,外面仅装置 apache 或用户的其余利用,镜像能够用来创立 docker 容器。
- 文件(root filesystem)和 meta data 的汇合
- image 是分层的,并且每一层都能够增加、批改、删除文件,成为一个新的 image
- 不同的 image 能够共享雷同的 layer
- image 自身是 read-only 只读的
Docker 镜像相干命令
- 查看本地已有的镜像列表
docker image ls
docker images
- 删除镜像
docker image rm f6509bac4980
#简写
docker rmi f6509bac4980
- 构建镜像
# 依据 dockerfile 构建一个镜像
docker image build
#从一个被扭转的容器创立一个新的镜像
docker container commit
#简写,从一个被扭转的容器创立一个新的镜像
docker commit
- 从镜像仓库拉取镜像
# 默认从 docker hub 拉取
docker pull ubuntu:14.04
- 查看指定镜像的创立历史
# 通过镜像名称
docker history mysql:5.7
#通过镜像 ID
docker history f6509bac4980
Dockerfile 语法及实际
dockerfile 语法
- dockerfile 官网参考文档
FROM 关键字
# 制作 base image
FROM scratch
#应用 base image
FROM centos
FROM ubuntu:14.04
阐明:为了平安起见, 尽量应用官网的镜像作为根底镜像 。
LABEL 关键字
LABEL version="1.0"
LABEL description="this is description"
阐明:此关键字的作用是定义镜像的元数据,相似于正文及帮忙信息,还是十分必要的
RUN 关键字
RUM yum update && yum install -y vim \
python-dev #反斜线换行
阐明:RUN 关键字用来执行命令,值得注意的是每运行一次 RUN,都会生成一层 layer, 为了防止无用分层,务必合并多条命令成一行 ,反斜线换行,&& 合并成多条命令
WORKDIR 关键字
# 如果不存在此目录,则会主动创立目录,并进入目录
WORKDIR /test
WORKDIT demo
RUN $PWD #输入后果应为 /test/demo
阐明:WORKDIR 设定当前工作目录, 进入目录该当应用 WORKDIR,防止应用 RUN cd,因为 RUN 会新增层 ,还有尽量应用相对目录。
ADD 和 COPY 关键字
ADD test.tar.gz / #增加到根目录并解压缩
COPY hello /
阐明:AND and COPY 本地文件增加到 Docker Image 外面,大部分状况,COPY 优于 ADD,ADD 相比 COPY 有解压缩的性能。如须要增加近程文件或目录,请应用 RUN 关键字执行 curl 或者 wget 命令。
ENV 关键字
ENV MYSQL\_VERSION 5.7 #设置常量
RUN apt-get install -y mysql-servier= "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #援用常量
阐明: 设置常量,减少可维护性 。
VOLUME 关键字
EXPOSE 关键字
CMD 关键字
ENTRYPOINT 关键字
Docker container 容器
Docker container 容器是什么
docker 利用容器来运行利用,容器是从镜像创立的运行实例,它能够被启动,开始、进行、删除、每个容器都是相互隔离的,保障平安的平台,能够吧容器看做是要给简易版的 linux 环境(包含 root 用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
- 容器通过 image 创立(copy)
- 容器在 imagelayer 之上建设要一个 container layer(可读写)
- image 负责 app 的存储和散发,container 负责运行 app
- 容器与镜像的关系相似于类和实例的关系
Docker 容器相干命令
- 查看容器列表
# 以后正在运行的容器列表
docker container ls
#列出所有容器,蕴含已退出的
docker container ls -a
docker ps -a
- 运行一个容器
docker run centos
#以交互模式运行一个容器
docker run -it centos
- 删除容器
# 指定容器 ID 删除
docker container rm d02f80816fbb
#简写
docker rm d02f80816fbb
#删除所有的容器,- q 选项只列出容器 ID
docker rm $(docker container ls -aq)
#删除退出状态的容器,- q 选项只列出容器 ID
docker rm $(docker container ls -f "status=exited" -q)
Docker repository 仓库
Docker repository 仓库是什么
仓库是集中存储镜像文件的中央,registry 是仓库注册服务,实际上仓库注册服务器上寄存着多个仓库,每个仓库中又蕴含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为两种,即私有仓库和公有仓库,最大的公开仓库是 docker Hub,寄存了数量宏大的镜像供用户下载,国内的 docker pool,这里仓库的概念与 Git 相似,registry 能够了解为 github 这样的托管服务