docker-02
一、私有仓库
docker pull
拉取,都是从hub.docker
上拉取的,公司自己做的docker镜像,放在哪比较合适?docker push
推到 hub.docker,如果是公开,大家都可以下载,公司内部只希望公司的人用,其他人不能用
公司内部,需要有个仓库管理自己的镜像——>私有仓库或者叫私服
以后拉取镜像时,先从自己服务器拉取,没有再去hub.docker拉取,咱们自己制作的镜像,传到私有仓库中,别人看不到
操作步骤
1、给镜像打标签 (id号还是一样)
- docker tag 03cf0f47aec0 curry/djagno_books
- 注意:标签的名字一定要跟hub.docker上账号名字一样
2、登录
- docker login # 输入用户名密码
3、推送
- docker push curry/djagno_books
搭建私有仓库
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、给镜像打标签(镜像名字或者镜像id号都行 后面是地址+端口+名字)
- docker tag books_django 10.0.0.205:5000/books_django
8、把自己制作的镜像,传到私有仓库
- docker push 10.0.0.205:5000/books_django
9、公司内部的人,你们都要能访问到这个,都可以把镜像拉取下来
- http://10.0.0.205:5000/v2/_catalog
- docker pull 10.0.0.205:5000/books_django
二、
铺垫:使用了docker 面临一个比较大的问题,如果一个djagno项目,使用mysql,redis,不要一次性把所有服务都放到一个容器中,每个服务一个容器,同时启动删除比较麻烦,批量的管理多个容器比较难以操作,于是有了docker-compose
Docker Compose是一个能一次性定义和管理多个Docker容器的工具,单机容器编排【单机的容器管理】
- docker swarm(docker自己出的):公司里用的不多
- 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文件写法(下面案例演示)
三、docker-compose部署flask项目
3.1 第一步:编写一个Dockerfile
FROM python:3.8
COPY . /app # 当前路径下的东西放到/app下
WORKDIR /app
RUN pip install flask redis -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD [ "python", "app.py" ]
3.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)
3.3 第三步:
- 有redis和web两个容器 镜像后面可以写版本,不写就用的最新的
- 书写规范,前面必须有空格
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
- 如果redis服务的名字叫redis,我在web服务中(容器中),根据redis名字就能拿到容器,正常的话滴
根据IP地址才能拿到,现在不用了,因为都在同一个网络里
ping redis
# 进入到了web,ping redis
# 安装ping命令,
apt-get update
apt-get install inetutils-ping
ping redis
# 一键部署:redis,和flask ,每个都在一个容器中
docker-compose up
小总结逻辑:
docker-compose up
执行把当前路径下写的docker-compose.yml
运行,得到基于image:redis的容器和刚刚构建出来web镜像的容器并且做了8080:5000端口映射,把REDIS_HOST: redis
参数传进来,容器一运行就会执行CMD [ "python", "app.py" ]
的代码,然后就会执行flask的项目
四、启动管理容器
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 | 进入到容器内 |
五、
一台服务器
- 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/curry/luffy.git
- docker,docker-compose装好
- docker-compose up
- 访问宿主机的 80 端口
#依赖镜像名称和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"]
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:
图解析
虚拟机上跑了个Nginx容器,做了个目录映射,映射到luffy/luffy_city/dist
,又跟宿主机做了个80:80映射,返回index能看到前端项目,前端项目加载好像8000端口发送请求,又做了个端口映射,8000映射到8000,接着转发给django容器。uwsgi监听的是8080端口里面有django+代码,通过名字luffy_mysql连接mysql容器和通过名字luffy_redis连接redis容器。后面想扩容的话再启动个容器就行