欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker Compose

程序员文章站 2022-05-15 09:16:21
...

Docker能够很容易地将每个微服务绑定到容器,并且Docker Compose使得这些容器的编排变得非常简单。没有Docker Compose,容器编排步骤将涉及各种镜像、创建所需的网络,以及以一定顺序通过一系列Docker run 命令来运行应用程序,

Docker Compose的功能不仅在于启动容器;它还有以下的功能:

  • 构建、停止以及启动与应用程序相关的容器
  • 跟踪运行中容器的日志,避免了必须打开多个终端会话来跟踪每个容器的麻烦
  • 查看每个容器的状态

Docker Compose 是本地开发测试使用的,真正上线不用它

linux需要额外安装,自行百度

 

Compose文件是一个YAML配置文件,该文件定义了启动应用程序所需的服务、网络和卷。Docker要求Compose文件所处的路径与调用docker-compose命令时所处的位置相同,并且该位置中要有一个docker-compose.yml或者docker-compose.yaml的文件,就是说创建个docker-compose文件,把Docker Compose写进这个文件中。一般都是写在同级目录下,也可以使用-f标记来重写这个位置。

 

常用命令

  • docker-compose up        Create and start containers
  • docker-compose stop     Stop services
  • docker-compose start     Start services
  • docker-compose down    Stop and remove containers, networks, images, and volumes 停止并删除所有的容器
  • docker-compose exec     跟docker exec 一样,对正在运行的容器操作
  • docker-compose build     Build or rebuild services 先把yml文件中需要build的镜像先build起来,然后再up起来,如果yml中的自定义的Dockerfile文件发生了更改,则需要先这样运行。
  • docker-compose config   Validate and view the Compose file, 就是查看自己写的docker-compose.yml文件
  • docker-compose logs      查看这些容器的日志
  • docker-compose logs --tail=n   查看容器的后n条数据
  • docker-compose ps           列举docker-compse 里的server
  • docker-compose images    列举docker-compose定义的container和images
  • docker-compose scale      Set number of containers for a service,就是一次启动几个服务,后面会说
  • docker-compose -f  docker-compose.yml up     -f 指定文件,默认是docker-compose。yml 通过-f 可以指定

 

关于文件版本

一共有三个版本,现在都用版本3,及开头用

version: '3'

version: '3'
services:
	database:        (这是服务的名字,随便取)
		image:mysql  (写成这个样子,是要在docker hub 拉取镜像)
		environment:
			xxxxx: xx
	webserver:
		image: nginx:alpine
		ports:
			- 8080:80
		depends_on:   (这个是说明了启动顺序,Docker Compose默认按从上到下执行,
                              但是这个指定了顺序,webserver->cache->database)
			- cache
			- database
	cache:
		image: redis

然后要启动所有的容器:

docker-compose up

 

Docker Compose 文件参考

1 Services

  • 一个service代表一个container,这个container可以从dockerhub的image来创建,或者本地的Dockerfile,build来创建
  • service的启动类似docker run ,可以指定network 和 vomlume,所以可以给service指定network和volume。

service包括以下的选项:

  • build
  • context
  • image
  • environment/env_file
  • depend_on
  • image
  • ports
  • volumes
  • restart

①build

build键值包含了在构建时要应用的配置选项。build键值可以是构建上下文的路径,也可以是一个由上下文和可选的Dockefile位置构成的详情对象。

services:
	app:
	    build: ./app
		
# 一般用这个就就行了,指明了Dockerfile所在的路径
	
	
services:
	app:
	    context: ./app
	    Dockerfile: dockerfile-app

②context

设置上下文路径,如果时相对路径,就是相对于Compose文件位置而言。

services:
	app:
	    context: ./app
	    Dockerfile: dockerfile-app

③image

如果使用了build选项时提供了image标签,那么Docker会构建该镜像,并使用所提供的镜像名称和标签为该镜像赋予名称和打上标签。

services:
	app:
	    build: ./app
	    image: xxx:xxx    # 就是给这个容器起一个明,相当于docker run -t xxx:xxx

如果没有build,只有image,那么docker会优先在本地找镜像,本地没有在从dockerhub找

services:
	db:
	    image: pstgres:9.4   # 本地没有,则会从dockrhub拉取

④environment/env_file

environment用于设置应用程序的环境变量,而env_file则提供envirment文件的路径,设置环境变量时会读取该路径。environment/env_file都可以接收作为数组输入的单个文件或多个文件。

environment可以用 = 或者 :

 environment:
     - ssss=ssss
 environment:
     ssss: ssss
version: '3'
services:
	app:
	    image: mysql
		environment:
	        PATH: /nome
# ############################

version: '3'
services: 
    app:
	image: mysql
	env_file: .env
		
# ############################

version: '3'
services:
	app:
	image: mysql
	env_file:
		- common.env
		- app.env
		- secrets.env
		

⑤depends_on

这个键值用于设置跨各个服务的依赖性需求。

version: '3'
services:
	database:
		image: mysql
	webserver:
		iamge: naginx:alpine
	depends_on:
		- cache
		- database
	cache:
		image: redis

⑥ports

这个键值用于指定要被公开到主机端口的容器端口。在提供这个键值时,可指定要将容器端口公开到哪个Docker宿主机端口,也可以仅指定容器端口,这样的话就会在主机上选择一个随机的临时端口号。

version: '3'
services:
    database:
	    imgae: nginx
	    ports:
		- "8080:80"
# ##########################

version: '3'
services:
    database:
	imgae: nginx
	ports:
            - "80"

⑦ volumes

volumes可以用作*键值,就是和services同级,也可以用作子选项,就是附属在services下。*和子选项要同时用。

注意如果有子选项,但是没有*的volumes键值,那么就会报错,因为相当于没创建卷,却直接引用。

前面说的利用卷,必须设置*的键值,但是要是用绑定挂载,就不需要*的键了。

version: '3'
services:
    database:
        image: mysql
        environment: 
            xxx:sss
        volumes:
            - "dbdata:/var/lib/mysql"   # 指定这个容器需要绑定的卷
    webserver:
        image: nginx:apine
        depends_on:
            - caceh
            - database
    cache:
        image: redis
    volumes:
        dbdata                         # 相当于 docker volume create dbdata
version: '3'
sercives:
    database:
        image: mysql
        environment:
            xxx: xxx
        volumes:
            - "./dbdir:/var/lib/mysql"     # 绑定挂载

⑥ restart

restart键值提供了容器的重启策略,默认情况下,重启策略被设置为no, 这意味着Docker无论如何都不重启该容器。可以在以下的重启策略之间选择。

  • no       容器绝不会重启
  • always  容器总是会在退出之后重启
  • on-failure   如果由于运行错误导致退出,则容器将会重启
  • unless-stopped   除非显示退出或者Docker守护程序停止运行,否则容器总是会重启

 

 

Docekr Compose Demo

docker-compose.yaml 代码清单

version: '3'
services:
    app:
        build: .
        depends_on:
            - mysql
        restart: "on-failure"
        volumes:
            - "appdata:/apps/xxx"
    mysql:
        iamge: mysql
        volumes:
            - "dbdata:/xxx/xxx"
        environment:
            - ssss=ssss
    volumes:
        dbdata
        appdata
docker-compose config     # 看是否正常
docker-compose up --build      # --build会强制Docker重新构建镜像

 

再来个例子,这里是指定network

version: '3'
    services:
        worker:
            build: ./worker
            networks:
                -back-tier
    networks:
        back-iter:
            driver: bridge

 

关于--scale选项, 启动多个服务

version: '3'
services:
    redis:
        image: redis
    web:
        build:
            context: .
            dockefile: Docekrfile




docker-compose up --scale web=3 -d   启动3个web服务,注意web是docker-conpose.yml文件里的services名