黑马程序员java web学习笔记--项目部署(Docker)

目录

[1 Docker简介](#1 Docker简介)

[2 Docker命令解读](#2 Docker命令解读)

[3 Docker基础](#3 Docker基础)

[3.1 常见命令](#3.1 常见命令)

[3.2 数据卷](#3.2 数据卷)

[3.3 自定义镜像](#3.3 自定义镜像)

[3.4 网络](#3.4 网络)

[4 项目部署](#4 项目部署)

[5 Dockers Compose](#5 Dockers Compose)


1 Docker简介

如果是利用传统方式部署MySQL,大概的步骤有:

搜索并下载MySQL安装包、上传至Linux环境、解压和配置环境、安装、初始化和配置。

而使用Docker安装,仅仅需要一步即可。

复制代码
docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql:8

当我们执行命令后,Docker做的第一件事情,是去自动搜索并下载了MySQL,然后会自动运行MySQL,我们完全不用插手,是非常方便的 。

不同操作系统下其安装包、运行环境是都不相同的!如果是手动安装,必须手动解决安装包不同、环境不同的、配置不同的问题!但Docker这种安装方式完全不用考虑运行的操作系统环境,它不仅仅在CentOS系统是这样,在Ubuntu系统、macOS系统、甚至是装了WSL的Windows下,都可以使用这条命令来安装MySQL,这就是因为Docker会自动搜索并下载MySQL。

注意: 这里下载的不是安装包,而是镜像(image)。 镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了,这套独立运行的隔离环境我们称为容器(container)

Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利,被称为镜像仓库。DockerHub网站是官方仓库,阿里云、华为云会提供一些第三方仓库,我们也可以自己搭建私有的镜像仓库。

Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。Docker服务部署应用时,首先要去搜索并下载应用对应的镜像 ,然后根据镜像创建并允许容器,应用就部署完成了。

2 Docker命令解读

复制代码
docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql:8

docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行。

--name mysql : 给容器起个名字叫mysql,你可以叫别的。

-p 3307:3306 : 设置端口映射,宿主机端口:容器内端口。容器是隔离环境,外界不可访问,但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。示例中就是将宿主机的3307映射到容器内的3306端口。

-e : 配置容器内进程运行时的一些参数。

mysql:8 : 设置镜像名称,Docker会根据这个名字搜索并下载镜像。REPOSITORY:TAG,其中REPOSITORY可以理解为镜像名,TAG是版本号,在未指定TAG的情况下,默认是最新版本,也就是mysql:latest。

3 Docker基础

3.1 常见命令

命令 说明
docker pull 拉取镜像
docker push 推送镜像到DockerRegistry
docker images 查看本地镜像
docker rmi 删除本地镜像
docker run 创建并运行容器(不能重复创建)
docker stop 停止指定容器
docker start 启动指定容器
docker restart 重新启动容器
docker rm 删除指定容器
docker ps 查看容器
docker logs 查看容器运行日志
docker exec 进入容器
docker save 保存镜像到本地压缩文件
docker load 加载本地压缩文件到镜像
docker inspect 查看容器详细信息

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

复制代码
# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

举例:Nginx

查看 DockerHub,拉取 Nginx 镜像,创建并运行 Nginx 容器。

DockerHub查看nginx镜像仓库及相关信息:

https://hub.docker.com/_/nginx/tags?name=1.20.2

docker pull nginx:1.20.2

复制代码
# 第1步,去DockerHub查看nginx镜像仓库及相关信息

# 第2步,拉取Nginx镜像 (比较耗时)
docker pull nginx:1.20.2

# 第3步,查看镜像
docker images

# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

# 第5步,查看运行中容器
docker ps

# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第6步,访问网页,地址:http://虚拟机地址

# 第7步,停止容器
docker stop nginx

# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第9步,再次启动nginx容器
docker start nginx

# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第11步,查看容器详细信息
docker inspect nginx

# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash

# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p

# 第13步,删除容器
docker rm nginx

# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

3.2 数据卷

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

挂载本地目录或文件,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载,挂载语法与数据卷类似。

复制代码
# 挂载本地目录
-v 本地目录:容器内目录

# 挂载本地文件
-v 本地文件:容器内文件

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

复制代码
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷

-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

前端:打包成静态文件,丢进官方 Nginx 即可。

MySQL:官方镜像,你只需要挂数据卷。

Java:自定义镜像,必须把你的 jar 包放进去,才能运行。

3.3 自定义镜像

镜像 就是包含了应用程序 、程序运行的系统函数库运行配置等文件的文件包。构建镜像的过程其实就是把程序打包的过程。

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

  • 准备一个linux服务(CentOS或者Ubuntu均可)

  • 安装并配置JDK

  • 上传Jar包

  • 运行jar包

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

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

  • 安装并配置JDK

  • 拷贝jar包

  • 配置启动脚本

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

镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。

Docker就提供了自动打包镜像的功能。

Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。

指令 说明 示例
FROM 指定基础镜像 FROM centos:7
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

Dockerfile文件编写好--docker build -t 镜像名 .(构建镜像)--docker run(容器)

3.4 网络

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

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

因此我们采用自定义网络 ,之后访问的时候用名称去访问就可以了。

命令 说明
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息
复制代码
# 1.首先通过命令创建一个网络
docker network create itheima

# 2.然后查看网络
docker network ls

# 结果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   itheima     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了itheima以外,其它都是默认的网络


# 3.让 myapp 和 mysql 都加入该网络
docker network connect itheima mysql
docker network connect itheima myapp


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

# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

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

4 项目部署

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

步骤:

  1. 准备MySQL容器,并创建tlias数据库及表结构。
  2. 修改项目的配置文件,修改数据库服务地址(package打包jar)。
  3. 编写Dockerfile文件(AI辅助)。
  4. 构建Docker镜像,部署Docker容器,运行测试。

编写Dockerfile文件

复制代码
# 使用 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

# 阿里云OSS环境变量
ENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot

#统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# 创建应用目录
RUN mkdir -p /tlias
WORKDIR /tlias

# 复制应用 JAR 文件到容器
COPY  tlias.jar  tlias.jar

# 暴露端口
EXPOSE 8080

# 运行命令
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]

由于项目要运行,需要依赖jdk的环境,所以这里我们需要将tlias.jar,jdk17.tar.gz,Dockerfile三个文件,上传到Linux服务器的 /root/tlias 目录下(如果没有这个目录,提前创建好)。

构建Docker镜像:docker build -t tlias:1.0 .

部署Docker容器:docker run -d --name tlias-server --network itheima -p 8080:8080 tlias:1.0

通过 docker logs -f 容器名,就可以查看容器的运行日志。

5 Dockers Compose

可以看到,我们部署一个简单的java项目,其中包含3个容器:MySQL、Java项目、Nginx,我们依次按照顺序部署,复杂的项目会更多,此时Docker Compose 就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

docker run部署MySQL的命令

XML 复制代码
docker run -d \
--name nginx-tlias \
-p 80:80 \
-v /usr/local/app/html:/usr/share/nginx/html \
-v /usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf \  
--network itheima \
nginx:1.20.2

------->docker-compose.yml文件

XML 复制代码
services:
  mysql:
    image: "nginx:1.20.2"
    container_name: nginx-tlias
    ports:
      - "80:80"
    volumes:
      - "/usr/local/app/html:/usr/share/nginx/html"
      - "/usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf"
    networks:
      - itheima
networks:
  itheima:
    name: itheima
docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络
XML 复制代码
services:
  mysql:
    image: mysql:8
    container_name: mysql
    ports:
      - "3307:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
      - "/usr/local/app/mysql/data:/var/lib/mysql"
      - "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - tlias-net
  tlias:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: tlias-server
    ports:
      - "8080:8080"
    networks:
      - tlias-net
    depends_on:
      - mysql
  nginx:
    image: nginx:1.20.2
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
      - "/usr/local/app/nginx/html:/usr/share/nginx/html"
    depends_on:
      - tlias
    networks:
      - tlias-net
networks:
  tlias-net:
    name: itheima

编写好docker-compose.yml文件,就可以部署项目了。

XML 复制代码
docker compose [OPTIONS] [COMMAND]

docker compose up -d
类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
Options -p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
Commands down 停止并移除所有容器、网络
Commands ps 列出所有启动的容器
Commands logs 查看指定容器的日志
Commands stop 停止容器
Commands start 启动容器
Commands restart 重启容器
Commands top 查看运行的进程
Commands exec 在指定的运行中容器中执行命令
相关推荐
junnhwan2 小时前
LeetCode Hot 100——贪心算法
java·算法·leetcode
xmlhcxr2 小时前
Redis
java·数据库·redis
魑魅魍魉都是鬼2 小时前
java 的排序算法
java·算法·排序算法
星幻元宇VR2 小时前
VR校园安全学习机|让安全教育“沉浸”进课堂的创新体验
科技·学习·安全·vr·虚拟现实
gechunlian882 小时前
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
java·spring cloud·微服务
晓纪同学2 小时前
ROS2 -06-动作
java·数据库·python·算法·机器人·ros·ros2
程序员杰森2 小时前
ESP32开发板+TB6612 x 2 四电机小车笔记
笔记·单片机·嵌入式硬件
重庆兔巴哥2 小时前
如何在Windows上配置Java环境变量?
java·开发语言·windows
小江的记录本2 小时前
【PageHelper】 【Spring Boot + MyBatis + PageHelper】 完整项目示例+PageHelper核心原理深度解析
java·前端·spring boot·后端·sql·spring·mybatis