前言
在上一篇《Dockerfile定制镜像》中,我们介绍了如何利用一个配置文件,提前添加好文件、安装好工具,并运行一些命令,构建自己的镜像,从而实现自定义功能。本篇主要介绍如何利用docker-compose实现容器编排。
一、Docker-Compose介绍
1.简介
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker多容器编排管理系统。使用 Docker-compose,可以用一个 YAML 文件定义一组要启动的容器,以及容器运行时的属性。 Docker-Compose的工程配置文件默认为docker-compose.yml
项目地址:https://github.com/docker/compose
2.Docker-Compose前世今生
Docker Compose 的前身是 Fig,现阶段 Docker Compose 是 Docker 官方的单机多容器管理系统(不能跨机器),它本质是一个Python 脚本,它通过解析用户编写的 yaml 文件,调用 Docker API 实现动态的创建和管理多个容器。
二、Docker-Compose安装
1.使用curl命令安装(推荐)
# 下载 Docker Compose 的安装包sudocurl-L"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose # 修改 Docker Compose 执行权限sudochmod+x /usr/local/bin/docker-compose
2.使用PIP安装
需提前安装Python环境
pip install -U docker-compose
三、Docker-Compose常用指令组成
Docker Compose 文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷)
1.常用指令说明
指令 |
说明 |
image |
镜像名称,基于哪个镜像,使用现有的镜像 |
build |
使用自定义的镜像,若当前docker-compose.yml和Dockerfile在同一路径下,则build的键值用 . 也可以,若不在同一路径下,或Dockerfile文件不是用的默认名称Dockerfile,则需指定Dockerfile的路径 |
command |
启动镜像时用的命令,类似于Dockerfile中的CMD指令 |
container_name |
容器名称 |
depends_on |
指定服务启动顺序,如存在多个服务nginx、db、Jenkins时,则在Jenkins服务下定义depends_on: db,会优先启动db服务 |
links |
解决容器之间的链接,使用db可以链接到db服务,使用别名test_db也可以 |
ports |
指定端口,端口映射时使用,类似于docker命令中的-p参数 |
volumes |
数据挂载时使用,类似于docker命令中的-v参数 |
2.docker-compose.yml示例
支持四种命名格式:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
下面就以前面分享过的《开源云真机平台-Sonic应用实践》中的sonic服务的docker-compose.yml为例,一起来看看上述指令的用法:
version: '3'# 版本services: # 服务, sonic-server-eureka: # 容器名(sonic微服务注册中心) image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-eureka:v1.5.0-release" hostname: sonic-server-eureka environment: # 环境,读取配置文件中eureka的用户名密码等- SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT -SONIC_EUREKA_HOST=sonic-server-eureka volumes: # 目录映射- ./logs/:/logs/ networks: # 网络名- sonic-network ports: # 端口映射-"${SONIC_EUREKA_PORT}:${SONIC_EUREKA_PORT}" sonic-server-gateway: # 容器名(sonic微服务网关) image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-gateway:v1.5.0-release" hostname: sonic-server-gateway environment: # 同样也是一些环境配置,用于和eureka容器通信- SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT -SONIC_EUREKA_HOST=sonic-server-eureka - SECRET_KEY - EXPIRE_DAY volumes: - ./logs/:/logs/ depends_on: # 指定服务启动顺序,先启动sonic-server-eureka容器- sonic-server-eureka networks: # 网络,各个容器必须处于同一网络下才能相互通信- sonic-network restart: on-failure sonic-server-controller: # 容器名 image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-controller:v1.5.0-release" environment: # 环境配置,读取数据库、账号等配置- SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT -SONIC_EUREKA_HOST=sonic-server-eureka - MYSQL_HOST - MYSQL_PORT - MYSQL_DATABASE - MYSQL_USERNAME - MYSQL_PASSWORD - SONIC_SERVER_HOST - SONIC_SERVER_PORT - SECRET_KEY - EXPIRE_DAY - REGISTER_ENABLE - NORMAL_USER_ENABLE - LDAP_USER_ENABLE - LDAP_USER_ID - LDAP_BASE_DN - LDAP_BASE - LDAP_USERNAME - LDAP_PASSWORD - LDAP_URL networks: - sonic-network volumes: - ./logs/:/logs/ depends_on: - sonic-server-eureka restart: on-failure sonic-server-folder: image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-folder:v1.5.0-release" environment: - SONIC_EUREKA_USERNAME
通过上述配置我们能够发现,docker-compose.yml这个配置文件,就是由前面我们介绍的一个个指令按照一定的格式、顺序、规则进行排列、相结合组成,从而实现不同容器的排编,相互通信,进而实现强大的功能。
四、Docker-Compose操作命令
用法:
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
docker-compose -h|--help
1.docker-compose操作命令
官方所有指令
常用指令
指令 |
说明 |
up |
启动容器编排(前提是当前目录存在docker-compose.yml文件) |
down |
删除容器编排,适用于docker-compose.yml文件发生变更、或安装出错时的卸载重装 |
ps |
查看所有服务状态,类似于docker ps -a |
start |
启动服务 |
stop |
指定服务启动顺序,如存在多个服务nginx、db、Jenkins时,则在Jenkins服务下定义depends_on: db,会优先启动db服务 |
logs |
查看docker-compose操作日志 |
2.docker-compose操作参数
官方所有选项
常用选项
参数 |
说明 |
-f |
指定yml文件启动,当前目录下不存在docker-compose.yml文件时使用 |
-d |
后台运行 |
3.容器编排操作实践
启动容器编排-up
docker-compose up # 启动容器(前提是当前目录存在docker-compose.yml文件)docker-compose -f docker-compose.yml up -d# 指定yml文件启动并设置后台运行
启动容器编排会经历以下过程:创建网络>>创建并运行各个容器>>各个容器之间建立连接
在使用"docker-compose up"和"docker-compose down"命令时,若当前目录下不存在以下四种中的任一格式文件:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml,或也未使用-f参数指定其他文件时,会报错提示:
删除容器编排
docker-compose down
删除容器编排:停止各个容器>>移除各个容器>>删除容器创建的网络
查看容器状态
docker-compose ps# 查看所有服务状态,类似于docker ps -a
启动服务
# docker-compose start 启动所有服务# docker-compose start [SERVICE...] 启动指定服务docker-compose start
停止服务
# docker-compose stop 停止所有服务# docker-compose stop [options] [SERVICE...] 停止指定服务docker-compose stop
与down命令不同,stop只会停止相关容器,但不会删除相关容器
查看日志
docker-compose logs
五、利用Docker Compose搭建wordpress博客系统
前面对一些常用指令作了说明,以及通过sonic前后台服务的docker-compose.yml案例对容器编排作了简单介绍,下面我们结合一个docker-compose搭建WordPress的案例来搭建我们自己的容器编排服务,官方配置文件内容如下:
1.配置docker-compose.yml
官网地址:https://docs.docker.com/compose/wordpress/ services: db: # We use a mariadb image which supports both amd64 & arm64 architecture image: mariadb:10.6.4-focal # If you really want to use MySQL, uncomment the following line#image: mysql:8.0.27 command: '--default-authentication-plugin=mysql_native_password' volumes: - db_data:/var/lib/mysql restart: always environment: -MYSQL_ROOT_PASSWORD=somewordpress -MYSQL_DATABASE=wordpress -MYSQL_USER=wordpress -MYSQL_PASSWORD=wordpress expose: -3306-33060 wordpress: image: wordpress:latest volumes: - wp_data:/var/www/html ports: -88:80 restart: always environment: -WORDPRESS_DB_HOST=db -WORDPRESS_DB_USER=wordpress -WORDPRESS_DB_PASSWORD=wordpress -WORDPRESS_DB_NAME=wordpress volumes: db_data: wp_data:
【注意】yml文件中冒号后面要带空格,严格规范格式
2.查看容器状态
docker-compose ps-a
3.前端访问
启动docker-compose,各个容器处于up状态,此时就可以访问前端页面,http://192.168.1.123:88/,会先进行安装配置,如:设置数据库、站点取名
个人博客主页如下:
因为我是内网服务器,只能在局域网内访问,公网无法访问。如果你有一台带有公网的云服务器,如阿里云,那么妥妥的就可以搭建自己的个人网站了,这种对服务器要求不高,入门级的就可以。现在的云服务器都挺便宜,一年才几十块钱,像阿里云服务器个人用户可以免费体验一个月。关于WordPress详细搭建方法可以参考我前面介绍的《用2核2G的入门级云服务器搭建WordPress博客系统》