最新文章:

首页 运维技术

docker创建镜像

发布时间:2017年10月27日 评论数:抢沙发 阅读数:4500

    文章索引

    1、Docker基础介绍及安装

    2、Docker创建容器

    3、Docker创建镜像

    4、Docker创建仓库

    5、Docker创建Tomcat

    6、Docker创建LNMP


    一、镜像介绍

    docker镜像一般由两种,一种是手动构建,另一种则是自动构建(Dockerfile),我们来学习如何通过自动构建和手动构建来构建镜像。


    二、自动构建

    2.1 查看镜像

    [root@linux-node1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/nginx     latest              e4e6d42c70b3        2 weeks ago         107.5 MB
    docker.io/centos    latest              36540f359ca3        2 weeks ago         192.5 MB

    2.2 启动一个镜像并进入容器

    [root@linux-node1 ~]# docker run --name mynginx -it centos
    [root@6d9a980fc0b1 /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    [root@6d9a980fc0b1 /]# yum install -y nginx
    [root@6d9a980fc0b1 /]# exit

    2.3 查看容器

    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID  IMAGE  COMMAND       CREATED         STATUS                 PORTS  NAMES
    6d9a980fc0b1  centos "/bin/bash" 21 minutes ago Exited (0) 10 seconds ago        mynginx

    此时我们看到有一个停止的mynginx容器。

    2.4 基于容器做镜像

    [root@linux-node1 ~]# docker commit -m "my nginx" 6d9a980fc0b1  youngcheung/nginx:v1
    sha256:76bed70bc348455f555dc705bb1ddec4dc94d0fa74f47c54e77d96eaf58d25d7
    [root@linux-node1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    youngcheung/nginx   v1                  76bed70bc348        21 seconds ago      381.9 MB
    docker.io/nginx     latest              e4e6d42c70b3        2 weeks ago         107.5 MB
    docker.io/centos    latest              36540f359ca3        2 weeks ago         192.5 MB

    当前已经存在一个版本为V1的镜像,但是我们启动不了,因为在后台运行,因此我们需要手动进入容器修改。

    2.5 修改容器

    [root@linux-node1 ~]# docker run -it --name nginxv1 youngcheung/nginx:v1
    [root@30181b84e881 /]#
    [root@30181b84e881 /]# vi /etc/nginx/nginx.conf
    daemon off;   #在nginx.conf 加上
    [root@30181b84e881 /]# exit  
    exit

    2.6  提交修改容器为镜像

    [root@linux-node1 ~]# docker commit -m "my nginx" 30181b84e881  youngcheung/nginx:v2
    sha256:7ad2cb731e7e63bc6d23542163a74340e4d9932069361cead16beb71c06176e8
    [root@linux-node1 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    youngcheung/nginx   v2                  7ad2cb731e7e        4 seconds ago       381.9 MB
    youngcheung/nginx   v1                  76bed70bc348        7 minutes ago       381.9 MB
    docker.io/nginx     latest              e4e6d42c70b3        2 weeks ago         107.5 MB
    docker.io/centos    latest              36540f359ca3        2 weeks ago         192.5 MB

    2.7 运行容器

    [root@linux-node1 ~]# docker run -d -p 82:80 youngcheung/nginx:v2 nginx
    136b5eb844c2ed1b55902c0e43bfb460eaf413be05d7cf45b5200b38ef647e70

    #浏览器访问IP:82

    docker构建镜像 云计算 第1张

    三、使用Dockerfile构建容器

    3.1 创建Dockerfile路径

    [root@linux-node1 ~]# mkdir /opt/dockerfile/nginx -p
    [root@linux-node1 ~]# cd /opt/dockerfile/nginx

    3.2 创建Dockerfile文件

    [root@linux-node1 nginx]# cat Dockerfile
    #This docker file 
    #verison:1
    #Author: zhsir
    #Base image
    FROM centos
    #Maintainer
    #MAINTAINER zhsir emailvip888888@163.com
    #Commands
    RUN rpm -ivh  https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum install nginx -y
    RUN echo "daemon off;" >>/etc/nginx/nginx.conf
    ADD index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    CMD ["nginx"]

    相关注释:

    #井号代表注释

    #Base image  除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么

    #Maintainer 维护信息

    #Commands 命令

    #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改

    EXPOSE 对外端口号

    CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务)

    3.3 创建index.html

    [root@linux-node1 nginx]# echo "zhangyang" >> index.html

    3.4 构建

    [root@linux-node1 nginx]# docker build -t youngcheung/nginx:v3 /opt/dockerfile/nginx/

    docker构建镜像 云计算 第2张

    3.5 启动容器

    [root@linux-node1 nginx]# docker run -d -p 83:80 youngcheung/nginx:v3 
    ea991767d121c8372cff5cb573fb694abdf39efa1a8c3757be07b48895095b19

    浏览器访问:

    docker构建镜像 云计算 第3张

    3.6 Dockerfile语法

    FROM

    格式:FROM<image>或FROM<image>:<tag>。
    解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。

    MAINTAINER

    格式:MAINTAINER <name>
    解释:指定维护者信息。

    RUN

    格式:RUN <command>或 RUN["executable", "param1", "param2"]。
    解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式

    CMD

    格式:
    CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
    CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;

    解释: 

    CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

    ENTRYPOINT

    格式:
       ENTRYPOINT ["executable", "param1","param2"]
       ENTRYPOINT command param1 param2(shell中执行)。

    解释:和CMD类似都是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 

    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。 

    所以生产实践中我们可以同时使用ENTRYPOINT和CMD, 

    例如:

    ENTRYPOINT ["/usr/bin/rethinkdb"]
    CMD ["--help"]
    USER

    格式:USER daemon

    解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。


    EXPOSE

    格式:EXPOSE<port> [<port>...]

    解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。


    ENV

    格式:ENV<key> <value>

    ENV <key>=<value> ...

    解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定


    ADD

    格式:

    ADD <src>... <dest>

    ADD ["<src>",... "<dest>"]

    解释:将指定的<src>复制到容器文件系统中的<dest> 

    所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0 

    如果文件是可识别的压缩格式,则docker会帮忙解压缩


    VOLUME

    格式:VOLUME ["/data"]

    解释:可以将本地文件夹或者其他container的文件夹挂载到container中。


    WORKDIR

    格式:WORKDIR/path/to/workdir

    解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 

    可以多次切换(相当于cd命令), 

    也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

    例如:

    WORKDIR /a

    WORKDIR b

    WORKDIR c

    RUN pwd

    则最终路径为 /a/b/c。

    ONBUILD 

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


    ARG

    格式:ARG<name>[=<default value>]

    解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。

二维码加载中...
本文作者:Mr.linus      文章标题: docker创建镜像
本文地址:http://www.90qj.com/438.html  本文已经被百度收录,点击查看详情
版权声明:若无注明,本文皆为“挨踢 Blog”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论