ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。 使用Compose 基本上分为三步: 1. Dockerfile 定义应用的运行环境 2. docker-compose.yml 定义组成应用的各服务 3. docker-compose up 启动整个应用 基本规则: 1. 大小写敏感 2. 使用缩进表示层级关系 3. 禁止使用tab缩进,只能使用空格键 4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级 5. 使用#表示注释 6. 字符串可以不用引号标注 ## 安装Compose Compose网站:[https://docs.docker.com/compose/](https://docs.docker.com/compose/) curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose -v ## 编写示例 ``` version: "3" services: nginx: # docker镜像,先拉取本地,再拉取云端 image: nginx:${NGINX_VERSION} # 容器名称 container_name: web # 端口映射 ports: - "${NGINX_HTTP_HOST_PORT}:80" # 数据挂载 宿主机:docker 此处可以写相对路径 volumes: - ${SOURCE_DIR}:/var/www/html/:rw # 重启策略 # no是默认的重启策略,在任何情况下都不会重启容器。 # 指定为always时,容器总是重新启动。 restart: always # 注意:如果服务之间是在同个networks之下的话就可以通过 服务名:port 来访问链接 networks: - default php72: # build用context指定的dockerfile创建 build: context: . # 传入dockerfile里面的参数,注意与context同级,在dockerfile里面通过ARG接收 args: - PHP_VERSION: ${PHP72_VERSION} # 指定容器名称 container_name: php72 # 链接到另一个服务中的容器 SERVICE:ALIAS # 在当前的web服务的容器中可以通过链接的db服务的别名database访问db容器中的数据库应用 # 如果没有指定别名,则可直接使用服务名访问。 links: - db:database # 链接到docker-compose.yml 外部的容器 external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresq # 使用该参数,container内的root拥有真正的root权限。 # 否则,container内的root只是外部的一个普通用户权限。 privileged: true # 容器名称 container_name: php72 # 启动时必须等mysql服务启动好 depends_on: - mysql cap_add: - SYS_PTRACE networks: - default mysql: image: mysql:${MYSQL_VERSION} ports: - "${MYSQL_HOST_PORT}:3306" volumes: - ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro - ${MYSQL_DATA_DIR}:/var/lib/mysql/:rw restart: always networks: - default # 环境变量传入dockerfile里面的变量 # 与args不同environment定义的变量在容器内部也可以反问 environment: MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" redis: image: redis:${REDIS_VERSION} ports: - "${REDIS_HOST_PORT}:6379" volumes: - ${REDIS_CONF_FILE}:/etc/redis.conf:ro restart: always entrypoint: ["redis-server", "/etc/redis.conf"] networks: - default # 指定其为同个docker网络 # docker network ls来查看 # 同一网络下,可以通过服务名来互联 networks: default: ``` - 变量来自同目录下的.env文件 - php通过同级目录的dockerfile来构建 - 镜像改了之后要通过`docker-compose build --no-cache` 来重新构建一下 ## 常用命令 * **ps**:列出所有运行容器 ~~~ docker-compose ps ~~~ * **logs**:查看服务日志输出 ~~~ docker-compose logs // 加-f,持续输出。 ~~~ * **port**:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口 ~~~ docker-compose port eureka 8761 ~~~ * **build**:构建或者重新构建服务 ~~~ docker-compose build ~~~ * **start**:启动指定服务已存在的容器 ~~~ docker-compose start eureka ~~~ * **stop**:停止已运行的服务的容器 ~~~ docker-compose stop eureka ~~~ * **rm**:删除指定服务的容器 ~~~ docker-compose rm eureka ~~~ * **up**:构建、启动容器 ~~~ docker-compose up ~~~ * **kill**:通过发送 SIGKILL 信号来停止指定服务的容器 ~~~ docker-compose kill eureka ~~~ * **pull**:下载服务镜像 * **scale**:设置指定服务运气容器的个数,以 service=num 形式指定 ~~~ docker-compose scale user=3 movie=3 ~~~ * **run**:在一个服务上执行一个命令 ~~~ docker-compose run 容器名 bash ~~~ >[info] > 1. 通过docker-compose编排的的容器是没有容器自己的ip,因为他们共用一个或多个network,可以通过`docker network ls`来查看,可以通过服务名来链接网络,`docker network inspect <container id>`可以查看对应网络的配置。 > 2. 通过docker-compose build的dockerfile一定要有CMD \[ "/bin/bash" \]等执行命令,才能通过docker-compose up起来 ### 更多参考 * [官方技术文档](https://docs.docker.com/compose/) * [compose file reference](https://docs.docker.com/compose/compose-file/) * [docker-compose的每个设置项都介绍了](https://docs.docker.com/compose/compose-file/#network-configuration-reference) * [docker-compose各参数中文解释](https://blog.csdn.net/qq_29349715/article/details/80818605)