docker-compose一键安装

昨日回顾

# 1 docker 应用部署
# 2 mysql 部署
-目录映射  -v 参数,宿主机路径:容器的路径
  docker run -id --name=mysql3 -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data/:/var/lib/mysql -v /root/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
   -端口映射
  -p 宿主机ip:容器ip
   -环境变量  -e  MYSQL_ROOT_PASSWORD=123456
   
-把容器删除,文件映射到宿主机,文件还在
   -再运行一个容器,跟文件管理,由于文件还在,表,库,数据都在
   -不建议在容器中跑【有状态的服务】
  -服务在运行过程中产生很多数据,记录数据
       -django服务,flask服务
       
       
# 3 redis部署
-docker run -id -p 6379:6379 --name redis_6379 -v /root/reids/conf/redis.conf:/etc/redis/redis.conf -v /root/reids/data:/data redis  redis-server /etc/redis/redis.conf --appendonly yes
   -redis配置文件
  bind 0.0.0.0
       daemonize NO
       protected-mode no
       requirepass 123456
   
# 4 nginx 部署
-nginx 容器起来,进入,容器装软件
  -debain,乌班图:apt-get install
       -redhat,centos: yum install
   -apt-get update
   -apt-get install
# 5 迁移备份
-容器做成镜像
  docker commit
   -镜像做成压缩包
  docker save
    -压缩包恢复成镜像
  docker load
       
# 6 Dockerfile
-一系列指令组成的一个脚本,用来构建docker镜像
   -名字必须叫Dockerfile
   -命令:
   #1 FROM image_name:tag 基于哪个基础镜像来构建
   #2 MAINTAINER lqz     声明镜像的创建者
   #3 ENV key value     设置环境变量 (可以写多条)
  ENV DB_PASSWORD lqz123  运行容器 -e参数指定 -e DB_PASSWORD=xxxx
   #4 RUN command           是Dockerfile的核心部分(可以写多条),
  command  linux命令
 
# 5 ADD 宿主机路径文件 容器路径文件 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
   # 6 COPY 宿主机路径文件 容器路径文件 将宿主机的文件复制到容器内
   # 7 WORKDIR path_dir 设置工作目录   docker exec 进入到容器,在某个路径下
   # 8 CMD   命令         运行容器默认执行的命令,它可以被替换
  CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改
   
   
# 面试题:CMD、RUN 和 ENTRYPOINT?
-dockerfile的指令
   -CMD:启动容器时执行的命令
   -RUN:用在在容器内部执行的命令,构建镜像的时候执行的
   -ENTRYPOINT 用起来跟CMD一样,但是CMD的命令可以被替换,ENTRYPOINT不可以

# 制作 centos+vim的dockerfiel
# 部署books项目的dockerfile
FROM python:3.8
MAINTAINER lqz
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
COPY /root/books  /soft/books
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","./books/manage.py","runserver","0.0.0.0:8080"]

docker run -id --name=books  -p 8080:8080 books_django:latest

 

image-20221221084535497

 

 

image-20221221085220352

今日内容

0 私有仓库

# docker pull拉取,都是从hub.docker 上拉取的,公司自己做的docker镜像,放在哪比较合适

# docker push 推到 hub.docker,如果是公开,大家都可以下载,公司内部只希望公司的人用,其他人不能用

# 公司内部,需要有个仓库管理自己的镜像----》私有仓库 私服

#以后拉取镜像时,先从自己服务器拉取,没有再去hub.docker拉取,咱们自己制作的经常,传到私有仓库中,别人看不到

0.1 把自己制作的镜像,上传到hub.docker

# 操作步骤:
1 给镜像打标签 (id号还是一样)
   docker tag 03cf0f47aec0 liuqingzheng/djagno_books
   2 登录
   docker login  # 输入用户名密码
   3 推送
   docker push liuqingzheng/djagno_books

0.2 搭建私有仓库

# harbor私有仓库:企业中使用多一些,有好看的图形化界面
-使用docker搭建harbor
# 咱们讲的是:registry ,老一点,没有图形化界面,不太好看,使用docker搭建

# 搭建步骤:
-1 拉取registry镜像
  docker pull registry
   -2 把镜像运行成容器
  docker run -di --name=registry -p 5000:5000 registry
       # 你使用浏览器访问宿主机5000端口,就能看到一个web服务
-3 宿主机浏览器访问:http://10.0.0.205:5000/v2/_catalog
-4 修改配置文件
  vi /etc/docker/daemon.json
       # 我
        {"insecure-registries":["10.0.0.205:5000"]}
       # 你们
      {"insecure-registries":["192.168.1.143:5000"]}
       
   -5 重启docker
  systemctl restart docker
   -6 启动私有仓库容器
  docker start registry
   -7 给镜像打标签
  docker tag books_django 10.0.0.205:5000/books_django
 
-4 把自己制作的镜像,传到私有仓库
  docker push 10.0.0.205:5000/books_django
   
-5 公司内部的人,你们都要能访问到这个:http://10.0.0.205:5000/v2/_catalog
  docker pull 10.0.0.205:5000/books_django

 

1 docker-compose介绍

# 使用了docker 面临一个比较大的问题,如果一个djagno项目,使用mysql,redis,不要一次性把所有服务都放到一个容器中,每个服务一个容器,批量的管理多个容器,比较难以操作,于是有了docker-compose

# Docker Compose是一个能一次性定义和管理多个Docker容器的工具,单机容器编排【定义和管理】
-docker swarm:公司里用的不多
-k8s是多机容器编排工具,go语言写了k8s
   

   Compose中定义和启动的每一个容器都相当于一个服务(service)
   Compose中能定义和启动多个服务,且它们之间通常具有协同关系
   管理方式:
   使用YAML文件来配置我们应用程序的服务。
   使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。
   
   
# 安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.14.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# yaml 文件写法

2 docker-compose部署flask项目

2.1.1 第一步:编写一个Dockerfile

FROM python:3.8
COPY . /app
WORKDIR /app
RUN pip install flask redis -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD [ "python", "app.py" ]

2.1.2 编写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 '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())


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

2.1.3 docker-compose的yaml文件 docker-compose.yml

version: "3"

services:

 redis:
   image: redis

 web:
   build:
     context: .
     dockerfile: Dockerfile
   ports:
     - 8080:5000
   environment:
     REDIS_HOST: redis
# 如果redis服务的名字叫redis,我在web服务中(容器中),根据redis名字就能拿到容器
ping redis
   
   # 进入到了web,ping redis
   # 安装ping命令,
   apt-get update
   apt-get install inetutils-ping
   ping redis
   
   
# 一键部署:redis,和flask ,每个都在一个容器中
docker-compose up

image-20221221111921076

 

2.4 docker-compose命令

docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
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  # 进入到容器内

 

 

3 docker-compose部署luffy前后端

# 一台服务器:
-python3.8 环境 djagno +uwsgi+代码
   -nginx软件
   -mysql 5.7
   -redis 5
   
# 每个都做成一个容器
-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文件
-docker-compose.yml内容
-Dockefile 文件
   - 修改前端链接后台的地址:luffycity/src/access/xx.js
   -编译:npm run build
   
   -提交到git
   
   -要部署的服务器:git clone https://gitee.com/liuqingzheng/luffy.git
   -docker,docker-compose装好
   -docker-compose up
   -访问宿主机的 80 端口

 

Dockerfile

#依赖镜像名称和ID
FROM python:3.8
#指定镜像创建者信息
MAINTAINER lqz
#切换工作目录
RUN mkdir /soft
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"]

docker_compose_files文件夹中nginx文件夹->default.cof

server {
 listen 80;
 server_name  127.0.0.1;
 charset utf-8;
 location / {
   root /var/www/html;
   index index.html;
   try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
}
}
server {
 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;
     proxy_pass http://luffy_django:8080;
}
 # 新增的配置静态文件
 location /static {
   alias /home/project/luffy_api/luffy_api/static;
}
}

docker_compose_files文件夹中redis文件夹->redis.cof

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 ./

docker_compose_files文件夹中->mysql.env

MYSQL_ROOT_PASSWORD=lqz12345
MYSQL_DATABASE=luffy
MYSQL_USER=luffy
MYSQL_PASSWORD=Luffy123?
TZ=Asia/Shanghai

 

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:

 

 

 

 

posted @ 2023-03-01 22:21  vonmo  阅读(972)  评论(0编辑  收藏  举报