docker-compose实战

2023-11-04

搭建wordpress容器

先用mysql5.6镜像启动一个名字为mysql-wordpress的容器,接着基于这个容器我们启动一个wordpress容器

docker run -d --name mysql-wordpress -v /home/zack/dockerwork/mysql-workpress:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.6
docker run -d -e WORDPRESS_DB_HOST=mysql-wordpress:3306  -e WORDPRESS_DB_USESR=root  -e WORDPRESS_DB_PASSWORD=root  --link mysql-wordpress -p 7080:80 wordpress

之后访问服务器外网地址和7080端口就可以看到wordpress设置界面了
docker为了简化构建多个容器的操作,提出了docker-compose的功能。

docker-compose的yaml文件

我们将要启动的容器,挂在的目录,使用的网络等信息都写入名字为docker-compose.yaml文件里,之后通过docker-compose up启动多个容器。
docker-compose其实是个批处理工具,接下来我们先介绍yaml的几个字段名字
services:一个service代表一个container,可以通过dockerhub拉取镜像启动,也可以通过Dockerfile构建镜像启动
volumes: 挂载的卷,docker会根据该字段创建对应的卷
networks:网络命名空间,docker会根据该字段创建对应的网络
接下来将wordpress容器启动的命令,我们通过docker-compose进行改造

version: '3'
services:

  wordpress-cp:
    image: wordpress
    ports:
        - 8080:80
    depends_on:
      - mysql-cp
    environment:
       WORDPRESS_DB_HOST: mysql-cp
       WORDPRESS_DB_USESR: root  
       WORDPRESS_DB_PASSWORD: root
    networks:
        - my-bridge
    
  mysql-cp:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes: 
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge

volumes:
    mysql-data:
networks:
    my-bridge:
      driver: bridge

depends_on表示依赖哪个镜像,可以起到控制镜像构建顺序的目的

写好wordpress的docker-compose后,我们接下来介绍docker-compose的命令和安装,通过docker-compose启动容器

docker-compose安装和命令

通过curl命令安装docker-compose

sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

下载完成后修改权限

sudo chmod +x /usr/local/bin/docker-compose

执行如下命令查看docker版本

docker-compose --version

如果显示版本信息,证明安装成功了。接下来介绍几个常用的命令
docker-compose up 命令可以找到当前目录下docker-compose.yml填写的service。当然也可以指定具体的compose文件

docker-compose -f docker-compose.yml up

可以看到容器启动,但是此时ctrl c退出后,容器也将停止,所以可以采用后台启动的方式

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

此时执行docker ps可以看到容器启动了
我的容器部署在云服务上,输入服务器地址和端口,可以看到wordpress的安装程序
docker-compose stop 可以停止正在运行的容器
docker-compose down 停止并删除容器
docker-compose ps 显示通过docker-compose启动的容器
docker-compose images 显示docker-compose容器和镜像信息
docker-compose exec 后边接上yml中定义的service以及响应的命令,就可以实现进入容器等操作
docker-compose network ls 查看docker-compose的网络

docker-compose exec mysql-cp bash

上述命令进入mysql-cp容器中

compose启动flask

实现一个Dockerfile,构造flask容器

FROM python:2.7
LABEL maintaner="ggroup@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]

Dockerfile 中引用了python2.7的镜像,然后安装flask和redis库,导出5000端口,接着执行python文件
app.py内部实现了一个简单的flask程序

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

接下来实现docker-compose.yml

version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis

因为一个docker-compose.yml中定义的多个service是默认共享同一个网络的,所以app.py可以通过本地地址访问6379端口的redis服务。
然后compose将5000端口映射为8080端口,并且导入了环境变量REDIS_HOST为redis
我们通过docker-compose up -d 启动,然后docker ps 看到服务成功,接着在浏览器输入地址和8080端口就可以实现统计访问次数的功能了。

docker-compose水平扩展

docker-compose提供了水平扩展伸缩的功能。修改docker-compose.yml文件,将web的端口映射注释掉,否则水平扩展会出现端口冲突。
修改docker-compose.yml

version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis

  lb:
    image: dockercloud/haproxy
    links:
      - web
    ports:
      - 1080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

我们添加了haproxy负载均衡,将访问1080端口的请求映射给80端口。然后我们将web服务的端口注释掉,防止启动多个web服务导致端口被抢占。

FROM python:2.7
LABEL maintaner="ggcloud.gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

Dockerfile中修改了暴露的端口为80,这样负载均衡可以通过links指定web服务,从而访问该服务80端口
接下来我们修改app.py程序

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

将python程序修改为绑定80端口,接下来启动docker-compose up -d
容器启动后可以通过 curl 127.0.0.1:1080 方式访问测试服务
输出如下

Hello Container World! I have been seen 1 times and my hostname is d14da1c8d66a.

我们通过docker-compose up –scale web=3 -d
可以看出之前启动的web服务没有变化,又新启动了两个web服务,扩充为三个web服务了

 

 可以扩充,当然也可以缩减,将docker-compose up –scale web=1 -d 执行后,就缩减为1个web服务了
我们将web服务扩充为5个,然后用curl脚本访问,循环访问

for i in `seq 10`; do curl 127.0.0.1:1080; done

  后台通过负载均衡将请求派发给不同的web服务

Hello Container World! I have been seen 2 times and my hostname is d14da1c8d66a.
Hello Container World! I have been seen 3 times and my hostname is 0e3b0e1588b4.
Hello Container World! I have been seen 4 times and my hostname is 3ed4382b162b.
Hello Container World! I have been seen 5 times and my hostname is 77c3a5cff8d2.
Hello Container World! I have been seen 6 times and my hostname is c65d07e6ab79.
Hello Container World! I have been seen 7 times and my hostname is d14da1c8d66a.
Hello Container World! I have been seen 8 times and my hostname is 0e3b0e1588b4.
Hello Container World! I have been seen 9 times and my hostname is 3ed4382b162b.
Hello Container World! I have been seen 10 times and my hostname is 77c3a5cff8d2.
Hello Container World! I have been seen 11 times and my hostname is c65d07e6ab79.

  感谢关注公众号

wxgzh.jpg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker-compose实战 的相关文章

随机推荐

  • VS 2022新特性_Visual Studio2022新功能

    一 VS 2022新特性 Visual Studio2022新功能 Visual Studio 2022 正式版来了 默认支持 Net 6 默认支持C 10 下载地址 https visualstudio microsoft com zh
  • Controller 层编写测试类

    前后端分离以后 Controller 部分的代码当然也要进行测试 但是往常我们的测试类无法发送http请求 这时就需要用到 MockMvc 一个简单的例子 测试类 RunWith SpringRunner class SpringBootT
  • 百度ueditor富文本编辑器数据回显为代码问题

    使用ueditor时 从数据库获取到html数据后 直接在ueditor里显示为代码 可通过以下方式修复
  • 卷积网络中,卷积操作后,激活和池化的顺序,应该先激活还是先池化

    对图像卷积操作后 接下来是先激活还是先池化 现在存在两种顺序 卷积 gt 激活 gt 池化 卷积 gt 池化 gt 激活 先给出结论 如果使用最大池化 两种顺序的结果是一样的 如果使用平均池化 建议采用第1种顺序 即卷积 gt 激活 gt
  • 表单验证实现React-router跳转

    方法一 broserHistory push handleSubmit e e preventDefault const path demo broserHistory push path 方法二 context对象方法 export de
  • Burp Suite入门笔记

    转载于 https www cnblogs com Wade James p 9614310 html
  • Cannot find module ‘F:\nodejs\node_modules\http-server\bin\http-server‘

    问题 http server全局安装后仍找不到模块 原因 http server与html文件不在同一目录 解决方案 1 打开http server文件所在位置 复制npm文件夹下的所有文件 2 将所有文件粘贴到html文件所在的目录下 3
  • 详解本地maven私服nexus安装及上传jar包snapshots快照

    目录 1 nexus简介 2 下载nexus 3 启动nexus 4 访问nexus 5 nexus服务介绍 6 相关配置 7 页面上传Release的jar流程 8 上传snapshots快照jar 9 项目中引用本地私服 1 nexus
  • Vue3+vant库处理showToast报错正确姿势:Can‘t resolve ‘vant/es/show-toast‘

    目录 1 首先 要排除是自己配置全局引用错误导致的问题 2 排除不是自己引用问题 进入下一步 移除 babel plugin import 3 在此时 似乎就已经解决showToast报错问题 环境 vant 4 6 3 1 首先 要排除是
  • llinux运维基础:zabbix部署

    一 zabbix安装 安装5 0版本 1 配置仓库 rpm Uvh https repo zabbix com zabbix 5 0 rhel 7 x86 64 zabbix release 5 0 1 el7 noarch rpm yum
  • 云服务器 ftp上传文件大小,云服务器ftp上传文件大小

    云服务器ftp上传文件大小 内容精选 换一换 在本地主机和Windows弹性云服务器上分别安装QQ exe等工具进行数据传输 使用远程桌面连接mstsc方式进行数据传输 该方式不支持断点续传 可能存在传输中断的情况 因此不建议上传大文件 文
  • 打包python脚本的血与泪

    解决Python脚本打包遇到的各种问题 故事背景 以下开始花里胡哨的错误操作 正确方法 故事背景 某日隔壁部门同事请领导帮忙写个脚本 能够完成excel上的高重复度繁复的工作 领导随手交给我 这个东西简单的 日天你去做吧 正在b站摸鱼的我
  • ssm+maven的进销存管理系统

    基于ssm maven的超市进销存管理系统 普通用户主要包含 进货管理 商品管理 库存管理 销售管理 酷虎信息管理 供应商信息管理 管理员比普通用户多了一个用户管理 登录界面 普通用户之进货管理 普通用户之商品信息管理 坤村管理 销售管理
  • vmp版本某数后缀(10-6,js逆向)

    看这篇文章的前提是 读者已经成功请求到了200页面 一 抓包分析 这个站在提交验证码的时候会将识别的内容加密放到后缀中 所以分析后缀也是无奈之举 二 跟栈分析 下个xhr断点 提交验证码 找到这个地方 思路 open和send都经过魔改了
  • Kubernetes入门——Kubernetes实现应用的高可用

    作者简介 胡家靖 百度基础架构部研发工程师 负责函数计算与云原生产品的研发 本文基于百度云原生团队 云原生基础知识概述及实践 系列视频课程 Kubernetes入门 Kubernetes实现应用高可用 梳理 视频课程可点击 https cl
  • 数据库系统概论——第十章 数据库恢复技术

    一 事务的基本概念 1 事务 Transaction 1 概念 是用户定义的一个数据库操作序列 这些操作要么全做 要么全不做 是一个不可分割的工作单位 2 事务和程序是 事务和程序是两个概念 在关系数据库中 一个事务可以是一条SQL语句 一
  • wpf datagrid 表头居中

  • 程序员常用的工具网站

    程序员常用的工具网站 免费书籍 数据库 在线制作流程图 java开发常用工具网站 程序开发导航 面试常看的网站 在线编程 系统设计 springboot学习参考网站 云服务器 LINUX命令学习 免费书籍 免费编程书籍 数据库 在线学习or
  • Python全栈自动化测试--Pycharm专业版安装

    一 下载Pycharm专业版 1 进入官网下载专业版 Download PyCharm Python IDE for Professional Developers by JetBrains 2 选择windows Professional
  • docker-compose实战

    搭建wordpress容器 先用mysql5 6镜像启动一个名字为mysql wordpress的容器 接着基于这个容器我们启动一个wordpress容器 docker run d name mysql wordpress v home z