一、Docker介绍
1、什么是docker
Docker 是一个开源的容器平台,旨在帮助开发者在不同的环境和操作系统上轻松地部署和管理应用程序。 它允许开发者将应用程序及其依赖项打包成轻量级的独立容器,这些容器可以在任何支持 Docker 的环境中运行,无需担心环境差异。Docker 的核心思想是容器化,即通过将应用程序及其所有依赖项放入单个容器中,确保应用程序在不同环境中都能快速可靠地部署和运行。
Docker 提供了一系列命令行工具,使得用户可以方便地创建、启动、停止和删除容器。此外,Docker 还包含了强大的容器编排工具,有助于管理多容器部署、升级和扩展。Docker 的优势包括快速且可靠的部署和管理应用程序、高度的灵活性和可扩展性,以及支持多种编程语言和开发框架,从而适应不同团队和项目的需求。
2、为什么是Docker
在开发的时候,在本机测试环境可以跑,生产环境跑不起来
这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接打包在一起,无论在那个机器上保证了环境一致。
优势1: 一致的运行环境, 更轻松的迁移
服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了
这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
优势2 :对进程进行封装隔离, 容器与容器之间互不影响, 更高效的利用系统资源
公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器
在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。
优势3: 通过镜像复制N 多个环境一致容器
3、Docker和虚拟机区别
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。
传统虚拟机 Docker容器 磁盘占用 几个GB到几十个GB左右 几十MB到几百MB左右 CPU内存占用 虚拟操作系统非常占用CPU和内存 Docker引擎占用极低 启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒 安装管理 需要专门的运维技术 安装、管理方便 应用部署 每次部署都费时费力 从第二次部署开始轻松简捷 耦合性 多个应用服务安装到一起,容易互相影响 每个应用服务一个容器,达成隔离 系统依赖 无 需求相同或相似的内核,目前推荐是Linux
4、Docker 的核心架构
镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
仓库: 用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
dockerFile : docker生成镜像配置文件,用来书写自定义镜像的一些配置
tar : 一个对镜像打包的文件,日后可以还原成镜像
二、Docker的安装与常用命令
1、docker安装
由于113、114、115三台开发机已经被其他同事安装了docker,这里就只做安装步骤的介绍
# 安装必要的一些系统工具
sudo
yum
install
-y yum-utils device-mapper-persistent-data lvm2
//
添加软件源信息 这里使用阿里云的镜像
sudo
yum-config-manager --add-repo http:
//mirrors
.aliyun.com
/docker-ce/linux/centos/docker-ce
.repo
//
更新yum索引列表并安装Docker引擎
sudo
yum makecache fast
sudo
yum
install
docker-ce
//
启动docker并设置开机启动
sudo
systemctl start docker
sudo
systemctl
enable
docker
//
最后验证docker状态
systemctl status docker
2、常用命令介绍
2.1、Images 镜像命令
2.1.1、查看本机中所有镜像
docker images -------------------------- 列出本地所有镜像
-a 列出所有镜像(包含中间映像层)
-q 只显示镜像id
2.1.2、搜索镜像
docker search [options] 镜像名
去dockerhub上查询当前镜像 --no-trunc 显示完整的镜像信息
2.1.3、从仓库下载镜像
docker pull 镜像名[:TAG|@DIGEST] ----------------- 下载镜像
2.1.4、删除镜像
docker rmi 镜像名 -------------------------- 删除镜像
-f 强制删除
2.1.5、构建镜像
docker build -------------------------- 构建镜像
[OPTIONS] 用于指定构建时的一些选项,例如镜像标签、构建上下文等,例如:-t 或 --tag:指定要构建的镜像的名称和标签。
PATH | URL | - 指定包含 Dockerfile 的上下文路径,该路径可能是本地文件系统的目录,也可以是一个 URL 或 -。
2.2、Contrainer 容器命令
2.2.1、运行容器
docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name 别名为容器起一个名字
-d 启动守护式容器(在后台启动容器)
-p 映射端口号:原始端口号 指定端口号启动
例:docker run -it --name mytomcat -p 8888:8080 tomcat
docker run -d --name mytomcat -P tomcat
2.2.2、查看运行的容器
docker ps
-------------------------- 列出所有正在运行的容器
-a 正在运行的和历史运行过的容器
-q 静默模式,只显示容器编号
2.2.3、停止|关闭|重启容器
docker start XXX
--------------- 开启容器
docker restart xxx
--------------- 重启容器
docker stop XXX
------------------ 正常停止容器运行
docker kill
XXX
------------------ 立即停止容器运行
2.2.4、查看容器内进程
docker
top
xxx ------------------ 查看容器内的进程
2.2.5、查看查看容器内部细节
docker inspect 容器
id
------------------ 查看容器内部细节
2.2.6、查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t 加入时间戳
-f 跟随最新的日志打印
--tail
数字 显示最后多少条
2.2.7、进入容器内部
docker exec
[options] 容器id
容器内命令 ------------------ 进入容器执行命令
-i 以交互模式运行容器,通常与-t一起使用
-t 分配一个伪终端 shell窗口 bash
2.2.8、容器和宿主机之间复制文件
docker cp
文件|目录 容器id:容器路径 将宿主机复制到容器内部
docker cp
容器id:容器内资源路径 宿主机目录路径 - 将容器内资源拷贝到主机上
2.2.9、删除容器
docker
rm
-f 容器
id
和容器名
docker
rm
-f $(docker
ps
-aq) -------------------------- 删除所有容器
三、Dockerfile
1、 什么是Dockerfile
Dockerfile可以认为是Docker 镜像的描述文件,是由一系列命令和参数构成的脚本 。主要作用是用来构建 docker 镜像的构建文件 。
通过架构图可以看出通过DockerFile 可以直接构建镜像
2、Dockerfile解析过程
3、 Dockerfile的保留命令
保留字 作用 FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROMMAINTAINER 镜像维护者的姓名和邮箱地址 RUN 构建镜像时需要运行的指令 EXPOSE 当前容器对外暴露出的端口号 WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 ENV 用来在构建镜像过程中设置环境变量 ADD 将宿主机目录下的文件拷贝进镜像且ADD 命令会自动处理URL 和解压tar 包 COPY 类似于ADD ,拷贝文件和目录到镜像中 将从构建上下文目录中< 原路径> 的文件/ 目录复制到新的一层的镜像内的< 目标路径> 位置 VOLUME 容器数据卷,用于数据保存和持久化工作 CMD 指定一个容器启动时要运行的命令 Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被docker run 之后的参数替换 ENTRYPOINT 指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和CMD 一样,都是在指定容器启动程序及其参数
3.1、FROM 命令
基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现
语法:FROM <image> FROM <image>[:<tag>] 使用版本不写为latest FROM <image>[@<digest>] 使用摘要
3.2、MAINTAINER 命令
镜像维护者的姓名和邮箱地址[废弃]
语法:
MAINTAINER <name>
3.3、RUN 命令
RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
语法:RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)RUN echo helloRUN [“executable”, “param1”, “param2”] (exec form)RUN [“/bin/bash”, “-c”, “echo hello”]
3.4、 EXPOSE 命令
用来指定构建的镜像在运行为容器时对外暴露的端口
语法:EXPOSE80/tcp 如果没有显示指定则默认暴露都是tcp EXPOSE80/udp
3.5、CMD 命令
用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
语法:CMD [“executable”,”param1″,”param2″] (exec form, this is the preferred form)CMD [“param1″,”param2”] (as default parameters to ENTRYPOINT)CMD command param1 param2 (shell form)
3.6、WORKDIR 命令
用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
语法:WORKDIR /path/to/workdirWORKDIR /aWORKDIR bWORKDIR c `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`
3.7、ENV 命令
用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
语法:ENV <key> <value> ENV <key>=<value> …
3.8、ADD 命令
用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
语法:ADD hom* /mydir/ 通配符添加多个文件ADD hom?.txt /mydir/ 通配符添加ADD test.txt relativeDir/ 可以指定相对路径ADD test.txt /absoluteDir/ 也可以指定绝对路径ADD url
3.9、COPY 命令
用来将context目录中指定文件复制到镜像的指定目录中
语法:COPY src destCOPY [“<src>”,… “<dest>”]
3.10、VOLUME 命令
用来定义容器运行时可以挂在到宿主机的目录
语法:VOLUME [“/data”]
3.11、ENTRYPOINT命令
用来指定容器启动时执行命令和CMD类似
语法:[“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2
ENTRYPOINT指令,往往用于设置容器启动后的第一个命令 ,这对一个容器来说往往是固定的。 CMD指令,往往用于设置容器启动的第一个命令的默认参数 ,这对一个容器来说可以是变化的。