入职必会-开发环境搭建49-Docker必会构建镜像

简介: 前面一直都是从Docker仓库中下载镜像然后使用。我们项目中可以通过Dockerfile构建自己的镜像。Dockerfile是由一系列命令和参数构成的文本文件,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。Dockerfile文件内容一般分为4部分● 基础镜像信息● 维护者信息● 镜像操作指令● 容器启动时执行的指令

Dockerfile构建镜像

Dockerfile 介绍

前面一直都是从Docker仓库中下载镜像然后使用。我们项目中可以通过Dockerfile构建自己的镜像。

Dockerfile是由一系列命令和参数构成的文本文件,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。Dockerfile文件内容一般分为4部分

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行的指令

Dockerfile构建镜像参考官网文档:https://docs.docker.com/build/building/packaging/

Dockerfile详细语法参考官网文档: https://docs.docker.com/engine/reference/builder

命令

作用

备注

FROM <image>

指定父镜像

指定Dockerfile基于哪个Image镜像构建

RUN <command>

执行命令

执行指定命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"]

WORKDIR <directory>

工作目录

指定容器内部的工作目录 如果没有创建则自动创建 / 表示绝对路径 没有/开头就使用上一条workdir的相对路径

CMD command param1 param2

容器启动命令

启动容器时候的默认命令

ADD <src>... <dest>

添加文件

Build的时候将宿主机的文件复制到Image镜像中,如果是一个压缩文件会在复制后自动解压

COPY <src>... <dest>

复制文件

和ADD相似,但是如果有压缩文件不会自动解压

ENV <key>=<value> ...

环境变量

指定环境变量

EXPOSE <port>

暴露端口

定义容器运行时监听的端口,给容器使用者看的

USER

指定执行用户

指定RUN CMD ENTRYPONT执行命令的用户

MAINTAINER <name>

作者信息

指定这个Dockerfile的作者信息,过时了

LABEL <key>=<value>

标签

指定Image镜像的元信息

ENTRYPOINT  command param1 param2

入口

设置镜像中应用的启动命令,在容器运行时调用

命令说明:

# 通过Dockerfile构建镜像
docker bulid -t 镜像名:版本 Dockerfile文件路径

Dockerfile 案例1

基于centos7镜像安装vim且默认登录后的工作目录为/opt

  1. 编写Dockerfile文件,内容如下:
FROM centos:7
MAINTAINER cxypa<cxypa@163.com>
RUN yum install -y vim
WORKDIR /opt
CMD /bin/bash
  1. 通过Dockerfile构建镜像

命令说明:

docker bulid -t 镜像名:版本 -f Dockerfile文件路径

操作示例:

[root@cxypa ~]# docker build -t centos7/vim  .
Sending build context to Docker daemon  57.34kB
Step 1/5 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
 ---> eeb6ee3f44bd
Step 2/5 : MAINTAINER cxypa<cxypa@163.com>
 ---> Running in cff5b4d726e3
Removing intermediate container cff5b4d726e3
 ---> fb5627bcac50
Step 3/5 : RUN yum install -y vim
 ---> Running in af69b2528db3
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
# 省略其他
Complete!
Removing intermediate container af69b2528db3
 ---> fa5b474a1b67
Step 4/5 : WORKDIR /opt
 ---> Running in 7e991e659673
Removing intermediate container 7e991e659673
 ---> 5bbfc8dfc670
Step 5/5 : CMD /bin/bash
 ---> Running in 78ae759a110c
Removing intermediate container 78ae759a110c
 ---> 6e15814c13f9
Successfully built 6e15814c13f9
Successfully tagged centos7/vim:latest
[root@cxypa ~]#


  1. 查看构建的镜像

操作示例:

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
centos7/vim   latest    fb6c28325e4f   55 seconds ago   453MB
centos        7         eeb6ee3f44bd   15 months ago    204MB


  1. 使用自己构建的镜像创建容器并运行测试

操作示例:

[root@localhost ~]# docker run -it --name ccv centos7/vim /bin/bash   # 使用自己的镜像创建容器,进入容器时自动进入到了/opt目录
[root@ee33f16a4a33 opt]#

Dockerfile 案例2

基于java8构建Java项目

操作步骤:

  1. 编写HelloWorld程序
  2. 编写Dockerfile文件
  3. 基于java:8-alpine作为基础镜像
  4. 将HelloWorld程序复制到镜像中
  5. 编译HelloWorld程序
  6. 运行HelloWorld程序
  7. 使用docker build命令构建镜像

具体操作:

  1. 编写HelloWorld程序
[root@localhost ~]# vim HelloWorld.java
public class HelloWorld {
        public static void main(String[] args) {
                System.out.println("Hello World Dockerfile!!!");
        }
}


  1. 编写Dockerfile文件
  2. 基于cytomine/java8作为基础镜像
  3. 将HelloWorld程序复制到镜像中
  4. 编译HelloWorld程序
  5. 运行HelloWorld程序
  6. 使用docker build命令构建镜像
[root@localhost ~]# vim Dockerfile
FROM cytomine/java8
COPY HelloWorld.java /tmp/HelloWorld.java
WORKDIR /tmp
CMD /bin/bash
RUN javac HelloWorld.java
RUN java HelloWorld
[root@localhost ~]# docker build -t myjava8 .
Sending build context to Docker daemon  22.53kB
Step 1/6 : FROM cytomine/java8
 ---> ac6f8a23f18f
Step 2/6 : COPY HelloWorld.java /tmp/HelloWorld.java
 ---> af3e0f7da7c6
Step 3/6 : WORKDIR /tmp
 ---> Running in 3fead0298672
Removing intermediate container 3fead0298672
 ---> 0a6bd5e186df
Step 4/6 : CMD /bin/bash
 ---> Running in 9270903959cf
Removing intermediate container 9270903959cf
 ---> 608be7ce9c2b
Step 5/6 : RUN javac HelloWorld.java
 ---> Running in 00c1a01cfcb5
Removing intermediate container 00c1a01cfcb5
 ---> 23ac4b671ac2
Step 6/6 : RUN java HelloWorld
 ---> Running in 1d880355cf5f
Hello World Dockerfile!!!   # 输出了程序的运行结果
Removing intermediate container 1d880355cf5f
 ---> 76a8a02afef9
Successfully built 76a8a02afef9
Successfully tagged myjava8:latest
相关文章
|
6月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
581 2
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
6月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
474 100
|
6月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
436 99
|
6月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
585 98
|
6月前
|
缓存 前端开发 Docker
Docker Layer Caching:加速你的容器构建
Docker Layer Caching:加速你的容器构建
|
6月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
673 6
|
6月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
280 8
|
8月前
|
Docker 容器 应用服务中间件
Docker 客户端是如何拉取镜像的?
Docker客户端拉取镜像的过程遵循Docker Registry HTTP API V2规范,主要分为解析镜像名、鉴权、获取Manifest、拉取Layers及本地合并五个步骤。它与Docker Hub、Harbor等仓库通信,确保镜像正确下载和构建。
1266 59
|
7月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
465 16