入职必会-开发环境搭建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
相关文章
|
5天前
|
应用服务中间件 Linux nginx
Docker镜像-手动制作yum版nginx镜像
这篇文章介绍了如何手动制作一个基于CentOS 7.6的Docker镜像,其中包括下载指定版本的CentOS镜像,创建容器,配置阿里云软件源,安装并配置nginx,自定义nginx日志格式和web页面,最后提交镜像并基于该镜像启动新容器的详细步骤。
51 21
Docker镜像-手动制作yum版nginx镜像
|
5天前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
56 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
5天前
|
应用服务中间件 Linux nginx
Docker镜像管理篇
关于Docker镜像管理的教程,涵盖了Docker镜像的基本概念、管理命令以及如何制作Docker镜像等内容。
39 7
Docker镜像管理篇
|
5天前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
38 20
|
5天前
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
71 8
|
11天前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
49 5
|
11天前
|
运维 Ubuntu Shell
掌握Docker容器的创建:从镜像到实例
【8月更文挑战第27天】
67 4
|
9天前
|
物联网 Serverless API
函数计算产品使用问题之怎么部署Docker镜像进行lora训练
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
9天前
|
前端开发 应用服务中间件 nginx
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
|
12天前
|
存储 Docker 容器
下一篇
DDNS