@[toc]
一、Docker 的核心概念
概念
Docker是容器技术。在本质上来说它就是主机的集合,如图:- 什么是主机
这里的主机我们一般说的是操作系统,世面上比较流行的系统:mac windows Linux 。 - 什么样类型的主机的集合?
主要是Linux系统主机的集合。
其实docker里面安装的是精简版的Linux,说白了这个精简版的Linux系统比较小,小到什么程度呢?小到只能运行一个应用程序。
- 什么是主机
为什么使用Docker部署
使用Linux单机部署
如图:缺陷:
- 端口冲突
- 环境冲突
主要原因是部署藕合造成的。
使用虚拟机部署
如图:缺陷
- 耗费资源的问题 【虚拟机需要消耗电脑的cpu 磁盘 内存,如果消耗太大,那么留给微服务的资源就很少的,就会影响微服务的性能】
- 使用困难的问题 【单独需要安装虚拟机,还得分配内存 cpu 硬盘大小的问题】
使用容器【docker】部署
如图:- Docker 如何解决资源耗费的问题?
它主要是用的是复用资源技术,其实是操作的操作系统资源,与虚拟机则不是【独立占用】,因为安装虚拟机的时候已经分配好cpu 内存 硬盘。 - Docker 如何解决使用困难的问题?
只需要一个命令运行容器。 Doker如何解决 端口冲突与环境冲突的
因为Docker中的容器是完全隔离。二、Docker的应用场景
- Docker 如何解决资源耗费的问题?
应用场景
单体项目与微服务项目。三、Docker如何安装
博客地址
https://blog.csdn.net/Fu_Shi_...四、Docker管理命令
管理命令
builder Manage builds 管理构建 config Manage Docker configs 管理配置 container Manage containers 管理容器 context Manage contexts 管理上下文 engine Manage the docker engine 管理引擎 image Manage images 管理镜像 network Manage networks 管理网络 node Manage Swarm nodes 管理节点(集群) plugin Manage plugins 管理插件 secret Manage Docker secrets 管理密钥 service Manage services 管理服务 stack Manage Docker stacks 管理 swarm Manage Swarm 管理集群 system Manage Docker管理系统 trust Manage trust on Docker images 管理信任 volume Manage volumes 管理数据挂载(数据持久化 === 永久保存)
五、Docker镜像
- 镜像的概念
镜像其实就是一个没有启动的Linux的主机而已。 生成Docker镜像的条件
- 微服务发布包
- DockerFile文件 【文件位置与发布包文件夹目录同级】
配置DockerFile文件
FROM mcr.microsoft.com/dotnet/aspnet:6:0 WORKDIR /publish EXPOSR 80 EXPOSE 443 COPY publish/ /publish ENTRYPOINT ["dotnet","项目.dll"]
生成镜像命令
#在DockerFile同级目录下执行 docker build -t 镜像名称 . #查看镜像列表 docker images
运行镜像
#运行镜像后得到就是容器 #多个端口映射 docker run -p 外部访问端口[5001]:容器端口[80] -p 外部访问端口[5002]:容器端口[443] 镜像名称
查看容器
#查看容器 docker exec -it 容器ID /bin/bash
创建镜像版本号
#设置镜像版本号 docker image tag 原有镜像名称 新镜像名称:版本号
六、Docker容器
- 概念
镜像其实就是一个启动的Linux的主机而已。 镜像与容器的区别
- 镜像不可改变,容器可以修改[可以使用 docker exec -it 容器ID /bin/bash 进行修改,但是镜像不可以]
- 镜像可以生成多个容器,容器只能运行一次。
镜像与容器的关系
- 一对多的关系
优点
- 可以快速启动集群。
- 容器之间相互隔离。
容器操作
#查看操作容器的所有命令 docker container -h #查看当前容器详细信息 docker container inspect 容器ID
七、Dockerfile的指令
指令
FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。 RUN: 用来执行命令行命令。其基本格式: shell格式: RUN <命令> ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式; exec格式: RUN <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式; COPY: 复制文件。 其基本格式: 格式1:COPY <源路径>...<目标路径> 格式2:COPY [“<源路径1>”,....."<目标路径>"] ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压; CMD:容器启动命令。其基本格式: shell格式: CMD <命令> exec格式: CMD ["可执行文件", "参数1", "参数2"...] 参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数 ENTRYPOINT: 入口点。其基本格式分为exec和shell, ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了: <ENTRYPOINT> "<CMD>" ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式: 格式1:ENV <key> <value> 格式2:ENV <key1>=<value1> <key2>=<value>... ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式: 格式1: ARG <参数名> [=<默认值>] 格式2: 该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖 VOLUME: 定义匿名卷。 其基本格式: 格式1: VOLUME ["<路径1>", "<路径2>"...] 格式2: VOLUME <路径> EXPOSE: 暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式: 格式1: EXPOSE <端口1> [<端口2>...] WORKDIR: 指定工作目录。其基本格式: 格式1: WORKDIR <工作目录路径> USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式: 格式1: USER <用户名> HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式: 格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令 格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令
核心指令
1.1、FROM 指定基础镜像构建 写法: FROM 指定基础镜像 1.2、COPY 复制命令。从上下文目录中复制文件或者目录到容器里指定路径。 写法: COPY 源路径,目标路径 COPY ["源路径","目标路径"] 1.3、RUN运行指令。构建的时候运行的指令 主要在于镜像构建的时候运行,运行build命令的时候 后面接的命令就是shell输入的命令 写法 RUN shell命令 参数1 参数2 RUN ["shell命令 ","参数1"," 参数2"] 例如: RUN ["echo",">"," /usr/share/index.html"] 1.4、CMD运行指令。运行容器时候运行的指令 主要在于镜像运行容器的时候生成,运行run的时候运行 写法 CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] 例如: CMD ["dotnet","rmcore.dll"] 缺点:在run 命令后面可以进行覆盖 docker run -d -P rmcore dotnet rmcore.dll 进行覆盖掉 1.5 ENTRYPOINT运行指令。运行容器时候运行的指令(不会被覆盖) 写法 ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 可以和CMD动态结合,设置动态的配置参数 例如 ENTRYPOINT ["nginx", "-c"] 定参 CMD ["/etc/nginx/nginx.conf"]变参 7.6、EXPOSE暴露端口指令 仅仅声明端口,就是指定镜像暴露的端口 在run 的时候,通过docker run -p 会自动随机映射到EXPOSE端口 写法 EXPOSE 端口 EXPOSE 端口 例如 EXPOSE 5000 EXPOSE 5001 1.7、WORKDIR工作目录指令 用于应用在容器内的工作目录,就好比:ruanmou目录 写法 WORKDIR <工作目录路径> 例如 WORKDIR /rmcore 或者 WORKDIR /nginx
八、Docker自定义镜像
DockerFile文件
- 作用
生成镜像文件。 基本配置
FROM mcr.microsoft.com/dotnet/aspnet:6:0 #指定基础镜像和指定环境[Linux+SDK] WORKDIR /publish #新建工作目录 EXPOSR 80 #暴露容器端口 EXPOSE 443 #暴露容器端口 COPT publish/ /publish #将文件copy到docker 文件夹下 ENTRYPOINT ["dotnet","项目.dll"] #执行命令
- Nginx自定义镜像
条件
- Linux主机
- 下载
- 解压
- 编译
- 运行
DockerFile文件
FROM centos:7 #指定基础镜像 RUN yum -y install gcc make pcre-devel zlib-devel tar zlib #安装插件 WORKDIR /nginx #创建工作目录 COPY nginx-1.15.2.tar.gz /nginx #将压缩文件拷贝到docker中 RUN tar -zxvf nginx-1.15.2.tar.gz #执行解压命令 RUN cd nginx-1.15.2 && ./configure && make && make install #执行编译命令 EXPOSE 80 #暴露容器端口 COPY nginx.sh /nginx.sh #将 nginx.sh 拷贝到docker 目录中 RUN chmod 775 /nginx.sh #设置修改权限为 775 CMD ["/nginx.sh"] #运行nginx命令
- 作用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。