1 docker安装
1.开启计算机虚拟环境
2.安装dockerDesktop(win) /docker+docker compose(Linux)
3.更新wls2(离线更新,百度wls2离线包下载安装)
2 更换docker镜像源
docker镜像源默认的无法使用,且国内镜像源频繁会失效,无法拉取镜像时可去百度docker镜像源,找会定期更新的帖子,可自己用浏览器访问一下镜像源链接是否可用。
3 Dockerfile构造镜像
编写Dockerfile并在根目录运行 docker build -t testimg:v1.0 . 即可完成镜像构造,下面是一个yolo环境镜像
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
# 给镜像换源
COPY ./sources.list /etc/apt/sources.list
# 安装依赖
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y python3-pip python3-dev && \
apt-get install -y --no-install-recommends \
openssh-server \
build-essential \
cmake \
curl \
vim \
ca-certificates \
libjpeg-dev \
libpng-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libv4l-dev \
libxvidcore-dev \
libx264-dev \
libgtk-3-dev \
patch \
pkg-config \
rsync \
unzip \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 安装 pip 依赖
RUN pip3 install ultralytics Flask flask-cors -i https://pypi.tuna.tsinghua.edu.cn/simple && pip3 cache purge
EXPOSE 80
sources.list文件如下,放置在和Dockerfile同一级目录下。
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
4 docker compose构造容器
使用镜像构造容器,镜像可即时pull也可以是本地的镜像模板,用于配置端口开放等十分方便,也可用于将多个镜像组成一个容器。
4.1 单镜像
docker-compose.yml
version: '1.0'
services:
numberpre:
restart: always
image: docker_numberpre:latest
ports:
- "8001:8001"
volumes:
- ./workspace:/workspace
networks:
- gasnet
working_dir: /workspace/test_code/
command: >
/bin/sh -c "python3 ./web_file.py"
networks:
testnet:
driver: bridge
name: testnet
restart: always 可使docker启动后该容器自启动,且容器不会因未关闭docker而直接关机导致容器异常。
ports: 配置容器端口与本机端口映射,并开放此端口访问
volumes: 挂载文件夹
networks: 配置网络连接,本机下多容器可通过此配置网络进行数据传递,而不需要通过ip
command: > 启动后自动运行的服务
在docker-compose.yml所在的路径下运行 docker compose up -d 指令,即可完成容器构造
4.2 多镜像
docker-compose.yml
把服务需要的多个镜像环境像搭积木一样连接起来,让配置文件完成所有搭建过程,最终只需要一句
docker compose up -d
完成傻瓜式部署,自动完成一切有可能出错的配置
来源:exadel-inc/CompreFace: Leading free and open-source face recognition system
version: '3.4'
volumes:
postgres-data:
services:
compreface-postgres-db:
image: ${registry}compreface-postgres-db:${POSTGRES_VERSION}
restart: always
container_name: "compreface-postgres-db"
environment:
- POSTGRES_USER=${postgres_username}
- POSTGRES_PASSWORD=${postgres_password}
- POSTGRES_DB=${postgres_db}
volumes:
- postgres-data:/var/lib/postgresql/data
compreface-admin:
restart: always
image: ${registry}compreface-admin:${ADMIN_VERSION}
container_name: "compreface-admin"
environment:
- POSTGRES_USER=${postgres_username}
- POSTGRES_PASSWORD=${postgres_password}
- POSTGRES_URL=jdbc:postgresql://${postgres_domain}:${postgres_port}/${postgres_db}
- SPRING_PROFILES_ACTIVE=dev
- ENABLE_EMAIL_SERVER=${enable_email_server}
- EMAIL_HOST=${email_host}
- EMAIL_USERNAME=${email_username}
- EMAIL_FROM=${email_from}
- EMAIL_PASSWORD=${email_password}
- ADMIN_JAVA_OPTS=${compreface_admin_java_options}
- MAX_FILE_SIZE=${max_file_size}
- MAX_REQUEST_SIZE=${max_request_size}B
depends_on:
- compreface-postgres-db
- compreface-api
compreface-api:
restart: always
image: ${registry}compreface-api:${API_VERSION}
container_name: "compreface-api"
depends_on:
- compreface-postgres-db
environment:
- POSTGRES_USER=${postgres_username}
- POSTGRES_PASSWORD=${postgres_password}
- POSTGRES_URL=jdbc:postgresql://${postgres_domain}:${postgres_port}/${postgres_db}
- SPRING_PROFILES_ACTIVE=dev
- API_JAVA_OPTS=${compreface_api_java_options}
- SAVE_IMAGES_TO_DB=${save_images_to_db}
- MAX_FILE_SIZE=${max_file_size}
- MAX_REQUEST_SIZE=${max_request_size}B
- CONNECTION_TIMEOUT=${connection_timeout:-10000}
- READ_TIMEOUT=${read_timeout:-60000}
compreface-fe:
restart: always
image: ${registry}compreface-fe:${FE_VERSION}
container_name: "compreface-ui"
ports:
- "8000:80"
depends_on:
- compreface-api
- compreface-admin
environment:
- CLIENT_MAX_BODY_SIZE=${max_request_size}
- PROXY_READ_TIMEOUT=${read_timeout:-60000}ms
- PROXY_CONNECT_TIMEOUT=${connection_timeout:-10000}ms
compreface-core:
restart: always
image: ${registry}compreface-core:${CORE_VERSION}
container_name: "compreface-core"
environment:
- ML_PORT=3000
- IMG_LENGTH_LIMIT=${max_detect_size}
- UWSGI_PROCESSES=${uwsgi_processes:-2}
- UWSGI_THREADS=${uwsgi_threads:-1}
healthcheck:
test: curl --fail http://localhost:3000/healthcheck || exit 1
interval: 10s
retries: 0
start_period: 0s
timeout: 1s
5 对镜像进行持久化更改:
5.1 docker commit
将安装好依赖环境后的容器制作成镜像,完成更改后保持容器运行,运行如下指令
docker commit oldImg newImg:v1.1
oldImg 可为容器名或其哈希值 运行 docker ps 查看 ,newImg:v1.1为自定义新容器名
此方法会保留容器中所有可写区的更改,非可写区如挂载文件夹区不会在新镜像中
因此,构造环境时需注意此环境是否需要随镜像移植,如果需要,请不要在挂载文件夹中构建
例如:使用npm install指令在挂载文件夹安装环境,安装后环境可用。将此环境制作成镜像后,在新电脑导入镜像,并使用原挂载文件夹复制件完成新容器构建,在新容器中,环境可能将不可用。因此,建议将需要迁移的环境在镜像可写区搭建,省去后期工作。
5.2 Dockerfile
使用Dockerfile构造镜像并完成持久化更改,如环境依赖的下载和安装,文件的复制。
5.3 两种方法对比
docker commit 的持久化更改相当于在原镜像上加一层可写层的更改,每commit一次叠一层,多次叠加后镜像会十分臃肿,且不具备可读性,但是好处是方便快捷。Dockerfile 对镜像的更改在文件中可以读到,后续操作性和可读性都比较好。个人建议测试迁移时commit,正式迁移时使用Dockerfile制作。
6 镜像迁移
6.1 打包镜像
docker save -o myImg.tar 镜像名[:标签]
可同时打包多个镜像
6.2 读取镜像
docker load -i myImg.tar
读入的镜像名与原系统中镜像名相同
7 几个要点
将部署流程融入于配置中,最后的部署步骤越简单越好,以 docker compose up -d 一句指令完成部署为佳
挂载文件夹极大便利了更改配置文件流程,但是需注意在挂载路径下执行读写操作有更大的读写时间开销
Comments NOTHING