一、Docker基础
容器和虚拟机的区别
- 虚拟机是一个完整的、独立的系统,虚拟机是完全独立于物理机的,隔离级别较高,实现虚拟机的解决方案:vmware workstation、vsphere、openstack、kvm
- 容器是会共用一部分物理机的资源【namespace】,比如共用物理机网络、共用物理机的主机名、共用物理机的挂载点....,容器的解决方案:docker
1.2 容器镜像文件
- 启动虚拟机 iso
- 启动容器的时候,用的是img文件,这个文件就称之为docker镜像文件
docker镜像文件的构成
- 分层构建
- 联合挂载
- 写时复制
docker容器编排工具
- 容器编排:控制多个容器的启动顺序、依赖关系
- kubernetes => k8s
- docker-compose
docker镜像文件的来源
自己创建docker镜像文件docker官方镜像【这里也有别人的做的镜像】:hub.docker.com
启动docker容器的流程
客户端执行启动命令
- docker build:基于dockerfile文件,创建docker镜像文件
- docker pull:从docker镜像文件的仓库下载docker镜像文件
- docker run:将doker镜像文件启动成容器【docker run的时候,如果本地没有镜像文件,就会自动取下载】
Docker的应用场景
工作中的环境有生产环境、测试环境、开发环境,测试环境又分为功能测试、性能测试;生产环境又分为预生产环境和生成环境。在工作中有这么多的环境,环境不同,配置也就不同,如果配置不同,那么就可能会导致上线失败, 而我们使用docker就可以简化配置,也就是说我们可以做一个镜像,使用这个镜像就可以完成启动。其实docker和openstack对比是不合适的,比较合适是的rpm包对比,因为他们都是事先配置环境的。
2.代码流水线管理【CD/CI】
我们的开发人员在开发完成以后,将代码传递到服务器上,然后测试人员可以从服务器上拉去代码进行测试,测试完成以后,开始进行发布,首先就是进行灰度发布,然后才是正事发布。
3.开发效率
公司来了新员工以后,第一天除了是办理手续之外,就是开始配置各种环境,这个过程就往往是比较麻烦的,那么这里,我们就可以用docker做个容器轻松来实现。
各个应用之间互相是隔离的。
也就是说一个服务器可以跑多个容器实例
处理bug的能力
docker是秒级的,启动速度极其快。比如之前说过,春晚的微信抢红包,用的是docker,说是可以1秒启动1000个docker程序。
二、安装配置docker
1. 基础要求
- l 64为的CPU
- l linux内核版本3.10及以上
- l ce:社区版
- l ee:商业版本
docker的下载地址
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7.9/x86_64/stable/
2. 安装d安装docker ocker
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7.9/x86_64/stable/
2)安装docker-ce的组件
yum install docker-ce
3)修改docker的配置文件,设置docker加速镜像地址
4)启动docker
5)检查docker的基础信息
3. docker基础操作
查看当前容器
查看当前镜像文件
4.配置使用阿里云镜像
第一步:登录mirrors.aliyun.com
第三步:修改配置文件,并重启服务
三、docker的网络
1 容器端口和linux随机端口进行绑定
-p 容器端口
案例:将容器的80端口向外进行暴露
docker run --name c1 -d -v /dir1:/usr/share/nginx/html -p 80 nginx
2. 容器端口和linux指定端口进行绑定
-p 宿主机端口:容器端口
案例:将容器的80端口向外进行暴露到linux的1122端口
docker run --name c3 -d -v /dir1:/usr/share/nginx/html -p 1122:80 nginx
四、容器的卷
1. 容器存在的问题
在容器中创建、修改、编辑文件后,这些操作都是临时的,一旦删除了容器,重新创建的新容器中,以上前面的操作就会全部丢失
2. 配置使用逻辑卷
-v linux目录:容器中的目录
五、dockerfile
1. 简介
dockerfile就是一个文本文件,通过这个文件中的设置,可以快速的创建docker镜像文件
作用:
可以自己定制docker镜像文件的
docker file的组成结构
1) # 表示注释信息2) 指令 参数3) 一行一个指令,指令通常写成大写,但是其实大小写不敏感4) docker file中的第一个非注释行必须是FROM(这是用来指定基础镜像,因为我们知道制作镜像都是基于一个基础镜像来做的。)5) docker file中的内容是从上向下依次执行
2. dockerfile关键字
关键:1:FROM作用:指定基础镜像文件
FROM centos:latest
关键字2:COPY指令将宿主机中的工作目录中的文件复制到目标镜像的文件系统中
复制一个文件:COPY复制多个文件:COPY [ ... ]
源文件路径,一般是相对路径目标文件路径,一般是绝对路径支持使用通配符
准则 1:src必须是工作目录下的目录或者文件,不能是父目录中的【工作目录就是dockerfile文件所在的目录】准则 2:如果dest不存在,会被动自动创建准则 3:如果src是目录,那么在进行复制的时候,会将src下的全部内容都递归方式复制过去,但是 src自身不会被复制过去准则 4:如果指定了多个src或者在src中使用了通配符,那么dest必须是一个目录,并且比用以/为结 尾
例子:将当前工作目录下的index.html复制到目标容器的文件系统中的/data/web/html下
COPY index /data/web/html
案例:基于centos7作为基础镜像,然后将工作目录下的abc.html复制到镜像中
关键字3:ADD指令
与COPY类似,都是将一个做入到镜像中,区别是ADD支持使用URL路径,也就是,如果你的做镜像的这个主机可以联网,那么就可以将网络上的一个文件下载到本地并引入到你的文件中。ADD的另一个作用就是如果源文件是一个本地文件,并且这个文件是tar压缩归档的文件,那么ADD 可以自动将这个文件解压展开到你的工作目录, 需要特别注意 ,如果源文件是一个网络文件,那么无法自动解压展开。
语法格式:
l ADDl ADD ["" "" ... ""]
wget https://nginx.org/download/nginx-1.12.2.tar.gz
FROM centos:7COPY abc.html /home/dir1/ADD nginx-1.12.2.tar.gz /usr/share/ngx
制作镜像
docker build -t myimage3 .
指令4:WORKDIR指
用于设定工作目录,比如上个例子中,将nginx放在了/usr/loca/src下,我们就可以将这个目录设置 为工作目录
FROM centos:7COPY abc.html /home/dir1/ADD nginx-1.12.2.tar.gz /usr/share/ngx
FROM centos:7COPY abc.html /home/dir1/WORKDIR /usr/share/ginxADD nginx-1.12.2.tar.gz ./
用于在镜像中创建一个挂载点目录,用以挂载宿主机上的卷或者其他容器上的卷基于dockerfile创建的卷,是无法指定卷所在的宿主机的目录的,需要自动生成
VOLUME
FROM busyboxCOPY abc.html /home/dir1/WORKDIR /usr/share/nginxADD nginx-1.12.2.tar.gz ./VOLUME /usr/share/nginx/html
制作镜像
docker build -t bx .
启动容器
docker run --name new1 -it bx
l 为容器打开监听的端口以实现和外部主机进行通信
l EXPOSE [/] [/] [/] ...l protocol是指定协议,可以是tcp,也可以是udp,默认tcp
EXPOSE 11211/udp 11211/tcp
指令7:RUN命
l 而RUM命令是基于Dockerfile构建镜像的时候要运行的命令,比如我们就基于url的方式来获取 nginx的安装包,获取以后是一个gz的压缩包,而我们知道docker是不会自动解压url获取的包的, 那么这个时候就需要使用RUN指令来运行tar来解压展开这个nginx的包了。
案例:在镜像中下载编译安装nginx
l 定义一个镜像文件启动为容器的时候,默认要运行的程序,也就是那个pid为1的程序l 系统中的主进程只能有一个,所以CMD指令通常只能有一个
案例:在容器中启动 nginx
六、容器编排
1. 简介
容器容器编排其实就是控制多个容器启动的时候的先后顺序,并且控制他们之间的依赖关系
实现容器编排的方法
k8sdocker-compose
2. 安装docker-compose
- 第一步:将docker-compose放到 /bin
- 第二步:设置可执行权限
chmod +x d /bin/docker-compose
3. 实现容器编排
启动和关闭docker compose中的容器