前言
项目中如果使用到了容器,那么合理的编排手段是必不可少的!
一、概览
在使用docker-compose过程中,我们想要有什么样的功能及效果呢?
对于我来说它最好能够:
- 同一个服务器中可能存在多个不同的项目,所以我需要能够关联nginx以便我可以进行反代操作
- 能够顺序启动不同的模块,db模块,队列模块等
- 能够在运行docker-compose的时候就指定参数,如数据库的登录
- 能够让容器中的数据库等存储直接使用Host主机中的存储目录
二、docker-compose文件介绍
docker-compose是yml类型的文件,所以在编写该文件的时候需遵守yml格式语法。
docker-compose.yml第一行是版本号:
version: '3.8'
该版本号表示该yml文件语法版本。
version底下则是我们需要编排的模块列表:services.
services下面一般还有个自定义的网络networks.
为了更好的解释直接贴上完整实例:
version: '3.8'
services:
//模块的名字,一般这个名字用来在services中交互,如底下deepends_on中的名称
mytestWeb:
image: ubuntu:latest //该模块对应的镜像
container_name: mytestWebContainer //指定容器的名称,可以使用docker ps查看
volumes: //存储卷,指定容器中/app目录下对应宿主机中的/work/mytest目录
- /work/mytest:/app
working_dir: /app //在容器中定位到/app目录
//使用command在容器中执行命令,底下的命令是执行输出/app目录下的所有文件,并将/app目录下的app文件设为可执行,并执行该文件
command: sh -c "ls -l && chmod 0700 ./app && ./app"
//暴露端口号,一般我们使用nginx反代时,只需要使用expose声明暴露该端口就好,不要底下
//ports映射端口,nginx直接listen 80就好了。
expose:
- "80"
ports:
- 8080:8899
depends_on: //depends_on表明底下的mytestMongodb模块运行起来后,才开始运行本模块
- mytestMongoDB
networks: //使用networks自定义网络
testcompose: //自定义的网络名称,该名称需要在底下networks模块中定义,否则报错
//固定当前模块ipv4地址,这种情况下,我们可以使用
//localhost:8080,192.168.2.6:8899直接访问到本容器
//如果我们使用了nginx监听了80端口,并且监听本容器Ip proxy_pass =
//http://192.168.2.6:8899/,(8899是项目中监听的端口)注意本地测试需要
//在/etc/hosts中加入域名,域名不能是ip(127.0.0.1除外)
ipv4_address: 192.168.2.6
mytestMongoDB:
image: mongo:latest
container_name: mytestMongoContainer
environment: //该属性可以在第一次启动该容器的时候创建一个作用在admin数据库中的root用户
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 123
networks:
testcompose:
ipv4_address: 192.168.2.7 //数据库对应的固定ip
networks: //该层级的networkds定义网络名称
testcompose: //自定义的网络名称
ipam: //固定语法
config: //固定语法(config对应的是数组,所以底下需要至少两个属性)
- subnet: 192.168.2.0/24 //网络号段
gateway: 192.168.2.1 //网关ip
2.nginx配置
顺便展示下,Nginx代理docker固定域名的写法:
server {
listen 80;
server_name a.pjsong.top;
access_log /var/log/nginx/composetest-access.log;
error_log /var/log/nginx/composetest-error.log;
location / {
proxy_pass http://192.168.2.6:8899/;
}
}
这样当监听到a.pjsong.top的时候将代理到192.168.2.6:8899这个ip加端口上面,注意本地测试的时候,server_name不要写已经被解析的域名,不然会直接被公网dns解析。
总结
docker-compose除了直接拉取镜像之外,也可以通过dockerfile来拉取构建,看个人所需,简单的直接doker-compose拉取就好了。