背景
我们知道对于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的端口,,注意这里容器间的相互访问时内部端口不是映射的主机端口
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指定的服务启动起来才行