Docker笔记

Sunsy 发布于 2025-06-22 1046 次阅读


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 一句指令完成部署为佳

挂载文件夹极大便利了更改配置文件流程,但是需注意在挂载路径下执行读写操作有更大的读写时间开销

此作者没有提供个人介绍。
最后更新于 2025-06-22