https://www.bilibili.com/video/BV1Ls411n7mx?p=12&spm_id_from=pageDriver
简介
Docker 是一个开源的、轻量级的容器引擎。用于创建、管理和编排容器。
docker是基于Go语言实现的云开发源项目,可通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到”一次封装,到处运行”。
docket的出现解决了代码依赖环境(操作系统、配置文件、数据)运行的问题,解决开发 和运维之间的“我在本地执行是OK的”矛盾。
docker从系统环境开始,自底至上打包应用,打破了原先”代码即应用“的概念。打包内容包括运行环境、配置镜像、运行文件、运行依赖包、操作系统和内核等。
docker中文官网:https://www.docker-cn.com/
Docker hub 官网:https://hub.docker.com/
虚拟机技术和容器虚拟化技术
虚拟机:可以在操作系统中运行另一个操作系统,看上去和真实操作系统一模一样,应用程序毫无感知。对底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
虚拟机的缺点:1、启动慢 2、资源占用多 3、冗余步骤多
Linux发展出另外一种虚拟化技术:LXC linux容器
linux容器不是模拟整个操作系统,而是对进程进行隔离。容器将软件运行所需要的所有资源打包到一个隔离的容器中。容器和虚拟机不同,它不需要捆绑整套操作系统,只需要软件工作所需要的库资源和设置。linux容器变得高效轻巧。
docker就是轻量级的linux系统。
虚拟机和docker对比:
1、传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需要的应用程序。
2、容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟。因此容器比虚拟机传递更轻便。
虚拟机的启动是分钟级别的,但是docker是秒级的
docker比虚拟机运行快的原因
1)docker比虚拟机的抽象层少。docker不需要Hypervison实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机上的硬件资源,因此docker在cpu、内存利用率上有明显优势
2)docker利用的是宿主机的内核,而不需要Guest OS(虚拟操作系统)。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。Docker直接利用宿主机的操作系统,因此新建一个docker容器只需要几秒钟
。
3、每个容器之间互相隔离,每个容器都有自己的文件系统,容器之间进程不会互相影响,能区分计算资源。
docker 和虚拟机VM的对比
1)docker是面向软件开发者,VM是面向硬件运维者
2)docker轻巧、灵活,适用于linux;VM笨重,与虚拟技术耦合度高
3)docker计划没有额外的性能损失,VM有操作系统额外的CPU\内存消耗
4)docker镜像小,便于存储与传输,VM镜像庞大
5)docker和宿主机共享OS,VM宿主机OS上运行着虚拟机OS
和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。
DevOps
开发自运维
好处:
更快速的应用交付和部署
更便捷的升级和扩缩容
更简单的系统运维
更高效的计算资源利用
docker三要素
一、镜像 image
镜像就是模板
镜像就是一个只读的模板,可以用来创建Docker容器,一个镜像可以创建很多容器。
类似于Person p = new Person()
二、容器 container
容器就是镜像的实例
docker利用容器独立运行一个或者一组应用。容器可以被启动、开始、停止、删除;每个容器都是互相隔离、保证安全的平台
容器类似于 简版的linux环境+运行在其中的应用程序。
docker本身是一个容器运行载体,或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就类似image镜像文件。docker根据image镜像文件生成容器的实例。
Image文件生成的容器实例,本身也是文件,称之为镜像文件
三、仓库 repository
仓库用来集中存放镜像文件
仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中包含多个镜像,每个镜像包含不同的标签(Tag)
仓库分为公开仓库(Public)和私有仓库(Private)两种,最大的公开仓库是Docker Hub(https://hub.docker.com/),存放着数量庞大的镜像供用户下载,响应速度慢,一般使用国内的公开仓库如阿里云、网易云等。
Docker hub 官网:https://hub.docker.com/
阿里云镜像加速网址:https://dev.aliyun.com/search.html
docker运行原理
1、docker是一个C/S结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
2、docker运行容器原理:
docker run hello-world
1)本地查找hello-world镜像,
2)如果没有则从阿里云下载一个镜像
3)以该镜像为模板 生产容器实例
4)运行容器实例
镜像
镜像是轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
镜像的基础是UnionFS(联合文件系统)。联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。镜像可以通过分层来进行集成,基于基础镜像制作各种具体的应用镜像。
UnionFS 特性:一次同时加载多个文件系统,但从外面看只能看见一个文件系统。
docker镜像就是由一层层的文件系统组成,主要包含bootfs文件系统和rootfs文件系统。
linux刚启动时会加载bootfd文件系统,bootfs主要包含bootloader(boot加载器)和kernel(内核),bootloader引导和加载kernal。当boot加载完成后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs在bootfs之上,包含典型linux系统中的/dev /proc /bin等标准目录和文件。
分层的最大好处就是共享资源,多个镜像都从相同的base镜像构建而来,宿主机只需在磁盘上报错一份base镜像,内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶层,这一层通常被称为“容器层”,“容器层”之下叫作“镜像层”。
数据卷
卷就是目录或者文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统。卷设计的目的就是数据持久化和共享数据
docker在删除数据时不会删除其挂载的数据卷。
可通过命令或者DockerFile添加容器卷,实现容器和宿主机间的数据共享。
1、docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
使用命令“docker inspect 容器id”可以检查数据卷是否挂载成功。
2、在容器中新建dockerfile文件,并使用VOLUME添加一组数据卷。
mkdir /mydocker/
Vim dockerfile
FROM centos
VOLUME [“/sss”,”/www”]
CMD echo “finished”
CMD /bin/bash
使用docker build命令生成新的镜像,并启动新镜像就可添加容器卷。
数据卷容器:挂载数据卷的容器称之为数据卷容器
其他容器通过挂载数据卷容器实现数据共享,实现容器和容器间的共享。
docker run -it —name dc03 —volums-from dc01 centos
CentOS安装docker
前置条件:
1、要求CentOS 7及以上,要求系统为64位,系统内核版本为3.10以上
查看CentOS版本的命令:cat /etc/redhat-release
查看系统内核版本的命令:uname -r
2、docker有两个版本,社区版CE版是免费版本;还有一种企业版EE,要付费。
MAC安装docker
阿里云镜像加速器
使用镜像加速器可以提升获取docker官方镜像的速度
1、登录阿里云 https://cr.console.aliyun.com/cn-beijing/instances/mirrors 获取镜像加速器的地址。每个人的镜像加速器地址都不相同,我的镜像加速器地址 【https://vdv9u9on.mirror.aliyuncs.com】
CentOS配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://vdv9u9on.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
MAC配置镜像加速器
(1) 对于10.10.3以下的用户 推荐使用Docker Toolbox 安装/升级Docker客户端
Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/
配置镜像加速器:
创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。
docker-machine create --engine-registry-mirror=https://vdv9u9on.mirror.aliyuncs.com -d virtualbox default
查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。
docker-machine env default
eval “$(docker-machine env default)”
docker info‘"
(2)对于10.10.3以上的用户 推荐使用Docker for Ma c安装/升级Docker客户端
Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/
配置镜像加速器:
在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将
https://vdv9u9on.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。
MAC还原docker最初的配置
MAC删除docker
docker system prune --all --volumes
帮助命令
docker version
docker info docker基本信息
docker help 帮助命令
镜像命令
本地主机的镜像列表 docker images
显示本地所有镜像 docker images -a
只显示镜像的id docker images -q
显示镜像的摘要信息 docker images —digests
显示镜像完整信息 docker images —no-trunc
从git hub上 查找镜像 docker search tomcat (OFFICIAL=【OK】的是官方版)
点赞数超过30的镜像 docker search -s 30 tomcat
显示完整信息 docker search -s 30 —no-trunc tomcat
只列出自动构建的镜像 docker search —automated tomcat
阿里云下载镜像 docker pull tomcat,默认是latest版本,
登录阿里云 docker login --username=** registry.cn-beijing.aliyuncs.com
从仓库中下载镜像:docker pull registry.cn-beijing.aliyuncs.com/mengxi/demo:[镜像版本号]
重命名镜像:docker tag [ImageId] registry.cn-beijing.aliyuncs.com/mengxi/demo:[镜像版本号]
将本地镜像推送到阿里云仓库:
docker push registry.cn-beijing.aliyuncs.com/mengxi/demo:[镜像版本号]
删除镜像: docker rmi tomcat ,默认是latest版本
强制删除镜像: docker rmi -f tomcat
删除多个镜像: docker rmi tomcat hello-world
删除全部镜像 : docker rmi -f $(docker images -q)
提交容器副本使之成为一个新的镜像: docker commit -m=“描述” -a=”作者” 容器id aguigu/mytomcat【目标镜像名】:1.2【标签名】
将当前dockerfile文件build成新的镜像文件 : docker build -f /mydocker/dockerfile2 -t zzz/centos .
容器命令
列出所有当前正在运行的容器 docker ps
列出当前正在运行的和历史上运行的全部容器 docker ps -a
列出上一次运行的容器 docker ps -l
列出上三次运行的容器 docker ps -n 3
列出容器,只显示容器编号 docker ps -q
列出容器详细信息 docker ps —no-trunc
新建并启动容器 docker run tomcat
启动容器带版本号 docker run tomcat:1.3
新建并指定容器的名字 docker run —name=“新容器名” tomcat
以交互模式运行容器并返回一个伪终端 docker run -it —name=“新容器名” tomcat
新建并启动一个后台守护容器 docker run -d tomcat
说明:以守护进程运行时,如果运行的命令不是一直挂起的命令(比如top tail等)就会直接退出。docker容器后台运行就必须有一个前台进程。这是docker机制问题
启动并指定主机端口:docker run -it -p 9090:8080 tomcat
启动并随机分配端口:docker run -it -P tomcat
启动并挂载数据卷 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
启动并挂载数据卷,容器内的数据卷只读不可写 docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器间传递共享数据卷:docker run -it —name dc03 —volums-from dc01 centos
容器内的root拥有真正的root权限,否则container内的root只是外部的一个普通用户权限: docker run --privileged=true
启动容器 docker start container_name 或者 docker start container_id
重启容器 docker restart container_name 或者 docker restart container_id
退出容器并停止容器执行,进入宿主机 exit
退出容器但不停止 ,进入宿主机 ctrl+P+Q
重新进入运行的容器并以命令行交互 docker exec -it 容器id bashshell 或者 docker attach 容器id
区别:attach 直接进入容器启动命令的终端,不会启动新进程 ;
Exec 在容器中打开新的终端,并启动新的进程。可以在容器内操作 也可以在容器外操作
容器内操作:docker exec -it 容器id |bin|bash
容器外操作:docker exec -it 容器id ls -l
停止容器(正常停止) docker stop container_name 或者 docker stop container_id
强制停止容器 docker kill container_name 或者 docker stop container_id
删除已停止的容器 docker rm container_id
强制删除容器 docker rm -f container_id
删除多个容器 docker rm container_id_1 container_id_2
或者 docker rm -f $(docker ps -q -a) 或者docker ps -a -q | xargs docker rm
查看容器日志 docker logs -f -t —tail 容器id
—tail 显示最后多少条
-f 跟随最新的日志打印
-t 显示时间
查看容器内的进程 docker top 容器id
查看容器内部细节 docker inspect 容器id
从容器内拷贝文件到主机上
docker cp 容器id:容器路径 宿主机路径
列出容器的变更历史 docker history 容器id
本地镜像发布到阿里云
1、登录阿里云 创建命名空间及镜像仓库(选择本地仓库)https://account.aliyun.com/login/login.htm
2、登录阿里云仓库
3、使用docker tag命令 重命名镜像
4、推送镜像到阿里云仓库
dockerfile
dockerfile是构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
dockerfile内容
注意:
1、每条保留字指令都必须为大写,且后面必须跟一个参数,
2、指令按从上到下顺序执行
3、#表示注释
4、每条指令都会创建新的镜像层,并对镜像进行提交
docker执行dockerfile大致流程
1、从基础镜像运行一个容器
2、执行一条指令并对容器进行修改
3、执行commit 操作提交一个新的镜像层
4、docker基于刚提交的镜像运行一个新容器
5、执行下一条命令,直到所有命令都执行完成
构建三步骤
编写dockerfile -->docker build -->docker run
dockerfile保留字
FROM 基础镜像,当前镜像是基于哪个镜像的
MAINTAINER 镜像维护者的名字和邮箱
RUN 容器构建时需要执行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 容器登录后 默认路径
ENV 设置环境变量 ,可在其他命令中使用
ADD 将宿主机中的文件拷贝到镜像中,拷贝+解压缩
COPY 类似ADD,但是COPY只拷贝
VALUME 容器数据卷 用于数据保存和持久化
CMD 指定容器启动时要执行的命令,但只有最后一行命令生效
ENTRYPOINT 同CMD ,但是可以执行多个命令
ONBUILD
二、websocket镜像
1、slave镜像
FROM acr.com/library/openjdk:8-v1
MAINTAINER yxx gaotu <yxx@acr.com>
RUN useradd --create-home -s /bin/bash jmeter
WORKDIR /home/jmeter
USER jmeter
ENV JMETER_VERSION 5.3
ENV JMETER_HOME /home/jmeter/apache-jmeter-${JMETER_VERSION}
ENV JMETER_BIN $JMETER_HOME/bin
ADD apache-jmeter-5.3.zip .
RUN unzip apache-jmeter-5.3.zip
COPY JMeterPlugins-Standard.jar ./apache-jmeter-5.3/lib/ext/
COPY JMeterWebSocketSamplers-1.2.8.jar ./apache-jmeter-5.3/lib/ext/
RUN rm -rf apache-jmeter-5.3.zip
ENV PATH $PATH:$JMETER_BIN
WORKDIR $JMETER_BIN
RUN sed -i -e "s/-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m/-Xms14g -Xmx14g -XX:MaxMetaspaceSize=2g/g" jmeter
CMD jmeter-server -Dserver_port=1099 -Dserver.rmi.localport=1099 -Dserver.rmi.ssl.disable=true
2、master镜像
FROM acr.com/library/openjdk:8-v1
MAINTAINER yxx gaotu <yxx@acr.com>
RUN useradd --create-home -s /bin/bash jmeter
WORKDIR /home/jmeter
USER jmeter
ENV JMETER_VERSION 5.3
ENV JMETER_HOME /home/jmeter/apache-jmeter-${JMETER_VERSION}
ENV JMETER_BIN $JMETER_HOME/bin
ADD apache-jmeter-5.3.zip .
RUN unzip apache-jmeter-5.3.zip
COPY JMeterPlugins-Standard.jar ./apache-jmeter-5.3/lib/ext/
COPY JMeterWebSocketSamplers-1.2.8.jar ./apache-jmeter-5.3/lib/ext/
RUN rm -rf apache-jmeter-5.3.zip
ENV PATH $PATH:$JMETER_BIN
WORKDIR $JMETER_BIN
RUN sed -i -e "s/-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m/-Xms14g -Xmx14g -XX:MaxMetaspaceSize=2g/g" jmeter