Post

Study notes:docker

Study notes:docker

笔者虽然写过一堆时尚小垃圾,还写了像模像样的README文档,但实际上笔者只是借Claude3.5狐假虎威,自己基本不会啥代码。所以,这篇Note是为我自己梳理docker的结构,以便于更好地作为甲方向Claude提要求用的,里面记录的东西对各位读者大能来说估计没什么用😸看个乐子吧。

Docker简介

Docker是一个开源的容器化平台,让开发者能够将应用程序及其依赖项打包到一个可移植的容器中,以确保应用在任何环境中都能一致运行。

Docker的核心概念

  • 镜像:一个独立的包含项目所有运行依赖的只读软件包,在构建时可以通过各种安装命令(如apt、pip等)向里面添加package,使得项目可以完全依赖这个环境来运行。镜像可以自己构建,也可以?从Docker Hub拉取。
  • Dockerfile:构建镜像的脚本。我的一个用于NAS同步远程服务器上计算化学数据项目的Dockerfile如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    FROM python:3.9-slim # 通常使用轻量级python环境为基础构建docker
    
    WORKDIR /app # 设置工作目录
      
    # RUN表示安装进docker镜像,此处先使用apt来安装所需的包。例如,核心rsync,同步时需要的openssh,适应远程中文目录的locales等
    RUN apt-get update && \
        apt-get install -y rsync openssh-client locales procps && \
        sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
        sed -i -e 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen && \
        locale-gen && \
        apt-get clean && rm -rf /var/lib/apt/lists/* && \
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
        echo "Asia/Shanghai" > /etc/timezone
    #安装完毕后使用apt-get clean删除不再需要的缓存,以减小docker镜像体积
    
    # 设置环境变量
    ENV LANG=zh_CN.UTF-8
    ENV LC_ALL=zh_CN.UTF-8
      
    # 创建项目目录
    RUN mkdir -p /app/keys /app/sync_data /app/templates /app/Orb_Viewer
      
    # 复制项目文件到镜像内
    COPY app.py requirements.txt /app/
    COPY templates /app/templates/
    COPY Orb_Viewer /app/Orb_Viewer/
      
    # 使用pip向docker内安装python包
    RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn -r requirements.txt || \
        pip install --no-cache-dir -r requirements.txt
      
    # 设置环境变量
    ENV FLASK_APP=app.py
    ENV FLASK_ENV=production
      
    # 为了保存同步下来的数据,进行卷挂载
    VOLUME ["/app/sync_data", "/app/keys"]
      
    # 如有web服务,可以对外暴露端口
    EXPOSE 5001 5011
      
    # 应用入口,大致表示启动镜像时该运行什么命令
    CMD ["python", "app.py"]
    
  • 容器:是镜像的运行载体,运行时通常不改变镜像内容。容器内的文件除非做永久化,否则是临时的。

在打包完成后,docker镜像可以轻松移植到各种平台使用,而无需担心环境问题。同时,NAS服务器上允许对docker容器进行远程管理,很适合用来部署一些web服务。

同时,docker也可以用来管理宿主机的环境,使用卷挂载允许容器内的程序处理宿主机的文件,并将结果写回宿主机。

Docker基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# docker pull从docker hub拉取镜像
docker pull nginx 

# docker build自己构建镜像
sudo docker build -t rsync-sync-nas .

# docker run运行容器 
# -p是映射到宿主机的端口设置
# -v是映射到宿主机的目录设置
sudo docker run -d \
  --name rsync-sync \
  -p 5010:5001 \
  -p 5011:5011 \
  -v $(pwd)/sync_data:/app/sync_data \
  -v $(pwd)/templates:/app/templates \
  -v $(pwd)/app.py:/app/app.py \
  rsync-sync-nas

# docker ps查看运行中的容器
docker ps
This post is licensed under CC BY 4.0 by the author.
Total hits!