Docker-compose

Docker-compose 

 

Docker Compose是什么 

Docker Compose 与 Docker Stack 非常类似。它能够在 Docker 节点上,以单引擎模式 (Single-Engine Mode)进行多容器应用的部署和管理。 
 
多数的现代应用通过多个更小的服务互相协同来组成一个完整可用的应用。比如一个简单的 示例应用可能由如下 4 个服务组成

  •  Web 前端。
  •  订单管理。
  •  品类管理。
  •  后台数据库。

    将以上服务组织在一起,就是一个可用的应用。 部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。 Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是 通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。 应用部署成功后,还可以通过一系列简单的命令实现对其完整声明周期的管理。甚至,配置 文件还可以置于版本控制系统中进行存储和管理。 

Docker Compose 的背景

Docker Compose 的前身是 Fig。Fig 是一个由 Orchard 公司开发的强有力的工具,在当时 是进行多容器管理的最佳方案。Fig 是一个基于 Docker 的 Python 工具,允许用户基于一 个 YAML 文件定义多容器应用,从而可以使用 fig 命令行工具进行应用的部署。 Fig 还可以对应用的全生命周期进行管理。内部实现上,Fig 会解析 YAML 文件,并通过 Docker API 进行应用的部署和管理。在 2014 年,Docker 公司收购了 Orchard 公司,并 将 Fig 更名为 Docker Compose。命令行工具也从 fig 更名为 docker-compose,并自此 成为绑定在 Docker 引擎之上的外部工具。虽然它从未完全集成到 Docker 引擎中,但是 仍然受到广泛关注并得到普遍使用。直至今日,Docker Compose 仍然是一个需要在 Docker 主机上进行安装的外部 Python 工具。使用它时,首先编写定义多容器(多服务)应用的 YAML 文件,然后将其交由 docker-compose 命令处理,Docker Compose 就会基于 Docker 引擎 API 完成应用的部署。

小总结:docker-compose 就是一个编排。需要熟练 yaml 语法。 
 

Docker Compose安装 

备注: docker-compose 是一个基于 yaml 语法的编排 创建的时候就是直接 vim  docker-compose.yaml   该文件执行必须是在当前文件夹否则需要加 -f 

Docker Compose常用命令

docker-compose 指令 

模板指令: 用来书写在 docker-compose.yml 文件中指令称之,为模板指令用来为服务进行 服务的 指令: 用来对整个 docker-compose.yml 对应的这个项目操作书 写 docker-compose 命 令之后命令 docker-compose up(指令)

 

1.up 指令

作用:用来启动所有 

docker-compose 服务
选项:-d 后台启动所有服务

 

2.down 指令

作用:用来关闭所有 
docker-compose 服务

 

3.exec 指令

作用:进入容器 
docker-compose exec redis (docker-compose.yml 中声明服务 id) bash 

 

4.ps 指令

作用:用来展示当前 
docker-conpose 运行的所有容器 docker-compose ps 

 

5.restart 指令

作用:用来重启项目中某个服务 如果不写服务 id 默认重启所有服务 
docker-compose restart [服务 id] 

 

6.rm 指令

作用:用来删除项目服务 
docker-compose rm 删除所有服务 
docker-compose rm -fv [服务 id]注意:谨慎操作 -v 删除服务的数据卷 

 

7.start 指令

启动服务 
docker-compose start [服务 id] 

 

8.stop 指令

关闭服务 
docker-compose stop [服务 id] 

 

9.top 指令

用来查看 compose 容器内运行的进程 
docker-compose top [服务 id] 

 

10.pause 指令

挂起服务 
docker-compose pause [服务 id]

 

11.unpause 指令

继续运行服务 
docker-compose unpause [服务 id]

 

12.logs 指令

查看服务日志 
docker- compose logs [服务 id] 

 

其他指令

port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定 的公共端口 

docker-compose port eureka 8761

build:构建或者重新构建服务

docker-compose build 

 

kill:通过发送 SIGKILL 信号来停止指定服务的容器

docker-compose kill eureka 


 config:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显 示错误原因 -h:

查看帮助 

docker-compose pull [options] [SERVICE...] 选项包括:

--ignore-pull-failures,忽略拉取镜像过程中的错误

--parallel,多个镜像同时拉取

--quiet,拉取镜像过程中不打印进度信息


docker-compose pull

拉取服务依赖的镜像

push:推送服务依赖的镜像到 Docker 镜像仓库 

 

Docker-compose 模板指令 

查看第一个模板

version: "3.2" 
services:
  tomcat: 										#服务名称
    image: tomcat:8.0-jre8 						#使用哪个镜像
    ports:    									#用来完成host与容器的端口映射关系
      - "8080:8080"
    volumes: 									#完成宿主机与容器中目录数据卷共享
      #一/root/apps:/usr/local/tomcat/webapps   #使用自定义路径映射
      - tomcatwebapps:/usr/local/tomcat/webapps
volumes:    									#声明上面服务所使用的自动创建的卷名
  tomcatwebapps:								#声明指令的卷名compose 自动创建该卷名但是会在之前加入项目名
    external:									#使用自定义卷名.
      false										#true确定使用指定卷名注意:一 旦使用外部自定义卷 名启动服务之前必须手动创建

 

docker-compose 部署多应用 

services :
tomcat01:    #服务名称
  container_nane: tomcat01 #相当于run的 --name
  image: tomcat:8.0-jre8 #使用哪个镜像相当于run image
  ports: #用来完成host与容器的端口映射关系  相当于run -P
    - "8080:8080"
  volumes: #完成宿主机与容器中目录数据卷共享相当 于run -v
    #- /root/apps:/usr/1ocal/tomcat/webapps #使用自定义路径映射
    - /root/apps:/usr/local/tomcat/webapps
  networks:    #代表当前服务使用哪个网络桥  相当于run --network
    - hello
tomcat02:  #服务名称
  container_name: tomcat02
  image: tomcat:8.0-jre8 #使用哪个镜像
  ports: #用来完成host与容器的端口映射关系
    - "8081:8080"
  volumes: #完成宿主机与容器中目录数据卷共享
    #- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
    - tomcatwebapps02:/usr/local/tomcat/webapps
  networks: #代表当前服务使用哪个网络桥
    - hello
mysql:
  image: mysql:5.7.32
  container_name: mysql
  ports:
    - "3307:3306"
  volumes:
    - mysqldata:/var/lib/mysql
    - mysqlconf:/etc/mysql
  environnent:
    - MYSQL_ROOT_PASSWORD=root
  networks:
    - hello
redis:
  image: redis:5.0.10
  container_name: redis
  ports:
    - "6379:6379"
  volumes:
    - redisdata:/data
  networks: 
    - hello
  command: "redis-server --appendonly yes" #run镜像之后用来獍盖容器内容默认命令
volumes:	#声明上面服务所使用的自动创建的卷名
  tomcatwebapps01:	#声明指令的卷名compose自动创建该卷名但是会在之前加入项目名
    external:	#使用自定义卷名,
      false		#true确定使用指定卷名 	注意:一旦使用外部自定义卷名启动服务之前必须手动创建
  tomcatwebapps02:
  mysqldata:
  mysqlconf:
  redisdata:
networks:	#定义服务用到桥
  hello:    #定义上面的服务用到的网桥名称默认创建就是bridge
    external:
      true	#使用外部指定网桥注意:网桥必须存在.

 

Docker-compose模板指令

build

构建或者重新构建服务

docker-compose build

container_name

指定容器名称 默认会将使用

container_name: docker-web-container

comand

覆盖容器启动后默认执行的命令

command: echo "hello world"

depends_on

解决容器的依赖 启动先后的问题 以下先启动redis db 再启动web

version: "3.0"
services:
  web:
    build: .
    depends_on:
     - db  (服务的ID名称)
     - redis
  redis:
    image: redis
  db: 
    image: mysql:5.6
    
#但是web服务不会等待redis  db完全启动之后再启动

env_file

从文件中获取变量 可以为单独的文件路径或者列表

如果docker-compose -f FILE 方式来指定Compose模板文件 则env_file中变量的路径会基于模板文件路径

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment

设置环境变量 可以使用数组和字典两种格式

只给定名称的变量会自动获取运行compose主机上对应的变量

environment:
  RACK_ENV: development
  SESSION_SECRET:
  
 environment:
   - PACK_ENV=development
   - SESSION_SECRET

image

指定镜像的名称或者ID 本地不存在会尝试拉取

image: centos
image: orcharup/centos 
image: a1s2df3a

ports

暴露端口信息 宿主机端口:容器端口映射

ports:
    - "3000"
  - "8080:8080"
  - "49100:22"
  - "127.0.0.1:8080:8080"

volumes

数据卷所挂载路径设置 可以设置宿主机路径 数据卷名称 并可以设置访问模式

volumes:
 - /var/lib/mysql
 - cache/:/tmp/apache
 - ~/configs:/etc/configs/:ro

如果路径为数据卷名称 必须在文件中配置数据卷

version: "3.0"
services:
  tomcat:
    image: tomcat:8.0-jre8
    ports:
      - "8080:8080"
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:
    external:
      false
 ------------------------------------
 #如果是自定义创建的volumes就如下
 volumes:
   mysql_data:
         external:
        true

network

配置容器连接的网络

version: "3"
services:

    some-service:
    networks:
      - some-network
      - other-network
networks:
  some-network:
  other-network:

healtheck

通过命令检查容器是否健康运行

healthcheck:
  test: ["CMD","curl","-f","http://localhost"]
  interval: 1m30s
  timeout: 10s 
  retries: 3

sysctls

配置容器的内核参数

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

ulimits

指定容器的ulimits限制值

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

 

docker-compose 的build指令

build 指令

作用:将指定的dockefile打包成指对应镜像,然后运行该镜像

services:
  web:
   build: 指定Dockerfile所在目录,先根据build中的dockerfile自动构成镜像,自动运行容器
     context: demo   ./demo   /root/demo指定上下文目录  Dockerfile所在目录 
     dockerfile: Dockerfile
   container_name: demo
   ports:
     - "8081:8081"
   networks:
     - hello  
   depends_on:
     - tomcat01

 

外部命令 
 

创建卷 
ocker volume create  tomcatwebapps01 
 
查看卷
docker volume ls 
 
创建网桥 
docker network  create bridge hello  
 
查看网桥 
docker network ls 
 
查看容器信息 
docker inspect 容器名 
 
如果要使用自定义卷名就要手动创建卷名 
docker volume create 卷名 
 
如果要使用自定义网桥就要手动创建桥 
docker network create -d bridge 桥名

 

posted @ 2021-07-22 18:04  isicman  阅读(366)  评论(0)    收藏  举报