当前位置: 首页 > 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…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...