【2】Docker Compose编排

Docker Compose 使用

Docker 帮助我们解决服务的打包安装的问题,随着而来的问题就是服务过多的带来如下问题:

  1. 多次使用 Dockerfile、Build、Image 命令或者 DockerHub 拉取 Image;
  2. 需要创建多个 Container,多次编写启动命令;
  3. Container 互相依赖的如何进行管理和编排。

Compose 是一个用于定义和运行多容器的 Docker 应用的工具。使用 Compose,你可以在一个配置文件(yaml格式)中配置你应用的服务,然后使用一个命令,即可创建并启动配置中引用的所有服务。
【2】Docker Compose编排_第1张图片

Compose 使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  3. 最后,执行 docker compose up 命令来启动并运行整个应用程序

Docker Compose 管理容器的结构

Docker Compose 将所管理的容器分为三层,分别是工程( project),服务(service)以及容器(container)。Docker Compose 运行目录下的所有文件( docker-compose.yml、 extends 文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml 所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。
同一个 docker compose 内部的容器之间可以用服务名相互访问,服务名就相当于 hostname,可以直接 ping 服务名,得到的就是服务对应容器的 ip,如果服务做了扩容,一个服务对应了多个容器,则 ping 服务名会轮询访问服务对应的每台容器 ip ,docker 底层用了 LVS 等技术帮我们实现这个负载均衡。

Docker Compose.yml 常用指令

  • image

指定镜像名称或者镜像 id,如果该镜像在本地不存在,Compose 会尝试 pull 下来。
示例:

image: java
  • build

指定 Dockerfile 文件的路径。可以是一个路径,例如:

build: ./dir

也可以是一个对象,用以指定 Dockerfile 和参数,例如:

build:
	context: ./dir
	dockerfile: Dockerfile-alternate
	args:
		buildno: 1
  • command

覆盖容器启动后默认执行的命令。
示例:

command: bundle exec thin -p 3000

也可以是一个 list,类似于 Dockerfile 中的 CMD 指令,格式如下:

command: [bundle, exec, thin, -p, 3000]
  • links

显示链接到其他服务中的容器。可以指定服务名称和链接的别名使用 SERVICE:ALIAS 的形式,或者只指定服务名称,示例:

web:
	links:
    - db
    - db:database
    - redis
  • external_links

表示链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的容器,特别是对于那些提供共享容器或共同服务。格式跟 links 类似,示例:

external_links:
  - redis_1
  - project_db_1:mysql
  - project_db_1:postgresql
  • ports

暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于 docker run -p ,示例:

ports:
  - "3000"
	- "3000-3005"
	- "8000:8000"
	- "9090-9091:8080-8081"
	- "49100:22"
	- "127.0.0.1:8001:8001"
	- "127.0.0.1:5000-5010:5000-5010"
  • expose

暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机,示例:

expose:
	- "3000"
	- "8000"
  • volumes

卷挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。示例:

volumes:
	# Just specify a path and let the Engine create a volume
	- /var/lib/mysql

	# Specify an absolute path mapping
	- /opt/data:/var/lib/mysql

	# Path on the host, relative to the Compose file
	- ./cache:/tmp/cache

	# User-relative path
	- ~/configs:/etc/configs/:ro

	# Named volume
	- datavolume:/var/lib/mysql
  • volumes_from

从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。示例:

volumes_from:
	- service_name
	- service_name:ro
	- container:container_name
	- container:container_name:rw
  • environment

设置环境变量。可以使用数组或者字典两种方式。只有一个 key 的环境变量可以在运行 Compose 的机器上找到对应的值,这有助于加密的或者特殊主机的值。示例:

environment:
	RACK_ENV: development
	SHOW: 'true'
	SESSION_SECRET:

environment:
	- RACK_ENV=development
	- SHOW=true
	- SESSION_SECRET
  • env_file

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以 envirment 为准。示例:

env_file: .env

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

继承另一个服务,基于已有的服务进行扩展。

  • net

设置网络模式。示例:

net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
  • dns

配置 dns 服务器。可以是一个值,也可以是一个列表。示例:

dns: 8.8.8.8

dns:
	- 8.8.8.8
	- 9.9.9.9
  • dns_search

配置 DNS 的搜索域,可以是一个值,也可以是一个列表,示例:

dns_search: example.com

dns_search:
	- dc1.example.com
	- dc2.example.com
  • 其他

docker-compose.yml 还有很多其他命令,这里仅挑选常用命令进行讲解,其它不作赘述。如果感兴趣的,可以参考 docker-compose.yml 文件官方文档:https://docs.docker.com/compose/compose-file/

利用Docker Compose部署nacos环境

参考:https://nacos.io/zh-cn/docs/quick-start-docker.html

1)创建一个空目录 docker-mall

2)在 docker-mall 目录下新建一个编排文件 docker-compose-env.yml,内容如下:

version: '3'
services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    ports:
     - 3306:3306
		restart: always
  	volumes:
			- ./mysql:/var/lib/mysql
		environment:
  		- MYSQL_ROOT_PASSWORD=root
			- MYSQL_DATABASE=nacos
			- MYSQL_USER=nacos
			- MYSQL_PASSWORD=nacos
		command: --default-authentication-plugin=mysql_native_password
	nacos:
  	image: nacos/nacos-server:v2.1.0
  	container_name: nacos
		volumes:
			- ./nacos/logs/:/home/nacos/logs
			- ./nacos/init.d/:/home/nacos/init.d
		ports:
			- "8848:8848"
			- "9848:9848"
  		- "9555:9555"
		environment:
			- PREFER_HOST_MODE=hostname
			- MODE=standalone
			- SPRING_DATASOURCE_PLATFORM=mysql
			- MYSQL_SERVICE_HOST=mysql
			- MYSQL_SERVICE_DB_NAME=nacos
			- MYSQL_SERVICE_PORT=3306
			- MYSQL_SERVICE_USER=nacos
			- MYSQL_SERVICE_PASSWORD=nacos
			- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
		depends_on:
			- mysql
		restart: always

3)启动 compose,在 docker-mall 目录执行如下命令:

docker compose -f docker-compose-env.yml up -d

执行成功后会启动 nacos 容器,可以通过[http://192.168.65.174:8848/nacos/index.html](http://192.168.65.174:8848/nacos/index.html)访问 nacos 控制台。

4)访问 nacos 控制台,并导入项目微服务相关配置。

你可能感兴趣的:(docker+k8s,docker,容器,docker,compose,编排)