1、什么是Docker?优点是什么?有哪些核心概念?
Docker 是一个开源的应用容器引擎,是一款快速构建、运行、管理应用的工具。容器完全使用沙盒机制,互相之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖任何语言、框架或包装系统。
- 优点:Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用;
- 镜像:将应用所需要的函数库、依赖、配置等与应用一起打包得到的就是镜像。
- 容器:根据镜像的应用进程创建的隔离环境就是容器。
- 镜像仓库:存储和管理镜像的服务就是镜像仓库。(最大的镜像仓库:DockerHub)
2、镜像操作命令有哪些?
- 搜索:
docker search 镜像名称
- 拉取:
docker pull
- 推送:
docker push
- 查看(所有)镜像:
docker images [-q]
- 删除:
docker rmi 镜像名称
- 删除所有:
docker rmi 'docker images -q'
- 制作镜像:
docker build -t 镜像名称 .
- 导出镜像:
docker save -o 镜像名称.tar 镜像名称
- 加载镜像:
docker load -i 镜像名称.tar
- 容器转为镜像:
docker commit 容器名称 镜像名称
3、容器操作命令有哪些?
- 查看(正在运行的):
docker ps [-a]
- 删除(强制):
dockers rm [f] 容器名称
- 删除所有:
docker rm -f $(docker ps -a)
- 创建容器:
docker create -d --name=容器名称 -p宿主机端口:容器内端口 镜像名称
- 创建并运行容器:
docker run -d --name=容器名称 -p宿主机端口:容器内端口 镜像名称
- 启动容器:
docker start 容器名称
- 停止容器:
docker stop 容器名称
- 重启容器:
docker restart 容器名称
- 暂停容器:
docker pause 容器名称
- 恢复容器:
docker unpause 容器名称
- 进入容器:
docker exec -it 容器名称 /bin/bash
- 查看容器信息:
docker inspect 容器名称或容器id
- 创建容器相关设置:
-
- 自启动:
restart=always
- 挂载数据卷:
-v es-data(数据卷名称):/usr/share/elasticsearch/data(容器内)
- 创建网络:
docker network create es-net(网络名称)
- 加入网络:
-- network es-net(网络名称)
- 端口映射:
-p 宿主机端口:容器内端口
- 自启动:
- 修改容器设置语法:
docker update --restart=no(相关设置) 容器id
4、数据卷操作命令有哪些?
- 创建数据卷:
docker volume create 数据卷名称
(位于/var/lib/docker/volume目录) - 查看当个数据卷详情:
docker volume inspect 数据卷名称
- 查看数据卷列表:
docker volume ls
- 删除数据卷:
docker volume rm 数据卷名称
- 删除未使用的数据卷:
docker volume prune
- 创建容器时挂载数据卷:
-
- 挂载数据卷(会自动创建数据卷):
docker run -v 数据卷名称:容器内目录路径
- 挂载指定目录(要自己创建):
docker run -v 绝对路径:容器内目录路径
- 挂载数据卷(会自动创建数据卷):
- (补充)docker 网络:
-
- 删除网络:
docker network rm 网络名
- 查看所有网络:
docker network lss
- 将容器连接到指定网络:
docker network connect 网络名称 容器名称
- 断开容器的网络:
docker network disconnect 网络名称 容器名称
- 删除网络:
5、docker如何自定义镜像?docker file的语法是什么样的?
一、创建一个空目录,在这个空目录中创建一个文件,命名为 DockerFile,最后将 java 项目打包成 jar 包,放到这个目录中;
二、编写 Dockerfile 文件
主要编写以下信息:
- 基于 java:8-alpine 作为基础镜像
- 将 app.jar 拷贝到镜像中
- 暴露端口
- 编写入口 ENTRYPOINT
Ps:Dockerfile的第一行必须是FROM;从一个基础镜像来构建基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
# 指定基础镜像
FROM java:8-alpine# 拷贝 java 项目包
COPY ./docker-demo.jar /tmp/app.jar# 暴露端口
EXPOSE 8090# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar使用 docker build 构建为一个镜像
三、使用 docker build 构建为一个镜像
- -t 表示设置镜像名和版本号(自定义)
- . 表示 Dockerfile 所在目录,因为刚刚我是将 Dockerfile 放在了当前文件目录下,所以就用 . 来表示当前目录
通过 docker images 就可以看到刚刚构建好的镜像
四、使用 docker run 运行镜像
这时候你就可以根据服务器 IP 和自己配置的镜像映射端口号以及项目地址就可以访问了(注意:如果需要访问,别忘了开放云服务器的端口号的防火墙)。
DockerFile本质就是一个文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
6、docker compose是干嘛的?语法是什么样的?
1、Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!相当于批量的docker run。
2、Docker-Compose 将所管理的容器分为三层
工程(project):一个工程包含多个服务
服务(service):一个服务当中可包括多个容器实例
容器(container)
Docker-Compose 运行目录下的所有文件(docker-compose.yml、extends文件 或 环境变量文件等)组成一个工程,若无特殊指定 工程名即为当前目录名。
Docker Compose 的核心就是其配置文件,采用 YAML 格式,默认为 docker-compose.yml 。
在这里插入图片描述
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务当中可包括多个容器实例,但是:Docker-Compose 并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul 技术。
Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量 COMPOSB_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目 (project)。