基本语法结构
version: "3.8"
services: # 容器
servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
image: # 镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
environment: # 可选,相当于 docker run里的 --env
volumes: # 可选,相当于docker run里的 -v
networks: # 可选,相当于 docker run里的 --network
ports: # 可选,相当于 docker run里的 -p
servicename2:
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 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 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 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-slim
RUN pip install flask redis && \
groupadd -r flask && useradd -r -g flask flask && \
mkdir /src && \
chown -R flask:flask /src
USER flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK_APP=app.py REDIS_HOST=redis
EXPOSE 5000
CMD ["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-redis
image: flask-redis:latest
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
container_name: redis-latest
image: redis:latest
networks:
- demo-network
networks:
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-redis镜像前提下,来docker-compose的
假如我们没有这个镜像呢?下面通过修改docker-compose.yml文件,自动构建flask-redis镜像,和创建两个容器并正常启动运行。
比如我有个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-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
container_name: redis-latest
image: redis:latest
networks:
- demo-network
networks:
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
参考