Docker-14.项目部署-DockerCompose

一.DockerCompose

大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

MySQL

Nginx

Java项目

而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。而且整个项目的部署没有体现出项目的整体性,不方便运维。

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

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

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

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

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

复制代码
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文件来定义,就是这样:

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

version: '3.8"是docker compose的语法版本号,containerA是服务名(一个服务就代表了一个镜像),其中包含了镜像,容器名,端口信息等。

对比如下:

dockerCompose和docker run描述的信息基本是一样的,只是语法不一样。

下面是一个dockerCompose的命令示例:

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

在构建hmall容器时,由于我们是通过jar包部署的,因此我们先要通过build构建镜像,然后再来生成容器。这里直接使用

复制代码
 hmall:
    build: 
      context: .

就能完成容器的创建。

在构建网络时,我们只需要指定一个网络标签,并在网络标签下指定要构建的网络名称,dockerCompose就会帮助我们自动构建网络,并将其他指定该网络标签的容器自动配置到这一网络下。

复制代码
networks:
  hm-net:
    name: hmall

hm-net就是网络标签。网络名为hmall。

那么如何利用dockerCompose文件完成一键部署呢?

使用docker compose命令即可。

-f:指定路径,如果在当前目录下可以不指定,省略掉。

-p:指定项目名称,可以不指定,默认就叫root。

up:一键启动,创建并启动所有容器。

down:停止并移除所有容器。

ps:列出所有启动容器。

logs:查看指定容器日志。

stop:停止某个容器。

start:启动某个容器。

restart:重启某个容器。

top:查看运行进程。

exec:进入容器内指定命令。

接下来我们使用docker compose进行一键部署,由于在docker compose文件中我们使用的都是相对路径,因此我们要保证docker compose文件和mysql文件夹、nginx文件夹等在同一目录下。

都在同一目录下,满足

使用docker compose up -d进行一键部署:

部署成功!

相关推荐
Bruce_Liuxiaowei2 分钟前
网站敏感文件_目录大全(分类记忆+风险标注)
运维·网络·网络协议·http·网络安全·https
csdn_aspnet12 分钟前
MobaXterm 运维实战、技巧与自动化
运维·自动化·mobaxterm
2201_7611990413 分钟前
jenkins找不到Build when a change is pushed to GitHub
运维·github·jenkins
独角鲸网络安全实验室26 分钟前
高危预警!React核心组件曝CVSS 9.8漏洞,数百万开发者面临远程代码执行风险
运维·前端·react.js·网络安全·企业安全·漏洞·cve-2025-11953
博语小屋29 分钟前
Linux 地址转换函数详解
linux·运维·服务器·c++
饱饱要坚持可持续发展观33 分钟前
Linux 防火墙开放/限制端口
linux·运维·网络
初学者_xuan1 小时前
安装与配置Jenkins(OpenEuler)
运维·servlet·jenkins
SunPengMSE1 小时前
基于运行unitree rl lab 的 Ubuntu 20.04 配置isaac sim + isaac lab
linux·运维·ubuntu
广东大榕树信息科技有限公司1 小时前
机房动环管理如何通过智能可视化实现高效运维?
运维·网络·物联网·国产动环监控系统·动环监控系统
阿萨德528号1 小时前
Maven 项目构建笔记 - 单体应用与简单微服务
笔记·微服务·maven