docker&docker compose是什么

dock,可以理解为是一种轻型的虚拟机,只需虚拟你所需要使用的软件的运行环境,即可保证软件能够正常运行,且这种虚拟是建立在一个个容器中的,是与宿主机器的环境隔离开的,并不会影响宿主机器已经配置好的环境,且能够十分方便地将项目在各种环境下进行迁移、部署

这里与虚拟机进行一个对比,会有更加直观的理解:

特点

普通虚拟机

Docker

跨平台

不一定支持在不带有桌面系统的服务器上运行

各类 windows 和 Linux 都支持

性能

内存占用高,各项不需要的服务也有包含,不纯粹

只虚拟软件所需的运行环境,减少软件不需要的服务

安装难度

需要手动部署环境

一个命令就可自动部署好软件所需环境

稳定性

不同系统之间存在差异

稳定性好

然而,在使用docker部署项目的时候,我们经常会发现一个项目往往不是独立运行的,需要多个软件协同工作,这就需要我们运行多个容器,并且让这些容器之间能够互相通信,当然,我们可以使用docker在这些容器之间构建起虚拟网络,但这无疑增加了部署的难度,因此,我们需要使用 docker-compose ,把项目的多个服务集合到一起,并一键运行。

docker原理

首先,我们需要知道作为容器,需要哪些服务?

简单来说,容器可以理解为一个专用某服务的独立操作系统,即:精简linux操作系统+某个软件服务 的组合。

因此,它必须包含运行某个软件所需的所有内容,包括:代码、运行所需要调用的库文件、环境变量、配置文件等。

docker使用

  • 镜像【image】:可以理解为官方、开发者发布的能够提供不同服务的软件安装包。一般的镜像都可以去 docker hub 找到。

  • 容器【container】:软件安装并运行之后的状态,每个软件运行环境都是独立且隔离的,可能存在由一个镜像运行的多个容器的情况。

docker安装及镜像更换

安装docker只需要参照官网的文档:

至于镜像更换,建议直接登录阿里云使用其提供的镜像进行更换:容器镜像服务 (aliyun.com)

也可以直接按照这个老哥提供的脚本一键安装:docker和docker compose、docker更换国内源

docker相关命令

辅助命令

  • docker version 查看docker客户端引擎、服务端引擎版本信息

  • docker info 查看docker引擎详细信息

  • docker --help 查看命令帮助信息

镜像相关操作命令

查看本地仓库中的镜像

  • docker images:查看本地仓库中的所有镜像

  • docker images 镜像名称:查看本地仓库中所有与指定"镜像名称"相关的镜像

执行之后返回结果如图: image-20240726153413139

显示信息的构成:

  • REPOSITORY:镜像名称

  • TAG:镜像版本

  • IMAGE ID:镜像ID【唯一标识】,在实际运用中,一般来说,前三位就能确定一个镜像

  • CREATED:该镜像官方创建的时间

  • SIZE:镜像大小

下载远端仓库中的镜像

  • docker pull 某个镜像的名称:这样使用默认拉取的是最新版本,<==> docker pull 镜像名称:latest

  • docker pull 镜像名称:版本号:这样可以获取指定版本的镜像

搜索镜像

docker search 镜像名称:在docker hub中镜像搜索,并返回符合用户搜索的结果,并不会显示版本,需要到docker hub网页中去查看具体的版本号

删除镜像

  • docker image rm 镜像id:<==>docker rmi 镜像id,这种方式只能删除没用运行过的镜像,不然就只能强制删除

  • docker image rm -f 镜像id:这种方式是强制删除,会将镜像和基于该镜像运行的容器全都删除

  • docker image rm $(docker images 镜像名称 -q):组合式删除所有指定镜像名称的镜像,参数 -q 代表仅显示id

容器相关操作命令

基本格式:docker 命令 [选项]

查看正在运行的容器

  • docker ps:查看正在运行的容器

  • docker ps -a:查看所有的容器,包括没有运行的容器

执行之后返回结果如图:

image-20240726161331485

其中:

  • CONTAINER ID:代表容器ID【唯一标识】

  • IMAGE:基于哪个镜像

  • COMMAND:容器内启动服务的命令

  • CREATED:容器的创建时间

  • STATUS:容器当前状态

  • PORTS:容器内该服务监听的端口号

  • NAMES:容器名称,若在启动时未指定名称,docker自动分配容器的名称

运行容器命令

  • docker run 镜像id:将镜像id对应的镜像运行起来,注意每运行一次镜像就会生成一个容器

  • docker run -p 宿主机端口号:容器内服务端口号 镜像id:运行容器,并同时设置容器与宿主机端口的映射关系,这样才能外部访问得到该容器的对应端口,注意:使用这种方式时,支持映射多个端口,增加 -p 宿主机端口号:容器内服务端口号 即可

  • docker run -d 镜像id:代表后台运行该容器

  • docker run --name 容器名称 镜像id:指定启动容器的名称

停止、重启、暂停、恢复容器

  • docker stop 容器id:停止,在容器启动之后可以使用

  • docker restart 容器id:重启,在容器启动之后可以使用

  • docker start 容器id:启动,在容器被停止之后可以使用

  • docker pause 容器id:暂停,在容器启动之后可以使用

  • docker unpause 容器id:重新开启,在容器暂停之后可以使用

杀死容器

docker kill 容器id:将容器进程直接杀死

删除容器

  • docker rm 容器id:只能删除处于停止状态的容器,运行状态中的容器用这种方式不能删除

  • docker rm -f 容器id:强制删除,即使该容器处于运行状态

  • docker rm $(docker ps -qa):组合式方式,删除所有容器

查看容器日志

  • docker logs 容器id:查看某个容器的日志

  • docker logs -f 容器id:查看某个容器的实时日志

  • docker logs -t 容器id:查看容器标注宿主机时间的日志

进入容器内部

  • docker exec -it 容器id bash:进入指定容器中并使用交互模式在容器中的bash窗口进行操作

    之后再退出容器:

    • exit:退出后,该容器也许就被停止了【不一定,但可能就会停止】

    • ctrl+p+q:退出后,该容器依然在运行中

容器与宿主机之间的文件拷贝

  • docker cp 容器id:容器内资源路径 宿主机目录路径:将容器中的指定文件和目录拷贝到宿主机中

  • docker cp 主机内资源路径 容器id:容器路径:将宿主机中指定文件复制到容器内部

查看容器内信息

  • docker top 容器id:查看容器内运行的进程

  • docker inspect 容器id展示容器内的其他信息

容器数据卷

生产条件下,这是最重要的,因为只有进行了容器数据卷的映射,才能实现数据的持久化管理

数据卷是什么?

数据卷即:Data Volume

作用:用来实现容器中数据和宿主机中数据进行映射的【从而实现挂载并实时同步某些文件 or 文件夹的作用】

【注意:数据卷的绑定使用必须在容器首次启动的时候设置】

数据卷的使用
  • docker run -v 宿主机某目录:容器内某目录 容器id

<!-- 在容器内的路径后加上 :ro 则表示在容器内仅可读 -->

慎用==》使用绝对路径时,如果按照如下操作进行:docker run -v 宿主机绝对路径:容器内路径

则:这种方式会将容器内路径的原本存在的内容全部清空,并始终按照宿主机的路径作为自己的路径

  • docker run -v aa:/usr/local/tomcat/webapps 容器id:使用别名的方式设置数据卷

aa是什么?【可以通过 find / -name aa 对宿主机中从根目录开始查找名为aa的文件夹 】

1、aa代表的是某个容器对应的数据卷的别名

2、这个别名如果存在,则容器在启动的时候就直接启动;如果不存在则自动创建

3、使用别名方式可以保留容器中所映射路径的原始内容

【但是前提条件是在宿主机中创建起来的别名所对应的路径下不能存在有内容】

打包容器为一个镜像

意义
  • 镜像:仅可读

  • 容器:可读可写

意义:将修改配置好的容器打包成一个新的镜像,以后在生产环境下,就可以基于这个镜像在不同的宿主机下运行成容器

使用
  • docker commit -m "描述信息" -a "作者信息" 容器id 打包的镜像名称:标签:将容器打包为新的镜像,其中标签一般为版本号

备份为tar及恢复
  • docker save 镜像名:标签 -o 目录/名称.tar:将某个镜像打包为tar以便于传输,标签一般为版本

  • docker load -i 名称.tar:将打包好的tar文件中的镜像载入