当前位置: 首页 > news >正文

【Docker】docker入门之dockerfile编写

文章目录

  • 前言
  • 一、docker是什么?
    • docker介绍
    • docker指令
  • 二、docker有什么用?
  • 三、docker怎么用?
    • FROM
    • MAINTAINER
    • RUN
    • ENV
    • WORKDIR
    • COPY、ADD
    • USER
    • EXPOSE
    • 实例
  • 四、docker注意事项
    • docker容器中使用某些宿主机设备时需要额外的权限
    • docker容器中文件内容中文出现乱码
    • dockerfile使用不了软件源,地址解析失败
    • docker容器ssh连接问题

前言

嗨喽,大家好。本篇文章主要记录博主在学习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

二、docker有什么用?

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

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

三、docker怎么用?

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

FROM

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

# 使用ubuntu20.04
FROM ubuntu:20.04# 使用ubuntu最新版
FROM ubuntu:latest

MAINTAINER

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

MAINTAINER NAME Authors ContactInformation

RUN

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

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

ENV

设置容器中的环境变量。

# 定义环境变量
ENV CPU_ARCH=aarch64

WORKDIR

设置工作目录。

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

COPY、ADD

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

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

USER

设置运行用户。

# 设置为root用户
USER root

EXPOSE

对外暴露容器端口。

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

实例

# 下面这段dockerfile是百度paddle中的一段开源的dockerfile
FROM ubuntu:18.04
MAINTAINER PaddlePaddle Authors <paddle-dev@baidu.com>WORKDIR /workspaceENV 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.shRUN 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.confRUN 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

四、docker注意事项

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

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

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

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 -*-

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

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

# 更改daemonjson
{"dns": ["8.8.8.8"]
}

docker容器ssh连接问题

  • docker容器想要通过ssh来连接,不可以直接通过容器的ip地址,我猜测因为容器ip地址只是宿主机给容器分配的一个ip地址,这个地址属于宿主机的内网,对外网是不可见的因此外网并不能ping通容器的ip地址,而宿主机却可以。
  • 想要使用ssh连接容器,必须将容器的22端口映射到宿主机的某个端口号上,然后通过宿主机的ip地址和映射的端口连接。

相关文章:

【Docker】docker入门之dockerfile编写

文章目录 前言一、docker是什么&#xff1f;docker介绍docker指令 二、docker有什么用&#xff1f;三、docker怎么用&#xff1f;FROMMAINTAINERRUNENVWORKDIRCOPY、ADDUSEREXPOSE实例 四、docker注意事项docker容器中使用某些宿主机设备时需要额外的权限docker容器中文件内容中…...

javaee之黑马乐优商城1

问题1&#xff1a;整体的项目架构与技术选型 技术选型 开发环境 域名测试 如何把项目起来&#xff0c;以及每一个目录结构大概是什么样子 通过webpack去启动了有个项目&#xff0c;这里还是热部署&#xff0c;文件改动&#xff0c;内容就会改动 Dev这个命令会生成一个本地循环…...

滴滴前端一面面经(已挂)

面试过程 前段时间面试了滴滴的前端实习岗位&#xff0c;大厂的面试机会很难得&#xff0c;复习了很多前端知识。 拿到面试机会&#xff0c;是在地铁上投递了boss&#xff0c;当时hr看了我的简历就和我约了第二天的面试。电脑也没带&#xff0c;晚上就用手机复习了前端的一些…...

靠谱的适合上班族做的副业,这几种一定要试试!

作为上班族&#xff0c;我们的时间常常被工作和日常生活所占据&#xff0c;很少有机会去追求自己的兴趣和创造额外的收入来源。然而&#xff0c;副业是一种理想的选择&#xff0c;可以帮助我们实现多样化的发展&#xff0c;并在经济上取得一定的突破。正如书中所言&#xff1a;…...

VSCode连接服务器

Pycharm连接服务器参考我的另一篇文章Pycharm远程连接服务器_pycharm进入服务器虚拟环境终端_Jumbo星的博客-CSDN博客 本质上Pycharm和VSCode都只是IDE&#xff0c;没有什么好坏之分。但是因为Pycharm连接服务器&#xff08;准确来说是部署&#xff09;需要买professional。而…...

Python爬虫网络安全:优劣势和适用范围分析

各位Python程序猿大佬们&#xff01;在当今数字化时代&#xff0c;网络安全是至关重要的。保护你的网络通信安全对于个人和组织来说都是非常重要的任务。在本文中&#xff0c;我将与你一起探讨Python网络安全编程中的代理、虚拟专用网络和TLS这三个关键概念&#xff0c;分析它们…...

swift APP缓存

这里的APP缓存是指Cache文件夹里的内容&#xff0c;iOS系统从iOS 10开始就支持系统自动清理功能了。 建议重要的内容不要放到 Cache文件夹中。 一、获取缓存 /// 获取缓存大小public static func getCacheSize() -> String {let folderPath NSSearchPathForDirectoriesIn…...

Linux中的dpkg指令(dpkg -l | grep XXX等)

dpkg是Debian包管理系统中的一个工具&#xff0c;用于在Linux系统中安装、升级、删除和管理软件包。它是Debian、Ubuntu以及基于它们的发行版中的包管理器。 dpkg 有很多用法&#xff0c;常用之举例:dpkg -l | grep apt 显示系统中安装的与apt相关&#xff08;命名&#xff09…...

import type {} from ‘module‘ 具体解释

import type { AxiosInstance, AxiosRequestConfig } from axiosimport type { RequestConfig, RequestInterceptors } from ./typesimport type {} from module 是 TypeScript 中的一种导入语法&#xff0c;用于导入类型声明而不导入具体的值&#xff0c;它告诉 TypeScript 编…...

十年JAVA搬砖路——数据结构线性结构

线性结构 线性表是一种数据结构&#xff0c;用于存储一组有序的数据元素。它的特点是数据元素之间存在一对一的关系&#xff0c;每个元素只有一个前驱和一个后继&#xff08;除了第一个元素和最后一个元素&#xff09;。线性表可以用数组或链表来实现。 数据是指事物的符号表…...

Mybatis为什么需要预编译等一系列问题

1 SQL 预编译 SQL 预编译是一种提高数据库访问效率的技术&#xff0c;它通过将 SQL 语句预编译并存储在数据库中&#xff0c;减少每次执行时需要进行解析和编译的开销&#xff0c;从而提高数据库访问的效率。 在预编译阶段&#xff0c;SQL 语句会被解析并转换为可执行的二进制…...

【JVM基础】JVM入门基础

目录 JVM的位置三种 JVMJVM体系结构类加载器双亲委派机制概念例子作用 沙箱安全机制组成沙箱的基本组件 NativeJNI&#xff1a;Java Native Interface&#xff08;本地方法接口&#xff09;Native Method Stack&#xff08;本地方法栈&#xff09; PC寄存器&#xff08;Program…...

【SpringBoot】详细介绍Spring Boot中@Component

在Spring Boot中&#xff0c;Component是一个通用的注解&#xff0c;用于标识一个类是Spring框架中的组件。Component注解是Spring的核心注解之一&#xff0c;它提供了自动扫描和实例化bean的功能。 具体来说&#xff0c;Component注解的作用是将一个普通的Java类转化为Spring…...

Redis执行lua脚本-Time函数-获取当前时间

演变过程&#xff1a; TIME 命令返回当前服务器的时间&#xff0c;包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…...

前端无需install快速调试npm包,Console-Import使用

Console-Import是一个Chrome扩展插件&#xff0c;可以方便地从Chrome控制台导入JavaScript和CSS资源。它可以帮助我们在开发过程中快速调试和测试第三方库或代码。 下载地址 安装 要安装Console-Import&#xff0c;请在Chrome网上应用店搜索“Console-Import”&#xff0c;然…...

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商

在构建一个稳定、高效的爬虫系统中&#xff0c;选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商&#xff0c;来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…...

Python爬虫基础:使用Scrapy库初步探索

Scrapy是Python中最流行的网页爬虫框架之一&#xff0c;强大且功能丰富。通过Scrapy&#xff0c;你可以快速创建一个爬虫&#xff0c;高效地抓取和处理网络数据。在这篇文章中&#xff0c;我们将介绍如何使用Scrapy构建一个基础的爬虫。 一、Scrapy简介及安装 Scrapy是一个用…...

MacBookPro重装系统图文教程

关机 长按电源按钮10s即可强制关机 快捷键选择 Intel Command-R&#xff1a;获得安装过的最新的 macOS&#xff0c;但不会升级到最高版Option-Command-R&#xff1a;获得与 Mac 兼容的最新版 macOSShift-Option-Command-R&#xff1a;获得 Mac 自带的 macOS 或者与它最接近且…...

Android 6.0长按电源键添加重启菜单

重启图标&#xff1a;frameworks/base/core/res/res/drawable-hdpi/ic_lock_power_reboot_alpha.pngframeworks/base/core/res/res/drawable/ic_lock_power_reboot.xml <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2014 The And…...

Python股票交易---均值回归

免责声明&#xff1a;本文提供的信息仅用于教育目的&#xff0c;不应被视为专业投资建议。在做出投资决策时进行自己的研究并谨慎行事非常重要。投资涉及风险&#xff0c;您做出的任何投资决定完全由您自己负责。 在本文中&#xff0c;您将了解什么是均值回归交易算法&#xff…...

基于BLE信号强度的寻物游戏:用CircuitPython实现无线接近探测

1. 项目概述&#xff1a;一个用蓝牙信号“捉迷藏”的硬件游戏几年前我第一次接触Adafruit的Circuit Playground系列开发板时&#xff0c;就被它那种“开箱即玩”的理念吸引了。它把LED、按钮、传感器都集成在一块板子上&#xff0c;让你不用焊接就能快速验证想法。后来出的Circ…...

从Awesome List到个人知识库:开发者如何高效筛选与组织技术资源

1. 项目概述&#xff1a;一份面向开发者的“Awesome List”清单 如果你在GitHub上混迹过一段时间&#xff0c;尤其是热衷于探索前沿技术、寻找优质学习资源或开源项目&#xff0c;那么你大概率见过或者使用过一种特殊的仓库—— Awesome List 。简单来说&#xff0c;这是一个…...

Step-by-Step知识蒸馏:让小模型学会大模型的推理过程

1. 项目概述&#xff1a;当“小个子”也能学会“大智慧”最近在模型压缩和知识蒸馏的圈子里&#xff0c;一个挺有意思的讨论点又热了起来&#xff1a;我们有没有可能让一个参数规模小得多的模型&#xff0c;通过一种更精细、更“手把手”的教学方式&#xff0c;达到甚至逼近那些…...

容器镜像深度解析与生产级部署实战指南

1. 项目概述&#xff1a;从容器镜像名到高效部署实践的深度解析最近在梳理内部容器镜像仓库时&#xff0c;一个名为containers/ramalama的镜像引起了我的注意。这个名字乍一看有些无厘头&#xff0c;甚至带点戏谑&#xff0c;但在容器化部署的实践中&#xff0c;这类看似随意的…...

LeetCode102:二叉树层序遍历详解(附图解)

题目LeetCode102给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。输入&#xff1a;root [3,9,20,null,null,15,7]输出&#xff1a;[[3],[9,20],[15,7]]Python解法代码示例&#xff08;广…...

AI驱动Figma设计自动化:Claude插件实现自然语言到UI生成

1. 项目概述&#xff1a;当设计工具遇上AI助手最近在和一些资深UI/UX设计师朋友交流时&#xff0c;大家不约而同地提到了一个痛点&#xff1a;在Figma这类设计工具里&#xff0c;从概念到高保真原型的转化过程&#xff0c;依然充满了大量重复、机械的劳动。比如&#xff0c;我需…...

Linux系统信息查询全攻略:从内核到发行版的深度解析与脚本实践

1. 项目概述&#xff1a;一个看似简单却暗藏玄机的基础操作“查看Linux系统版本”&#xff0c;这几乎是每个运维工程师、开发人员乃至普通用户在接触Linux系统时&#xff0c;第一个需要掌握的命令。它简单到常常被新手教程一笔带过&#xff0c;却又复杂到足以让老手在排查问题时…...

AI 术语通俗词典:优化器

优化器是机器学习、深度学习、神经网络和人工智能中非常核心的一个术语。它用来描述&#xff1a;模型在得到梯度之后&#xff0c;如何更新权重和偏置&#xff0c;使损失函数逐渐变小。 换句话说&#xff0c;优化器是在回答&#xff1a;模型已经知道自己错在哪里之后&#xff0c…...

探索Mod Assistant:Beat Saber模组管理工具的高效解决方案

探索Mod Assistant&#xff1a;Beat Saber模组管理工具的高效解决方案 【免费下载链接】ModAssistant Simple Beat Saber Mod Installer 项目地址: https://gitcode.com/gh_mirrors/mo/ModAssistant Beat Saber模组管理工具Mod Assistant是一款专为PC版Beat Saber设计的…...

【ElevenLabs卡纳达文语音实战指南】:2024年唯一经生产环境验证的7步本地化部署方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs卡纳达文语音技术概览与生产价值定位 ElevenLabs 作为全球领先的文本转语音&#xff08;TTS&#xff09;平台&#xff0c;自2023年Q4起正式支持卡纳达语&#xff08;Kannada&#xff09;&…...