docker-compose种不通的服务之间的访问问题,夸容器访问

发布时间 2023-11-28 16:26:51作者: 学不会xuebuhui

背景

我们知道对于docker 的每个容器都是独立的,想要夸容器访问的话,不能用127.0.0.1加端口号去访问,所以需要docker虚拟网卡的网关分配的地址去访问,
可以通过docker inspect对每个容器的局域网ip进行查看,但是这样比较麻烦,所以有一个新的解决办法,就是通过docker-compose配置文件的方式创建多个service,然后就可以用service的name的方式访问了,servicename会自动解析成对应的ip,确保访问不出问题

应用

先看一个列子

# 编写compose文件:
version: '3.0'
services:
  kodcloud:
    container_name: kodcloud
    image: kodcloud/kodbox
    restart: always
    ports:
      - 1111:80
    depends_on:
      - mysql
      - redis

  mysql:
    container_name: mysql
    image: mysql:8.0.29
    restart: always
    volumes:
      - /root/kodbox/mysql/data:/var/lib/mysql
      - /root/kodbox/mysql/conf:/etc/mysql/conf.d
      - /root/kodbox/mysql/logs:/logs
    ports:
      - 9004:3306
    environment:
      - "MYSQL_ROOT_PASSWORD=2002"

  redis:
    container_name: redis
    image: redis:5.0
    restart: always
    volumes:
      - /root/kodbox/redis/data:/data
      - /root/kodbox/redis/redis.conf:/etc/redis/redis.conf
    ports:
      - 9005:6379

docker-composer up -d后台启动后,进入kodcloud容器,然后ping redis和mysql的端口,
image

docker-compose的ports、expose、links、depends_on的使用技巧

ports端口映射[主机]:[容器],如果不加:默认是内部的端口,主机端口随机
expose只是dockerfile的声明,没什么实际作用,
links是别名,相当于dns或者host设置了指定ip,可以通过service名字直接访问,列入

version: "3.1"
 ​
 services:
   db:
     image: mariadb
     command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
     volumes:
       - "./db:/var/lib/mysql"        #左边 ./db 代表数据库持久化目录位置
     environment:
       - "TZ=Asia/Shanghai"
       - "MYSQL_ROOT_PASSWORD=sbsn555"
       - "MYSQL_DATABASE=kodbox"
       - "MYSQL_USER=kodbox"
       - "MYSQL_PASSWORD=sbsn555"
 ​
   app:
     image: kodcloud/kodbox
     ports:
       - 5326:80        #左边 5326 是主机访问端口,可按需修改
     links:
       - db
       - redis
     volumes:
       - "./site:/var/www/html"        #左边 ./site 代表kodbox持久化目录位置
     restart: always
 ​
   redis:
     image: redis:alpine
     environment:
       - "TZ=Asia/Shanghai"
     restart: always

depends_on:容器的依赖关系
通过depends_on告诉docker-compose当前服务启动之前先要把depends_on指定的服务启动起来才行