第15章 项目部署(Docker)

一、课程概述

快速构建、运行、管理应用的工具

安装及启动

二、入门

1、MySQL安装

执行以下命令完成安装

docker run -d \

--name mysql \

-p 3307:3306 \ 宿主机端口:容器内部端口

-e TZ=Asia/Shanghai \

-e MYSQL_ROOT_PASSWORD=123 \

mysql:8

主机mysql -h192.168.100.128 -P3307 -uroot -p123检查安装是否成功

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

docker images查看当前容器中的所有镜像

2、命令解析

docker run:创建并运行一个容器,-d是让容器在后台运行

--name mysql:给容器起个名字,必须唯一

-p 3307:3306:设置端口映射

-e KEY=VALUE:是设置环境变量

mysql:8:指定运行的镜像的名字,版本

镜像名称一般分两部分组成:repository:tag

·其中repository就是镜像名

·tag是镜像的版本

注意:在没有指定tag时,默认是latest,代表最新版本的镜像

三、核心

1、常见命令

(1)介绍

结尾加 --help是帮助文档

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: Docker Docs

(2)操作

在DockerHub中搜索Nginx镜像,查看镜像的名称

可以将镜像保存为一个文件,也可以将一个文件恢复为一个镜像

拉取Nginx镜像(比较耗时)

查看本地镜像列表

将镜像保存为文件docker save -o nginx-1.20.2.tar nginx:1.20.2

移除镜像

加载本地镜像文件

基于镜像创建并运行Nginx容器

查看容器

停止容器

再次启动容器

进入Nginx容器

删除容器

2、数据卷挂载

(1)容器内操作

创建容器docker run -d --name nginx -p 80:80 nginx:1.20.2

进入nginx容器docker exec -it nginx bash

进入html目录

进入html

(2)数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

/_data目录与docker容器里面的内容一一对应

操作命令

(3)数据卷操作

注意:在执行docker run命令时,使用-v数据卷:容器内目录

形式可以完成数据卷挂载(数据卷不存在,会自动创建)

查看已存在的容器

强制删除容器

创建容器并指定数据卷!!!!!!!!!!建立了连接

容器内目录:宿主机目录

查看数据卷列表

查看html数据卷详情

进入存放所有数据卷的目录

进入html数据卷

进入其下的_data目录

进入该html文件

修改文件内容,宿主机里面的内容发生变化,容器里面的内容也发生了变化,主机访问的页面也发生了变化

静态资源部署

上传到宿主机的_data目录下

3、本地目录挂载

(1)匿名数据卷

容器中还有两个匿名数据卷,表示的是mysql的备份文件

(2)命令

docker run -d -name容器名 -p宿主机端口:容器端口 -v宿主机目录或文件:容器内目录或文件 镜像名

注意: 本地目录必须以/或./开头,如果直接以名称开头,会被识别为数据卷而非本地目录

-v mysql:/var/lib/mysql会被识别为一个数据卷,数据卷叫mysql

-v./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

(3)挂载操作

需求:创建MySQL容器,并基于本地目录挂载实现MySQL容器数据目录、配置文件、初始化脚本的目录挂载。(官方文档)

  • 根目录创建mysql文件夹

  • 上传文件

先停掉并删掉原来的mysql容器

挂载 /root/mysql/data 到容器内的 /var/lib/mysql 目录

挂载 /root/mysql/init 到容器内的 /docker-entrypoint-initdb.d 目录 (资料中的sql脚本)

挂载 /root/mysql/conf 到容器内的 /etc/mysql/conf.d 目录

启动mysql

进入data/目录

有tlias文件夹

主机cmd访问数据库mysql -h192.168.100.128 -P3307 -uroot -p123

可以看到数据库里的文件

(4)小结

4、自定义镜像

(1)自定义镜像

镜像就是包含了应用程序程序运行的系统函数库运行配置等文件的文件包。

构建镜像的过程其实就是把上述文件打包的过程。

(2)镜像结构

镜像的构建和运行是按层来的

(3)Dockerfile

Dockerfile就是一个文本文件 ,其中包含一个个的指令(Instruction) ,用指令来说明要执行什么操作构建镜像

将来Docker可以根据Dockerfile帮我们构建镜像。

Dockerfile文件构建镜像

TypeScript 复制代码
# 使用 CentOS 7 作为基础镜像
​
FROM centos:7
​
# 添加 JDK 到镜像中
​
COPY jdk17.tar.gz /usr/local/
​
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz
​
# 设置环境变量
​
ENV JAVA_HOME=/usr/local/jdk-17.0.10
​
ENV PATH=$JAVA_HOME/bin:$PATH
​
# 创建应用目录
​
RUN mkdir -p /app
​
WORKDIR /app
​
# 复制应用 JAR 文件到容器
​
COPY app.jar app.jar
​
# 暴露端口
​
EXPOSE 8080
​
# 运行命令
​
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

(4)构建镜像操作

创建app目录

上传三个文件

构建镜像docker build -t myImage:1.0 .

-t :是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest

. :是指定Dockerfile所在目录,如果就在当前目录,则指定为"."

查看容器中的镜像

运行容器中的app,加入docker容器

查看容器

访问网络地址http://192.168.100.128:8080/emps

返回JSON数据

自己构建java应用的镜像,并将容器启动起来,访问到了java应用

(5)小结

镜像的结构是怎样的?

镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包而成。

Dockerfile是做什么的?

Dockerfile就是利用固定的指令 来描述镜像的结构和构建过程 ,这样Docker才可以依次来构建镜像

构建镜像的命令是什么?

docker build -t 镜像名 Dockerfile目录

5、网络

(1)未自定义网络

查看mysql容器的详细信息

mysql的IP地址

查看java应用的详细信息

java应用的IP地址

进入容器

ping mysql的IP地址

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

(2)自定义网络

加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:

创建网络

mysql容器加入itheima网络中

查看网络

创建时加入网络

进入容器

通过容器名字连接mysql相互通信

四、部署

1、服务端部署

需求:将我们开发的 tlias-web-management 项目打包为镜像,并部署

步骤:

(1)MySQL容器

准备MySQL容器 ,并创建tlias数据库及表结构。(已完成)

启动已有的mysql容器

删掉其他

DataGrip新建sql连接

(2)java应用

准备java应用 (tlias项目)镜像,部署Docker容器,运行测试。

  • 修改tlias项目配置文件 ,修改数据库服务地址logback日志文件存放地址,打jar包。

    修改数据库连接配置

    TypeScript 复制代码
    datasource:
      url: jdbc:mysql://mysql:3306/tlias
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123

    修改日志存放位置

    XML 复制代码
    <FileNamePattern>/tlias/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>

    打包,获取target/下的jar包,重命名为tlias.jar

  • 编写Dockerfile文件。

    里面包含阿里云id密码、端口、jdk版本等

  • 构建Docker镜像。

    创建/usr/local/tlias-docker-app,并把文件上传进来

    开始构建docker build -t tlias:1.0 .

    查看镜像docker images

    根据id删掉app的镜像

    (3)部署Docker容器

    创建容器,加入itheima网络

    因为mysql也加入了该网络,网络内,容器间可以使用名称通信

    docker run -d --name tlias-server -p 8080:8080 --network itheima tlias:1.0

    查看容器docker ps

    查看容器尾部的日志docker logs -f tlias-server

    使用apifox发送post登录请求,获取到了token数据

2、前端部署

需求:创建一个新的nginx容器,将资料中提供的前端项目的静态资源部署到nginx中。

步骤:

(1)部署nginx容器

(设置目录映射)。

新建文件夹存放前端项目

文件夹下上传文件

conf目录中的nginx.config包含

-v /root/tlias-nginx/html:/usr/share/nginx/html

-v /root/tlias-nginx/conf/nginx.conf:/etc/nginx/nginx.conf

这些目录映射,进行反向代理,交给哪台服务器请求

(2)创建nginx容器并上传资源

将部署的前端资源文件及配置文件上传至服务器,执行命令创建nginx容器。

创建nginx容器

docker run -d \ --name nginx-tlias \ -v /root/tlias-nginx/html:/usr/share/nginx/html \ -v /root/tlias-nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ --network itheima \ -p 80:80 \ nginx:1.20.2

查看所有容器docker ps

主机浏览器访问192.168.100.128

成功进入

3、DockerCompose

(1)介绍

前面手动部署mysql、前后端繁琐、不便于统一管理

因此引入DockerCompose

Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

(2)还原环境

根据id删掉以前的容器

删掉镜像

删掉网络

(3)操作

涉及到的服务:MySQL数据库、服务端、前端nginx。

步骤:

准备资源(tlias.sql,服务端的jdk17、jar包、Dockerfile,前端项目打包文件、nginx.conf)

准备docker-compose.yml配置文件

基于DockerCompose快速构建项目

创建目录/usr/local/app

上传文件

Docker Compose的命令格式:docker compose OPTIONS COMMAND

选项参数说明:

启动server容器并后台运行

查看容器、网络、镜像

主机浏览器访问192.168.100.128

成功进入

停止并移除所有的容器、网络

一键构建一键移除

相关推荐
Jay-r1 小时前
极简博客搭建(精简版):textlog + GitHub Pages
python·github·教程·集成学习·博客网站·技术教程·自我成长
Albart5751 小时前
【已解决】IndexError_ list index out of range 列表索引越界 全套根治方案
python·indexerror·列表索引越界·python 报错解决·python 排错
卷心菜的学习路2 小时前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题
winfredzhang2 小时前
用 wxPython 打造「Claude Code 任务启动器」:一个把 AI CLI 变成一键工作流的桌面工具
python·wxpython·powershell·剪贴板·claudecodecli
Logintern093 小时前
DeepAgents 的子 Agent 如何实现上下文隔离
python
金銀銅鐵3 小时前
[Python] 借助 Turtle 来展示汉诺塔
python·数学
暴躁的小鸟3 小时前
附近口碑好的斜视配镜训练的眼视光中心
人工智能·python·深度学习
Data_Journal3 小时前
如何使用 Java 和 Jsoup 解析 HTML
大数据·开发语言·数据库·python·scrapy
如何原谅奋力过但无声3 小时前
现代化Python工具:uv、Ruff、Pyright、Rich(只讲重点版)
vscode·python·uv