【Docker】docker入门之dockerfile编写

这篇具有很好参考价值的文章主要介绍了【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

二、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

实例

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

docker build -t image_name:version .
其中:
- 还可以使用-f选项指定dokcerfile文件
- version代表dockerfile中使用的基础镜像的版本
- 最后的点表示上下文目录
# 下面这段dockerfile是百度paddle中的一段开源的dockerfile
FROM ubuntu:18.04
MAINTAINER PaddlePaddle Authors <paddle-dev@baidu.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

四、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,如果该文件不存在,可以创建一个新文件。文章来源地址https://www.toymoban.com/news/detail-693592.html

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

docker容器ssh连接问题

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

到了这里,关于【Docker】docker入门之dockerfile编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker技术入门| Part03:Dockerfile详解(Dockerfile概念、Dockerfile 指令、使用Dockerfile构建镜像)

    Docker镜像原理 Docker镜像是由特殊的文件系统叠加而成 最底端是bootfs,并使用宿主机的bootfs 第二层是root文件系统rootfs,称为base image 然后再往上可以叠加其他的镜像文件 统文件系统(UnionFile System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统的视角,这样就隐

    2024年02月09日
    浏览(64)
  • Docker基础入门:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月10日
    浏览(55)
  • 【Docker】Docker 仓库管理和Docker Dockerfile

    作者简介: 辭七七,目前大二,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,

    2024年02月05日
    浏览(41)
  • docker/Dockerfile/docker compose

    https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/ 在x86环境下,由容器统一管理开发及运行环境。 Docker https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/ sudo dockerd 手动启动docker sudo service docker start 后台启动docker sudo dockerd 显示启动docker,看日志中的docker /var/log/docker.log sudo apt-key adv --keyserver key

    2024年02月08日
    浏览(45)
  • [Docker]五.Docker中Dockerfile详解

    Dockerfile 就是用来构建 docker 镜像的构建文件 新建一个名为 Dockerfile 文件,并在文件内添加以下内容:         要构建并实现上面的镜像, 以前的办法: 下载一个centos镜像,通过镜像启动容器,进入容器,然后下载net-tools软件,然后cd 到wwwroot目录,执行/bin/bash,然后退出容器,把这个容器

    2024年02月06日
    浏览(43)
  • Docker容器:docker镜像的创建及dockerfile

    创建镜像有三种方法:基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.1 启动镜像 1.2 生成新镜像 2.1 OPENVZ 下载模板 2.2 导入容器生成镜像 3.1 dockerfile结构及分层 (1)dockerfile结构大致分为4个部分 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 Dockerfil

    2024年02月11日
    浏览(57)
  • 初识Docker:(7)查询Docker镜像的DockerFile

    我们知道了根据dockerfile来制作镜像,如果给你一个现成的镜像,你能逆向查看出dockerfile吗? 否则,你怎么知道该镜像使用的是CMD还是ENTRYPOINT ,使用的是shell格式还是CMD格式?由于格式决定了docker内部如何产生PID1进程,因此有必要逆向一下。 对于dockerfile,我们首先要有基本

    2024年02月12日
    浏览(45)
  • docker学习:dockerfile和docker-compose

    以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。 对于一个docker,例如python,我们需要其在构建成容器时,就有np。有以下两种方法: pull python,并run后,在里面pip install numpy,随后对这个容器进行打包保存 在pull python时,就将pip ins

    2024年02月08日
    浏览(44)
  • Docker Dockerfile Docker-compose学习笔记

    Docker目前支持Centos7及以后的版本。64位操作系统,内核版本至少为3.10 安装软件源,以及devicemapper存储类型 添加Docker yum源 安装Docker 启动Docker 测试是否能获取镜像 查看获取的镜像 生效配置信息 安装Docker需要保证你的电脑开启虚拟化 进入任务管理器→点击性能→看一下CPU是

    2024年02月12日
    浏览(46)
  • 《Docker极简教程》--Dockerfile--Dockerfile的基本语法

    Dockerfile是一种文本文件,用于定义Docker镜像的内容和构建步骤。它包含一系列指令,每个指令代表一个构建步骤,从基础镜像开始,逐步构建出最终的镜像。通过Dockerfile,用户可以精确地描述应用程序运行环境的配置、依赖项安装、文件复制等操作。这使得应用程序的部署

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包