一、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,替换即可
sudo yum install docker-ce- docker-ce-cli- 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语法
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这样的托管服务