Docker

Docker

一、一个项目的完整部署过程

一个项目的完整部署过程
在这里插入图片描述

二、同一应用在不同的环境下是否能正常访问

不同的环境
在这里插入图片描述
同一应用(环境不同)
在这里插入图片描述

三、感受原始安装并启动Tomcat和我们现在启动Tomcat

1、感受原始安装并启动Tomcat

  1. 下载 tomcat.tar.gz包
  2. 上传到Linux
  3. 解压 tomcat.tar.gz包
  4. 进入到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、制作自定义镜像的步骤

  1. 指定基础镜像
  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包

  1. 解决ROOT.zip

  2. 把解压后的内容压缩成一个tar.gz包

    tar -zcvf ROOT.tar.gz [ROOT.zip解压后的文件和目录]

  3. 修改Dockerfile文件

  4. 构建自定义镜像

  • 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
在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值