将本地Python项目打包构建docker镜像,并在docker中运行【流程1-8】
8、Docker Compose (Docker编配)
附录: 其他常用docker命令
>> pip freeze > requirements.txt
执行完成后会生成一个叫requirements的TXT文件
aiohttp==3.8.1
click==8.0.3
dnspython==2.2.0
elasticsearch==7.13.3
Flask==2.0.2
numpy==1.19.2
pandas==1.0.4
pip==21.3.1
py-eureka-client==0.10.2
wheel
yarl==1.6.3
es-python (作为Python项目根目录)
|- modules (modules文件夹: 其中的内容是Python项目子目录文件)
|- run.py (Python项目的执行入口)
|- requirements.txt (步骤2生成的项目依赖列表)
|- Dockerfile.txt (步骤4即将编写的文件)
在es-python文件夹下,新建一个Dockerfile文件:
>> touch Dockerfile
编写Dockerfile内容:
# Dockerfile 指令
# 基于 基础镜像
FROM python:3.6.10
# 定义 元数据
LABEL maintainer="HashSWAP" version="1.0"
# 将构建环境下的文件OR目录, 复制到镜像中的/code目录下,
ADD . /code
# 设置/切换 当前工作目录 为 /code
WORKDIR /code
# 根据需要, 定义 环境变量
ENV IP 192.168.70.58
ENV REFRESHED_AT 2022-07-20
# 指定 一个OR多个 卷, 挂载到镜像 (配合后续docker cp使用)
VOLUME ["/opt/project", "/data"]
# 安装python环境支持(针对python项目)
RUN pip install -r requirements.txt
# 暴露出外界访问容器的端口
EXPOSE 5033
# 假设run.py是项目启动入口,
# ENTRYPOINT 和 CMD 指令均可用于指定容器启动时要运行的命令,
# 区别在于 CMD 命令可以被 docker run命令覆盖
ENTRYPOINT ["python", "run.py"]
CMD ["python", "run.py"]
>> cd /usr/hashswap/es-python
>> docker build -t es-python-image .
OR
>> docker build -t="es-python-image:v2022.07.21" .
注:若多次构建可以使用 –no-cache 命令,忽略之前构建过程的缓存
>> docker build --no-cache -t es-python-image .
>> docker images
>> docker run --name es-python-app_0 -it es-python-image:v2022.07.20 python run.py
OR
>> docker run --name es-python-app_1 -p 5034:5033 -it es-python-image:v2022.07.20 python run.py
注意: 5033端口应该是容器内项目暴漏出来的端口, 例如"SERVICE_PORT": 5033;
5034端口不应该跟宿主机上其他端口冲突。
至此,项目以docker容器格式运行了…
docker run如果需要的参数过多,则可以编写docker-compose.yml,然后使用docker-compose up命令来启动容器;
也可以同时启动多个容器;
>> touch docker-compose.yml
${**} 内容根据实际需要编写
es_python_app:
container_name: es_python_app
image: XXXXX/es_python_iamge
restart: always
environment:
- ES_IP=${ES_IP}
- ES_PORT=${ES_HTTP_PORT}
- EUREKA_SERVER=${EUREKA}
- EUREKA_APP_NAME=es_python_app
- EUREKA_INSTANCE_HOST=${IP}
- EUREKA_INSTANCE_IP=${IP}
- EUREKA_INSTANCE_PORT=${ES_PORT}
- SERVICE_PORT=${ES_PORT}
ports:
- ${ES_PORT}:${ES_PORT}
volumes:
- ./es_python:/es_python
command: python run.py --instance_host=${USE_APP_HOST} --instance_port=${USE_APP_PORT} --eureka_server=${EUREKA}
# 以后台守护进程的模式, 启动DockerCompose
>> docker-compose up -d
>> docker-compose --file $DEPLOY_PATH/lib/docker-compose.yml up -d
-d 将容器放到后台运行
-it 交互式运行
--name es-python-con01 命名
-p 8081:80 将容器的80端口绑定到本地宿主机的8081端口上
-p 80 将容器的80端口绑定到本地宿主机的随机端口上
-e "WEB_PORT=8090" 传递环境变量
--restart=always 自动重启容器
-v ./es_python:/es_python 挂载某个卷
-w /var/log 覆盖工作目录
-c "while true; do echo hello world; sleep 1; done"
eg:
>> docker run --name es_python_app -p 5033:5033 -it es-python-image:v2022.07.21 python run.py
>> docker inspect es-python
>> docker logs es-python
-f 动态监控日志
-t 为每条日志项加上时间戳
--tail 10 获取最后十条日志
--tail 0 -f 跟踪最新日志
>> docker top es-python
>> docker images
>> docker search python
>> docker stop pm1n8d9jd9n
>> docker rm ji0382h0hf
>> docker rmi a7sha923
>> docker exec -t -i es-python-app-1 /bin/bash
>> sudo systemctl restart docker
# 格式: docker save [options] images [images...]
>> docker save -o ~/software/es-python/es-python-image.tar es-python-image:latest
>> docker save > ~/software/es-python/es-python-image.tar es-python-image:v2022.07.21
# -o 和 > 表示输出到文件, ****.tar为目标文件, name:tag为源镜像名
>> docker load --input /images/ubuntu_14.04.tar
# OR 通过符号的方式来导入
>> docker load < /images/ubuntu_14.04.tar
# 格式: >> docker export [options] container
# >> docker export #ID or #Name > /app/export.tar
>> docker export -o ~/software/es-python/es-python-cont.tar es-python-app-1
>>> docker export es-python-app-1 > ~/software/es-python/es-python-cont.tar
# -o > 表示输出到文件,
注: docker import用来载入容器包,但会恢复为镜像
# 格式: >> docker import [options] file|URL|- [REPOSITORY[:TAG]]
>> docker import ~/software/es-python/es-python-cont.tar es-python-image:v202207new