Docker应用-项目部署及DockerCompose

文章目录

  • Docker应用-项目部署
    • [1. 项目部署-后端](#1. 项目部署-后端)
      • [1.1 修改配置](#1.1 修改配置)
      • [1.2 项目打包](#1.2 项目打包)
      • [1.3 编写Dockerfile](#1.3 编写Dockerfile)
      • [1.4 创建镜像](#1.4 创建镜像)
      • [1.5 创建并运行容器](#1.5 创建并运行容器)
      • [1.6 测试](#1.6 测试)
    • [2. 项目部署-前端](#2. 项目部署-前端)
      • [2.1 html前端静态目录](#2.1 html前端静态目录)
      • [2.2 nginx.config编写](#2.2 nginx.config编写)
      • [2.3 部署宿主机服务器](#2.3 部署宿主机服务器)
      • [2.4 创建容器并挂载](#2.4 创建容器并挂载)
      • [2.5 测试](#2.5 测试)
    • [3. DockerCompose](#3. DockerCompose)
      • [3.1 基本语法](#3.1 基本语法)
      • [3.2 基础命令](#3.2 基础命令)

Docker应用-项目部署

1. 项目部署-后端

1.1 修改配置

修改yml文件,将mysql配置改为动态获取:

application.yml

yml 复制代码
Spring:
  datasource:
    url: jdbc:mysql://${db.host}:3306/hmall?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: ${db.pw}

application-dev.yml

yml 复制代码
db:
  host: mysql #容器名
  pw: 123

1.2 项目打包

项目打包:idea-maven-package:

跳过单元测试,直接打成jar包,部署到docker服务器;

1.3 编写Dockerfile

将Dockerfile文件部署到daocker服务器(与应用jar包在同一级目录)

dockerfile 复制代码
# 基础镜像
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 hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

1.4 创建镜像

dockerfile 复制代码
# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t hmall .
# 2.查看镜像
docker images

1.5 创建并运行容器

dockerfile 复制代码
# 3.创建并运行容器,并通过--network将其加入自定义网络ff,这样才能通过容器名访问mysql
docker run -d --name hmall --network ff -p 8080:8080 hmall

1.6 测试

通过浏览器访问:http://你的虚拟机地址:8080/

2. 项目部署-前端

2.1 html前端静态目录

将前端代码(hmall-portalhmall-admin),复制到前端静态目录html文件中

2.2 nginx.config编写

对静态资源目录做代理配置

nginx 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/json;

    sendfile        on;
    
    keepalive_timeout  65;

    server {
        listen       18080;
        # 指定前端项目所在的位置
        location / {
            root /usr/share/nginx/html/hmall-portal;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location /api {
            rewrite /api/(.*)  /$1 break;
            proxy_pass http://hmall:8080;
        }
    }
    server {
        listen       18081;
        # 指定前端项目所在的位置
        location / {
            root /usr/share/nginx/html/hmall-admin;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location /api {
            rewrite /api/(.*)  /$1 break;
            proxy_pass http://hmall:8080;
        }
    }
}

2.3 部署宿主机服务器

将代码和配置文件,部署至宿主机服务中,保证同一级目录。

2.4 创建容器并挂载

  • /root/nginx/nginx.conf挂载到/etc/nginx/ng``inx.conf
  • /root/nginx/html挂载到/usr/share/nginx/html

由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:

  • 18080:对应hmall-portal
  • 18081:对应hmall-admin

并加入自定义网络,可以访问后台和数据库

Bash 复制代码
docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network ff \
  nginx

2.5 测试

通过浏览器访问:http://你的虚拟机ip:18080

3. DockerCompose

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

3.1 基本语法

docker-compose.yml文件的基本语法可以参考官方文档:

https://docs.docker.com/compose/compose-file/compose-file-v3/

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

举例来说,用docker run部署MySQL的命令如下:

Bash 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --network hmall
  mysql

如果用docker-compose.yml文件来定义,就是这样:

YAML 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: hmall

对比如下:

docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络

示例

YAML 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

3.2 基础命令

编写好docker-compose.yml文件,就可以部署项目了。常见的命令:

https://docs.docker.com/compose/reference/

基本语法如下:

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

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
-p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令

示例

bash 复制代码
# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                    0.0s
 => => transferring dockerfile: 358B                                                    0.0s
 => [internal] load .dockerignore                                                       0.0s
 => => transferring context: 2B                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
 => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
 => [internal] load build context                                                       0.0s
 => => transferring context: 98B                                                        0.0s
 => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
 => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
 => exporting to image                                                                  0.0s
 => => exporting layers                                                                 0.0s
 => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
 => => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4
 ✔ Network hmall    Created                                                             0.2s
 ✔ Container mysql  Started                                                             0.5s
 ✔ Container hmall  Started                                                             0.9s
 ✔ Container nginx  Started                                                             1.5s

# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s..."   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint...."   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
相关推荐
我明天再来学Web渗透1 小时前
【2024年-11月-23日-开源社区openEuler实践记录】KubeOS:云原生时代操作系统的革新力量
运维·开发语言·云原生·开源·云计算·openstack
猿人启示录1 小时前
Keepalived + LVS 搭建高可用负载均衡及支持 Websocket 长连接
运维·负载均衡·lvs
天地人-神君1 小时前
centos双网卡不能上网
linux·运维·centos
rgrgrwfe1 小时前
httpslocalhostindex 配置的nginx,一刷新就报404了
运维·nginx
码韵1 小时前
【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解
linux·运维·ubuntu
楚灵魈2 小时前
[Linux]从零开始的Nginx反向代理配置及运用教程
linux·运维·nginx
小妖盖2 小时前
VMwareTools安装(ubuntu23)
运维·服务器
踏雪Vernon2 小时前
[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程
运维·服务器
hkj88082 小时前
linux查看访问外网本机ip地址的命令
linux·运维·服务器
沉默的八哥3 小时前
运维人员的Python详细学习路线
运维·python·学习