【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是什么?docker介绍docker指令 二、docker有什么用?三、docker怎么用?FROMMAINTAINERRUNENVWORKDIRCOPY、ADDUSEREXPOSE实例 四、docker注意事项docker容器中使用某些宿主机设备时需要额外的权限docker容器中文件内容中…...
javaee之黑马乐优商城1
问题1:整体的项目架构与技术选型 技术选型 开发环境 域名测试 如何把项目起来,以及每一个目录结构大概是什么样子 通过webpack去启动了有个项目,这里还是热部署,文件改动,内容就会改动 Dev这个命令会生成一个本地循环…...
滴滴前端一面面经(已挂)
面试过程 前段时间面试了滴滴的前端实习岗位,大厂的面试机会很难得,复习了很多前端知识。 拿到面试机会,是在地铁上投递了boss,当时hr看了我的简历就和我约了第二天的面试。电脑也没带,晚上就用手机复习了前端的一些…...
靠谱的适合上班族做的副业,这几种一定要试试!
作为上班族,我们的时间常常被工作和日常生活所占据,很少有机会去追求自己的兴趣和创造额外的收入来源。然而,副业是一种理想的选择,可以帮助我们实现多样化的发展,并在经济上取得一定的突破。正如书中所言:…...
VSCode连接服务器
Pycharm连接服务器参考我的另一篇文章Pycharm远程连接服务器_pycharm进入服务器虚拟环境终端_Jumbo星的博客-CSDN博客 本质上Pycharm和VSCode都只是IDE,没有什么好坏之分。但是因为Pycharm连接服务器(准确来说是部署)需要买professional。而…...
Python爬虫网络安全:优劣势和适用范围分析
各位Python程序猿大佬们!在当今数字化时代,网络安全是至关重要的。保护你的网络通信安全对于个人和组织来说都是非常重要的任务。在本文中,我将与你一起探讨Python网络安全编程中的代理、虚拟专用网络和TLS这三个关键概念,分析它们…...
swift APP缓存
这里的APP缓存是指Cache文件夹里的内容,iOS系统从iOS 10开始就支持系统自动清理功能了。 建议重要的内容不要放到 Cache文件夹中。 一、获取缓存 /// 获取缓存大小public static func getCacheSize() -> String {let folderPath NSSearchPathForDirectoriesIn…...
Linux中的dpkg指令(dpkg -l | grep XXX等)
dpkg是Debian包管理系统中的一个工具,用于在Linux系统中安装、升级、删除和管理软件包。它是Debian、Ubuntu以及基于它们的发行版中的包管理器。 dpkg 有很多用法,常用之举例:dpkg -l | grep apt 显示系统中安装的与apt相关(命名)…...
import type {} from ‘module‘ 具体解释
import type { AxiosInstance, AxiosRequestConfig } from axiosimport type { RequestConfig, RequestInterceptors } from ./typesimport type {} from module 是 TypeScript 中的一种导入语法,用于导入类型声明而不导入具体的值,它告诉 TypeScript 编…...
十年JAVA搬砖路——数据结构线性结构
线性结构 线性表是一种数据结构,用于存储一组有序的数据元素。它的特点是数据元素之间存在一对一的关系,每个元素只有一个前驱和一个后继(除了第一个元素和最后一个元素)。线性表可以用数组或链表来实现。 数据是指事物的符号表…...
Mybatis为什么需要预编译等一系列问题
1 SQL 预编译 SQL 预编译是一种提高数据库访问效率的技术,它通过将 SQL 语句预编译并存储在数据库中,减少每次执行时需要进行解析和编译的开销,从而提高数据库访问的效率。 在预编译阶段,SQL 语句会被解析并转换为可执行的二进制…...
【JVM基础】JVM入门基础
目录 JVM的位置三种 JVMJVM体系结构类加载器双亲委派机制概念例子作用 沙箱安全机制组成沙箱的基本组件 NativeJNI:Java Native Interface(本地方法接口)Native Method Stack(本地方法栈) PC寄存器(Program…...
【SpringBoot】详细介绍Spring Boot中@Component
在Spring Boot中,Component是一个通用的注解,用于标识一个类是Spring框架中的组件。Component注解是Spring的核心注解之一,它提供了自动扫描和实例化bean的功能。 具体来说,Component注解的作用是将一个普通的Java类转化为Spring…...
Redis执行lua脚本-Time函数-获取当前时间
演变过程: TIME 命令返回当前服务器的时间,包含两个条目 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扩展插件,可以方便地从Chrome控制台导入JavaScript和CSS资源。它可以帮助我们在开发过程中快速调试和测试第三方库或代码。 下载地址 安装 要安装Console-Import,请在Chrome网上应用店搜索“Console-Import”,然…...
构建稳定的爬虫系统:如何选择合适的HTTP代理服务商
在构建一个稳定、高效的爬虫系统中,选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商,来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…...
Python爬虫基础:使用Scrapy库初步探索
Scrapy是Python中最流行的网页爬虫框架之一,强大且功能丰富。通过Scrapy,你可以快速创建一个爬虫,高效地抓取和处理网络数据。在这篇文章中,我们将介绍如何使用Scrapy构建一个基础的爬虫。 一、Scrapy简介及安装 Scrapy是一个用…...
MacBookPro重装系统图文教程
关机 长按电源按钮10s即可强制关机 快捷键选择 Intel Command-R:获得安装过的最新的 macOS,但不会升级到最高版Option-Command-R:获得与 Mac 兼容的最新版 macOSShift-Option-Command-R:获得 Mac 自带的 macOS 或者与它最接近且…...
Android 6.0长按电源键添加重启菜单
重启图标: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股票交易---均值回归
免责声明:本文提供的信息仅用于教育目的,不应被视为专业投资建议。在做出投资决策时进行自己的研究并谨慎行事非常重要。投资涉及风险,您做出的任何投资决定完全由您自己负责。 在本文中,您将了解什么是均值回归交易算法ÿ…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
