Docker-compse的应用

1 docker-compose

复制代码
# 使用了docker 面临一个比较大的问题,如果一个djagno项目,使用mysql,redis,不要一次性把所有服务都放到一个容器中,每个服务一个容器,批量的管理多个容器,比较难以操作,于是有了docker-compose
​
# 不要把多个服务放到一个容器中(能,不建议)--》docker建议就是一个服务一个容器
​
​
# 批量管理,操作docker容器的软件---》docker-compose--》go语言编写的只在单机上操作容器的软件
    -go语言写的---》编译型语言---》编译完成---》可执行文件--》直接可以执行
# Docker Compose是一个能一次性定义和管理多个Docker容器的工具,单机容器编排【定义和管理】
​
​
# 多机容器编排
    docker swarm:用的不多
    k8s
    
# Docker Compose概念
    Compose中定义和启动的每一个容器都相当于一个服务(service)
    Compose中能定义和启动多个服务,且它们之间通常具有协同关系
    管理方式:
    使用YAML文件来配置我们应用程序的服务。
    使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。
 
​
# 安装docker-compose (可执行文件,放在了github上,下载下来即可,速度很慢)
# https://github.com/docker/compose/releases
wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64
cp ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose # 想在任意路径下执行docker-compose都有相应----》需要把可执行文件放到环境变量所在的目录下
chmod +x /usr/local/bin/docker-compose
​
​
  r--    ---    ---
# rwx    rwx    rwx
  属主   属组    其他
  r:read 读权限 
  w:wirte 写权限
  x :执行权限
​
 属主   属组  所有人
 chmod 777 文件名
 chmod +x 
​
    
  rwx  r-x   -wx
  111  101   011 
  chmod 753 文件名
    
    
    
# 以后在任意位置敲docker-compose都可以
​
​
# epel源
    -yum install centos仓库下载
    -软件不全
    -epel源 扩展源 
        nginx
        redis
        python
​
​
​
# 常用命令
# 启动管理容器
docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
docker-compose -f 指定文件 up
docker-compose up -d  # 后台执行,一般我们看日志输出,不用这个
​
docker-compose stop  # 停止,不会删除容器和镜像
docker-compose down # 停止,并删除关联的容器
docker-compose start  # 启动yml文件管理的容器
docker-compose ps    # 正在运行的容器
docker-compose images # docker-compose管理的镜像
​
docker-compose exec yml文件中写的service /bin/bash  # 进入到容器内
​
docker-compose up -d --build # 启动容器但是重新构建镜像,基于重新构建的镜像启动
​
​
#####  如果你没装docker#######
# 配置yum仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
​
# 下载 docker-ce  docker-ce-cli docker-compose-plugin
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2 docker-compose 部署flask

复制代码
# flask 项目,使用redis服务---》2个容器
    flask 项目容器
    redis容器

2.1 新建flask项目

复制代码
from flask import Flask
from redis import Redis
import os
​
app = Flask(__name__)
# redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
redis = Redis(host='redis', port=6379,decode_responses=True) # 容器的主机名---》flask容器和redis容器是能ping通的,可以通过ip ping 也可以通过主机名ping
​
@app.route('/')
def hello():
    redis.incr('hits')
    return '你好! 查看 %s 次\n' % (redis.get('hits'))
​
​
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

2.2 编写Dockerfile--》用于构建flask项目的镜像

复制代码
# 基础指定镜像
FROM python:3.10
# 容器的工作目录
WORKDIR /app 
# 将Dockerfile所在目录中的所有文件复制到容器的、app目录中
COPY . /app
# 所有依赖在requirements.txt文件里面下载
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 监听端口
EXPOSE 5000
# 用python执行,app.py文件
CMD [ "python", "app.py" ]
​
# 构建出镜像---》一会统一使用 docker-compose构建

2.3 编写docker-compose的配置文件-docker-compose.yml

复制代码
version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis
   

2.4 一键启动

复制代码
docker-compose up
​
​
# 如果redis服务的名字叫redis,我在web服务中(容器中),根据redis名字就能拿到容器
# 进入到容器
docker-compose exec redis /bin/bash
​
redis-cli
# 查看访问次数
get hits
    
    ping redis
    
    # 进入到了web,ping redis
    # 安装ping命令,
    apt-get update
    apt-get install inetutils-ping
    ping redis
    

也可以映射端口给别人用

复制代码
# 10.0.0.102:8080   这个是我的宿主机接口
# 192.168.1.172:5001   这个是我的本机接口

3 docker-compose 一键部署项目

复制代码
# 一台服务器:
    -python3.8 环境 djagno +uwsgi+代码
    -nginx软件
    -mysql 5.7
    -redis 
    
# 每个都做成一个容器
    -djagno项目容器:python3.8 构建的django,项目依赖模块,uwsgi,代码
    -nginx容器:目录映射,映射到宿主机,代理vue前端,编译后的静态文件
    -mysql 容器:创建,创用户,密码,luffy库
    -redis 容器,跑起来即可
    
    
# docker-compose yml文件配置,一键启动
    -git clone https://gitee.com/liuqingzheng/luffy.git
    -目录结构
    luffy
        luffy_api  # 后台项目
            Dockerfile
        luffycity  # 前台项目
        docker_compose_files # 放数据的文件夹(配置,目录映射)
        docker-compose.yml #ymal文件
        
    - 修改前端链接后台的地址:
        -改后端地址
        -改前端链接后端地址
        
        npm install
    -编译:npm run build
    
    -提交到git
    
    -要部署的服务器:git clone https://gitee.com/liuqingzheng/luffy.git
    -docker,docker-compose装好
    -docker-compose up
    -访问宿主机的 80 端口  10.0.0.102
    - 连接数据库就好 
    没有luffy数据库就创建一个就好

5.1 项目目录结构

复制代码
luffy
    -docker_compose_files  # nginx有自己的配置文件,redis自己的配置,mysql的配置
        nginx # 文件夹
            -default.conf  # nginx配置文件
        redis # 文件夹
             redis.conf
        mysql.env#配置文件
    -luffy_api  # 原来路飞后端项目
        -Dockerfile
        -luffy.ini  # luffy.xml uwsgi的配置文件
    -luffycity  # 前端项目
    
    -docker-compose.yml  # docker-compose的配置文件
    
​
# 把luffycity/dist 文件夹删除
# 把\luffy\luffycity\src\assets\js\settings.js后端地址改成上线地址(服务器地址)
# 来到前端路径下:luffy\luffycity
cnpm install  安装依赖
​
# 编译,在\luffy\luffycity\dist文件夹
npm run build
​
# 提交到git上
​
​
# 在部署的机器上,git clone 下来
# 进入到项目目录
docker-compose up

5.2 luffy_api/Dockerfile--->构建uwsgi+django

复制代码
FROM python:3.8
MAINTAINER lqz
WORKDIR /soft
COPY ./requestment.txt /soft/requestment.txt
RUN pip install -r requestment.txt -i https://pypi.doubanio.com/simple
#CMD ["uwsgi", "-x", "./luffy.xml"]
CMD ["uwsgi", "./luffy.ini"]
#CMD ["python", "manage_pro.py", "runserver"]

5.3 docker-compose.yml

复制代码
version: "3"
​
services:
  nginx:
    image: nginx
    container_name: luffy_nginx
    ports:
      - "80:80"
      - "8000:8000"
    restart: always
    volumes:
      - ./luffycity/dist:/var/www/html
      - ./docker_compose_files/nginx:/etc/nginx/conf.d
    depends_on:
      - django
    networks:
      - web
​
  django:
    build:
      context: ./luffy_api
      dockerfile: Dockerfile
    container_name: luffy_django
#    command: python manage_pro.py makemigrations && python manage_pro.py migrate && uwsgi ./luffy.ini
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - ./luffy_api:/soft
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - mysql
      - redis
    networks:
      - web
  redis:
    image: redis:6.0-alpine
    container_name: luffy_redis
    ports:
      - "6379:6379"
    volumes:
      - ./docker_compose_files/redis/data:/data
      - ./docker_compose_files/redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - web
  mysql:
    image: mysql:5.7
    container_name: luffy_mysql
    restart: always
    ports:
      - "3306:3306"
    env_file:
      - ./docker_compose_files/mysql.env
    volumes:
      - ./docker_compose_files/mysql/data:/var/lib/mysql
      - ./docker_compose_files/mysql/logs:/var/log/mysql
      - ./docker_compose_files/mysql/conf:/etc/mysql/conf.d
    networks:
      - web
​
networks:
  web:

5.4 一键部署

复制代码
docker-compose up  
​
​
​
# redis容器和mysql容器删除
​
​

4 远程链接linux开发

复制代码
# 1 公司中,有的模块不支持win
# 2 公司为了统一环境--》大家都在linux内开发
​
​

面试题

复制代码
# 1 三道题
1 并发 并行
2 同步 异步
3 阻塞 非阻塞
​
​
# 发送钉钉通知
    -掉接口--》获取打卡数据
   
# 期终架构项目,使用docker-compose一键部署  后端

商城项目部署

如果找不到git就安装一个

复制代码
# 使用 yum 安装 git
yum install git -y
 
# 查看是否安装成功
git --version

可能会遇到公钥问题

复制代码
ssh-keygen -t rsa -C 
复制代码
cd /root/.ssh/
​
vi id_rsa.pub  # 将公钥进复制
  • 在到gitee上面

配置公钥部署

注意前后端保持一致

忽略文件配置

复制代码
.DS_Store
shopproduct/node_modules
​
​
​
# local env files
.env.local
.env.*.local
​
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
​
​
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
​
.idea
logs/*.log
scripts
__pycache__

docker_compose_files

nginx

default.conf

复制代码
server {
   # 监听80端口
  listen 80;
   # 服务地址
  server_name  127.0.0.1;
  charset utf-8;
  location / {
      # nginx会指定首页文件
    root /var/www/html;
    index index.html;
    try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
  }
}
server {
    # 监听8000端口
  listen 8000;
  server_name  127.0.0.1;
  charset utf-8;
  location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      # 配置指定请求的实际地址,所有的配置location本地地址将会被代理到http://shop_django:8080。
      proxy_pass http://shop_django:8080;
  }
  # 新增的配置静态文件
  location /static {
      # 宿主机中配置文件的实际地址
    alias /home/project/shop/shop/static;
  }
}

redis

redis.conf

复制代码
​
bind 127.0.0.1
port 6379
daemonize no
​
pidfile /var/run/redis_6379.pid
databases 16
​
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir ./

msyql.env

复制代码
# 数据库的root密码
MYSQL_ROOT_PASSWORD=bzt123123
MYSQL_DATABASE=shop
# 数据库的一般是要写一个其他的用户来进行测试的
MYSQL_USER=shop
MYSQL_PASSWORD=bzt123123
TZ=Asia/Shanghai

注意后端在

  • python manage.py runserver 0.0.0.0:8000:这将使服务器可以从任何 IP 地址的 8000 端口访问。

  • python manage.py runserver 8000:这将启动服务器在 8000 端口,但只可以从本地机器访问。

  • python manage.py runserver --noreload:这将启动服务器,但不启用自动重载功能,这意味着在代码更改后,你需要手动重启服务器。

这里来测试你的django后端是否能成功运行

前端配置

注意在容器的docker-compose exec mysql /bin/bash

跟window里面的MySQL是否能成功连接

复制代码
# 这个里前端信息配置完成之后进行
cnpm install
cnpm run build

修改setting.js配置文件

  • 将所有的127.0.0.1:8123改成http://10.0.0.102:8000/
复制代码
const BASE_URL = 'http://10.0.0.102:8000/'

系统错误:MySQL 8 or later is required (found 5.7.36)

这个就是重新安装一个mysql版本就行 直接用docker pull mysql下载最新版本的mysql

后端配置

配置文件

HOST可是宿主机的地址10.0.0.102

复制代码
BACKEND_URL = 'http://10.0.0.102:8080'
​
# 前台地址URL
LUFFY_URL = 'http://10.0.0.102'
# 支付宝同步异步回调接口配置
​
# 后台异步回调接口
NOTIFY_URL = BACKEND_URL + "/Pay/"
​
# 前台同步回调接口,没有 / 结尾0
​
RETURN_URL = LUFFY_URL + "/Pay/success"
​
复制代码
# mysql配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'shop',
        'HOST': 'shop_mysql',
        'PORT': '3306',
        'USER': 'shop',
        'PASSWORD': "bzt123123"
    }
}

在shop/wsgi.py

里面的要只想你上面的配置文件

复制代码
import os
​
from django.core.wsgi import get_wsgi_application
​
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'shop.settings')
​
application = get_wsgi_application()

shop.ini

  • UWSGI是一个用于部署Python Web应用的服务器
复制代码
[uwsgi]
chdir = /app01
master = true
wsgi-file = shop/wsgi.py
http = 0.0.0.0:8080
chmod-socket = 755
processes = 2
pidfile = /app01/shop/uwsgi.pid
#设置缓冲
post-buffering = 4096
复制代码
[uwsgi]
#配置块的开始,指定了以下配置项是针对UWSGI的。
chdir = /app01 
#设置工作目录为/app01,UWSGI将会在这个目录下查找其他配置文件和执行脚本。
master = true 
#设置UWSGI以主进程模式运行,这允许UWSGI管理多个工作进程。
wsgi-file = shop/wsgi.py 
#指定WSGI应用的入口文件,这里是shop目录下的wsgi.py。
http = 0.0.0.0:8080
#设置UWSGI监听的HTTP端口,这里是所有IP地址上的8080端口。
chmod-socket = 755
#设置监听的socket文件的权限为755(即,可读可执行,但只有所有者可以写)。
processes = 2
#设置UWSGI运行的工作进程数为2。
pidfile = /app01/shop/uwsgi.pid 
#设置UWSGI进程的PID文件位置,进程ID将被写入这个文件。
post-buffering = 4096 
#设置POST请求的缓冲区大小为4096字节,这有助于处理大的POST请求。

Dockerfile

复制代码
#依赖镜像名称和ID
FROM python:3.10
#指定镜像创建者信息
MAINTAINER bzt
#切换工作目录
RUN mkdir /app01
WORKDIR /app01
COPY ./requirements.txt /app01/requirements.txt
RUN pip install --upgrade pip
RUN pip install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
​
#CMD ["uwsgi", "-x", "./luffy.xml"]
CMD ["uwsgi", "./shop.ini"]
#CMD ["python", "manage_pro.py", "runserver"]
​

docker-compose.yml

复制代码
version: "3"
​
services:
  nginx:
    image: nginx
    container_name: shop_nginx
    ports:
      - "80:80"
      - "8000:8000"
    restart: always
    volumes:
      - ./shopproduct/dist:/var/www/html
      - ./docker_compose_files/nginx:/etc/nginx/conf.d
    depends_on:
      - django
    networks:
      - web
​
  django:
    build:
      context: ./shop
      dockerfile: Dockerfile
    container_name: shop_django
#    command: python manage_pro.py makemigrations && python manage_pro.py migrate && uwsgi ./luffy.ini
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - ./shop:/app01
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - mysql
      - redis
    networks:
      - web
  redis:
    image: redis:6.0-alpine
    container_name: shop_redis
    ports:
      - "6379:6379"
    volumes:
      - ./docker_compose_files/redis/data:/data
      - ./docker_compose_files/redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - web
  mysql:
    image: mysql
    container_name: shop_mysql
    restart: always
    ports:
      - "3306:3306"
    env_file:
      - ./docker_compose_files/mysql.env
    volumes:
      - ./docker_compose_files/mysql/data:/var/lib/mysql
      - ./docker_compose_files/mysql/logs:/var/log/mysql
      - ./docker_compose_files/mysql/conf:/etc/mysql/conf.d
    networks:
      - web
​
networks:
  web:

这是一个使用 Docker Compose 版本 3 的配置文件,它描述了一个多容器 Docker 应用,包括 Nginx、Django 应用、Redis 和 MySQL 服务。以下是每个部分的详细说明:

服务部分

Nginx 服务
复制代码
nginx:
  image: nginx
  container_name: shop_nginx
  ports:
    - "80:80"
    - "8000:8000"
  restart: always
  volumes:
    - ./shopproduct/dist:/var/www/html
    - ./docker_compose_files/nginx:/etc/nginx/conf.d
  depends_on:
    - django
  networks:
    - web
  • 使用 nginx 镜像创建一个名为 shop_nginx 的容器。

  • 将容器的 80 和 8000 端口映射到宿主机的相同端口。

  • 容器总是会在停止后自动重启。

  • 将宿主机的 ./shopproduct/dist 目录映射到容器的 /var/www/html 目录,用于存放 Nginx 服务的网站文件。

  • 将宿主机的 ./docker_compose_files/nginx 目录映射到容器的 /etc/nginx/conf.d 目录,用于存放 Nginx 的配置文件。

  • Nginx 服务依赖于 Django 服务。

  • 使用 web 网络来连接到其他服务。

Django 服务
复制代码
django:
  build:
    context: ./shop
    dockerfile: Dockerfile
  container_name: shop_django
  # command: python manage_pro.py makemigrations && python manage_pro.py migrate && uwsgi ./luffy.ini
  restart: always
  ports:
    - "8080:8080"
  volumes:
    - ./shop:/app01
  environment:
    - TZ=Asia/Shanghai
  depends_on:
    - mysql
    - redis
  networks:
    - web
  • 使用当前目录下的 ./shop 文件夹中的 Dockerfile 文件构建镜像。

  • 创建一个名为 shop_django 的容器。

  • 注释掉的命令用于执行数据库迁移和启动 uWSGI 服务。

  • 容器总是会在停止后自动重启。

  • 将容器的 8080 端口映射到宿主机的 8080 端口。

  • 将宿主机的 ./shop 目录映射到容器的 /app01 目录。

  • 设置环境变量 TZAsia/Shanghai,以配置时区。

  • Django 服务依赖于 MySQL 和 Redis 服务。

  • 使用 web 网络来连接到其他服务。

Redis 服务
复制代码
redis:
  image: redis:6.0-alpine
  container_name: shop_redis
  ports:
    - "6379:6379"
  volumes:
    - ./docker_compose_files/redis/data:/data
    - ./docker_compose_files/redis/redis.conf:/etc/redis/redis.conf
  command: redis-server /etc/redis/redis.conf
  networks:
    - web
  • 使用 redis:6.0-alpine 镜像创建一个名为 shop_redis 的容器。

  • 将容器的 6379 端口映射到宿主机的 6379 端口。

  • 将宿主机的 ./docker_compose_files/redis/data 目录映射到容器的 /data 目录,用于存放 Redis 数据。

  • 将宿主机的 ./docker_compose_files/redis/redis.conf 文件映射到容器的 /etc/redis/redis.conf 文件,用于配置 Redis。

  • 使用指定的配置文件启动 Redis 服务。

  • 使用 web 网络来连接到其他服务。

MySQL 服务
复制代码
mysql:
  image: mysql
  container_name: shop_mysql
  restart: always
  ports:
    - "3306:3306"
  env_file:
    - ./docker_compose_files/mysql.env
  volumes:
    - ./docker_compose_files/mysql/data:/var/lib/mysql
    - ./docker_compose_files/mysql/logs:/var/log/mysql
    - ./docker_compose_files/mysql/conf:/etc/mysql/conf.d
  networks:
    - web
  • 使用 mysql 镜像创建一个名为 shop_mysql 的容器。

  • 容器总是会在停止后自动重启。

  • 将容器的 3306 端口映射到宿主机的 3306 端口。

  • 使用 ./docker_compose_files/mysql.env 文件中的环境变量来配置 MySQL。

  • 将宿主机的 ./docker_compose_files/mysql/data 目录映射到容器的 /var/lib/mysql 目录,用于存放 MySQL 数据。

  • 将宿主机的 ./docker_compose_files/mysql/logs 目录

相关推荐
程序猿小三2 小时前
Linux下基于关键词文件搜索
linux·运维·服务器
虚拟指尖3 小时前
Ubuntu编译安装COLMAP【实测编译成功】
linux·运维·ubuntu
椎4954 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
刘某的Cloud4 小时前
parted磁盘管理
linux·运维·系统·parted
极验4 小时前
iPhone17实体卡槽消失?eSIM 普及下的安全挑战与应对
大数据·运维·安全
爱倒腾的老唐4 小时前
24、Linux 路由管理
linux·运维·网络
yannan201903134 小时前
Docker容器
运维·docker·容器
_清浅5 小时前
计算机网络【第六章-应用层】
运维·服务器·计算机网络
正在努力的小河5 小时前
Linux 自带的 LED 灯驱动实验
linux·运维·服务器
李子圆圆5 小时前
电力专用多功能微气象监测装置在电网安全运维中的核心价值是什么?
运维·安全