- Docker
- 一. 容器化技术
- 1. 历史演变
- 2. Docker优势
- 二. Docker简介
- 1. cs架构的优势
- 2. 镜像容器两者区别
- 3. 执行流程
- 4. 同一镜像多容器创建
- 三. Docker安装
- 前置准备
- docker安装
- pull失败的原因以及解决办法
- 四. Docker命令
- 1. Docker镜像版本查询
- 2. 基本命令
- 3. 宿主机不知道如何和内部的容器打交道解决方案
- 六. 容器内部结构
- 1. tomcat容器内部结构
- 2. 容器中的执行命令
- 3. 容器声明周期
- 3.1 docker kill 和docker stop区别
- 3.2 docker pause 和docker stop区别
- 七. Dockerfile构建镜像
- 1. Dockerfile自动部署Tomcat应用
- 2. dockerfile简单使用
- 3. Dockerfile两大特性
- 4. Dockerfile基础命令
- 5. run和cmd区别
- 6. entrypoint和cmd区别
1. 物理机时代
- 部署非常慢
- 成本很高
- 资源浪费
- 难于扩展与迁移
- 受限于硬件
2. 虚拟机时代
- 多部署
- 资源池
- 资源隔离
- 很容易扩展
- vm需要装 *** 作系统
3. 容器化时代
相比虚拟机更小巧,更灵便
容器化技术应用场景
2. Docker优势
- 应用化的迁移方式
- 统一的参数配置
- 自动化部署
- 应用集群监控
- 开发与运维之间的沟通桥梁
1.开源的应用容器引擎,基于go语言开发
2.容器完全使用沙箱机制,容器开销极低
3.Docker就是容器化技术的名词
4.Docker也具备一定化职能
5.基于cs架构,拥有服务端和客户端的架构
6.Docker具备虚拟化职能:可以创建容器,还可向本地的物理机申请资源,更加方便程序的迁移与扩展。
7.Docker提供标准的应用打包的方式,集装箱是镜像文件,镜像文件中包含了所有的资源,如web引用,数据库,web应用服务器,队列等,在这个镜像中还用来描述这些应用所需要的硬件环境要求,部署后也可灵活的调整,运维工程师得到镜像文件后,方便的进行扩展与还原,马上能得到与之前一样的运行环境。这也是docker存在的意义。
# 虚拟化和容器化技术混合运用场景 - 如阿里云,腾讯云的服务器性能好:采用的是虚拟机和容器化技术的实现 - 比如在阿里云购买ecs服务器,在阿里云那边就是一个虚拟机,根据应用场景不同,安装不同容器,比如购买阿里云的mysql数据库,阿里云通过容器化技术自动安装mysql容器,就得到一台mysql服务器了,这里虚拟化主要是对硬件资源的隔离,但在虚拟机中所使用到的mysql是通过容器化技术部署的二. Docker简介
# 1.可用资源: - 如物理机,阿里云/腾讯云的虚拟机,看得见摸得着的称为可用资源,cpu,硬盘,内存等等,应用程序不是直接 *** 作可用资源,而是应用程序面向docker引擎获取可用资源 # 2.Dokcer引擎: - 获取可用资源,使得应用程序不直接面向底层资源,而是通过中间层docker引擎进行 *** 作 2.1包含的子组件: 1. docker server(docker daemon):也称为docker demon守护进程,所有docker服务都是通过docker daemon完成,如容器的获取,镜像的创建等 2. REST API 通讯层:可以看成是一个小的tomcat,rest api是基于web容器提 供服务的,所以客户端和rest api传输的是标准的http请求和响应,server通过rest api返回给客户端结果,应用的协议:标准的web协议 http,因为使用http,docker兼容性和可扩展性都是很好的 3. docker client:docker pull 就是dokcer client的可执行文件,通过rest api向server层发送请求和指 令 # 3.应用程序 - docker引擎和java的jvm特别的像,无论是docker的应用程序,还是java的应用程序不在直接面向底层资源,而是通过中间层docker引擎进行 *** 作1. cs架构的优势
2. 镜像容器两者区别服务器和客户端不用安装一台电脑上,可以使运维工程师用一台电脑对很多台服务器进行管理,通过 docker server所暴露的rest api实现,提高运维管理的效率
镜像:镜像是只读的文件,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"
容器:运行镜像的环境,如window镜像的运行环境pc物理机
3. 执行流程client:通过redis api 发送请求
docker_host:接收并进行处理命令
Docker daemon:容器获取,镜像创建等
images:本地镜像
registry:中央镜像库,大量的镜像来供使用者下载
- client端通过rest api发送请求docker pull tomcat,Docker_Host中Docker daemon接收,查询本地仓库images是否包含该镜像,若没有去中央仓库registry拉取镜像下载到本地仓库images
- client端通过docker run tomcat命令,创建tomcat容器
pull创建镜像文件,只读的,所以使用run创建对应的redis容器,redis容器对外暴露服务,而容器内部为一个迷你的linux系统,如果一个redis不够用,再次使用run通过dockerdemon在创建一个redis容器,两个redis容器实互不干扰的,各自拥有独立的文件系统,独立的硬件资源,一个redis停掉了,不影响另一个redis
三. Docker安装 前置准备# yum install -y yum-utils device-mapper-persistent-data lvm2 -y 自动确认安装 yum-utils是yum安装的工具包,简化安装过程中设置安装源的配置过程 安装数据存储驱动包,docker内部存储通过这2个组件完成数据存储 # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 修改yum的安装源,设置新的安装源,路径为国内阿里云的安装源 设置新的安装源目的:docker安装源默认是在国外,下载的非常慢 # yum makecache fast 让安装源自动检测速度是最快的,优先使用它docker安装
# yum -y install docker-ce docker-ce:开源的社区版本 -ee:收费企版pull失败的原因以及解决办法
pull失败:从国外的docker中央仓库进行下载,中国网络特殊性,会下载失败 阿里云容器镜像服务:由阿里云作为docker镜像代理,来加速获取docker的加载速度 进入阿里云官网,搜素容器加速服务,找到镜像加速
四. Docker命令 1. Docker镜像版本查询下方蓝色复制到linux中,直接自己进行加载
命令解释
sudo systemctl daemon-reload 对其server daemon重新加载
sudo systemctl restart docker 重新启动docker
版本在hub.docker.com网站中搜索查看,是否拥有对应镜像的版本,否则pull不到
如搜索到tomcat
官方:有图标且名称为组件名称tomcat
第三方:与其官网概念相反,不建议使用,原因:也许存在bug,恶意代码等
右侧为支持的平台,选Linux - x86 64位 (lastet)
2. 基本命令上图的的DEscriptION为提供的版本
docker pull registry :tags
拉取中央仓库的镜像并下载
若存在多个版本,可通过***:tags***指定版本,不加tags讲最新的版本下载
docker rm -f 容器id
-f:若容器在运行,可强制删除
docker run -p 8000:8080 tomcat
宿主机和容器的端口映射
8000为宿主机端口,容器内部的8080端口
docker run -p 8000:8080 -d
run命令属于前台运行,独占状态,命令进入阻塞的状态,即命令输入不了,ctrl+c退出tomcat运行,才能继续输入命令,但是tomcat也会停止运行
-d:代表后台运行
docker ps -a
docker ps:列出当前运行的容器及其相关信息
docker ps -a:列出所有的容器及其相关信息
docker images
docker rm -f 容器id
容器id通过docker ps命令查看
-f : 若此容器正在运行,强制删除容器
docker rmi -f tomcat:tag
移除镜像
-f:对正在运行的容器镜像,强制移除(开发可以这么用,线上不能这么用)
cd /var/lib/docke
Linux下docker默认存放路径 :var/lib/docker
3. 宿主机不知道如何和内部的容器打交道解决方案containers:容器
image:镜像
- 宿主机:容纳docker的虚拟机/物理机,内部包含容器
解决方案:端口映射,通过宿主机的端口和容器的端口进行绑定
外面互联网就可以通过输入http://宿主机ip:宿主机的port进行访问
端口映射所提供的好处:可以换容器,只要保证宿主机映射端口不变,程序可无缝迁移,就比如tomcat服务器不想用了,换个其他的web服务器
六. 容器内部结构 1. tomcat容器内部结构 2. 容器中的执行命令netstat -tupln 端口号查询
中间可看出通过docker proxy完成8000映射容器内部的8080端口
-
docker exec -it 容器id /bin/bash
进入容器内部,其内部一个迷你版的linux,内存小到只能运行tomcat
内部迷你版linux只提供最基本的命令,如ls,而ll却没有就是这个原因,保证内存足够小
exec:在对应容器中执行命令
-it:采用交互的方式命令(用于在迷你版linux上交互)
-
cat /proc/version
查看linux版本
-
java -version
jdk版本
-
exit
退出容器,返回宿主机
3.2 docker pause 和docker stop区别kill杀死docker进程
stop停止docker进程
两者各自运行docker start的区别
kill后,在docker start会重新创建一个docker容器
stop后,在docker start会继续停止的docker进程
docker pause:暂停服务,通过docker unpause恢复服务
docker stop:停止容器线程,通过docker start恢复该容器线程
异常情况oom内存溢出,也会将容器线程变为die,如果重启进入start状态,如果不重启进入stop状态
七. Dockerfile构建镜像# dockerfile镜像描述文件 1. Dockerfiler是一个包含用于组合镜像的命令文本文档,文本内容包含了一条条构建镜像所需的指令和说明 2. Docker通过读取Dockerfile中的指令按步自动生成镜像 3. docker build -t 机构/镜像 :tags Dockerfile目录1. Dockerfile自动部署Tomcat应用
FROM tomcat :latest
from : 设置基准镜像,在镜像中进行扩展
MAINTAINER xxx.com
maintainer:说明当前镜像由哪个人或哪个机构来维护的
WORKDIR /usr/local/tomcat/webapps
workdir:用来切换工作目录,也可以理解为是cd,如果切换的目录不存,workdir会自动创建
用docker exec -it 容器id /bin/bash
进入容器后,看到容器的路径名,部署一个新的web应用,需要存放在webapps中,所以需要切换到/usr/local/tomcat/webapps
ADD docker-web ./docker-web
2. dockerfile简单使用add:将指定目录下的所有文件/目录复制到指定目录下
docker-web:我们自己在客户端创建的目录
./docker-web:wordir 录下,即/usr/local/tomcat/webapps目录下的docker-web,若不存在则创建
1.本地创建一个目录,里面包含dockerfile文件(不添加后缀名)和docker-web的目录
2.上传到linux,usr/images(创建images目录)
3.build 指令(生成镜像,可通过docker images命令查看)
4.run(生成容器并运行,run命令详细看生命周期图)
5.客户端根据宿主机的映射端口访问里面的tomcat,自己所写的html
6.build后,mywebapp执行流程
3. Dockerfile两大特性1.分层
分层进行堆叠
from -> maintainer -> wordir -> add 可以把from理解为汉堡最下面的面包片,在这个面包片上添加对应的蔬菜,肉,直到add把这些覆盖上,形成一个完整的汉堡
2.系统快照
4. Dockerfile基础命令通过docker临时容易体现出来
from->add的每一步都会生成临时容
作用:在每一步执行完后,docker都会对当前运行的系统环境生成一个快照,快照是以临时容器的方式来体现,相当于玩游戏时存档,临时容器可以理解为存档
好处:临时容器可重用,极大加快了镜像的构建速度以及节省系统资源,比如在部署一个新镜像时,前3步和之前tomcat镜像build都一样,所以只需将第四步add进行重新的临时容器构建
FORM - 基于基准镜像
基准镜像:构建新镜像时,依托于哪个原有镜像进行扩展
- 从远程仓库拉取tomcat镜像,并创建一个临时的容器,用于镜像的构建
- 临时容器:用于镜像的构建,不可以直接使用
- id:临时容器
FROM scratch 不依赖于任何人基准镜像base image
LABEL&MAINTANER - 说明信息
LABEL:描述信息,这些信息不会产生实质的影响,只供阅读
MAINTAINER zhanghp.com
LABEL version=“1.0”
LABEL description=“一二三”
WORKDIR - 设置工作目录
工作目录可分为
- 绝对路径
- 相对路径:用"."即可代表当前路径,如WORKDIR .
ADD & COPY - 赋值文件
copy和add是一样的
add:支持文件的解压缩,抓取远程文件功能(不常用)
ENV - 设置环境变量
ENV JAVA_HOME /usr/local/openjdk8
**作用:**用JAVA_HOME常量代替了后面的路径
**好处:**如果以后环境变量变了,只需改ENV中的路径一处即可,其他所有引用的地方都发生变化
EXPOSE - 暴露容器端口
将容器内部端口暴露给物理机
EXPOSE 8080
docker run -p 8000:8080 tomcat
RUN&CMD&ENTRYPOINT - 运行命令
RUN : 在build构建时执行该命令
CMD:在容器启动后执行默认的命令或参数
ENTRYPOINT 入口点:容器启动时执行命令
# RUN - 构建时运行 - RUN yum install -y vim #shell命令格式 - RUN ["yum","install","-y","vim"] #Exec命令格式 为什么有2个,涉及linux底层,exec命令后会替代当前的进程,推荐exec
shell运行方式
使用shell执行时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本,脚本执行完毕,退出子shell,回到当前shell
Exec运行方式
用Exec替换当前进程,并且保持PID不变,执行完毕,直接退出,并不会退回之前的进程环境
ENTRYPOINT 启动命令
- ENTRYPOINT(入口点)用于在容器启动时执行命令
- Dockerfile中只有最后一个ENTRYPOINT会被执行
- ENTRYPOINT [“ps”] #推荐使用Exec格式
CMD 默认命令
- CMD用于设置默认执行的命令
- 如Dockerfile中出现多个CMD,则只有最后一个被执行
- 如容器启动时附加指令,则CMD被忽略
- CMD [“ps” , “-ef”] #推荐使用Exec格式
entrypoint一定被运行,cmd不一定被运行
5. run和cmd区别在usr/images下创建目录,其里面创建dockerfile文件
docker run 会执行cmd [“echo”,“aa”]中的aa
而docker build 不会
cmd详解
若在docker run 后加别的命令如ls,会取代原有的cmd来执行
6. entrypoint和cmd区别ps -ef 查看进程的完整格式
ps -aux 查看进程列表
若上面是ENTRYPOINT 而下方紧跟着cmd,会联合使用
好处:
cmd可从外界传参,比方采用aux命令显示进程列表,可通过docker run zhanghp.com/docker_run -aux 替代原有dockerfile的cmd
所以此时从ps -ef -> ps -aux
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)