容器自动化:docker-compose

server/2024/10/20 16:08:17/

dockercompuslnmplnmt_0">ansible一键部署docker-compus+lnmp+lnmt项目

dockercompose_1">一、docker-compose

我们知道使用一个dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排,服务编排有多种技术方案。

dockercompose_3">1.1、docker-compose简介

docker-compose项目是docker官方的开源项目,负责实现对docker容器集群的快速编排
docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。docekr-compse运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中包含多个服务,每个服务中定义了容器运行的镜像、参数、以来。一个服务当中可包括多个容器实例,Docker-compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡,比如consul
dokcer-compose的工程配置文件默认为docker-compose。yml,可通过环境变量compose_file或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器
使用一个dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如是要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
conpsoe允许用户通过一个单独的docker-compose.yml模板文件(yaml格式)来定义一组相关联的应用容器为一个项目(project)
docker-compose项目由python编写,调用docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持docker API,就可以在其上利用compose来进行编排管理

1.2、YAML 文件格式及编写注意事项

YAML是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于XML数据藐视语言,语法比XML简单的很多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分割,数组用中括号[]括起来,hash用花括号{}括起来。
使用YAML时需要注意下面事项

  • 大小写敏感
  • 通过缩进表示层级关系
  • 不支持制表符tab键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
  • 用#号注释
  • 符号字符后缩进1个空格,如冒号、逗号、横杠
  • 如果包含特殊字符用单引号硬起来会作为普通字符串处理,双引号:特殊字符作为本身想表示的意思

docker_compose_15">1.3、docker compose配置常用字段

字段描述
build指定dockerfile文件名,要制定dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile构建镜像上下文路径
context可以是dockerfile的路径,或是指向git仓库的url地址
image指定镜像
command执行命令,覆盖容器启动后默认执行的命令
container name指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
deploy指定部署和运行服务相关配置,只能在swarm模式使用
environment添加环境变量
networks加入网络,引入顶级networks下条目
ports暴露容器端口,与-p相同,但端口不能低于60
volumes挂载一个宿主机目录或命令卷到容器,命令卷要在顶级volumes定义卷名称
volumes_from从另一个服务或容器挂载卷,可选参数:ro和:rw
hsotname容器主机名
sysctls在容器内设置内核参数
links连接到另一个容器,-服务名称[:服务别名]
restart重启策略,默认no,always,no-failure,unless-stoped
  1. no,默认策略,在容器退出时不重启容器
  2. on-failure:在容器非正常退出时(退出装填非0),才会重启容器
  3. on-failure:3:在容器非正常退出时重启容器,最多重启3次
  4. always:在容器退出时总是重启容器
  5. unless-stoped:在容器退出时总是重启容器,但是不考虑在docker守护进程启动时就已经停止了的容器

docker_compose_40">1.4、docker compose常用命令

字段描述
build重新构建服务
ps列出容器
up创建和启动容器
exec在容器里面执行命令
scale制定一个服务容器启动数量
top显示容器进程
logs产看容器输出
down删除容器、网络、数据卷和镜像

二、ansible部署环境

[root@localhost roles]# tree
.
├── docker
│   ├── files
│   ├── handlers
│   │   └── main.yaml
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   │   └── daemon.json.j2
│   └── vars
│       └── main.yaml
├── docker-compose
│   ├── files
│   │   └── docker-compose-linux-x86_64
│   ├── handlers
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   └── vars
├── docker-compose-lnmp
│   ├── files
│   │   └── compose_lnmp.tar.gz
│   ├── handlers
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   └── vars
├── docker-compose-lnmt
│   ├── files
│   │   └── compose_lnmt.tar.gz
│   ├── handlers
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   └── vars
├── jdk
│   ├── files
│   │   ├── auto-jdk.sh
│   │   └── jdk-8u60-linux-x64.tar.gz
│   ├── handlers
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   └── vars
└── main.yaml30 directories, 14 files

2.1主剧本main.yaml

[root@localhost roles]# cat main.yaml 
---- hosts: lnmpgather_facts: Trueroles:- docker- docker-compose - docker-compose-lnmptasks:- name: start docker-lnmpshell: docker-compose -f /root/docker-compose-lnmp/docker-compose.yaml up -d- host: lnmtgather_facts: Trueroles:- docker- docker-compose- jdk- docker-compose-lnmttask:- name: start docker-lnmtshell: docker-compose -f /root/docker-compose-lnmt/docker-compose.yaml up -d

docker_130">2.2docker安装

[root@localhost docker]# cd tasks/
[root@localhost tasks]# 
[root@localhost tasks]# ls
main.yaml
[root@localhost tasks]# cat main.yaml 
- name: install required packagesyum:name: - yum-utils- device-mapper-persistent-data- lvm2state: present- name: add docker repo to /etc/yum.repos.dshell: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reporegister: result              - name: install docker-ceyum:name: docker-cestate: present- name: create /etc/dockerfile:path: /etc/docker       state: directory- name: start docker servicesystemd:                         name: dockerstate: startedenabled: true- name: provide docker-ce configfiletemplate:src: daemon.json.j2                 dest: /etc/docker/daemon.jsonnotify: restart docker              
[root@localhost handlers]# cat main.yaml 
- name: restart dockersystemd:name: dockerstate: restarted        enabled: true
[root@localhost templates]# cat daemon.json.j2 
{"registry-mirrors": ["https://cbd49ltj.mirror.aliyuncs.com"]
}

dockercompose_188">2.3docker-compose安装

[root@localhost docker-compose]# tree
.
├── files
│   └── docker-compose-linux-x86_64
├── handlers
├── tasks
│   └── main.yaml
├── templates
└── vars5 directories, 2 files
[root@localhost tasks]# cat main.yaml - name: copy docker-compose-linux-x86_64 to /usr/local/bincopy: src=docker-compose-linux-x86_64 dest=/usr/local/bin/docker-compose-linux-x86_64- name: install docker-composeshell: cd /usr/local/bin && mv docker-compose-linux-x86_64 docker-compose && chmod +x docker-compose

2.4安装jdk

[root@localhost jdk]# tree
.
├── files
│   ├── auto-jdk.sh
│   └── jdk-8u60-linux-x64.tar.gz
├── handlers
├── tasks
│   └── main.yaml
├── templates
└── vars5 directories, 3 files
[root@localhost jdk]# cat files/auto-jdk.sh 
#!/bin/bash                                                                                                                                        
# install tomcat# 部署Java环境JDKcd ~
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/[ $? -eq 0 ] && ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk || exit 2# 配置Java环境变量sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/bashrcchown -R root.root /usr/local/jdk/source /etc/bashrc

##########变量可能不刷新需要手动刷新一下环境变量#########

##############或者创建软连接来刷新变量###############

[root@localhost jdk]# cat tasks/main.yaml 
--- - name: copy-jdkcopy: src=jdk-8u60-linux-x64.tar.gz dest=/root/- name: sh auto-jdk.shscript: auto-jdk.sh- name: 刷新变量shell: source /etc/bashrc

dockercomposelnmp_260">2.5拷贝ldocker-compose-lnmp到目标服务器

[root@localhost docker-compose-lnmp]# tree
.
├── files
│   └── compose_lnmp.tar.gz
├── handlers
├── tasks
│   └── main.yaml
├── templates
└── vars5 directories, 2 files
[root@localhost docker-compose-lnmp]# cat tasks/main.yaml 
---- name: copy-docker-compose-lnmpcopy: src=compose_lnmp.tar.gz dest=/root/- name: shell: tar xf compose_lnmp.tar.gz

dockercomposelnmt_283">2.6拷贝ldocker-compose-lnmt到目标服务器

[root@localhost docker-compose-lnmt]# tree
.
├── files
│   └── compose_lnmt.tar.gz
├── handlers
├── tasks
│   └── main.yaml
├── templates
└── vars5 directories, 2 files
[root@localhost docker-compose-lnmt]# cat tasks/main.yaml 
---- name: copy-docker-compose-lnmptcopy: src=compose_lnmt.tar.gz dest=/root/- name: shell: tar xf compose_lnmt.tar.gz

dockercompos_lnmp_308">三丶docker-compos 部署lnmp

[root@docker ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf #开启ipv4转发
[root@localhost compose_lnmp]# ls
docker-compose.yml  mysql  nginx  php  wwwroot

dockercomposeyml_314">3.1docker-compose.yml(主剧本)

[root@localhost compose_lnmp]# cat docker-compose.yml 
version: '3'
services:nginx:container_name: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 80:80- 443:443networks:lnmp:ipv4_address: 172.20.0.10volumes:- ./wwwroot:/usr/local/nginx/htmlmysql:container_name: mysqlimage: mysql:5.6ports: - 3306:3306networks:lnmp:ipv4_address: 172.20.0.20volumes:- ./mysql/db-data:/usr/local/mysqlcommand: --character-set-server=utf8environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: wordpressMYSQL_USER: userMYSQL_PASSWORD: user123php:container_name: phpbuild:context: ./phpdockerfile: Dockerfileports:- 9000:9000                networks:lnmp:ipv4_address: 172.20.0.30volumes:- ./wwwroot:/usr/local/nginx/htmldepends_on:- nginx- mysql
networks:lnmp: driver: bridgeipam:config:- subnet: 172.20.0.0/16

代码解析

  • version: ‘3’:指定了Docker Compose文件的版本。
  • services: 开始定义各个服务。
    • nginx: 定义了一个名为nginx的服务。
      • container_name: 指定容器的名称为nginx。
      • build: 指定构建该服务容器时的上下文路径和Dockerfile文件。
      • ports: 将主机的80端口和443端口映射到容器的对应端口。
      • networks: 指定该服务连接到的网络及其IPv4地址。
      • volumes: 将主机的./wwwroot目录挂载到容器的/

http://www.ppmy.cn/server/55904.html

相关文章

「技术分享」FDL对接金蝶云API取数

很多企业的ERP系统都在用金蝶云星空,金蝶云星空API是IT人员获取数据的重要来源, 常常用来生成定制化报表,进行数据分析,或是将金蝶云的数据与OA系统、BI工具集成。 通常情况下,IT人员需要使用Python、Java等语言编写脚…

AI在软件开发中的革新与未来挑战

目录 前言 AI工具的广泛应用与优势 AI与开发者技能需求的互动关系 AI的未来展望与面临的挑战 结语 前言 在当今快速发展的技术领域中,生成式人工智能(AIGC)正以前所未有的方式改变着软件开发的面貌。从代码生成到错误检测,再…

iPhone苹果手机iOS18如何隐藏打开APP怎么找出来恢复隐藏APP?

iPhone苹果手机如何隐藏APP? 1、iPhone苹果手机上一些APP不想让别人看到可以设置为隐藏APP,请长按要设置隐藏的APP,选择需要面容ID; 2、然后再接着选择隐藏并需要面容ID,选择后手机桌面将不在显示该APP; i…

软件运维服务方案(Word原件2024)

软件运维服务方案(Word原件) 1. 服务简述 我们提供全面的软件运维服务,确保软件系统的稳定运行。 1.1 服务内容 包括监控、维护、故障排查与优化。 1.2 服务方式 结合远程与现场服务,灵活响应客户需求。 1.3 服务要求 高效响应&am…

Java Selenium入门程序

需求:使用chrome浏览器打开百度首页 1.配置浏览器驱动 (1)下载浏览器驱动,浏览器版本需与驱动版本一致; (2)编辑系统环境变量-->编辑Path-->填入浏览器驱动路径: 2.maven工…

26 华三防火墙安全区域

防火墙区域规划 配置网络网卡的地址在同一网段 第一个问题 为什么防火墙直连在同一个网段ping不通? 配置IP地址 local区域: 将local区域的所有接口启用 华三防火墙的local区域是指设备本地接口所在的区域,也称为局域网(LAN)或内部网络 Int…

lodash中flush的使用(debounce、throttle)

在项目的配置中,看到了一个请求,类似是这样的 import { throttle } from lodash-es// 请求函数 async function someFetch(){const {data} await xxx.post()return data }// 节流函数 async function throttleFn(someFetch,1000)// 执行拿到数据函数 a…

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查…