一、概述
Docker是做什么的?
- Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用
什么是镜像?
- 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像
什么是容器?
- 为每个镜像的应用进程创建的隔离运行环境就是容器
什么是镜像仓库?
- 存储和管理镜像的服务就是镜像仓库
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器
二、基本命令
命令关系解释:
命令 | 说明 | 文档地址 |
---|---|---|
docker pull | 拉取镜像 | docker pull |
docker push | 推送镜像到DockerRegistry | docker push |
docker images | 查看本地镜像 | docker images |
docker rmi | 删除本地镜像 | docker rmi |
docker run | 创建并运行容器(不能重复创建) | docker run |
docker stop | 停止指定容器 | docker stop |
docker start | 启动指定容器 | docker start |
docker restart | 重新启动容器 | docker restart |
docker rm | 删除指定容器 | docs.docker.com |
docker ps | 查看容器 | docker ps |
docker logs | 查看容器运行日志 | docker logs |
docker exec | 进入容器 | docker exec |
docker save | 保存镜像到本地压缩文件 | docker save |
docker load | 加载本地压缩文件到镜像 | docker load |
docker inspect | 查看容器详细信息 | docker inspect |
三、部署MySQL
先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:
1 | docker run -d \ |
- -d:让容器后台运行
- –name:给容器命名
- -e:环境变量
- -p:主机端口号映射到容器内端口号
- -v:指定数据卷
一行命令就可以搞定原来繁琐的部署
四、数据卷
1.定义
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:
html
:放置一些静态资源conf
:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html
目录;如果我们要修改Nginx的配置,最好是找到conf
下的nginx.conf
文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
在上图中:
- 我们创建了两个数据卷:
conf
、html
- Nginx容器内部的
conf
目录和html
目录分别与两个数据卷关联。 - 而数据卷conf和html分别指向了宿主机的
/var/lib/docker/volumes/conf/_data
目录和/var/lib/docker/volumes/html/_data
目录
这样以来,容器内的conf
和html
目录就 与宿主机的conf
和html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data
就是在操作容器内的/usr/share/nginx/html/_data
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
2.基本命令
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | docker volume create |
docker volume ls | 查看所有数据卷 | docs.docker.com |
docker volume rm | 删除指定数据卷 | docs.docker.com |
docker volume inspect | 查看某个数据卷的详情 | docs.docker.com |
docker volume prune | 清除数据卷 | docker volume prune |
3.本地挂载
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
1 | # 挂载本地目录 |
注意:本地目录或文件必须以 /
或 ./
开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
例如:
1 | -v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷 |
4.本地挂载MySQL
示例:
- 挂载
/root/mysql/data
到容器内的/var/lib/mysql
目录 - 挂载
/root/mysql/init
到容器内的/docker-entrypoint-initdb.d
目录(初始化的SQL脚本目录) - 挂载
/root/mysql/conf
到容器内的/etc/mysql/conf.d
目录(这个是MySQL配置文件目录)
1 | docker run -d \ |
五、自定义镜像
镜像的定义:镜像中包含了程序运行需要的系统函数库、环境、配置、依赖以及应用本身等各种文件。通俗来讲,就是一堆文件的集合;
镜像的结构:
镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包而成
1.Dockerfile
Dockerfile就是利用固定的指令来描述镜像结构和构建过程,这样docker才可以依次来构建镜像
基础语法
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
1 | # 指定基础镜像 |
2.构建镜像
1 | dokcer build -t 镜像名 Dockerfile目录 |
1 | docker build -t n |
命令说明:
docker build
: 就是构建一个docker镜像-t docker-demo:1.0
:-t
参数是指定镜像的名称(repository
和tag
).
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了xxx目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录
1 | # 直接指定Dockerfile目录 |
六、容器网络互联
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
1.常见命令
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | docker network create |
docker network ls | 查看所有网络 | docs.docker.com |
docker network rm | 删除指定网络 | docs.docker.com |
docker network prune | 清除未使用的网络 | docs.docker.com |
docker network connect | 使指定容器连接加入某网络 | docs.docker.com |
docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
docker network inspect | 查看网络详细信息 | docker network inspect |
2.示例
1 | # 1.首先通过命令创建一个网络 |
注意:加入自定义网络的容器才可以通过容器名互相访问;
七、部署项目
1.创建自定义网络
docker自定义网络可以通过容器名访问同一网络内的容器
前台需要访问后台,这里也是通过别名访问
因后台项目需要使用MySQL,所以可以通过创建一个自定义网络,通过别名去访问mysql,例如下图的yaml文件
1.首先创建一个网络
1 | docker network create sgx |
2.让MySQL加入此网络
1 | docker network connnet sgx mysql |
后续前台和后台项目在run时加入自定义网络
2.部署后台
1.进入idea进行打包
2.等待打包完成之后,将target中生成的.jar文件和Dockerfile文件上传到虚拟机上
3.然后创建镜像
1 | docker build -t hmall . |
注意:因为我当前在当前存放Dockerfile文件的文件夹下,我这里可以使用 .
如何不在存放Dockerfile文件的文件夹下,需要写上绝对路径或者cd到Dockerfile文件夹下使用 .
然后查看本地镜像,如果存在则代表创建成功
4.启动镜像并且指定自定义网络
这里需要指定自定义网络,因为我们在后台配置文件中配置了通过别名访问MySQL
1 | docker run -d --name hm -p 8080:8080 --network sgx hmall |
查看日志是否启动成功
1 | docker logs -f hm |
5.访问接口
3.部署前端
1.将nginx资源上传到虚拟机
2.启动一个新的nginx并进行数据卷挂载
1 | docker run -d \ |
3.查看是否成功
4.DockerCompose
1).定义
Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
2).语法对比
docker run 参数 | docker compose 指令 | 说明 |
---|---|---|
–name | container_name | 容器名称 |
-p | ports | 端口映射 |
-e | environment | 环境变量 |
-v | volumes | 数据卷配置 |
–network | networks | 网络 |
基本语法如下:
1 | docker compose [OPTIONS] [COMMAND] |
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
-p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |
3).一键部署
综上所述 上面部署前台和后台的所有命令可以总结为下面代码:
将代码放入到docker-compose.yml文件后,可以一键部署
1 | version: "3.8" |
一键部署指令:
1 | 启动所有, -d 参数是后台启动 |