暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从源码到镜像

程序媛的梦想 2017-12-28
1789

本文先介绍Docker的基本概念、启动过程,然后介绍镜像、镜像仓库,接着介绍Dockerfile的关键字,最后通过一个例子介绍如何将源码制作成镜像并上传到公共的镜像仓库。通过整个过程去理解如何通过源码制作自己的Docker容器。

Docker 包括三个基本概念:
  • 镜像(Image)

  • 容器(Container)

  • 仓库(Repository)

Docker的启动过程

Docker的使用过程分为镜像构建和容器启动。

镜像构建:

即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。

容器启动:

容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令来启动服务的。针对单个容器,这可以通过 docker run 来运行。

镜像:

类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。

镜像仓库

用来存储镜像数据,并且提供拉取和上传镜像的功能。

官方镜像仓库:

Docker 官方的Registry:Docker Hub。它提供与源代码托管服务的gitHub类似,Docker Hub托管的是镜像。值得注意的是Docker Hub是管理公共镜像的,要求我们的机器能够连接互联网。网址:https://hub.docker.com

我们平常通过命令行docker search的镜像:

其实就是这里的:

Dockerfile关键字:

  • FROM:基于哪个镜像;

  • MAINTAINER:镜像创建者;

  • ADD:将文件拷贝到container的文件系统对应的路径;

  • EXPOSE:container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射;

  • CMD:容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD。CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令;

  • ENTRYPOINT:container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条。ENTRYPOINT没有CMD的可替换特性;

  • ENV:用来设置环境变量;

  • VOLUME:可以将本地文件夹或者container的文件挂载到container中;

  • RUN:安装软件用;

  • WORKDIR:切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效;

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

例子

这里通过一个例子介绍如何将源码(这里用的是Java代码)制作成镜像。重点在于dockerfile的编写。先查看一下现有的镜像:

docker images


第一步:将Java代码打包成jar包(这里的jar包是XNExporter.jar)

然后,进入到jar所在的目录先把java:latest镜像pull下来,下面要用到:

第二步:编写dockerfile(重点)

vim dockerfile 

解释:
  • FROM:这个镜像是基于哪个镜像做的。这里是基于java.latest;

  • MAINTAINER:发布者,这里是xiangni;

  • ADD:将文件拷贝到container的文件系统对应的路径。这里是将jar包拷贝到容器的文件系统里;

  • EXPOSE:暴露的端口。这里暴露的端口是8989;

  • CMD:容器启动时执行的命令,这里是运行jar包。


第三步:生成镜像

注意:~后面是生成的dockerfile的存放目录:

docker build ~/Desktop/XNExporter/target 

看到Successfully built xxxx就知道镜像成功生成了。到这里已经完成了从源码到镜像的过程。

然后验证一下:

docker images

看第一个,已经生成了镜像,但是还没有名字,于是给它设置一下tag:

这时,这个镜像的repository和TAG已经有了名字。


第四步:运行生成的本地镜像

查看:

这时Container已经启动了。

检查暴露的端口是否能访问:看到了数据,说明没有问题。

第五步:上传到Docker Hub

我在Docker Hub建了一个仓库repository(下图中的xiangniangel是我的Docker Hub的用户名)。

1. 登录
docker login

输入用户名和密码:


同时,在Docker Hub上新建一个仓库,我这里的新建的仓库名为repository。注意,如果之前设置的镜像的repository(这里是xiangni/xnexporter)和Docker Hub(xiangniangel/repository)上的不一致是传不上去的:


2.改一下tag:

格式: docker tag 镜像ID DockerHub上的用户名/仓库名:自定义的镜像的版本号

docker tag 3540a7fd59c3 xiangniangel/repository:latest
3.push

格式: docker tag 镜像ID DockerHub上的用户名/仓库名:自定义的镜像的版本号(比上面设置tag的时候少了镜像ID)

docker push xiangniangel/repository:latest

没有报错,看到一长串的字符,说明已经上传成功了。可以打开Docker Hub验证一下,这时我们看到上面已经有了刚刚push的记录:


也可以点开查看详情:


这时我们已经可以通过docker search命令查找到我们放在Docker Hub上的镜像了:


本文参考:http://blog.csdn.net/wsscy2004/article/details/25878223
文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论