• 【Docker】docker入门之dockerfile编写


    前言

    嗨喽,大家好。本篇文章主要记录博主在学习docker以及编写dockerfile的过程,记录使用docker过程中遇到的问题。

    一、docker是什么?

    docker介绍

    • Docker 是一种开源的容器化平台,用于构建、部署和运行应用程序。它提供了一种轻量级、灵活和可移植的方式来打包应用程序及其依赖项,并创建一个独立、隔离的运行环境,称为容器。
    • 容器是一种虚拟化技术,相比传统的虚拟机,它更加轻量级和快速。在 Docker 中,每个容器都运行在同一主机的操作系统上,并共享主机的内核,从而减少了资源的占用和启动时间的消耗。
    • 使用 Docker,您可以方便地将应用程序和其依赖项打包成一个可移植、自包含的镜像文件。这些镜像可以在任何支持 Docker 的环境中部署和运行,无论是开发人员的本地机器,云平台还是其他服务器。

    虚拟机类似,docker需要使用到的容器也是一种虚拟化技术。我们编写dockerfile去实现这个docker镜像的定义,通过dockerfile产生一个docker镜像,再使用docker镜像创建一个容器来使用。这样看来,docker更像一个类型,dockerfile产生的镜像与类的作用很相似,而容器就是镜像实例化出的对象。

    docker指令

    # 运行(创建)一个容器,具体的选项可以查找资料学习这里就不一一列举
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    # 启动容器
    docker start name
    # 进入容器
    docker attach name
    # 停止容器
    docker stop name
    # 加载容器
    docker load -i name
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    二、docker有什么用?

    我们手机上面有各种各样的app,但是每个手机的系统大部分都是不一样的,那么这些app如何适配这些不同的系统无疑是一个难题。而docker提供了一种轻量级、灵活、可移植的方式打包应用程序及其依赖项,并创建一个独立隔离的运行环境,这很好的解决了应用程序在每个不同环境的适配问题。
    总的来说,docker可以提供:

    • 快速构建和部署应用程序,减少配置和依赖问题。
    • 简化多个环境之间的迁移和部署。
    • 提供隔离和安全性,确保应用程序之间的互不干扰。
    • 可以水平扩展应用程序,根据需要增加或减少容器的数量。

    三、docker怎么用?

    制作一个docker镜像需要编写相应的dockerfile,dockerfile的内容是由一系列指令构成的,每个指令都会构建一个新的镜像层,因为 Docker 的镜像是通过多个只读的文件系统层堆叠而成的。每个 Dockerfile 指令都会生成一个新的镜像层,并在前一层的基础上进行修改。这样的设计使得 Docker 镜像具有可重复构建和高度可定制的特性。

    FROM

    一个docker镜像由很多层构成,其中第一层就是基础镜像,基础镜像是构建其他镜像的起点,它提供了一个预装和配置好的操作系统和环境。

    # 使用ubuntu20.04
    FROM ubuntu:20.04
    
    # 使用ubuntu最新版
    FROM ubuntu:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5

    MAINTAINER

    指定维护者名称和联系信息,用于标识镜像的作者。

    MAINTAINER NAME Authors ContactInformation
    
    • 1

    RUN

    RUN命令用来在容器中执行命令,用于安装软件包、运行脚本等。

    # 安装软件包
    RUN sudo apt install gcc gcc-c++ make cmake && \
        mv -f test.txt /root # shell命令
    
    • 1
    • 2
    • 3

    ENV

    设置容器中的环境变量。

    # 定义环境变量
    ENV CPU_ARCH=aarch64
    
    • 1
    • 2

    WORKDIR

    设置工作目录。

    # 设置工种目录为/root,相当于cd /root
    WORKDIR /root
    
    • 1
    • 2

    COPY、ADD

    拷Dockerfile目录下的文件到镜像中。这里需要说明的是当我们是使用dockerfile制作镜像的时候能且仅能添加当前dockerfile所在目录下的文件到dockerfile中去,同时在开始构建镜像的时候会计算当前目录下所有文件的大小。因此,在构建docker镜像时最好将不必要的文件删除或者移出dockerfile的目录中。

    • COPY可以添加当前目录下的文件到镜像中。
    • ADD除了拥有COPY的功能外,还附加了一些功能。如:自动解压被复制的压缩文件,可以从远程URL中复制文件到镜像中。
    # COPY 被复制的文件 存放路径
    COPY TEST /root/
    
    # ADD 被复制的文件 存放路径
    ADD TEST /root/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    USER

    设置运行用户。

    # 设置为root用户
    USER root
    
    • 1
    • 2

    EXPOSE

    对外暴露容器端口。

    # 如要使用shell,可以暴露22号端口
    EPXOSE 22
    
    • 1
    • 2

    实例

    使用dokcer构建镜像命令如下:

    docker build -t image_name:version .
    其中:
    - 还可以使用-f选项指定dokcerfile文件
    - version代表dockerfile中使用的基础镜像的版本
    - 最后的点表示上下文目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 下面这段dockerfile是百度paddle中的一段开源的dockerfile
    FROM ubuntu:18.04
    MAINTAINER PaddlePaddle Authors .com>
    
    WORKDIR /workspace
    
    ENV PATH /opt/python3/bin:/root/.local/bin:$PATH
    ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/python3/lib
    
    # Install Python
    ADD https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.7.12.1-Linux-x86_64.sh miniconda3.sh
    RUN /bin/bash miniconda3.sh -b -p /opt/python3/ && \
        rm -f miniconda3.sh
    
    RUN mkdir -p ~/.pip && \
        echo "[global]" >> ~/.pip/pip.conf && \
        echo "trusted-host =  mirrors.aliyun.com" >> ~/.pip/pip.conf && \
        echo "index-url = https://mirrors.aliyun.com/pypi/simple" >> ~/.pip/pip.conf
    
    RUN echo "channels:" >> ~/.condarc && \
        echo "  - conda-forge" >> ~/.condarc && \
        echo "  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/" >> ~/.condarc && \
        echo "  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/" >> ~/.condarc && \
        echo "  - defaults" >> ~/.condarc && \
        echo "custom_channels:" >> ~/.condarc && \
        echo "  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >> ~/.condarc && \
        echo "show_channel_urls: true" >> ~/.condarc && \
        echo "channel_priority: strict" >> ~/.condarc
        
    # Install R
    RUN conda install -y r -c conda-forge
    
    # Install PaddlePaddle
    RUN /opt/python3/bin/python -m pip install \
        https://paddle-wheel.bj.bcebos.com/0.0.0-cpu-mkl/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl
    
    # Install reticulate, R interface to Python
    RUN Rscript -e 'install.packages("reticulate", repos="https://cran.rstudio.com")'
    
    COPY example example
    RUN cd example && \
        curl -O https://paddle-inference-dist.cdn.bcebos.com/mobilenet-test-model-data.tar.gz && \
        tar -zxvf mobilenet-test-model-data.tar.gz && rm mobilenet-test-model-data.tar.gz 
    #
    EXPOSE 22
    
    • 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
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    四、docker注意事项

    docker容器中使用某些宿主机设备时需要额外的权限

    docker容器并没有使用宿主机上某些设备的权限,这需要我们在创建容器时配置一些参数,允许容器使用宿主机上的设备。参数如下:

    docker run --privileged # 创建容器时加上参数
    
    • 1

    docker容器中文件内容中文出现乱码

    这是因为解码方式没有指定,可以使用如下的操作修复中文解码:

    # dockerfile中添加以下内容
    # Fix locales to en_US.UTF-8
    RUN apt-get install -y locales
    RUN localedef -i en_US -f UTF-8 en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LC_ALL en_US.UTF-8
    
    # 在有中文的文件中添加以下注释
    # -*- coding: utf-8 -*-
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    dockerfile使用不了软件源,地址解析失败

    可以通过在Docker守护进程配置文件中设置默认的DNS服务器来实现。请按照以下步骤进行操作:
    打开 Docker 守护进程的配置文件 /etc/docker/daemon.json,如果该文件不存在,可以创建一个新文件。

    # 更改daemonjson
    {
      "dns": ["8.8.8.8"]
    }
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    超强换元法,二重积分计算的核武器!(雅可比行列式超通俗讲解)
    vue中的路由守卫/元信息/嵌套路由
    非小细胞肺癌靶向用药整理
    反射、枚举及lambda表达式
    自接触svn之后对git的了解及其应用
    花生壳内网穿透+Windows系统,如何搭建网站?
    2023数学建模国赛游记
    Webpack打包生产环境进行优化处理
    【ARM Coresight 系列文章 21 -- SoC-400 介绍 】
    【SpringMvc】SpringMvc +MyBatis整理
  • 原文地址:https://blog.csdn.net/qq_59456417/article/details/132563418