入职必会-开发环境搭建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
相关文章
|
1月前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
21天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
5天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
21 3
docker push推送自己搭建的镜像
|
21天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
42 9
|
1月前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
1783 30
|
21天前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
42 4
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
1月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
151 2
下一篇
DataWorks