• docker简单介绍----Dockerfile命令


    DockerFile的组成部署:

    下面优先介绍下Dcokerfile的基础指令

    一、CMD指令:容器启动时要莫热门运行的命令,如果有多个CMD指定,最后一个生效

    使用方法:

    CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;

    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

    CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

    举例:CMD ["/usr/sbin/httpd","-c","/etc/httpd/conf/httpd.conf"]

    二、ENTRYPOINT 指令:功能类似于CMD,但是优先级较高,如果CMD和ENTRYPOINT指令同时存在,ENTRYPOINT会覆盖CMD指令

    使用方法:

    ENTRYPOINT ["executable", "param1", "param2"]

    ENTRYPOINT command param1 param2(shell中执行)

    举例:(使用列表的方式来指定参数)

    ENTRYPOINT ["top", "-b"]    

    三、WORKDIR指令:从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行,

    个人理解:例如需要执行自带的tomcat脚本  需要切换到$HOME/bin下执行start.sh脚本来启动,

    举例:

    WORKDIR /opt/tomcat/bin

    RUN  ./start.sh

    四、ENV指令:用来在镜像构建过程中设置环境变量,这些变量会写入到镜像中永久有效,也可以用docker run -e参数来传递环境变量,这些变量只在容器运行时有效

    例如:

    ENV JAVA_HOME /usr/local/java/bin   yum install nginx

    WORKDIR $JAVA_HOME

    设置容器临时变量运行:

    docker run -it -e "JAVA_HOME=/usr/local/java"  tomcat  env

    HOME=/

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin

    WEB_PORT=8080

    五、USER指令:指定该镜像会以什么用户运行,默认是root

    语法:

    USER  nginx

    USER  nginx:nginx

    USER  uid

    USER  uid:gid

    USER  user:gid

    USER   uid:group

    也可以使用docker run -u选项来覆盖指令指定的值

    六、VOLUME指定:用来向基于镜像创建的容器添加卷,一个卷是可以存在于一个或者多个容器内的特定目录,绕过联合文件系统,并提供如下共享数据或者

    对数据进行持久化的功能

    用法:只能使用docker-managed volume而不能使用Bind-mount Volume,意思是无法指定宿主机上的挂载目录

    VOLUME  ["/data"]

    七、ADD指令:用来将构建环境下的文件和目录复制到镜像中,相当于将宿主机的文件复制到镜像新创建的镜像中

    例如:

    ADD /opt/boss.war  /opt/tomcat/webapps/boss.war

    源文件也可以是url格式的

    ADD http://wordpress.org/latest.zip /root/wordpress.zip

    ADD还可以用来解压#将ghd.tar.gz 解压到/var/www  如果目标目录存在和压缩包命名相同的文件,则不会覆盖

    ADD ghd.tar.gz /var/www 

    八、COPY指令:和ADD指令很相似,但是没有解压功能

    语法:源文件或者目录必须宇dockerfile文件在同一目录     复制目录时。des目标目录必须以"/"结尾

    COPY 源文件/目录    目标文件/目录

    例子:

    COPY文件:COPY  index.html  /opt/

    COPY目录: COPY  opt  /data/opt/   #将宿主机的opt目录拷贝到容器的/data下,必须写目录名称并且以“/ ”结尾

    九、ONBUILD指令:能为镜像添加触发器,当一个镜像被用做其他镜像的基础镜像时(比如你的镜像需要从某未准好的位置

    添加源代码,或者你需要执行特定于构建镜像环境的构建脚本),该镜像中的触发器将会被执行

    举例:

    使用一个ubuntu基础镜像来构建一个新镜像,并使用ONBUILD来创建一个mydir的目录

    FROM ubuntu
    MAINTAINER hello
    ONBUILD RUN mkdir mydir
    构建镜像:
    docker build -t imagea .
    利用imagea镜像创建容器: docker run --name test1 -it imagea /bin/bash
    这时会发现根目录下没有mydir目录
    我们在写一个新的Dockerfile文件,以imagea作为基础镜像
    十、EXPOSE:指定容器启动端口号
    语法:默认是tcp协议并且可以指定多个EXPOSE

     
    EXPOSE  80/tcp
    EXPOSE  2222/udp

     

     FROM imagea
       RUN ls

    [root@guohaidong dockerfile]# docker build -t imageb .
    Sending build context to Docker daemon 2.048 kB
    Step 1/2 : FROM imagea
    # Executing 1 build trigger...
    Step 1/1 : RUN mkdir mydir
     ---> Running in 13c2e09dafb9
    
     ---> 085a6989e15d
    Removing intermediate container 13c2e09dafb9
    Step 2/2 : RUN ls
     ---> Running in 0cf60df45aa6
    
    anaconda-post.log
    bin
    dev
    etc
    home
    lib
    lib64
    media
    mnt
    mydir
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var
     ---> 753e79c490a3
    Removing intermediate container 0cf60df45aa6
    Successfully built 753e79c490a3
    View Code
    利用上面的dockerfile文件构建镜像: docker build -t imageb .
    利用imagea镜像创建容器: docker run --name test2 -it imageb /bin/bash
    我们没有看到根目录下已经有mydir目录了,从构建过程中也可以看出来


    ============================================================
    案例:编译安装redis
    首先下载centos镜像
    docker search centos
    docker pull centos
    然后使用docker run进入到容器,将c++和make安装上
    yum update
    yum -y install gcc gcc-c++ make vim curl
    使用docker commit生成新的基础镜像
    docker commit 容器id 镜像名称:tag
    在基础镜像上编写Dockerfile来build镜像
    FROM    centos:base-v2
    MAINTAINER      "Guohaidong <18310208368@163.com>"
    WORKDIR /etc/redis-3.2.8/
    ADD redis-3.2.8.tar.gz  /etc/
    RUN cd /etc/redis-3.2.8/src
    RUN  sh -c make
    COPY redis.conf /etc/redis-3.2.8/redis.conf
    EXPOSE 6379
    CMD ["/etc/redis-3.2.8/src/redis-server","redis.conf"]
    View Code
    使用docker build生成新镜像
    docker build -t redis:v2 . #注意点

    运行镜像
     
    docker run -d --name redis-node-79 -h redis-server -p 10.10.32.150:8379:6379 -v /etc/redis-3.2.8/ a455

    测试正常并且已经将容器中的目录挂载到了宿主机目录
  • 相关阅读:
    实现三栏布局
    Element对象
    React中组件间通信的方式
    CSS实现展开动画
    Vue中组件间通信的方式
    java面试一日一题:mysql执行delete数据真的被删除了吗
    java面试一日一题:讲对mysql的MVCC的理解
    java面试一日一题:讲下mysql中的锁
    java面试一日一题:如何优化sql
    java面试一日一题:在创建微服务时,是用RPC还是http
  • 原文地址:https://www.cnblogs.com/python-cat/p/10375978.html
Copyright © 2020-2023  润新知