Docker
一、一个项目的完整部署过程
一个项目的完整部署过程 |
---|
![]() |
二、同一应用在不同的环境下是否能正常访问
不同的环境 |
---|
![]() |
同一应用(环境不同) |
---|
![]() |
三、感受原始安装并启动Tomcat和我们现在启动Tomcat
1、感受原始安装并启动Tomcat
- 下载 tomcat.tar.gz包
- 上传到Linux
- 解压 tomcat.tar.gz包
- 进入到tomcat的bin目录,执行startup.sh
2、我们现在启动Tomcat
docker run -p 8001:8080 -d tomcat:8.0.15
- 通过上述命令,就成功安装并启动了一个tomcat,非常的快,可以是秒级
- 对比原始的方式来启动tomcat,效率大大提升,步骤也很简单
3、要启动第二个tomcat
3.1 传统方式怎么办?
- 重新解压一份tomcat.tar.gz包
- 修改 tomcat/conf/server.xml 中的启动和停止相关端口号
- 再执行startup.sh
3.2 现在怎么办?
- 只需要再次执行如下命令,修改端口号即可
- docker run -p 8002:8080 -d tomcat:8.0.15
四、虚拟化
1、传统虚拟化
传统虚拟化【VMWare】 |
---|
![]() |
2、Docker虚拟化
Docker虚拟化 |
---|
![]() |
3、对比传统虚拟机总结
特性 | Docker虚拟化容器 | 传统虚拟化 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
五、Docker介绍
1、概述
- Docker 是一个开源的应用
容器
引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像
中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱
机制,相互之间是隔离的。
2、Docker工作原理
Docker工作原理 |
---|
![]() |
- 概述
- 仓库:存储镜像的地方。分为中央仓库、远程仓库、私服
- 镜像:封装了一个具备独立环境、软件等数据的一个完整的文件。【Java中类,抽象的】
- 容器:由镜像生成了一个具体的可以正常运行的环境。【Java中的对象,具体的】
- 容器之间具备沙箱功能,是相互独立的环境,互不影响。
- 容器有自己独立的ID,也可以为容器取名称
六、Docker安装
使用root用户来安装
1、安装
apt-get install docker.io
- 中间输入
y
【是否继续】
2、查看安装是否成功
docker -v
Docker version 18.09.7, build 2d0083d
3、配置镜像加速器
3.1 修改配置文件
vi /etc/docker/daemon.json
- 内容如下
{
"registry-mirrors": ["https://ohfqk9xf.mirror.aliyuncs.com"]
}
3.2 重启Docker
systemctl daemon-reload
systemctl restart docker
七、镜像
1、概述
- 封装了一个具备独立环境、软件等数据的一个完整的文件。
- Tomcat镜像【Linux --> JDK --> Tomcat】
- MySQL镜像
- Redis镜像
- 镜像网站
- 官方:https://hub.docker.com/
- 国内:http://hub.daocloud.io/
2、操作
#搜索镜像
docker search 镜像名称
#查看本地镜像
docker images
#拉取镜像,未指定版本,就拉取latest
docker pull tomcat:8.0.15
#导出镜像
docker save -o 镜像路径【包括名称】 镜像ID
#加载镜像,加载成功的镜像是没有名称的,可以使用docker tag 来打一个版本
docker load -i 镜像路径【包括名称】
#为镜像取名称
docker tag 镜像ID 镜像名称:版本
#删除镜像,只是没有该镜像对应的容器在运行的情况下
docker rmi 镜像ID[镜像名称:版本]
镜像的基本信息 |
---|
![]() |
3、镜像的分层存储
分层存储 |
---|
![]() |
![]() |
八、容器
1、概述
- 由镜像生成了一个具体的可以独立正常运行的环境
2、操作
#运行一个前台容器[没有名字的容器]
docker run -p 8001:8080 镜像ID[镜像名称:版本]
-p: 映射端口 宿主机端口:容器端口
-d: 后台运行
--name: 容器名称
--rm: 停止容器后自动删除容器
-v: 数据卷映射 把宿主机的目录和容器内部的目录进行挂载关系【操作宿主机的目录就相当于在操作容器内部的目录】
#docker run -d -p 宿主机端口:容器端口 --name 容器名称 -v 宿主机目录:容器内部目录 镜像ID
docker run -d -p 8002:8080 --rm --name tomcat8002 -v /opt/tomcat8002/webapps:/usr/local/tomcat/webapps 8384f49437b3
#进入容器内部
docker exec -it 容器ID[容器名称] bash
#退出容器内部
exit
#查看正在运行容器
docker ps
#查看全部容器
docker ps -a
#停止、启动、重启容器
docker stop|start|restart 容器ID[容器名称]
#删除容器【容器必须停止】
docker rm 1容器ID 2容器ID
#删除所有停止运行的容器
docker rm $(docker ps -qa)
九、自定义镜像
1、为什么要使用自定义镜像
- 在企业开发,我们在部署应用时,往往都是一些商业型项目,而这些项目在进行部署时对应的环境,在Docker是不可能存在的,那么如何快速的部署我们的应用,并且能够通过外部直接进行访问?就需要我们自己制作自定义镜像
2、制作自定义镜像的步骤
- 指定基础镜像
- 加上我们把自己的应用部署到镜像生成的容器中对应的步骤即可
制作自定义镜像的步骤 |
---|
![]() |
3、Dockerfile
把上面第2步【制作自定义镜像的步骤】写入到Dockerfile文件,然后再通过Dockerfile文件构建自定义镜像即可
以该镜像为基础,运行容器
3.1 实现步骤
- Dockerfile
FROM tomcat:8.0.15
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf ./*
COPY ./ROOT.zip ./
RUN unzip ./ROOT.zip
RUN rm -rf ./ROOT.zip
WORKDIR /usr/local/tomcat/
-
把ROOT.zip复制到Dockerfile同一个目录下
-
构建镜像
docker build -t 自定义镜像的名称:版本 .
- 基于镜像,运行容器
docker run -d -p 8088:8080 --name myweb myweb:1.0
访问【http://192.168.145.136:8088】 |
---|
![]() |
4、Dockerfile的常用指令
- FROM:指定基础镜像
- WORKDIR:切换工作路径
- RUN:执行shell命令
- COPY:复制当前内容到镜像中
- ENV:配置环境变量
- EXPOSE:暴露端口
- CMD:执行该命令对应的内容【这个操作只会执行一次】
- VOLUME:指定数据卷
- ADD:对tar.gz文件会执行如下操作【复制、解压、删除】
5、在自定义镜像中使用tar.gz包
解决ROOT.zip
把解压后的内容压缩成一个tar.gz包
tar -zcvf ROOT.tar.gz [ROOT.zip解压后的文件和目录]
修改Dockerfile文件
构建自定义镜像
- Dockerfile
FROM tomcat:8.0.15
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf ./*
ADD ./ROOT.tar.gz ./
WORKDIR /usr/local/tomcat/
6、构建镜像命令中最后一个点代表的意义
构建镜像命令中最后一个点代表的意义 |
---|
![]() |
7、虚悬镜像
- 当我们多次构建自定义镜像时,如果当次构建镜像的名称和版本跟之前的重名了,那么之前构建的镜像名称就会丢失,这些名称丢失的镜像被称为叫虚悬镜像。虚悬镜像是没有存在的意义的
- 要删除所有虚悬镜像
docker image prune
#如果跳框,就输入`y`
十、数据卷
1、没有数据卷的情况
如果运行了一个Tomcat容器,希望把war包部署到容器中,目前我们需要怎么做?
- 使用Dockerfile,可以使用命令将war部署进去
- 使用
docker cp
命令把宿主机的内容复制到容器中像MySQL这种数据库对应的配置文件及数据目录会非常的多,每个都需要进行复制会非常的麻烦,而且文件一多,就会非常的慢
2、数据卷概述
- 就是一个宿主机的目录,它跟容器内部目录会形成数据共享的关系。
- 即操作宿主机的目录就等同于在操作容器内部的目录
- 使用数据卷时,其实就是建立宿主机目录和容器内部目录的映射关系,我们通常都称作是挂载
数据卷 |
---|
![]() |
3、数据卷案例
- 安装MySQL
docker run -p 3306:3306 --name mysql3306 \
-v /opt/docker/mysql/conf:/etc/mysql \
-v /opt/docker/mysql/logs:/var/log/mysql \
-v /opt/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.25
-v:指定数据卷映射【数据卷目录如果不存在,会自动创建】
-e:指定环境变量
\:代表换行【无特殊意义】
- 使用远程客户端工具
SQLyog
连接远程数据库服务器【操作就跟之前操作我们本地的数据库一样】- 创建出来的数据库会在宿主机的
/opt/docker/mysql/data
目录下
- 创建出来的数据库会在宿主机的
远程连接 |
---|
![]() |
十一、docker-compose
1、使用原生docker运行容器的缺陷
- 命令过多,一个命令参数过多
- 自定义镜像步骤过于复杂
- 一个Docker容器往往内部是不止一个容器的,内部门这些容器运行是有先后顺序的
- 部署一个完整的应用对应的镜像生成的容器
- Tomcat
- MySQL
- Redis
- MQ
- Elasticsearch
- …
- 部署一个完整的应用对应的镜像生成的容器
2、docker-compose概述
- 是一个Docker官方开发的用来进行容器编排的应用【项目或工具】
- 有一个核心配置文件
docker-compose.yml
3、安装docker-compose
3.1 下载
curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
3.2 授权
chmod +x /usr/local/bin/docker-compose
3.3 查看版本
docker-compose -v
4、使用docker-compose部署tomcat容器
- 创建
docker-compose.yml
#版本,固定不变
version: '3.1'
#服务列表,一个服务代表一个容器
services:
#服务名,自己定义
tomcat8001:
#基础镜像
image: daocloud.io/library/tomcat:8.5.15-jre8
#容器名称
container_name: tomcat8001
#是否随着docker的重启而重启
restart: always
#端口映射
ports:
- 8001:8080
volumes:
- /opt/tomcat/webapps:/usr/local/tomcat/webapps
- /opt/tomcat/logs:/usr/local/tomcat/logs
- 在
docker-compose.yml
文件所在的目录或者子目录下运行容器docker-compose up -d
5、docker-compose的常用命令
#在后台启动容器
docker-compose up -d
#停止并删除容器
docker-compose down
#停止、启动、重启容器
docker-compose stop|start|restart
#操作一个服务[停止、启动、重启服务
docker-compose stop|start|restart 服务名
#查看日志
docker-compose logs
6、在docker-compose中使用Dockerfile
- Dockerfile
FROM tomcat:8.0.15
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf ./*
ADD ./ROOT.tar.gz ./
WORKDIR /usr/local/tomcat/
- docker-compose.yml
#版本,固定不变
version: '3.1'
#服务列表,一个服务代表一个容器
services:
#服务名,自己定义
tomcat8002:
#基础镜像
#image: daocloud.io/library/tomcat:8.5.15-jre8
#容器名称
container_name: tomcat8002
#是否随着docker的重启而重启
restart: always
#端口映射
ports:
- 8002:8080
volumes:
#- /opt/tomcat/webapps:/usr/local/tomcat/webapps
- /opt/tomcat/logs:/usr/local/tomcat/logs
#使用Dockerfile
build:
#Dockerfile文件所在的位置
context: ./
#Dockerfile文件的名称
dockerfile: Dockerfile
文件位置 |
---|
![]() |
7、docker-compose搭建多个不同的服务
- docker-compose.yml
version: '3.1'
services:
tomcat8080:
image: tomcat:8.0.15
container_name: tomcat8080
ports:
- 8080:8080
restart: always
volumes:
- /opt/docker/docker_tomcat_mysql/tomcat/ROOT/:/usr/local/tomcat/webapps/ROOT/
depends_on: # 依赖,在mysql启动完之后再启动
- mysql3306
mysql3306:
restart: always
image: mysql:5.7.25
container_name: mysql3306
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /opt/docker/docker_tomcat_mysql/data/:/var/lib/mysql/
- 把docker-compose.yml放到你自己想要放的目录
- 进入docker-compose.yml所在的目录,执行
docker-compose up -d
- 可以看到启动了两个容器【tomcat8080,mysql3306】
十二、私服
1、私服的应用场景
私服的应用场景 |
---|
![]() |
2、搭建私服
2.1 搭建Registry
- docker-compose.yml
version: '3.1'
services:
registry:
image: registry
restart: always
container_name: registry
ports:
- 5000:5000
volumes:
- /opt/docker/registry/data:/var/lib/registry
2.2 搭建Registry的web界面
- docker-compose.yml
version: '3.1'
services:
frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8888:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.145.136 # 注意要使用registry的ip
- ENV_DOCKER_REGISTRY_PORT=5000
-
访问web界面
http://192.168.145.136:8888
|
3、上传自定义镜像到私服
3.1 制作自定义镜像
docker build -t myweb:2.0 .
3.2 配置私服地址
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://ohfqk9xf.mirror.aliyuncs.com"],
"insecure-registries": [
"192.168.145.136:5000"
]
}
- 重启Docker
3.3 打标签
#打标签 本地镜像名称:版本 私服地址/镜像名称:版本
docker tag myweb:2.0 192.168.145.136:5000/myweb:2.0
3.4 推送镜像到远程
docker push 192.168.145.136:5000/myweb:2.0
docker push 192.168.145.136:5000/myweb:2.0 |
---|
![]() |
http://192.168.145.136:8888/repositories/20 |
---|
![]() |
4、拉取私服上的镜像
- 换一台装有Docker的机器,拉取即可
docker pull 192.168.145.136:5000/myweb:2.0
docker pull 192.168.145.136:5000/myweb:2.0 |
---|
![]() |