更新时间:2022-11-08 gmt 08:00

制作docker镜像-凯发k8国际娱乐官网入口

制作docker镜像,有以下两种方法。

  • 快照方式制作镜像(偶尔制作的镜像):在基础镜像上,比如ubuntu,先登录镜像系统并安装docker软件,然后整体制作快照,即可得到所需软件的docker镜像。
  • dockerfile方式制作镜像(经常更新的镜像):将软件安装的流程写成dockerfile,使用docker build构建成docker镜像。

快照方式制作镜像

如果后续镜像没有变化,可通过快照方式制作镜像。

快照方式制作镜像示例:

本示例中使用华为云创建一台云服务器,并使用快照方式制作bwa镜像。

  1. 云服务器创建成功后,在云服务器列表页,选中待登录的弹性云服务器。单击“远程登录”,输入ecs初始帐号,登录ecs。
    图1 云服务器列表
  2. 安装容器引擎
  3. 启动一个空白的基础容器,并进入容器。

    例如,启动一个centos容器。

    docker run -it centos
  4. 安装依赖包。
    yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
    yum -y install git
    yum -y install gcc automake autoconf libtool make
    yum install -y zlib zlib-devel
  5. 安装bwa软件,在github上下载bwa的源代码,并使用make编译。
    yum install bwa
    git clone https://github.com/lh3/bwa.git
    cd bwa;make

    请预先安装好git,并检查本机是否有ssh key设置。

  6. 输入exit退出容器。
  7. 查询容器id。
    docker ps -a
  8. 制作快照。
    docker commit -m "xx" -a "tsj" container-id tsj/image:tag

    例如:docker commit -m "test" -a "username" adb1127979a1 bwa:v0.7

    • -a:提交的镜像作者,例如tsj。
    • container-id:容器id。
    • -m:提交时的说明文字,例如xx。
    • tsj/image:tag:仓库名/镜像名:tag名,名称可自定义。
  9. 执行docker images命令查看制作完成的docker镜像。

dockerfile方式制作镜像

如果后续镜像经常变更(例如某个软件更新版本),建议使用dockerfile方式制作镜像。如果采用快照方式制作镜像,则每次变更都需要执行操作命令,制作过程较为繁琐。

dockerfile方式制作镜像是将快照制作的方式用dockerfile文件写出来,然后执行docker build -t tsj/image:tag .命令,自动完成镜像制作。

命令中“.”表示dockerfile文件的路径,“tsj/image:tag”表示仓库名/镜像名:tag名。

dockerfile方式制作镜像常用命令示例:

本例中使用华为云创建一台云服务器,制作centos镜像,并在镜像中放入图片文件,讲解dockerfile常用命令使用方法。

  1. 云服务器创建成功后,在云服务器列表页,选中待登录的弹性云服务器。单击“远程登录”,输入ecs初始帐号,登录ecs。
    图2 云服务器列表
  2. 安装容器引擎
  3. 创建一个名为workdir的目录。
    mkdir workdir
  4. 在该目录中创建一个dockerfile文件。
    cd ./workdir
    touch dockerfile
  5. 在该目录中创建一个空白文件abc.txt,创建一个webapp目录。
    touch abc.txt
    mkdir webapp
  6. 在该目录中下载一个网络图片。
    wget https://www.baidu.com/img/bd_logo1.png
  7. 执行vi dockerfile命令,进入dockerfile文件中,编写文件。
    #version 1.0.1
    from centos:latest
    maintainer ***u "***u@xxx.com"
    #设置root用户为后续命令的执行者
    user root
    #执行操作
    run yum update -y
    run yum install -y java
    #使用&&拼接命令
    run touch test.txt && echo "abc" >>abc.txt
    #对外暴露端口
    expose 80 8080 1038
    #复制文件
    copy abc.txt /opt/
    #复制文件夹
    copy /webapp /opt/webapp
    #复制图片文件
    copy bd_logo1.png /opt/
    #设置环境变量
    env webapp_port=9090
    #设置工作目录
    workdir /opt/
    #设置启动命令
    entrypoint ["ls"]
    #设置启动参数
    cmd ["-a", "-l"]
    #设置卷
    volume ["/data", "/var/www"]
    #设置子镜像的触发操作,该命令在创建镜像时不会执行,只有在后续依照该镜像创建新镜像时才会执行
    onbuild add . /app/src
    onbuild run echo "on build excuted" >> onbuild.txt
  8. 按键盘esc键,并执行:wq保存退出dockerfile。
  9. 制作镜像。
    docker build -t centos:v01 .

详细的dockerfile指令请参见、《容器镜像服务 编写高效的dockerfile》

使用获取的notebook基础镜像制作自定义镜像时,请参考以下说明。

  • dockerfile中不可以指定cmd以及entrypoint,否则会覆盖基础镜像启动脚本,引起异常。
  • 基础镜像中的pypi mirror,默认配置为华为云软件开发云的pypi mirror。您可以在容器中执行如下命令,查看pypi mirror。如果您想用其他pypi mirror,可将命令中的index-url参数修改为您需要的pypi mirror。
    cat /root/.pip/pip.conf.product
    [global]
    index-url = http://repo.myhuaweicloud.com/repository/pypi/simple
    format = columns
    [install]
    trusted-host=repo.myhuaweicloud.com

dockerfile基本语法

  • from

    指定待扩展的父级镜像(基础镜像)。除了注释以外,在文件的开头必须是一个from指令,后面的指令便在这个父级镜像的环境中运行,直到遇到下一个from指令。通过添加多个from命令,可以在同一个dockerefile文件中创建多个镜像。

  • maintainer

    声明创建镜像的作者信息:用户名、邮箱,非必须参数。

  • run

    用来修改镜像的命令,常用来安装库、程序以及配置程序。一条run指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行。

    run 语句具有以下形式。

    • run yum update:在/bin/sh路径中执行的指令命令。
    • run ["yum", "update"]:直接使用系统调用exec来执行。
    • run yum update && yum install nginx:使用&&符号将多条命令连接在同一条run语句中。
  • expose

    用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-p(大写)即可将expose里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。您也可以通过-p(小写)参数将dockerfile中expose中没有列出的端口设置成公开的。

  • copy

    将本地的文件或目录复制到镜像中。

  • add

    向新镜像中添加文件,这个文件可以是主机文件、网络文件或文件夹。

    • 第一个参数:源文件(夹)。
      • 如果是相对路径,必须是相对于dockerfile所在目录的相对路径。
      • 如果是url,会将文件先下载下来,然后再添加到镜像里。
    • 第二个参数:目标路径。
      • 如果源文件是主机上的zip或者tar形式的压缩文件,docker会先解压缩,然后将文件添加到镜像的指定位置。
      • 如果源文件是一个通过url指定的网络压缩文件,则不会解压。
  • volume

    在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问。

  • workdir

    为接下来执行的指令指定一个新的工作目录,这个目录可以使绝对目录,也可以是相对目录。根据需要,workdir可以被多次指定。当启动一个容器时,最后一条workdir指令所指的目录将作为容器运行的当前工作目录。

  • env

    设置容器运行的环境变量。在运行容器的时候,通过设置-e参数可以修改这个环境变量值,也可以添加新的环境变量。

    例如:

    docker run -e webapp_port=8000 -e webapp_host=www.example.com ...
  • cmd

    用来设置启动容器时默认运行的命令。

  • entrypoint

    用来指定容器启动时的默认运行的命令,与cmd类似。区别在于:运行容器时添加在镜像之后的参数,对entrypoint是拼接,cmd是覆盖。

    • 若在dockerfile中指定了容器启动时的默认运行命令为ls -l,则运行容器时默认启动命令为ls -l
      • entrypoint [ "ls", "-l"]:指定容器启动时的程序及参数为ls -l
      • docker run centos:当运行centos容器时,默认执行的命令是docker run centos ls -l
      • docker run centos -a:当运行centos容器时拼接了-a参数,则默认运行的命令是docker run centos ls -l -a
    • 若在dockerfile中指定了容器启动时的默认运行命令为--entrypoint,则在运行容器时若需要替换默认运行命令,可以通过添加--entrypoint参数来替换dockerfile中的指定。

      docker run gutianlangyu/test --entrypoint echo "hello world"

  • user

    为容器的运行及run、cmd、entrypoint等指令的运行指定用户或uid。

  • onbuild

    触发器指令。构建镜像时,docker的镜像构建器会将所有的onbuild指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用from指令指定父镜像为当前镜像时,才会触发执行。

    使用from以这个dockerfile构建出的镜像为父镜像,构建子镜像时:

    onbuild add . /app/src:自动执行add . /app/src

分享:
网站地图