Docker Compose 笔记 网络

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值