version: "3.8"services: # 容器servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS nameimage: # 镜像的名字command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令environment: # 可选,相当于 docker run里的 --envvolumes: # 可选,相当于docker run里的 -vnetworks: # 可选,相当于 docker run里的 --networkports: # 可选,相当于 docker run里的 -pservicename2:volumes: # 可选,相当于 docker volume createnetworks: # 可选,相当于 docker network create
以 Python Flask + Redis练习:为例子,改造成一个docker-compose文件
新建一个flask-redis文件夹,有app.py ,Dockerfile
#app.py文件from flask import Flask
from redis import Redis
import os
import socketapp = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/')
def hello():redis.incr('hits')return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
#Dockerfile文件FROM python:3.9.5-slimRUN pip install flask redis && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.py REDIS_HOST=redisEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
1. 拉取redis镜像
docker image pull redis
2. 拉取python镜像
docker pull python:3.9.5-slim
3.进入flask-redis当前文件夹, 执行
docker image build -t flask-redis .
4. 输入docker image ls, 有了3个镜像
5.创建网络
docker network create -d bridge demo-network
6.创建容器
docker container run -d --name redis-server --network demo-network redis
docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
这章学习熟悉后,是先让你构建flask-redis 和 redis 两个镜像,再去运行两个容器。但没有使用docker-compose.yml文件的内容。
新建 docker-compose.yml 个文件
#docker-compose.yml文件version: "3.8"services:flask-redis:container_name: flask-redisimage: flask-redis:latestenvironment:- REDIS_HOST=redis-servernetworks:- demo-networkports:- 8080:5000redis-server:container_name: redis-latestimage: redis:latestnetworks:- demo-networknetworks:demo-network:
然后在执行docker-compose up -d命令,同时运行了两个容器,就是直接通过docker-compose命令完成镜像构建 和 容器运行,一步到位了。
6. 把之前创建的两个容器使用 docker container rm xxx xxx命令删除,保留之前的镜像文件
7. 执行docker-compose
docker-compose up
这个命令是在你有了flask-redis镜像后 创建了两个容器并且正常启动了
按键盘ctrl+c会退出停止了。
输入查看容器, 能看到自动给你创建了两个状态是exited的容器。
docker container ls -a
改用命令 -d 后台运行
docker-compose up -d
但是我买了这个阿里服务器,通过ip地址+端口号 ,却不能正常打开。
获取运行docker-compose ps命令也能看到
docker-compose ps
需要主要的是docker-compose ps命令一定要在当前目录下运行才行。
执行 docker-compose stop停止运行
docker-compose stop
能够查看到已经停止的 容器
执行删除,会被全部删除
docker-compose rm
还要刚才创建的网络,docker-compose是不会帮你删除的,要自己手动删除。
仅供学习参考。
比如我有个flask-py文件夹,有flask文件夹,和docker-compose.yml。这两个是同级的啊。
version: "3.8"services:#flask是容器名称flask:#通过build构建镜像build:context: ./flask #构建的文件夹./flask context意思是要的build的目录dockerfile: Dockerfile # Dockerfile的名字image: flask:latest #镜像的名称environment:- REDIS_HOST=redis-servernetworks:- demo-networkports:- 8080:5000redis-server:container_name: redis-latestimage: redis:latestnetworks:- demo-networknetworks:demo-network:
然后删除之前创建的flask-redis镜像,docker image rm xxx(id)
然后上传flask-py文件夹,后 cd进入
执行命令
docker-compose build
但他这里只给我构建了一个镜像而已,没有自动创建的两个容器和网络。
那意思就是docker-compose build失败了?
然后呢 直接build是不行的。
先删了构建的镜像。执行命令pull拉取了flask-redis这个镜像,它会自动构建镜像。
docker-compose pull
再然后up -d后台启动,
docker-compose up -d
最后 docker-compose ps
docker image ls
docker container ls -a
docker network ls
都能看到数据了。
最后 执行 删除所有 刚才创建的
docker system prune -f
参考
compose 文件的结构和版本 - Docker Tips