Docker-02-镜像项目部署

Docker-02-镜像&项目部署

文章目录

  • Docker-02-镜像&项目部署
  • 一、镜像
    • ①:镜像结构
    • ②:Dockerfile
    • ③:构建镜像
      • 01:构建
      • 02:查看镜像列表
      • 03:运行镜像
  • 二、网络
    • ①:容器的网络IP地址
    • ②:网络常见命令
    • ③:自定义网络
  • 三、项目部署
    • ①:准备工作
    • ②:准备MySQL、nginx、redis容器
      • 01:创建网络
      • 02:创建nginx容器
      • 03:创建redis容器
      • 04:创建MySQL容器
      • 05:准备数据
    • ③:部署Java项目
      • 01:准备Dokerfile文件
      • 02:部署后端
      • 03:部署前端


一、镜像

前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

①:镜像结构

要想自己构建镜像,必须先了解镜像的结构。
之前我们说过,镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。
因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)
  • 安装并配置JDK
  • 上传Jar包
  • 运行jar包

那因此,我们打包镜像也是分成这么几步:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
  • 安装并配置JDK
  • 拷贝jar包
  • 配置启动脚本

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

在这里插入图片描述

②:Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。
而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

其中的语法比较多,比较常用的有:

指令说明示例
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内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

思考一下:以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。

所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

是不是简单多了。

③:构建镜像

01:构建

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。
在课前资料中,我们准备好了一个demo项目及对应的Dockerfile:

在这里插入图片描述

1.首先,我们将课前资料提供的docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录:

在这里插入图片描述

2.然后,执行命令,构建镜像:

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

命令说明:

  • docker build : 就是构建一个docker镜像
  • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
# 直接指定Dockerfile目录
docker build -t docker-demo:1.0 /root/demo

结果:
在这里插入图片描述

02:查看镜像列表

1.查看镜像列表:

# 查看镜像列表:
docker images

在这里插入图片描述

03:运行镜像

1.运行该镜像:

# 1.创建并运行容器
docker run -d --name dd -p 8080:8080 docker-demo:1.0
# 2.查看容器
docker ps

在这里插入图片描述

2.访问

# 3.访问
curl localhost:8080/hello/count

在这里插入图片描述

3.查看日志

docker logs -f dd

在这里插入图片描述

二、网络

①:容器的网络IP地址

上面我们创建了一个Java项目的容器,而Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。现在,我们的容器之间能否互相访问呢?我们来测试一下

首先,我们查看下MySQL容器的详细信息,重点关注其中的网络IP地址:

1.用基本命令,寻找Networks.bridge.IPAddress属性

# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql
# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.17.0.2

在这里插入图片描述

2.进入dd容器,在容器内,通过ping命令测试网络

# 2.然后通过命令进入dd容器
docker exec -it dd bash# 3.在容器内,通过ping命令测试网络
ping 172.17.0.2

在这里插入图片描述

发现可以互联,没有问题。

但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。

②:网络常见命令

我们必须借助于docker的网络功能来解决这个问题

官方文档:https://docs.docker.com/engine/reference/commandline/network/

常见命令有:

命令说明文档地址
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

③:自定义网络

1.首先通过命令创建一个网络

# 1.首先通过命令创建一个网络
docker network create coke

在这里插入图片描述

2…然后查看网络

# 2.然后查看网络 ( 其中,除了coke以外,其它都是默认的网络)
docker network ls

在这里插入图片描述

3.让dd和mysql都加入该网络,注意,在加入网络时可以通过–alias给容器起别名

# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect coke mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect coke dd

在这里插入图片描述

4.进入dd容器,尝试利用别名访问db

# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db

在这里插入图片描述

5.进入dd容器,用容器名访问

# 4.3.用容器名访问
ping mysql

在这里插入图片描述

OK,现在无需记住IP地址也可以实现容器互联了。

总结:

  • 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
  • 在同一个自定义网络中的容器,可以通过别名互相访问

三、项目部署

①:准备工作

好了,我们已经熟悉了Docker的基本用法,接下来可以尝试部署项目了。

项目说明:

  • invoice:发票系统管理的后端代码
  • invoice-web:发票系统管理的前端代码

部署的容器及端口说明:

项目容器名端口备注
invoiceinvoice19009发票系统管理的后端API入口
invoice-webnginx8899发票系统管理的前端入口
mysqlmysql3306发票系统管理的前端入口

DockerFile

# 基础镜像
FROM openjdk:8-jre-buster# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 拷贝jar包
COPY invoice-0.0.1-SNAPSHOT.jar /app.jar# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

②:准备MySQL、nginx、redis容器

  • 因为项目中分别用到了MySQL、nginx和redis,所以提前准备好这些容器(并准备好数据库中的数据)

  • MySQL、nginx、redis容器 将容器放到同一个网络中,之后直接使用容器名字访问即可

在这里插入图片描述

01:创建网络

# 创建网络(名为invoice)
docker network create invoice# 查看所有网络
docker network ls

在这里插入图片描述

02:创建nginx容器

1.创建容器
创建nginx容器笔记:https://blog.csdn.net/cygqtt/article/details/135665012

由于需要让nginx同时代理invoice-web前端资源,因此我们需要暴露两个端口:

  • 80:默认nginx首页端口(也可以不代理)
  • 8899:对应invoice-web
docker run \
-p 80:80 \
-p 8899:8899 \
--name nginx \
--restart=always \
-v /usr/local/nginx/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/logs:/var/log/nginx \
-d nginx:1.25.3

2.nginx容器创建之后我们需要将nginx容器加入到invoice网络中

# 查看所有网络
docker network ls
# 将容器加入到网络中
docker network connect invoice nginx

在这里插入图片描述

3.查看网络详细信息

docker network inspect  invoice

在这里插入图片描述

03:创建redis容器

1.创建容器
创建redis容器笔记:https://blog.csdn.net/cygqtt/article/details/135665012

2.redis容器创建之后我们需要将redis容器加入到invoice网络中

# 查看所有网络
docker network ls
# 将容器加入到网络中
docker network connect invoice redis

在这里插入图片描述

3.查看网络详细信息

docker network inspect  invoice

在这里插入图片描述

04:创建MySQL容器

1.创建容器
创建MySQL容器笔记:https://blog.csdn.net/cygqtt/article/details/135665012

2.MySQL容器创建之后我们需要将MySQL容器加入到invoice网络中

# 查看所有网络
docker network ls
# 将容器加入到网络中
docker network connect invoice mysql

在这里插入图片描述

3.查看网络详细信息

docker network inspect  invoice

在这里插入图片描述

05:准备数据

1.运行sql文件

在这里插入图片描述
在这里插入图片描述

③:部署Java项目

01:准备Dokerfile文件

1.可以使用以下两种方式来命名 Dockerfile 文件:

  • Dockerfile:这是最常见和推荐的方式,使用没有后缀的文件名。
  • Dockerfile.dockerfile:这种方式在某些情况下可能更具描述性,特别是当你有多个类型的 Dockerfile 文件时。

2.Dokerfile内容

# 基础镜像
FROM openjdk:8-jre-buster# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 拷贝jar包
COPY invoice-0.1.2-SNAPSHOT.jar /app.jar# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

02:部署后端

1.将Dockerfile和jar包一起上传到虚拟机

在这里插入图片描述

2.构建镜像

# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t invoice .

在这里插入图片描述

2,查看镜像

# 2.查看镜像
docker images

在这里插入图片描述

3.创建并运行容器

# 创建并运行一个tomcat容器
docker run -d --name tomcat --restart=always  --network invoice -p 8080:8080 tomcat
# 命令分析
-d: #这是一个简写形式,全称为 --detach。它表示在后台运行容器。
--name tomcat: #指定容器的名称为 tomcat。
--restart=always: #设置容器始终自动重启,即使容器异常退出也会自动重新启动。
--network invoice: #将容器连接到名为 invoice 的网络中。这要求在运行此命令之前已经创建了该网络。
-p 8080:8080: #将主机的端口 8080 映射到容器的端口 8080。这使得可以通过主机的 8080 端口访问容器中运行的 Tomcat 服务。
tomcat: #指定要使用的镜像名称为 tomcat。
# 创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name invoice --restart=always  --network invoice -p 19009:19009 invoice

在这里插入图片描述

4.查看启动日志

docker logs invoice

在这里插入图片描述

5.请求api测试 http://192.168.200.128:19009/web/workFile/getAll

  • 后端部署成功!
    在这里插入图片描述

03:部署前端

1.创建目录用于存放前端代码

mkdir -p /usr/local/nginx/html/invoice-web

2.将打包好的前端代表拷贝到目录/usr/local/nginx/html/invoice-web

在这里插入图片描述

3.配置nginx

vim /usr/local/nginx/nginx/nginx.conf
  • 添加以下信息
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/json;sendfile        on;keepalive_timeout  65;client_max_body_size 1000M; #(设置客户端请求体最大值) client_body_buffer_size 1000M; #(配置请求体缓存区大小) fastcgi_intercept_errors on;server {    listen 8899;server_name _;location /api/ {# 这里配置代理到后端服务的地址proxy_pass http://invoice:19009/;}location / {# 这里配置前端资源的路径(容器内部路径)root /usr/share/nginx/html/invoice-web;index index.html index.htm;try_files $uri $uri/ /index.html;}}
}

4.重启nginx容器

# 重启nginx容器(使配置文件生效)
docker restart nginx

在这里插入图片描述

5.访问测试 http://192.168.200.128:8899/web

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据中心负载测试的常用工具和技术有哪些?

数据中心负载测试是评估系统在高负载下的性能和稳定性的重要手段。通过模拟大量用户并发访问,可以检测系统的瓶颈和潜在问题,为优化系统性能提供依据。以下是一些常用的数据中心负载测试工具和技术: Apache JMeter:JMeter是一个开…

《世界之外》提前开测,网易打响国乙大战

1月18日,国乙市场迎来了一场大战。 原定于1月26日开服的网易新乙游《世界之外》,突然宣布在1月18日进行不删档、不限量测试,从某种意义上来说,其实就等同于提前公测。 而同一天开服的还有叠纸的全新3D乙游《恋与深空》&#xff…

基于R语言的NDVI的Sen-MK趋势检验

本实验拟分析艾比湖地区2010年至2020年间的NDVI数据,数据从MODIS遥感影像中提取的NDVI值,在GEE遥感云平台上将影像数据下载下来。代码如下: import ee import geemap geemap.set_proxy(port7890)# 设置全局网络代理 Map geemap.Map()# 指定…

2024年宜昌市中级职称评定条件能力业绩要求是什么?

1.参与完成 4 项中型以上工程建筑项目的勘察、设计,并通过审查 2.参与完成标准(含国家标准、行业标准、地方标准、团体、标准)、省级标准设计,参与工法、管理办法、规定、规程细则的编写,并正式发布实施 3.参与完成新技…

文件上传时报413错误

原因:nginx上传文件大小有限制,如果不配置nginx上传文件大小,则上传时会出现 413 (Request Entity Too Large) 异常(请求实体过大) 解决方案:1、打开nginx主配置文件nginx.conf,找到http{ }&…

go语言(三)----函数

1、函数单变量返回 package mainimport "fmt"func fool(a string,b int) int {fmt.Println("a ",a)fmt.Println("b ",b)c : 100return c}func main() {c : fool("abc",555)fmt.Println("c ",c)}2、函数多变量返回 pack…

表的增删改查CURD(基础)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 新增(Create) 全列插入 指定列…

高校教务系统登录页面JS分析——河北地质大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密码加…

鹅厂有料有趣的程序员交流圈重磅官宣!加入立享福利

号外!腾讯云开发者社区重磅上线海量社群,覆盖开发者技术学习交流、工作成长、生活分享等多元场景需求,用最新鲜的内容,最好玩的互动,与你一起共创最有料有趣的技术人交流圈~ 最有料有趣交流圈在这里你可以畅…

Git学习笔记(第5章):Git团队协作机制

目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作,就必须借助代码托管中心。 5.1 团队内协作 问题引入:成员1(大佬)利用Git在宿主机上初始化本地库,完成代码的整体…

thinkphp+vue+mysql大学生心理健康测试分析系统g4i4o

学生心里测试分析系统由管理员和学生、教师交互构成。学生对于本系统的使用,学生可以通过系统注册、登录,修改个人信息,查看交流区、心理测试卷、新闻资讯等功能。 教师对于本系统的使用,教师可以通过系统注册、登录,修…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷6

某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,选…

人工智能之卷积神经网络(CNN)

前言:今天我们重点探讨一下卷积神经网络(CNN)算法。 _ 20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络CNN(Convo…

大模型学习与实践笔记(九)

一、LMDeply方式部署 使用 LMDeploy 以本地对话方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事 2.api 方式部署 运行 结果: 显存占用: 二、报错与解决方案 在使用命令,对lmdeploy 进行源码安装是时,报错 1.源…

枚举类型缝缝补补

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字,enum叫枚举数据类型&#…

在分类任务中准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,如何在python中使用呢?

在机器学习和数据科学中,准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,用于评估分类模型的性能。 1. 准确率(Accuracy)…

Linux文件同步

Linux文件同步 scp简介基本用法 rsync简介基本用法 tftp简介基本用法 其他命令ftpsftplftp 此博客将主要介绍Linux文件同步常用的两种命令:scp(secure copy)、rsync(remote synchronization)和tftp(Trivial…

2018年认证杯SPSSPRO杯数学建模D题(第二阶段)投篮的最佳出手点全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 D题 投篮的最佳出手点 原题再现: 影响投篮命中率的因素不仅仅有出手角度、球感、出手速度,还有出手点的选择。规范的投篮动作包含两膝微屈、重心落在两脚掌上、下肢蹬地发力、身体随之向前上方伸展、同时抬肘向投篮方向…

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程 1)系统架构1.1.系统成员组成1.2.作业提交流程 2)核心概念2.1. 并行度(Parallelism)2.1.1.并行子任务和并行度2.1.2.并…

【Linux修行路】基本指令

目录 推荐 前言 1、重新认识操作系统 1.1 操作系统是什么? 1.2操作系统的作用 1.3 我们在计算机上的所有操作 1.4 Linux操作的特点 2、Linux基本指令 2.1 ls 指令 2.2 pwd 命令 2.3 cd 指令 2.3.1 Linux中的目录结构 2.3.2 绝对路径和相对路径 2.3.3 cd 指令 …