Docker Compose 笔记 网络

2023-11-07

Compose 简介


1. 引入
通过前面的知识,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器,从而得到一个镜像。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

使用流程:

创建 docker-compose.yml 配置文件(yaml语法)
使用 docker-compose 来指令管理这个集群
2. 介绍
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排

其代码目前在 https://github.com/docker/compose 上开源

Compose定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」

Compose恰好满足了这样的需求,它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

Compose中有两个重要的概念:

服务 (service):一个应用的容器。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose来进行编排管理

3. 安装
Compose 支持 Linux、macOS、Windows 10 三大平台。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行

Docker Desktop for Mac/Windows自带docker-compose可以直接使用

$ docker-compose --version

docker-compose version 1.27.4, build 40524192

使用Compose

1. 术语
首先介绍几个术语

服务 (service):一个应用容器
项目 (project):由一组关联的应用容器组成的一个完整业务单元
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理

2. 案例
最常见的项目是 web 网站,该项目应该包含 web 应用和数据库

下面我们用 Python 来建立一个能够记录页面访问次数的 web 网站

2.1 创建flask web 应用
新建文件夹,在该目录中编写 app.py 文件

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)

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


2.2 编写Dockerfile
编写 Dockerfile 文件,内容为

FROM python:3.6
ADD ./app.py /home
WORKDIR /home
RUN pip3 install redis flask -i https://mirrors.aliyun.com/pypi/simple/
CMD ["python3", "app.py"]



2.3 docker-compose.yml
编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件

version: '3'
services:
  flask:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis"


3. 运行&测试
执行完上述步骤之后,能够看到3个文件

运行 compose 项目
在当前路径下,运行如下命令

docker-compose up


启动成功

效果
此时访问本地 5000 端口,每次刷新页面,计数就会加 1

结束运行方式:ctrl+c

host='redis',redis是主机名,可以想象成两台电脑之间通信,可以修改名字

4. 扩展
怎样能够用宿主机的Redis客户端访问刚刚使用docker-compose管理的Redis容器? 参考如下方式

修改docker-compose.yml

重新运行docker-compose up

使用Redis客户端链接redis容器

常用命令

docker-compose build ---构建镜像
docker-compose up ---构建镜像或者下载镜像,然后创建容器,且运行
docker-compose stop ---停止容器的运行
docker-compose down ---停止容器的运行且删除
docker-compose start ---与stop相反,即将停止运行的容器再次运行起来
docker-compose ps ---
docker-compose images ---

搭建flask+MySQL+Redis项目

1.准备

mkdir docker_compose
cd docker_compose
mkdir 01_flask
mkdir 02_mysql
mkdir 03_redis

2.构建flask服务


进入到01_flask文件夹

1. 建立Dockerfile文件
新建Dockerfile文件,如下:

Docker 快速入门,安装数据库 Dockerfile使用 制作ubuntu-flask镜像_O丶ne丨柒夜的博客-CSDN博客
2. 建立requirements.txt
新建requirements.txt文件
3. 建立sources.list
新建sources.list文件
4. 建立项目文件夹
新建立一个文件夹project,目的是以后将flask项目代码共享到此目录

mkdir project

5. 在project文件夹下建立flask项目
进入到project文件夹,然后新建app.py,内容如下:

from flask import Flask


app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)  # 注意默认端口为5000

6. 建立docker-compose.yml
跳转到docker_compose路径下,然后新建docker-compose.yml文件,内容如下:

version: '3'
services:
  flask:
    build: ./01_flask
    volumes:
     - ./01_flask/project:/home/project
    ports:
     - "5000:5000"

volumes:共享文件夹 本地文件夹:容器文件夹

7. 构建flask服务
执行如下命令

docker-compose build

构建成功

说明:

因为此时的docker-compose.yml文件中只有一个flask的服务,所以只创建了这个镜像

3.构建MySQL服务

1. 备份
将之前的docker-compose.yml进行备份
2. 修改
然后修改docker-compose.yml内容如下:

version: '3'
services:
    mysql:
        image: mysql:5.7
        expose:
            - 3306
        ports:
            - "3307:3306"
        environment:
            MYSQL_ROOT_PASSWORD: python
        volumes:
            - ./02_mysql:/var/lib/mysql


3. 构建
执行命令,运行服务

docker-compose up
4. 测试
测试MySQL服务

 

5. 说明
我们之所以在docker-compose.yml文件中设置volumes是为了保证,将来操作的数据可以直接存储到宿主机,而不会因为容器的删除,导致数据丢失

4.构建Redis服务

1. 备份docker-compose.yml
2. 修改
修改docker-compose.yml内容如下:

version: '3'
services:
    redis:
        image: redis
        expose:
            - 6379
        ports:
            - "6399:6379"


3. 构建
运行如下命令:

docker-compose up
效果:

4. 测试
使用Redis客户端链接Redis容器进行测试

5.连通各服务


1. 合并为一个docker-compose.yml文件
将之前的3个docker-compose.yml文件合并为一个,内容如下:

version: '3'
services:
    redis:
        image: redis
        expose:
            - 6379
        ports:
            - "6399:6379"
    mysql:
        image: mysql:5.7
        expose:
            - 3306
        ports:
            - "3307:3306"
        environment:
            MYSQL_ROOT_PASSWORD: python
        volumes:
            - ./02_mysql:/var/lib/mysql
    flask:
        build: ./01_flask
        volumes:
            - ./01_flask/project:/home/project
        ports:
            - "5000:5000"
        depends_on:
            - mysql
            - redis

注意:

depends_on表示依赖,如上述代码中意思是:需要运行flask服务那么需要先运行redis、mysq服务,但并不能保证在flask服务运行前它们已经成功的运行起来,只能保证它们先运行

2. 运行效果
运行命令:

docker-compose up

使用docker-compose ps查看

如果需要关闭服务,则使用ctrl+c的方式

实现“薪经咨询”项目运行

刘宇轩/xinjingzixun_2020

1. 将薪经咨询项目代码复制到project下

2. 修项目中用到的数据地址

app.py
from flask import Flask
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

from views import index_blu, passport_blu, user_blu, news_blu
from models import db
from utils.common import show_top_6_news_style

# 创建flask应用对象
app = Flask(__name__)

# 加载配置
app.config.from_pyfile("config.ini")

# 创建蓝图,且注册到app
app.register_blueprint(index_blu)
app.register_blueprint(passport_blu)
app.register_blueprint(user_blu)
app.register_blueprint(news_blu)

# 初始化数据库
db.init_app(app)

# 添加过滤器
app.add_template_filter(show_top_6_news_style)

# 添加数据库迁移等工具
manager = Manager(app)
# 生成migrate对象 用来数据库迁移
migrate = Migrate(app, db)
# 添加db命令
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)
    # manager.run()
config.ini
import redis
# 数据库相关配置
# 设置数据库的链接地址
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:python@mysql:3306/xinjingzixun_2020'

# 是否开启追踪数据库的改变
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 打印数据库执行的语句
SQLALCHEMY_ECHO = True

# session秘钥相关配置
SECRET_KEY = "a9sdjfas;jfq249rufalsdj;sdlnf;aw8uf.sdjfaisd"
#设置session存储到redis中
SESSION_TYPE='redis'
#redis链接对象(给flask-session扩展使用的)
SESSION_REDIS=redis.StrictRedis(host='redis',port=6379)

​3. 尝试运行

docker-compose up
docker-compose down

docker网络(外部访问容器)


容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

实际情况我们不会采用此方式,而会使用-p

如果要查看一个容器使用的端口以及映射情况,除了可以使用docker ps查看以外,还可以使用 docker container ls 查看

一、准备my_flask镜像
1. Dockerfile

FROM python:3.6
WORKDIR /home
RUN pip3 install flask -i https://mirrors.aliyun.com/pypi/simple/
CMD ["python3", "app.py"]


2. 创建app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "<h1>Hello World</h1>"

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


3. 创建镜像

docker build -t my_flask:1.0 .

-p的作用(外部访问容器

-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。

支持的格式有:

  • ip:hostPort:containerPort

  • ip::containerPort

  • hostPort:containerPort

1. 映射所有接口地址

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行

docker run --rm -it -v 自己电脑的绝对路径:/home -p 5000:5000 my_flask:1.0

 

此时默认会绑定本地所有接口上的所有地址

2. 映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

docker run --rm -it -v 自己电脑的绝对路径:/home -p 127.0.0.1:5000:5000 my_flask:1.0

 

3. 映射到指定地址的任意端口

使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

docker run --rm -it -v 自己电脑的绝对路径:/home -p :5000 my_flask:1.0
docker run --rm -it -v C:\Users\abc\Desktop\zhizuo\wangluo:/home -p :5000 my_flask:1.0

多个端口:

docker run --rm -it -v C:\Users\abc\Desktop\zhizuo\wangluo:/home -p :80  -p 12345:5000 my_flask:1.0

还可以使用 udp 标记来指定 udp 端口

docker run --rm -it -v 自己电脑的绝对路径:/home -p :5000/udp my_flask:1.0

 

4. 查看映射端口配置

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

$ docker port 容器id

 

注意:

  • 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)

  • -p 标记可以多次使用来绑定多个端口

例如

docker run -d -p 5000:5000 -p 3000:80 my_flask:1.0

容器互联

输入--help ,查找命令使用

docker ps --help

1. 引入

当真实部署一个web项目时肯定需要用到多个容器之间进行数据通信,此时就是所谓的容器互联

2. 使用默认网络

当使用如下命令时,会看到如下图示效果

docker network ls

说明:

默认情况下,docker会有3种网络方式,bridge、host、null,除此以外还有其他的方式 一般很少使用。

bridge(网桥)方式

在这种方式下,默认会把所有的容器链接到一起,这也就是为什么能够在一个容器中ping通另外一个容器了

查看方式

可以使用

docker network inspect 网络id

查看这个网络中所有的容器ip以及其他信息

flask 用 bride 链接

当我们在使用docker-compose构建服务时,会自动创建一个新的网络如下

查看各服务(容器)的ip信息

3. 使用自定义网络

为了更方便的使用网络,可以自己进行创建并使用这个网络

新建网络

下面先创建一个新的 Docker 网络。

$ docker network create -d bridge my-net

-d 参数指定 Docker 网络类型,有 bridge overlay

连接容器

运行一个容器并连接到新建的 my-net 网络

docker run --rm -it --network my-net my_flask:1.0 bash

打开新的终端,再运行一个容器并加入到 my-net 网络

docker run --rm -it --network my-net my_flask:1.0 bash

再打开一个新的终端查看容器信息

$ docker container ls

可以通过如下方式进行检查

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

Docker Compose 笔记 网络 的相关文章

  • 制作本地yum仓库

    root 192 cd etc yum repos d root 192 yum repos d ls redhat repo root 192 yum repos d vim rpm repo base name baseos gpgch
  • Jmeter 性能压测-常遇问题与解决技巧

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 使用匿名binder实现client向server端的死亡通知

    一 引言 因为binder是跨进程通信 难免会遇到服务端出现异常挂死的情况 这个时候需要通知到客户端进行相应的处理 在网络通信中是非常常见的机制 当然 在binder中 Android也为我们写好了相关的框架 但通过binder源码分析 你
  • Linux ls命令

    目录 一 配置项 1 1 ls l 1 2 ls a 1 3 ls lrt 1 4 ls ld 二 案例 2 1 查看指定文件夹下文件的数量
  • 我当年自学黑客(网络安全)的一些心得!(内附学习笔记)

    前 言 写这篇教程的初衷是很多朋友都想了解如何入门 转行网络安全 实现自己的 黑客梦 文章的宗旨是 1 指出一些自学的误区 2 提供客观可行的学习表 3 推荐我认为适合小白学习的资源 大佬绕道哈 文末有福利 一 自学网络安全学习的误区和陷阱
  • IT圈大实话!卷运维不如卷网络安全

    前言 在刚刚过去的金九银十 我进行了多场网络安全的技术面试 我发现最近很多从事运维的选择了辞职 转行到了网络安全这个发展路线 说实话 运维工程师这个岗位在IT行业里面确实是处于最底层的 不管什么环节出现问题 基本都是运维背锅 薪资水平也比不
  • 为什么这么多人自学黑客,但没过多久就放弃了(掌握正确的网络安全学习路线很重要)

    网络安全是一个 不断发展和演变 的领域 以下是一个 网络安全学习路线规划 旨在帮助初学者快速入门和提高自己的技能 基础知识 网络安全的 基础知识 包括 网络结构 操作系统 编程语言 等方面的知识 学习这些基础知识对理解网络安全的原理和技术至
  • 小白成功搭建Elasticsearch 只需五步(包含配置xpack)

    ElasticSearch 安装成功后 是不需要使用用户名和密码就可以访问的 这也是在配置skywalking的apm过程中 连接es数据库无需设置用户名和密码的原因 启动es也非常的简单 在 bin 目录下运行elasticsearch
  • 进程间通信

    进程间通信 进程间通信介绍 进程间通信目的 数据传输 一个进程需要将它的数据发送给另一个进程 资源共享 多个进程之间共享同样的资源 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止 时要通知父进程
  • Python采集猎聘网站招聘数据内容,看看现在职位风向

    嗨喽 大家好呀 这里是爱看美女的茜茜呐 环境使用 Python 3 10 Pycharm 模块使用 第三方模块 需安装 requests gt pip install requests pandas gt pip install panda
  • nohup - 后台执行

    nohup no hang up 语法 nohup Command Arg 使用示例 nohup python a py 日志将被保留在 当前文件夹下的 nohup out 将日志放到文件 不输出到终端 echo hello gt 1 tx
  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • msyql 异常,别干着急,70%的问题都在这里!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 独家 | 鸿蒙(HarmonyOS)开发详细学习笔记免费分享

    前言 华为宣布 将在1月18日 在北京 上海 杭州 南京 成都 厦门 武汉 长沙 8 大城市同时召开大会 届时将揭秘鸿蒙生态和 HarmonyOS NEXT 进阶新篇章 简单的来说就是 纯血鸿蒙系统 即将彻底揭晓 鸿蒙系统自推出来以来 就一
  • ssh:connect to host github.com port 22: Connection timed out

    解决流程 1 将github的端口由22改为443 ssh T p 443 git ssh github com 2 接着输入yes进行确认 The authenticity of host ssh github com 443 192 1
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培

随机推荐

  • 关于Unsupported major.minor version 52.0报错问题解决方案

    目录 1 问题描述 2 问题分析 3 解决方案 步骤一 删除JDK1 7版本 步骤二 导入JDK1 8版本 步骤三 将新的JDK1 8引入到工程中 4 总结 1 问题描述 在启动项目工程中 当编译class文件的时候会报错一个 java l
  • QClub大连站2013年第一期总结

    今天下午 QClub大连站2013年第一期如期举行 报名差不多50人 到场也有30多人 地点还在老地方 万恒商务大厦 我自己今天的状态不太好 女儿最近感冒 我也跟着有些上火 嗓子疼了三天了 今天开始有点儿咳嗽 还好不是特别严重 开场比较简单
  • python中系统找不到指定文件怎么办_PyCharm-错误-找不到指定文件python.exe的解决方法...

    1 现象 系统提示找不到指定的文件 Error running hello Cannot run program B pystudy venv Scripts python exe in directory python study Cre
  • 微前端解决方案

    目录 微前端解决方案 微前端的整体架构 微前端部署平台 微前端解决方案 在理想的情况下 期望能达到 将一个复杂的单体应用以功能或业务需求垂直的切分成更小的子系统 并且能够达到以下能力 子系统间的开发 发布从空间上完成隔离 子系统可以使用不同
  • debug跳出循环_Java基础-第04章:循环结构「云图智联」

    免费学习视频欢迎关注云图智联 https e yuntuzhilian com 1 什么是循环结构 1 1 为什么要学习循环结构 生活中 有很多 重复的去作某件事 的例子 旋转的钟表指针 滚动的车轮 日复一日的上课等等 同理 在程序中也有很
  • Python实现经纬度空间点DBSCAN聚类

    写在前面 博主前期科研工作中 涉及到要对某个地区的一些空间点进行聚类分析 想到读研期间 曾经用DBSCAN聚类算法实现了四线激光雷达扫描的三维点云数据聚类 论文题目 基于改进DBSCAN算法的激光雷达目标物检测方法 当初用matlab实现的
  • Spark SQL参数调优指南

    目录 1 运行行为 1 1 动态生成分区 1 2 broadcast join 使用hint强制做broadcastjoin 1 3 动态资源分配 1 4 Shuflle相关 1 5 读ORC表优化 2 executor能力 2 1内存 2
  • 独孤九剑第五式-朴素贝叶斯模型

    文章适合于所有的相关人士进行学习 各位看官看完了之后不要立刻转身呀 期待三连关注小小博主加收藏 小小博主回关快 会给你意想不到的惊喜呀 各位老板动动小手给小弟点赞收藏一下 多多支持是我更新得动力 文章目录 前言 朴素贝叶斯模型理论讲解 模型
  • 网络爬虫 - 6 JsonPath的使用方法与爬取案例

    1 json数据解析 1 json概念 JSON 是存储和交换文本信息的语法 类似 XML JSON 比 XML 更小 更快 更易解析 JSON 是纯文本 JSON 具有 自我描述性 人类可读 JSON 具有层级结构 值中存在值 JSON
  • Pytorch 学习(五):Pytorch 实现多层感知机(MLP)

    Pytorch 实现多层感知机 MLP 本方法总结自 动手学深度学习 Pytorch版 github项目 部分内容延续 Pytorch 学习 四 Pytorch 实现 Softmax 回归 实现方法 实现多层感知器 Multlayer Pe
  • Unity enabled & Single(关闭组件和单例)

    1 先获取需要关闭的组件 2 在代码中用获取组件的变量点出enabled 单例 单例类 内存中只能有一个 实例化的时候一定要new calss Single 单例 private static Single instance 私人化构造函数
  • 贪心的问题合集(Leetcode题解-Python语言)

    贪心算法 Greedy Algorithm 是一种在每次决策时采用当前状态下最优或最好的策略 从而希望导致结果是最好或最优的算法 455 分发饼干 class Solution def findContentChildren self g
  • 关于虚拟机时不时繁忙、黑屏的解决方法(适用于VM12版本)

    关于虚拟机时不时黑屏 繁忙 关不了机的解决方法 针对于出现启动集群多个节点时 某一节点黑屏的情况 或者是单单要启动一台虚拟机时黑屏的情况 我个人用的是vm12版本 该方法可能不适用于VM15 我也没有试验过 不知道是否管用 特别是在启动集群
  • idea快捷键--编码

    1 创建main方法 psvm 输入public static void main的首字母 psvm 然后按tab或者enter 就会写好main方法 2 输出语句 System out print 键入 sout 3 for循环 输入 f
  • GitLab 与 Gerrit

    origin http blog csdn net feng8888bbb article details 70170638 相信大家看到这里 会发现gitlab比gerrit多了许多功能 比如说Issues Wiki等 我们从几个方面对比
  • string类常用函数

    1 substr函数 字符串截取函数 用于获取字符串的子串 str substr begin length 用于截取str中以begin为下标长度为length的字串 string s asd s s substr 0 1 结果为a 2 f
  • 逆变器和Modbus浅理解

    最近有兄弟去了能源部门 刚好跟着学了一些相关的知识 撇在这记录一下 当然理解的可能不是很正确 尤其Modbus协议压根没有写过 轻喷
  • php 怎么接受流数据类型_PHP数据类型

    PHP 支持 9 种原始数据类型 四种标量类型 boolean 布尔型 integer 整型 float 浮点型 也称作double string 字符串 三种复合类型 array 数组 object 对象 callable 可调用 两种特
  • linux 根目录各目录功能简介

    CentOS 6 5 目录 说明 备注 bin 存放普通用户可执行的指令 即使在单用户模式下也能够执行处理 boot 开机引导目录 包括Linux内核文件与开机所需要的文件 dev 设备目录 所有的硬件设备及周边均放置在这个设备目录中 et
  • Docker Compose 笔记 网络

    Compose 简介 1 引入 通过前面的知识 我们知道使用一个 Dockerfile 模板文件 可以让用户很方便的定义一个单独的应用容器 从而得到一个镜像 然而 在日常工作中 经常会碰到需要多个容器相互配合来完成某项任务的情况 例如要实现