Docker教程(四) Docker镜像构建

本文链接:https://blog.csdn.net/yuan_xw/article/details/77744272

Docker教程() Docker镜像构建

Docker手动构建镜像

创建自己的镜像,打造自己的Docker世界。

1-1该图片来自网络

1.1 新建容器

1、启动cenos镜像,并且安装相关的软件,执行命令:

docker run --name centos_nginx -it centos

1.2 容器安装Nginx

1、安装命令,执行命令:

yum install -y wget gc gcc gcc-c++ makopenssl-devel ncurses-devel make

2、下载nginxpcre,下载到指定/usr/local/software/package目录

  1. wget -P /usr/local/software http://nginx.org/download/nginx-1.13.4.tar.gz

  2. wget -P /usr/local/software ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz

解压安装包:

  1. tar -zxvf /usr/local/software/nginx-1.13.4.tar.gz

  2. tar -zxvf /usr/local/software/pcre-8.38.tar.gz

3、创建用户

创建www用户,用户不需要登录,不创建用户主目录。执行命令:

useradd -s/sbin/nologin -M www

4、安装nginx,执行命令:

cd /usr/local/software/nginx-1.13.4
./configure --prefix=/usr/local/software/nginx/ --user=www--group=www --with-http_ssl_module --with-http_stub_status_module--with-pcre=/usr/local/software/pcre-8.38/
make&& make install

执行成功见下图:

       

5、设置nginx前台运行

设置nginx前台运行,编辑vi /usr/local/software/nginx/conf/nginx.conf文件,在文件下的最顶部加入

daemon off;

注意:最后需要带分号【;

退出容器后,执行命令:exit;

1.3 手动构建镜像

1、手动构建镜像:

查看看一下容器的编号,执行命令:

执行命令:docker ps –l

手动构建镜像,docker commit :从容器创建一个新的镜像。

  1. 语法:docker commit [OPTIONS] CONTAINER[REPOSITORY[:TAG]]

  2. OPTIONS说明:

  3. -a :提交的镜像作者;

  4. -c :使用Dockerfile指令来创建镜像;

  5. -m :提交时的说明文字;

  6. -p :在commit时,将容器暂停。

  7. 执行命令:docker commit -m "build centos7 nginx container" 661c46652844centos7/nginx:v1.0-SNAPSHOT

2、查看已经提交的镜像:

执行命令:

docker images

3、使用新镜像创建容器:

执行命令:

docker run -d -p 125:80 centos7/nginx:v1.0-SNAPSHOT /usr/local/software/nginx/sbin/nginx

4、访问容器nginx

Dockerfile构建镜像

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。docker程序将这些Dockerfile指令翻译真正的linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于MakefileDocker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

2.1 Dockerfile规范

1、规范说明:

Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

Dockerfile的命名:Dockerfile文件的名字必须是"Dockerfile",首字母必须大写。

2、Dockerfile命令列表

指令名称

指令语法

说明

备注

FROM

FROM <image>

指定基础image

构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的imageFROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。

FROM <image>:<tag>

MAINTAINER

MAINTAINER <name>

用来指定镜像创建者信息

构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。

RUN

RUN <command> (the command is run in a shell - `/bin/sh -c`) 

安装软件用

构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。

RUN ["executable", "param1", "param2" ... ]  (exec form)

CMD

CMD ["executable","param1","param2"] (like an exec, this is the preferred form)

设置container启动时执行的操作

设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。

设置container启动时执行的操作:

CMD ["param1","param2"] (as default parameters to ENTRYPOINT) 

CMD ["executable","param1","param2"] (like an exec, this is the preferred form)

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form) 

设置container启动时执行的操作

该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。

当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。

ENTRYPOINT command param1 param2 (as a shell)

USER

ENTRYPOINT ["docker"] 

USER daemon 

ENTRYPOINT ["docker", "-u", "daemon"]

设置指令,设置启动容器的用户,默认是root用户。

设置指令,设置启动容器的用户,默认是root用户。

EXPOSE

EXPOSE <port> [<port>...]

指定容器需要映射到宿主机器的端口

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。

ENV

ENV <key> <value>

用于设置环境变量

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。

ADD

ADD <src> <dest>

src复制文件到containerdest路径

构建指令,所有拷贝到container中的文件和文件夹权限为0755uidgid0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

VOLUME

VOLUME ["<mountpoint>"] 

指定挂载点

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

WORKDIR

WORKDIR /path/to/workdir

切换目录

设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。

ONBUILD

ONBUILD <Dockerfile关键字>

在子镜像中执行

ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

更多的Dockerfile指令,参考官方网站:https://docs.docker.com/engine/reference/builder/

2.2 Dockerfile构建镜像

1、编写DockerFile文件,构建jdk+tomcat环境。Dockerfile文件,编写完成后上传到【/usr/local/software】目录

Dockerfile文件

  1. # this is jdk1.8 + tomcat8.5 Dockerfile

  2. # version 1.0

  3. # author:yuan_xw

  4. # 指定基础image为该image的最后修改的版本。语法:FROM <image>:<tag>

  5. FROM centos

  6. # MAINTAINER(用来指定镜像创建者信息)。语法:MAINTAINER <name>

  7. MAINTAINER yuan_xw

  8. # RUN 构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了centos,那么软件管理部分只能使用centos的命令。

  9. RUN yum install -y wget

  10. RUN wget -P /usr/local/software --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz

  11. # RUN 构建指令,解压jdk-8u144-linux-x64.tar.gz文件

  12. RUN tar -zxvf /usr/local/software/jdk-8u144-linux-x64.tar.gz -C /usr/local/software

  13. # ENV构建指令,在image中设置一个环境变量。语法:ENV <key> <value>

  14. ENV JAVA_HOME /usr/local/software/jdk1.8.0_144

  15. ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

  16. ENV PATH $JAVA_HOME/bin:$PATH

  17. # 安装 tomcat8.5

  18. RUN wget -P /usr/local/software http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz

  19. RUN tar -zxvf /usr/local/software/apache-tomcat-8.5.20.tar.gz -C /usr/local/software

  20. # EXPOSE(指定容器需要映射到宿主机器的端口)设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

  21. EXPOSE 8080

  22. #设置tomcat8.5 启动

  23. # ENTRYPOINT(设置container启动时执行的操作)

  24. # 在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。

  25. ENTRYPOINT /usr/local/software/apache-tomcat-8.5.20/bin/startup.sh && tail -100f /usr/local/software/apache-tomcat-8.5.20/logs/catalina.out

2、构建镜像

脚本写好了,需要转换成镜像。语法:docker build –t <镜像名称>:<标签> <目录,当前目录.>

执行命令:

docker build -t centos7/jdk-tomcat:v1.0-SNAPSHOT .

3、查看生成的镜像

执行命令:

docker images

4、启动docker镜像

执行命令:

docker run-d -p 8090:8080 centos7/jdk-tomcat:v1.0-SNAPSHO

5、在浏览器访问Tomcat

在浏览器上访问:http://192.168.201.151:8090/语法:http://<host>:8090host为主机IP

--以上为《Docker教程(四) Docker镜像构建》,如有不当之处请指出,我后续逐步完善更正,大家共同提高。谢谢大家对我的关注。

——厚积薄发(yuanxw)

Docker教程(四) Docker镜像构建相关推荐

  1. Docker教程(一) Docker入门教程

    Docker教程(一) Docker入门教程 本文链接:https://blog.csdn.net/yuan_xw/article/details/51935278 Docker教程(一) Docke ...

  2. Docker教程(二) Docker环境安装

    Docker教程(二) Docker环境安装 本文链接:https://blog.csdn.net/yuan_xw/article/details/77248243 Docker教程(二) Docke ...

  3. Docker教程(三) Docker网络访问和数据管理

    Docker教程(三) Docker网络访问和数据管理 本文链接:https://blog.csdn.net/yuan_xw/article/details/77504077 Docker教程(三) ...

  4. Docker系列四~docker安装mysql

    Docker系列四 docker安装mysql 搜索mysql版本 [root@localhost conf.d]# docker search mysql INDEX NAME DESCRIPTIO ...

  5. 【docker教程】docker视频教程(ubuntu)数据卷挂载、数据卷容器volume、端口映射(镜像叠加,分层复用)rootfs、bootfs(没看完)

    黑马程序员Docker容器化技术,从零学会Docker教程 可以先看1-13课.以及 docker概述 文章目录 docker概述 ubuntu安装docker docker架构 配置docker镜像 ...

  6. docker(四)镜像的大小优化

    镜像的大小优化与默认挂载 一.优化镜像 优化一:把不需要的命令丢入/dev/null 优化二:减少RUN构建 优化三:多阶段构建 优化四:使用更为轻量级的linux发行版 二.关于VOLUME 一.优 ...

  7. Docker系列 四.Docker部署SpringBoot

    四.Docker部署SpringBoot 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以).IDEA 1. 创建springboot项目 这 ...

  8. docker教程_2 docker常见命令

    https://gitee.com/fakerlove/docker 文章目录 2. 入门常用命令 2.1 docker的帮助命令 2.2 docker的镜像命令 查看镜像 搜索镜像 下载镜像 删除镜 ...

  9. 极简的docker教程-在docker上运行微服务

    文章目录 用一个简单的demo了解docker构建自定义镜像 首先用docker拉一个nginx 编写一个Dockerfile 构建 查看自己构建的镜像是否成功了 运行 测试 了解一下Dockerfi ...

最新文章

  1. js类数组转数组的方法(ArrayLike)
  2. 文件,文件夹基本操作
  3. oracle里的ols机制,Oracle ASM的AU(Allocation units)分配
  4. 图灵机原理三体中人计算机,有关计算机中人列计算机的问题
  5. Spring event 使用完全指南
  6. 哪里的草莓质量又好又便宜呢?水果批发市场(前提你买的得多)
  7. elastic 修改map_Amazon Elastic Map Reduce使用Apache Mahout计算建议
  8. nacos集群的ap cp切换_阿里Nacos-配置-多环境
  9. OpenShift 4 - Pod的亲和性/反亲和性
  10. 2021-2025年中国触摸传感器行业市场供需与战略研究报告
  11. ps提示“脚本错误-50出现一般Photoshop错误的解决方法
  12. 搭建SpringMVC详解
  13. libxml2的安装及使用
  14. 电力安全防护的十六字安全方针
  15. Arduino USBASP烧录之ICSP模式
  16. Amazon,我们完全不能接受 — 因此我们必须变更 Elastic 许可协议
  17. java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部署
  18. Chrome插件有哪些?
  19. CPT208 人机设计 笔记
  20. 苦于抖音四季文案久已的朋友们快看过来!

热门文章

  1. MySQL入门 (七) : 储存引擎与资料型态
  2. WordPress:如何判断登录用户的角色
  3. jquery实现的视差滚动教程(视差大背景效果)
  4. firebug for IE6+, Firefox, Opera, Safari and Chrome
  5. QueryPath, php上的jQuery
  6. C++ concurrency::task实现异步编程(Windows)
  7. Osg/OsgEarth—— 无法打开文件osgGA/MatrixManipulator错误
  8. http库cookiejar模块
  9. javascript 西瓜一期 13 十六进制的数数方式与进位
  10. python-自定义模块-文件的操作