Docker是一个开源的应用容器引擎,基于Go语言开发,Docker可以打包应用及其依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的系统。
docker相关资源:
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: https://docs.docker.com/
- Docker Hub: https://hub.docker.com
Docker架构
图片来源:Docker 架构
- 镜像(Image):Docker镜像(Image),相当于时一个root文件系统。比如Ubuntu镜像就包含了完整的一套Ubuntu最小系统的root文件系统。
- 容器(Container):独立运行的一个或一组应用,是镜像运行后的进程,镜像和容器类似于面向对象程序设计种的类和对象,镜像是静态的定义(比如类),容器时镜像运行时的实体(对象)。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Respository):可以看成一个代码控制中心,用来保存镜像。官方在Docker Hub提供了庞大的镜像集合供使用,也可以自己上传镜像
Docker与虚拟机的区别:
- 容器与容器之间只是进程的隔离,虚拟机是完全的资源隔离(容器虚拟化的是操作系统,虚拟机虚拟化的是硬件)
- 虚拟机的启动需要的时间是分钟级别,Docker启动是秒级甚至更短
- 容器使用宿主操作系统的内核,只能运行在同一类型操作系统,虚拟机使用完全独立的内核,可以运行不同操作系统
安装
Docker可以运行在MAC、Windows、CentOS、Ubuntu等操作系统上,官网:https://www.docker.com/
网上有很多安装教程,尽量在linux系统上安装使用。
安装成功后,可以通过docker -v
命令查看安装是否成功
> docker -v
Docker version 20.10.11, build dea9396
Docker基本命令
服务相关命令
命令 | 描述 |
---|---|
systemctl start docker | 启动docker服务 |
systemctl stop docker | 停止docker服务 |
systemctl restart docker | 重启docker服务 |
systemctl status docker | 查看docker服务状态,启动中:active (running)、停止状态:inactive (dead) |
systemctl enable docker | 设置开机启动docker服务 |
镜像相关命令
命令 | 描述 |
---|---|
docker images | 查看本地所有的镜像 |
docker search 镜像名称 | 从 Docker Hub 查找需要的镜像 |
docker pull 镜像名称[:版本号] | 从Docker Hub(仓库)下载指定版本镜像到本地,如果版本号未指定,则默认下载最新的版本。 |
docker rmi 镜像id docker rmi 镜像名称[:版本号] | 根据镜像id或镜像名称+版本号(若版本号未输,默认是latest)删除指定镜像 |
docker save 镜像名称:版本>路径/xxx.tar | 将指定镜像导出到指定路径下(文件后缀为rar) |
docker load<文件路径 | 将指定镜像文件导入到系统中 |
docker tag 原镜像名称:版本 新镜像名称:新版本 docker tag 镜像id 新镜像名称:新版本 | 标记本地镜像为新镜像名称、新版本(不会修改原有的镜像) |
docker history 镜像名称 | 查看指定镜像的创建历史 |
docker images
命令:docker images [OPTIONS]
描述:列出本地镜像
输出结果字段说明:
- REPOSITORY: 镜像名称
- TAG:镜像版本号
- IMAGE ID:镜像在本地的id
- CREATED:镜像在官方被创建的日期
- SIZE:镜像大小
docker search
命令:docker search 镜像名称
描述:从 Docker Hub 查找需要的镜像
输出结果字段说明:
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布,若显示为[OK]表示是官方提供的镜像
- STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
docker pull
命令:docker pull 镜像名称[:版本号]
描述:从 Docker Hub 拉取指定的镜像到本地
docker rmi
命令:
- 根据镜像id删除:docker rmi 镜像id
- 根据镜像名称和版本号(默认为latest)删除:docker rmi 镜像名称[:版本号]
描述:rmi(remove images的缩写)删除指定的镜像
注意:如果镜像名称一样,版本号一个是latest,一个是具体的版本号,如果具体的版本号就是最新的,则2个镜像的镜像id是一样的,这个时候使用镜像id删除会失败,这个时候就只能使用镜像名称+版本号的方式去删除指定的镜像。
也可以批量删除镜像(需要跟docker images -q结合使用),命令行格式为:
docker rmi `docker images -q redis`
docker save
命令:docker save 镜像名称:版本>路径/xxx.tar
描述:将指定镜像导出到指定路径下(文件后缀为rar)
注意:文件对应的路径必须是已经存在的,路径不存在的话会失败
docker load
命令:docker load<文件完整路径(包含文件名)
描述:将指定镜像文件导入到系统中
docker tag
命令:
- 按照镜像名称和版本:docker tag 原镜像名称:版本 新镜像名称:新版本
- 按照镜像id:docker tag 镜像id 新镜像名称:新版本
描述:标记本地镜像为新镜像名称、新版本
从结果来看,docker tag并没有将原有的内容进行修改(IMAGE ID)一样,相当于是复制了个镜像
docker history
命令:docker history 镜像名称
描述:查看指定镜像的创建历史
容器相关命令
命令 | 描述 |
---|---|
docker ps | 查看正在运行的容器 |
docker run [option] --name=容器名称 本地镜像名称:镜像版本 [待执行命令] | 创建并启动容器,且自动执行待执行命令 |
docker exec 参数 容器名称或容器id 待执行命令 | 进入容器(后面退出容器,容器不会关闭) |
docker start/restart/stop/kill 容器名称或容器id | 启动/重启/停止/杀掉 容器 |
docker pause/unpause 容器名称或容器id | 暂停容器运行 |
docker rm 容器名称或容器id | 删除容器 |
docker inspect 容器名称或容器id | 查看容器元信息 |
docker top 容器名称或容器id | 查看容器中运行的进程信息 |
docker stats 容器名称或容器id | 查看容器占用资源情况 |
docker cp 本地路径 容器id:路径 docker cp 容器id:路径 本地路径 | 将本地路径内容拷贝到指定容器的指定路径下 将指定容器的指定路径内容拷贝到本地指定路径 |
docker logs [option] 容器名称或容器id | 查看指定容器的日志 |
docker ps
命令:docker ps或docker ps -a
描述:查看正在运行的容器
结果字段说明
- CONTAINER ID:容器ID
- IMAGE:镜像
- COMMAND:创建容器时执行的命令(比如docker run时在命令末尾的内容)
- CREATED:容器创建时间
- STATUS:容器运行状态
- PORTS:网络访问端口
- NAMES:容器名称
docker run
命令:docker run [option] --name=容器名称 镜像名称:镜像id 待执行命令
option常用参数:
- -i:以交互模式运行容器,通常与 -t 同时使用,使用it这2个参数后,容器创建后自动进入容器中,推出容器后,容器自动关闭。
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
- -d:以守护(后台)模式运行容器,并返回容器ID。创建一个容器在后台运行,需要使用docker exec进入容器,退出后容器也不会关闭
- –name:为创建的容器命名
描述:创建并启动容器,并在容器中自动执行指定的一条命令
docker start/restart/stop/kill
命令:docker start/restart/stop/kill 容器名称或容器id
描述:启动/重启/停止/杀掉 容器
docker pause/unpause
命令:docker pause/unpause 容器名称或容器id
描述:暂停容器运行
docker rm
命令:docker rm 容器名称或容器id
选项:
- -v:删除容器后,会去查看关联的卷(数据卷容器类型的)是否不在使用中了,如果不在使用中,则将卷同步删除
描述:删除容器(需要停止容器再删,运行状态的会删除失败)
docker inspect
命令:docker inspect 容器名称或容器id
描述:查看容器元信息
docker top
命令:docker top 容器名称或容器id
描述:查看容器中运行的进程信息
输出结果字段说明:
- PID:进程的进程号
- PPID:父进程进程号
- C、%CPU:cpu使用率
- STIME:进程启动时的系统时间
- TTY:进程启动时终端设备,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
- TIME:运行进程需要的累积CPU时间
- CMD:启动程序名称或命令
docker stats
命令:docker stats 容器名称或容器id
描述:查看容器占用资源情况
输入docker stats命令,回车后,出现如下界面:
之后可以Ctrl+C退出当前界面
docker cp
命令:docker cp 路径1 路径2
描述:将路径1的内容复制到路径2去。如果是表示某个容器的路径,则需要是容器id:
或容器名称:
开头
注意:路径均为绝对路径
docker logs
命令:docker logs [option] 容器名称或容器id
描述:获取容器的日志
option参数说明
- -f:跟踪日志输出
- –since:显示某个开始时间的所有日志
- -t:显示时间戳
- –tail:仅列出最新N条容器日志
docker exec
命令:docker exec 参数 容器名称或容器id 待执行命令
描述:在运行的容器中执行命令(exit命令退出容器后,容器不会关闭)
参数说明:
- -d:分离模式(在后台运行)
- -i:保持STDIN打开
- -t:分配一个伪终端
数据卷和数据卷容器
思考:
- Docker容器删除后,容器中产生的数据也会随之销毁(数据非持久化)
- Docker容器和外部机器不能可以直接交换文件(不能直接,那就间接)
- 容器之间想要进行数据交互(不能直接,那就间接)
为了解决容器中的数据无法与其他机器、容器交互和持久保存的问题,Docker提供了数据卷。
数据卷:
- 数据卷时宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步(即容器和数据卷数据同步更新)
- 一个数据卷可以被多个容器同时挂载
- 一个容器可以被挂载多个数据卷
数据卷作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
在创建启动容器时,使用 -v参数 设置数据卷:
docker run …
-v 宿主机目录(文件):容器内目录(文件)
…
注意事项:
- 目录必须时绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
一个容器可以挂载多个数据卷
配置数据卷容器
如果某个容器想与数据卷容器共享数据,除了2者的数据卷是同一个的方法外,也可以设置一个数据卷容器,然后其他容器可以跟这个数据卷容器进行挂载。
在创建启动数据卷容器时,使用 -v参数 设置数据卷:
docker run …
-v 容器内目录(文件)路径
…
在创建启动容器时,使用 –volumes-from 数据卷容器id或名称 挂载数据卷容器
docker run …
--volumes-from 数据卷容器id或名称
…
docker volume命令
docker volume ls
格式:docker volume ls [option]
常用选项:
--filter dangling=true
:只显示未使用中的卷描述:查看全部数据卷容器信息(只展示数据卷容器的卷,主机的数据卷目录、文件或关联数据卷容器的容器均不被识别)
docker volume inspect
格式:docker volume inspect 卷名称
描述:查看卷详情
docker volume rm
格式:docker volume rm 卷名称
描述:删除对应的卷(如果卷还在使用中【被映射、挂载】,则删除失败)