Docker Compose详细教程(从入门到放弃)

        对于现代应用来说,大多都是通过很多的微服务互相协同组成的一个完整应用。例如,
订单管理、用户管理、品类管理、缓存服务、数据库服务等,它们构成了一个电商平台的应
用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compose 就是解决这类问题的。


1、简介


Docker Compose 是一个需要在 Docker 主机上进行安装的 Docker 容器编排外部工具。其
并不是通过脚本或各种冗长的 Docker 命令来将应用组件组织起来,而是通过一个声明式的
配置文件描述整个应用,然后通过一条命令完成应用部署。部署成功后,还可通过一系列简
单命令实现对其完整生命周期的管理。


Docker Compose 的前身是 Fig(无花果)。

2、compose 文件


2.1 文件简介


Docker Compose 使用 YAML 文件来定义服务。官方推荐的默认文件名为 compose.yml ,
但同时也支持 docker-compose.yml。


由于一个 compose 文件中定义的为一个项目的所有服务,所以一般为在创建 compose
文件之前先新建一个目录,目录名称一般为项目名称,然后再将项目所需的所有镜像、微服
务的 Dockerfile 放入该目录,并在该目录中新建 compose 文件。


compose 文件中包含 6 个顶级属性:version、services、networks、volumes、configs 与secrets,及很多的它们下面所包含的属性。下面简单介绍一下常用的属性。

2.2 version


version 是一个顶级属性,但已经过时,不再需要在 compose 文件中出现了。

2.3 serivces


services 是一个顶级属性,用于定义一个应用中所包含的服务。Docker Compose 会将每
个服务部署在各自的容器中。其下包含的第一级的属性即为服务名称,这个名称可以根据服
务内容随意命名。而在服务名称下还可包含很多的属性,常用属性如下:
 

(1) build


用于指定一个 Dockerfile 的路径。而该 Dockerfile 则是用于创建当前服务镜像的。这个
路径可以是以斜杠(/)开头的绝对路径,也可以是相对于当前 compose 文件的、以点(.)号开头
的相对路径。
如果 Dockerfile 文件名不是默认名称,则需要通过 build 下的 context 属性指定路径,
dockerfile 属性指定文件名。

例如,

build:
 context: ./
 dockerfile: myDockerfile

(2) image


用户指定当前服务所需要使用的镜像,这个镜像可以是本地镜像,也可以是远程镜像仓
库中的镜像(会自动 pull)。
如果设置了 build,此时再设置的 image 属性即为构建出的镜像的名称与 Tag。

(3) container_name


该属性用于设置容器名称,但并不是必须的。如果没有设置该属性,容器名称则会采用
“合成方式”。而合成时需要用到 services 下的第一级属性。


在 services 下存在一级属性,称为服务名称。该级属性是作为 services 下的第一级属性
出现的。服务名称将来会作为容器名称的一部分出现。容器的名称格式为:当前 compose
文件所在目录名_ 服务名称。


如果在 services 下没有指定 image 属性,而是使用 bild 属性,即没有现成的镜像,而是
根据 build 下指定的 Dockerfile 生成镜像,此时生成的镜像名称格式为:当前 compose 文件
所在目录名-服务名称。

(4) ports

一个列表。前面为暴露出的端口号,后面为容器中应用的端口号。如果仅设置了一个端
口号,那么这个端口号是容器中应用的端口号,其暴露到宿主机的端口号会被随机分配。

ports:
 - 80:80 # 绑定容器的 80 端口到主机的 80 端口
 - 9000:80 # 绑定容器的 80 端口到主机的 9000 端口
 - 443 # 绑定容器的 443 端口到主机的任意端口,容器启动时随机分配绑定的主机端口号

(5) command

用于覆盖 Dockerfile 中的 CMD 指令内容,即启动该服务容器后立即运行的命令。如果
直接按照Dockerfile中的CMD指令内容执行即可,则compose文件中无需该command属性。

(6) depends_on

一个列表。用于指定当前服务的启动所依赖的应用名称。即列表中指定的服务会先于当
前服务启动。


(7) deploy

用于指定当前服务容器的部署设置。其下有一个常用属性 replicas,用于指定该服务启
动的容器的数量。即实现一个服务多个容器。一旦指定了 deploy:replicas,就不能再指定
container_name 属性了。因为各个启动的容器名称不能相同,而只能由系统自动生成。

services:
 frontend:
 image: awesome/webapp
 deploy:
 mode: replicated
 replicas: 6

(8) networks

用于指定当前服务容器要连接到的网络。该网络必须是已经存在的,或通过顶级属性
networks 创建的网络。

(9) volumes

用于指定当前服务容器所使用到的所有 volume。这些 volume 可以使用路径与卷标两种方式。
例如,下面是路径方式,非常直观,易于查看,但需要管理本地路径。

db:
 image: mariadb:latest
 ports:
 - "3306:3306"
 volumes:
 - /etc/mysql:/var/lib/mysql

再如,下面是卷标方式,backend 与 backup 两个服务共享了 db-data 的卷,逻辑简洁明
了,且无需管理本地路径。但具体卷标所代表的是 Docker 主机的哪个路径,并不能直观的
看到。需要通过 docker volume inspect [卷标]来查看。

services:
 backend:
 image: awesome/database
 volumes:
 - db-data:/etc/data
 backup:
 image: backup-service
 volumes:
 - db-data:/var/lib/backup/data
volumes:
 db-data:

2.4 networks

networks 作为一个顶级属性,用于定义和创建应用中所使用到的所有网络。其下包含的
第一级属性即为网络名称,这个网络名称可以随意命名。而在网络名称下还可包含很多的属
性,常用属性如下:

services:
  app:
    networks:
     - app_bridge: #这里使用的并不是网络名称
networks:
  app_bridge:
    name: appBGnet # 这才是网络名称
    driver: bridge

(1) name

networks 下的第一级属性—网络名称,并不是真正的网络名称,而仅仅是网络名称的一
部分。在真正生成网络后,其真正的网络名称格式为:当前 compose 文件所在目录名_
networks 下的第一级属性。
但如果设置了name属性,则网络名称即为这里指定的名称,不会出现名称再合成情况。

(2) driver

用于指定网络驱动,缺省驱动为 Bridge。

(3) attachable

如果该属性设置为 true,则除了当前 compose 中定义的服务外,其它独立容器也可以
连接到此网络,并能与该网络中的服务及也连接到该网络的其它独立容器通信。缺省状态为
false。


2.5 volumes

volumes 作为一个顶级属性,用于定义和创建应用中所使用到的所有 volume。其下包含
的第一级属性即为 volume 的卷标,这个卷标可以随意命名。这个卷标所代表的是当前Docker主机中的目录,至于该目录的具体位置,是由系统自动分配的。


在网络名称下还可包含很多的属性,但这些属性并不常用,所以这里不进行介绍了。

3、常用命令

Docker Compose通过docker-compose系列命令查看和控制compose中的所有服务容器。

docker-compose pull #拉取 compose 中服务依赖的全部镜像或指定镜像。通过在命令后添加服务名称来指定。

docker-compose config #检查 compose 文件是否正确。可添加选项-q,表示只有存在问题时才有输出。

docker-compose up #启动 compose 中的所有容器。-d 选项表示后台启动。

docker-compose logs #查看 comopse 中所有服务或指定服务的运行日志。通过在命令后添加服务名称来指定。默认情况下,将对不同的服务日志使用不同的颜色来区分。

docker-compose ps #列出 compose 中所有服务或指定服务。通过在命令后添加服务名称来指定。

docker-compose top #列出 compose 中当前正在运行的所有服务或指定服务。通过在命令后添加服务名称来指定。

docker-compose images #列出 compose 中所有服务或指定服务对应的镜像。通过在命令后添加服务名称来指定。

docker-compose port #列出指定服务容器的指定端口所映射的宿主机端口。

docker-compose run #在指定服务上执行一条命令。

docker-compose exec #进入指定服务容器。通过在命令后添加服务名称来指定。

docker-compose pause #暂停 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose unpause #恢复 compose 中处于暂停状态的所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose stop #停止 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose restart #重启 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose start #启动 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose kill #通过发送 SIGKILL 信号停止指定服务的容器。

docker-compose rm #删除 compose 中的、处于停止状态的所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。

docker-compose down #停止并删除 compose 中的所有服务容器、网络、镜像、数据卷。

4、安装


4.1 下载安装包

docker compose下载链接icon-default.png?t=N7T8https://download.csdn.net/download/weixin_43025151/88537056

将上述文件copy到 /usr/local/bin目录下。

4.2 添加可执行权限


为 docker-compose 文件添加可执行权限。

chmod +x /usr/local/bin/docker-compose


查看文件:

ll /usr/local/bin

4.3 测试


通过 docker-compose version 测试安装是否成功。

docker-compose version 

5、项目构建


5.1 项目代码


(1) 功能描述
这是一个 Spring Boot 工程。控制器具有三个接口:查询所有、根据名称查询、新增记录。整个架构包含一个 Redis 与 MySQL服务器。

(2) pom依赖
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.17</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.tigerhhzz</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>

		<!--spring boot 与 redis 整合依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--lombok-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

		<!--mybatis 与 spring boot 整合依赖-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

		<!--mysql 驱动-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>

		<!-- druid 驱动 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.12</version>
		</dependency>

		<!--tomcat 内置的 JSP 解析器-->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
		</dependency>

		<!--jstl 依赖-->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

(3) 实体类
 

package com.tigerhhzz.entities;

import lombok.Data;

import java.io.Serializable;

/**
 * @Author tigerhhzz
 * @Date 2023 11 06 14 18
 **/
@Data
public class Product implements Serializable {

        private Integer id;
        //产品名称
        private String name ;
        //年化利率
        private Double rate;
        //募集总额
        private Double amount;
        //已募集金额
        private Double raised;
        //产品周期
        private Integer cycle;
        //产品募集结束时间
        private String endTime;

}


(4) sql 文件
以下是生成 product 表及相应数据的 SQL 文件内容。

CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) DEFAULT NULL,
 `rate` double DEFAULT NULL,
 `amount` double DEFAULT NULL,
 `raised` double DEFAULT NULL,
 `cycle` int(11) DEFAULT NULL,
 `endTime` char(10) DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
INSERT INTO `product` VALUES 
(1,'TXTY',2.76,50000,20000,30,'2022-07-10'),(2,'GTTY',2.86,30000,30000,60,'2
022-07-12'),(3,'GTGX',2.55,60000,50000,90,'2022-07-09'),(4,'GFMA',2.96,30000
,20000,7,'2022-05-10'),(5,'TYXD',2.65,80000,60000,20,'2022-07-05'),(6,'HNSY'
,3.05,30000,20000,10,'2022-06-10'),(7,'HNSX',2.76,50000,30000,30,'2022-07-02
'),(8,'LXSY',2.86,30000,20000,20,'2022-07-11');

(5) Controller 类

package com.tigerhhzz.controller;

import com.tigerhhzz.entities.Product;
import com.tigerhhzz.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author tigerhhzz
 * @Date 2023 11 06 14 28
 **/
@RestController
public class Productcontroller {

    @Autowired
    private ProductService productService;

    @GetMapping("/")
    public String indexHandle() {
        //查询所有产品
        List<Product> allProducts = productService.findAllProducts();
        StringBuilder sb = new StringBuilder();
        for (Product product : allProducts) {
            sb.append(product).append("<br>");
        }
        return sb.toString();
    }

    //上架新产品
    @PostMapping("/register")
    public String registerHandle(@RequestBody Product product) {
        //添加新产品
        productService.saveProduct(product);
        return "save success" ;
    }

    //根据产品名称查询产品
    @GetMapping("/list")
    public String listHandle(String name) {
        List<Product> result = productService.findProductsByName(name);
        StringBuilder stringBuilder = new StringBuilder();

        for (Product product : result) {
            stringBuilder.append(product).append("<br>");
        }
        return stringBuilder.toString();
    }

}

(6) Service 接口

package com.tigerhhzz.service;

import com.tigerhhzz.entities.Product;

import java.util.List;

/**
 * @Author tigerhhzz
 * @Date 2023 11 06 14 47
 **/
public interface ProductService {
    void saveProduct(Product product);

    List<Product> findAllProducts();

    List<Product> findProductsByName(String name);
}

(7) Service 实现类

package com.tigerhhzz.service;

import com.tigerhhzz.entities.Product;
import com.tigerhhzz.dao.ProductDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author tigerhhzz
 * @Date 2023 11 06 14 49
 **/
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductDao dao;

    @Override
    @Transactional(rollbackFor = Exception.class)
    @CacheEvict(value = "pc", allEntries = true)
    public void saveProduct(Product product) {
        dao.insertProduct(product);
    }

    @Cacheable(value = "pc", key = "'product_' +#name")
    @Override
    public List<Product> findProductsByName(String name) {
        return dao.selectProductsByName(name);
    }

    @Cacheable(value = "pc", key = "'product_all'")
    @Override
    public List<Product> findAllProducts() {
        return dao.selectAllProducts();
    }
}

(8) Dao 接口
 

package com.tigerhhzz.dao;

import com.tigerhhzz.entities.Product;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @Author tigerhhzz
 * @Date 2023 11 06 14 52
 **/
@Mapper
public interface ProductDao {

    void insertProduct(Product product);

    List<Product> selectAllProducts();

    List<Product> selectProductsByName(String name);
}


(9) 映射文件
在 src/resources 资源目录中定义 ProductDao.xml 映射文件。

<?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tigerhhzz.dao.ProductDao">

    <insert id="insertProduct">
        insert into product(id,name, rate, amount, raised, cycle, endTime)
        values(#{id},#{name}, #{rate}, #{amount}, #{raised}, #{cycle}, #{endTime})
    </insert>

    <select id="selectAllProducts" resultType="com.tigerhhzz.entities.Product">
        select id, name, rate, amount, raised, cycle, endTime from product
    </select>

    <select id="selectProductsByName" resultType="com.tigerhhzz.entities.Product">
        select id, name, rate, amount, raised, cycle, endTime
        from product
        where name like '%' #{name} '%'
    </select>


</mapper>


(10) 配置文件
这里特别要注意 mysql 与 redis 的 IP,使用的是相应 Docker 主机的 IP。

# 注册mybatis
mybatis:
  # 注册映射文件
  mapper-locations: classpath:*.xml
  # 注册实体类别名
  type-aliases-package: com.tigerhhzz.entities


# 注册数据源
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.162.100:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false
    username: root
    password: 123456
  #  messages:
  #    basename: i18n/message
  #    encoding: utf-8
  #  #与Redis整合
  redis:
    # 配置单机版redis
    host: 192.168.162.100
    port: 6379
    password: 12345
    #连接sentinel高可用集群
    #sentinel:
    #master: mymaster
    #nodes: redisOS:26380,redisOS:26381,redisOS:26382

    #连接Redis分布式系统
    #cluster:
    #nodes: redisOS:6380,redisOS:6381,redisOS:6382,redisOS:6383,redisOS:6384,redisOS:6385

  cache:
    type: redis  #指定缓存类型
    cache-names: pc #指定缓存空间名称,随意
#配置logback日志控制
logging:
  charset:
    file: "/var/applogs/finance.log" #文件输出路径
  pattern:
#    file: level-%-5level - %msg%n     #文件输出
    console: level-%-5level - %msg%n  #控制台输出
#  file:
#    name: "/var/applogs/finance.log" #文件输出路径
#  level:
#    root: warn #全局最低输出级别
#    com.tigerhhzz.dao: debug #特定包下的级别




(11) 启动类

package com.tigerhhzz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

springboot完整demo项目下载链接:

https://download.csdn.net/download/weixin_43025151/88537578

5.2 项目打包


将项目 package 打为 jar 包,然后再上传到 Docker 主机的/root/demo 目录中。

5.3 定义 Dockerfile


在 Docker 主机的任意目录中新建一个目录,该新建目录名称与项目名称相同。这里在
/root 目录中 mkdir 一个名称为demo的目录。然后在该目录中新建 Dockerfile 文件

# 指定当前镜像继承自 openjdk:8u102,因为下面要运行 Jar 包,需要 JDK 环境
FROM openjdk:8u102
# 作者与项目相关说明
MAINTAINER tiger tigerhhhzz@163.com
LABEL version="1.0" description="this is a spring boot application"
# 将当前目录下的 jar 包 copy 到容器中。
# 注意,这个当前目录指的是 docker build 命令最后一个参数指定的上下文路径
COPY demo.jar demo.jar
# 一定要执行的 exec
ENTRYPOINT ["java", "-jar", "demo.jar"]
# 指定对外暴露的端口号
EXPOSE 8080

6、Compose 编排启动项目


使用 Docker Compose 可以 mysql 与 redis 的 IP 进行了软编码。使得当前应用访问的 mysql 与 redis可以运行在如何容器中。方便以后维护!!

6.1 定义 compose.yml


在 demo目录中新建一个文件 compose.yml。

vi compose.yml

services:
  app:
    build: ./
    container_name: myapp
    ports:
      - 9000:8080
    volumes:
      - ./logs:/var/applogs
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - 3306:3306
    volumes:
      - /root/mysql/log:/var/log/mysql
      - /root/mysql/data:/var/log/mysql
      - /root/mysql/conf:/etc/mysql/conf.d

  redis:
    image: redis:latest
    ports:
      - 6379:6379
    volumes:
      - /root/redis/redis.conf:/etc/redis/redis.conf
      - /root/redis/data:/data
    command: redis-server /etc/redis/redis.conf

6.2 修改应用


(1) 修改配置文件
对于应用程序,需要修改其配置文件 application.yml。将 mysql 与 redis 的主机名修改为它们相应服务的名称。

(2) 重新打包上传
由于应用程序的配置文件发生了变化,所以需要对应用程序重新进行 package 打包,并
将新的 jar 包上传到 Linux 系统中的/root/demo 目录中。

6.3 启动所有容器

docker-compose up -d

6.4 写入 mysql 数据


(1) 进入 mysql

docker ps -a

docker exec -it fadc954dadf8  /bin/bash

 mysql -uroot -p


(2) 准备数据
复制前面的 sql 文件中的内容,直接粘贴到 mysql 命令行即可。

CREATE DATABASE IF NOT EXISTS `test`;

USE `test`;
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) DEFAULT NULL,
 `rate` double DEFAULT NULL,
 `amount` double DEFAULT NULL,
 `raised` double DEFAULT NULL,
 `cycle` int(11) DEFAULT NULL,
 `endTime` char(10) DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `product` VALUES 
(1,'TXTY',2.76,50000,20000,30,'2022-07-10'),(2,'GTTY',2.86,30000,30000,60,'2
022-07-12'),(3,'GTGX',2.55,60000,50000,90,'2022-07-09'),(4,'GFMA',2.96,30000
,20000,7,'2022-05-10'),(5,'TYXD',2.65,80000,60000,20,'2022-07-05'),(6,'HNSY'
,3.05,30000,20000,10,'2022-06-10'),(7,'HNSX',2.76,50000,30000,30,'2022-07-02
'),(8,'LXSY',2.86,30000,20000,20,'2022-07-11');

6.5 访问应用


启动项目的访问方式http://192.168.162.100:9002/

6.6 指定各组件名称

前面的 compose.yml 文件中应用生成的镜像采用的是默认名称,mysql 与 redis 生成的容
器名称采用的是默认名称,生成并加入的 bridge 网络也称默认名称的网络。这些组件的所
使用的默认名称,也可以被指定名称所代替。

(1) 定义 compose2.yml

services:
  app:
    build: ./
    container_name: myapp
    image: mydemo:2.0
    ports:
      - 9003:8080
    volumes:
      - ./logs:/var/applogs
    networks:
      - tigernetworks
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:latest
    container_name: tigermysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - 3306:3306
    volumes:
      - /root/mysql/log:/var/log/mysql
      - /root/mysql/data:/var/log/mysql
      - /root/mysql/conf:/etc/mysql/conf.d
    networks:
      - tigernetworks

  redis:
    image: redis:latest
    container_name: tigerredis
    ports:
      - 6379:6379
    volumes:
      - /root/redis/redis.conf:/etc/redis/redis.conf
      - /root/redis/data:/data
    networks:
      - tigernetworks
    command: redis-server /etc/redis/redis.conf
networks:
  tigernetworks:

(2) 启动所有容器
这里通过-f 选项指定要使用的 compose 文件。

docker-compose -f compose2.yml up -d

(3) 查看容器
查看容器,可以看到容器名称为指定的名称。

(4) 查看网络
此时查看网络可以看到,又新生成一个网络。对于生成的网络,其生成的名称为“当前
compose 文件所在目录名_ networks 下的第一级属性”。

docker network ls

(5) 查看网络详情
通过 docker network inspect demo_tigernetworks命令,查看该网络的详情,可以看到,compose
中定义的三个服务容器都在该网络中。

docker network inspect demo_tigernetworks

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress 媒体库文件夹管理插件 FileBird v5.5.4和谐版下载

FileBird是一款WordPress 按照文件夹管理方式的插件。 拖放界面 拖放功能现已成为现代软件和网站的标配。本机拖动事件&#xff08;包括仅在刀片中将文件移动到文件夹以及将文件夹移动到文件夹&#xff09;极大地减少了完成任务所需的点击次数。 一流设计的文件夹树展示 我们…

如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

2023年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 阅读以下代码,程序输出结果正确的选项是?( ) def process_keywords(keywords_list):unique_keywords = list(set(keywords_list))

Day31力扣打卡

打卡记录 由子序列构造的最长回文串的长度&#xff08;区间DP&#xff09; 先将两个字符串合并&#xff0c;再仿照 最长回文子序列 的做法&#xff0c;从中间开始往外进行遍历&#xff0c;由于是两个字符串&#xff0c;在 最长回文子序列 的做法上需要满足 len(word1) < j …

《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS

title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录&#xff1a;网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…

力扣刷题篇之数与位2

系列文章目录 目录 系列文章目录 前言 数值计算 总结 前言 本系列是个人力扣刷题汇总&#xff0c;本文是数与位。刷题顺序按照[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 数值计算 415. 字符串相加 - 力扣&#xff08;…

Android studio配置Flutter开发环境报错问题解决

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 报错问题截图 报错原因已经给出&#xff1a; You need Java 11 or higher to build your app with this version of G…

C#中.NET Framework4.8 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、 移植&#xff08;Migrations&#xff09;数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 本文想说的是&#xff0c;.NET Framework4.8 Win…

把大模型装进手机,总共分几步?

年初ChatGPT爆火的时候&#xff0c;我去上海参加华为春季新品发布会&#xff0c;用一页keynote提到了大模型技术与手机硬件的结合。虽然只有短短的一两分钟&#xff0c;但我专门发了一条朋友圈&#xff0c;看好自然语言交互能力在手机上的应用。 当时我就有预感&#xff0c;大语…

LeetCode(16)接雨水【数组/字符串】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 42. 接雨水 1.题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

Reids集群

目录 一、集群的概念 1.为什么要搭建集群&#xff1f; 2.Redis搭建集群是否需要考虑状态同步的问题&#xff1f; 二、Redis集群的模式 1.redis集群--主从模式 1.1什么是Redis的主从模式&#xff1f; 1.2.主从模式它们之间的数据是怎么实现一个同步的&#xff1f; 1.3.主…

大数据爬虫分析基于Python+Django旅游大数据分析系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python和Django的旅游大数据分析系统是一种使用Python编程语言和Django框架开发的系统&#xff0c;用于处理和分…

某头部通信企业:SDLC+模糊测试,保障数实融合安全发展

某头部通信企业是全球领先的综合通信信息解决方案提供商&#xff0c;为全球电信运营商、政企客户和消费者提供创新的技术与产品解决方案。该企业持续关注核心技术攻关&#xff0c;深入打造系列化标杆项目和价值场景&#xff0c;加强数字化平台的推广应用&#xff0c;加快共建开…

操作系统(二 )| 进程控制 进程状态 进程描述 进程控制 进程同步互斥

文章目录 1 进程和程序区别2 进程状态2.1 进程的5种基本状态2.2 进程状态之间转换2.3 七状态模型 3 进程描述3.1 进程控制块 PCB3.2 进程块组织方式 4 进程控制5 进程同步 互斥5.1 区分进程互斥和同步5.2 核心方案5.3 其他方案方案1 设置锁变量方案2 严格轮转法方案3 Peterson解…

智能AI系统ChatGPT网站源码+支持OpenAI DALL-E3文生图+支持ai绘画(Midjourney)/支持GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

什么是集成测试?集成测试方法有哪些?

1、基本概念&#xff1a; 将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试&#xff0c;一般来说是以模块和子系统为单位进行测试。 2、集成测试包含的层次&#xff1a; 1. 模块内的集成&#xff0c;主要是…

重生之我是一名程序员 31

大家晚上好&#xff01;前面给大家分享了指针与数组的知识&#xff0c;所以今天要给大家分享的知识是——指针数组 相信大家在这里都会有疑问&#xff0c;指针数组是指针还是数组&#xff1f; 在这我们可以类⽐⼀下其他类型的数组&#xff0c;比如整型数组是存放整型的数组&am…

c语言:如何打印杨辉三角形。

题目&#xff1a;打印杨辉三角形 如&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 思路和代码&#xff1a; //由规律不难得出&#xff0c;每行首个数字和最后最后一个数字都为1&#xff0c;其余数字是这列的上一个数字和前一个数字的和组成&#xff0c;由此推出代码 #de…

LeetCode(17)罗马数字转整数【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 13. 罗马数字转整数 1.题目 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

【Web开发】基于 Jekyll 中的 Chirpy 模板搭建博客网站(一):成功经验篇

基于 Jekyll 中的 Chirpy 模板搭建博客网站&#xff08;一&#xff09;&#xff1a;成功经验篇 1.Jekyll 介绍2.Chirpy 介绍3.安装步骤3.1 Prerequisites3.2 Installation3.2.1 Creating a New Site3.2.2 Installing Dependencies 3.3 Usage3.3.1 Configuration3.3.2 Running L…