Docker实战(二)
转至:http://objcoding.com/2017/12/07/Docker(2)/
制作镜像一般有三种方法,第一种是 run 一个基础容器,在里面下载好我们需要的东西,然后通过 docker commit 命令生成一个新的镜像,第二种方法是基于本地模版导入,第三种就是这篇文章说的基于 Dockerfile 创建。
结构
Dockerfile 大概可以分为四部分:基础镜像信息、维护者信息、操作指令、容器启动时执行的命令。
基础镜像信息指定了 Dockerfile 生成的镜像是基于哪个基础镜像的,且第一行必须需要用 FROM 指令指定基础镜像,操作者信息是为了让使用者知道这个镜像的作者的信息,操作指令是在基础镜像的基础中添加一些新的配置和资源,需要用到 Dockerfile 的指令,容器启动时执行的命令是在容器启动完成后立即执行的命令,一般来说,这个容器的任务就是这条执行命令,结构如下所示:
# 指定基础镜像
FROM centos# 维护者信息
MAINTAINER zhangchenghui zhangchenghui.dev@gmail.com# 操作指令
RUN yum update && yum install tomcat
COPY xxx/data /data
VOLUME [ "/data" ]# 容器启动时执行命令
CMD ["sh", "/run.sh"]
指令
FROM
这个命令是每个 Dockerfile 必备的,用于指定基础镜像,且必须在第一行,格式为:
FROM <image id> 或 FROM <image>:<tag>
RUN
每个 run 相当于一次 docker commit,就是说每执行一次 run,都在当前镜像的基础上 commit 一个新的镜像,因此尽量把命令集中用 run 执行一次,免得生成过多的镜像,同时执行多个命令时可以用 && 连接起来,如果太长了也可以用 \ 换行,格式为:
RUN <command> 或 RUN [ "sh", "/run.sh" ]
CMD && ENTRYPOINT
CMD 和 ENTRYPOINT 都可以作为容器启动时执行的命令,为什么要将这两个指令放一起讲呢,因为 ENTRYPOINT 可以作为一个入口点,将 CMD 当作参数传递,CMD 格式如下:
# shell格式
CMD /usr/local/bin/nginx# exec格式
CMD [ "curl", "http://xxx.cn" ]
而 ENTRYPOINT 可以写成:
ENTRYPOINT "<CMD>"
CMD 的缺点就是命令的参数在 Dockerfile 中固定了,不能灵活添加参数,而 ENTRYPOINT 可以在执行 docker run 指令时灵活地在 ENTRYPOINT 中添加参数,比如:
CMD [ "curl", "-s", "http://ip.cn" ]
这条执行命令就固定了,运行容器时不能再继续往里面添加参数了,因为如果没有入口点,这时你运行容器:
docker run <容器名字> -i
docker 根本识别不了这个「 -i 」是什么东东,我们再来看看:
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
这时你再运行,docker 就会在这个入口点添加新的参数。
注:如果 Dockerfile 有多个ENTRYPOINT入口点,只有最后一个生效。
EXPOSE
这个没啥好说的,用于向宿主机暴露容器中的端口,格式为 :
EXPOSE <port>
ENV
其实这个也没啥好说的,定位 Dockerfile 中的环境变量,格式为:
ENV <key> <value>
ADD && COPY
这两个指令可以将 Dockerfile 的相对路径的资源,复制到镜像中,当目标路径不存在会自动创建,格式为:
ADD <src> <test>
COPY <src> <test>
两个指令唯一区别是 ADD 可以指定一条 URL 当作资源,而 COPY 只能是 Dockerfile 的相对路径。
当项目在远程 git 仓库中时,我们就可以在编写 Dockerfile 时利用 ADD 指令主动从 git 仓库中拉取最新代码到容器中:
ADD https://github.com/zhangchenghuidev/zhangchenghuidev.github.io.git /data
VOLUME
VOLUME 指令可以使容器在启动时自动挂载一个目录或文件到宿主机中,但是这个命令并不能指定宿主机的一个目录,只能随机地挂载 /var/lib/docker/volumes/xxx/_data 其中一个目录,例如在 Dockerfile 中:
VOLUME [ "/data" ]
我们通过 Docker inspect <容器名称或id> 查看容器信息可看到:
而我们发现,我们在 Docker run 的 -v 中 是可以挂载宿主机指定的目录。
WORKDIR
指定当前镜像的工作目录,都知道每个 run 命令都会 commit 一个新镜像,下一个 run 继续在上一个镜像的基础上继续 commit,如果上一个镜像指定了当前目录的话,那么下一次 run,就会基于这个目录去工作了,没有指定默认是根目录。格式如下:
WORKDIR <工作路径>
实战
创建各类资源:
cd ~
mkdir docker
cd docker
mkdir sample
# 将项目复制到sample目录
cp /usr/local/tomcat/webapps sample
touch Dockerfile
编写Dockerfile:
vim Dockerfile
from tomcatMAINTAINER zhangchenghui zhangchenghui.dev@gamil.comENV WORKSPACE /usr/local/tomcatWORKDIR $WORKSPACECOPY sample/webapps webappsRun echo '<h1>hello, docker</h1>' > webapps/index.htmlVOLUME [ "/data" ]EXPOSE 8080 80CMD [ "sh", "bin/catalina.sh" ]
从上面指令可看出来,这是在 tomcat 镜像的基础上做的,设定工作目录在 tomcat 根目录下 /usr/local/tomcat,将宿主机 Dockerfile 相对路径下的项目复制到容器 tomcat 的 webapps 下,在 webapps 下创建一个 index.html 文件,并复制内容为 <h1>hello, docker</h1> ,挂载 /data 目录到宿主机上,对应宿主机的 /var/lib/docker/volumes/xxx/_data 其中一个目录下,开放 8080 80 端口,最后设定在容器启动时执行启动 tomcat 容器的指令。
启动容器:
docker build -t myweb:v4 .
这个「 . 」表示当前目录,因为 Dockerfile 就在当前目录下,而且 Dockerfile 中的相对路径也是根据 Dockerfile 的当前目录来确定的。
构建过程:
查看列表,刚刚利用 dockerfile 生成的镜像就有了:
启动一个容器:
docker run -d -it -p 8080:8080 bd066935d00a
查看一下容器挂载点,是不是和 Dockerfile 设定的一样:
docker inspect 609a4f1962dc
进入容器,看项目是不是已经复制到 webapps 目录中:
docker exec -it 609a4f1962dc /bin/bash
Docker实战(二)相关推荐
- Docker最全教程之Python爬网实战(二十二)
Python目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考Stack Overflow 2019开发者调查报告发布).笔者建议.NET.Java开发人员可以将Python发展 ...
- 「docker实战篇」python的docker爬虫技术-安卓模拟器(二)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「docker实战篇」python的docker爬虫技术-安卓模拟器(二) 为什么要手机模拟器,如果有条件正好有不使用的安卓手 ...
- Docker 实战教程之从入门到提高(二)
本系列第一篇文章,Docker 实战教程之从入门到提高 (一),我们已经介绍了如何在 Ubuntu 操作系统中安装 Docker,以及 Proxy 和 Insecure Registry 的配置. 本 ...
- Docker实战-部署GPE微服务的监控体系(二)
前言 上篇文章:我们介绍了GPE体系中,grafana的部署和安装(<Docker实战-部署GPE微服务的监控体系>),今天这个文章,我们继续介绍GPE体系中,Prometheus和Exp ...
- Docker 实战教程之从入门到提高 (五)
本系列的前四篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的 ...
- Docker 实战教程之从入门到提高 (四)
本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的 ...
- Docker实战 (docker swarm的应用,docker集群的构建,在docker集群中部署服务)
Docker实战 ----docker swarm的应用,docker集群的构建,在docker集群中部署服务 转载来源:https://blog.csdn.net/No_red/article/de ...
- 【云原生之Docker实战】使用Docker部署Lsky Pro个人图床平台
[云原生之Docker实战]使用Docker部署Lsky Pro个人图床平台 一.Lsky Pro介绍 1.Lsky Pro简介 2.Lsky Pro特点 二.检查宿主机系统版本 三.检查本地dock ...
- 【云原生之Docker实战】使用Docker部署家庭个人在线音乐平台
[云原生之Docker实战]使用Docker部署家庭个人在线音乐平台 一.music-player介绍 1.music-player简介 2.music-player特点 二.检查dokcer状态 1 ...
- 【云原生之Docker实战】使用docker部署DokuWiki知识库系统
[云原生之Docker实战]使用docker部署DokuWiki知识库系统 一.DokuWiki介绍 二.检查本地Docker环境 1.检查系统版本 2.检查docker版本 3.检查docker状态 ...
最新文章
- 监控系统 Prometheus 和 Zabbix 对比
- Redis - 事务
- python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做
- 【Python基础】惊叹,Pyecharts绘制饼图原来可以如此漂亮!
- 机器学习认识聚类(KMeans算法)
- Linux(CentOS6.4)Solr4.8.1中文分词配置(IK分词)
- 洛谷P2085ssl1411OJ1370-最小函数值【堆,贪心】
- java指定sql生成xml_通过generate解析SQL日志生成xml进行SQL回放
- linux笔记 第十七天 加密技术、openssl详解
- c语言经典50道例题---精华篇
- winqsb替代软件linux,winqsb软件64位-运筹学软件winqsb下载 v3.0免费版 附使用教程-下载啦...
- MacOS Big Sur 11.2.2 (20D80) With and OC 0.6.7 原版DMG黑苹果镜像
- 2022-07-08 Unity Json2——LitJson
- python字典存储数据的形式_python字典的常用操作,数据类型划分
- C#异步加载数据:BackgroundWorker的使用
- 基于BASYS3的VHDL交通灯控制器——有限状态机(FSM)
- 自建私有云与公有云托管对比_云托管:利与弊
- 系统设计-开放平台(二)
- 计算机网络 5 - 链路层
- APS计划排程结果的量化评价
热门文章
- 【案例教程】GEE遥感云大数据在林业中的应用
- com.android.coolwind,土豆视频(com.tudou.android) - 9.2.5 - 应用 - 酷安
- 洛谷4895 独钓寒江雪 (树哈希+dp+组合)
- solr之模糊搜索(Fuzzy matching)
- 鸿蒙电脑操作系统最新消息,今日大事件:鸿蒙操作系统6月2日见苹果 WWDC 将于 6 月 8 日举行...
- DELL XPS15 9570 32GB内存升级记
- 英文文献作者的几种写法
- 司普沃浅谈西瓜软腐病防治技术与管理
- 计算球的体积-java
- 【毕业设计day05】精析代码