Docker--docker使用及自定义Dockerfile构建镜像

版权声明:分享是一种美德,能够找到同一兴趣点是幸运,转载文章记得说明出处,共同进步。 https://blog.csdn.net/David_snjly/article/details/78664130

一、docker概念

  • 镜像:

一个镜像可以包含一个完整的 ubuntu操作系统环境,里面仅安装了 Apache或用户需要的其它应用程序。用户可以定制属于自己的镜像。

  • 容器:
  1. 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
  2. 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 仓库:
  1. 仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
  2. 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

Docker 仓库的概念跟 Git 类似。

二、docker场景

  • docker安装:针对使用的系统,选择安装方式 docker官网
  • docker通常用于如下场景:
    1. web应用的自动化打包和发布;
    2. 自动化测试和持续集成、发布;
    3. 在服务型环境中部署和调整数据库或其他的后台应用;
    4. 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

三、docker命令

  1. 获取镜像:
  • docker search 镜像:从仓库搜索镜像

  • docker pull 镜像:从docker hub 仓库获取

  • docker pull 指定完整的仓库注册服务器地址 :从指定仓库地址获取镜像

  • docker run 镜像: 使用镜像,运行一个实例

    拉取并运行tomcat镜像latest版本

    $ docker run -it tomcat:latest

    -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。-d 让 Docker 容器在后台以守护态(Daemonized)形式运行

  • docker images: 列出本地已有的镜像

  • docker tag sourceTag targetTag :给镜像sourceTag创建一个targetTag镜像

    $ docker tag tomat_maven_yehao:latest registry-xxx.com/tomcat_maven_yehao:1.0.0

  • docker push 镜像:上传镜像到仓库

    $ docker push registry-xxx.com/tomcat_maven_yehao:1.0.0

  • docker save 镜像:导出镜像到本地文件

    $ sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

  • docker load :从导出的本地文件中再导入到本地镜像库

    $ sudo docker load --input ubuntu_14.04.tar

  • docker rmi 镜像:移除本地的镜像,可以使用 命令。注意 docker rm 命令是移除容器。

    注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。

  • docker stop:终止一个运行中的容器

  • docker export:导出容器快照到本地文件

    $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago

    $ sudo docker export 7691a814370e > ubuntu.tar

  • docker import :从容器快照文件中再导入为镜像

  • docker exec # 在容器里执行一个命令,可以执行bash进入交互式

    $ docker exec -it containerId /bin/bash

    ##进入容器以bash方式运行

Dockerfile编写

  • 一.Dockerfile 基本结构 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。’#’ 为 Dockerfile 中的注释。先看下面一个小例子:
    # This my first nginx Dockerfile
    # Version 1.0
    # Base images 基础镜像
    FROM centos
    #MAINTAINER 维护者信息
    MAINTAINER author
    #ENV 设置环境变量
    ENV PATH /usr/local/nginx/sbin:$PATH
    #ADD  文件放在当前目录下,拷过去会自动解压
    ADD nginx-1.8.0.tar.gz /usr/local/  
    ADD epel-release-latest-7.noarch.rpm /usr/local/  
    #RUN 执行以下命令 
    RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
    RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
    RUN useradd -s /sbin/nologin -M www
    #WORKDIR 相当于cd
    WORKDIR /usr/local/nginx-1.8.0 
    RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
    RUN echo "daemon off;" >> /etc/nginx.conf
    #EXPOSE 映射端口
    EXPOSE 80
    #CMD 运行以下命令
    CMD ["nginx"]
    FROM : 指定基础镜像,要在哪个镜像建立
    
  1. 格式为 FROM <image> 或FROM <image>:<tag> 。

    第一条指令必须为 FROM 指令。

  2. MAINTAINER:指定维护者信息

    格式为 MAINTAINER <name>

  3. RUN:在镜像中要执行的命令

    格式为 RUN <command> 或 RUN ["executable", "param1", "param2"] 前者将在 shell 终端中运行命令,即 /bin/bash -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”,”echo hello”] 。

  4. WORKDIR:指定当前工作目录,相当于 cd

    格式为 WORKDIR /path/to/workdir 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。 可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如 WORKDIR /a WORKDIR b >> WORKDIR c >> RUN pwd 则最终路径为 /a/b/c 。

  5. EXPOSE:指定容器要打开的端口

    格式为 EXPOSE <port> [<port>...] 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。

  6. ENV:定义环境变量

    格式为 ENV <key> <value> 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 例如: ENV PATH /usr/local/nginx/sbin:$PATH

  7. COPY :复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的

    格式为 COPY 。

  8. ADD:相当于 COPY,但是比 COPY 功能更强大

    格式为 ADD <src> <dest> 该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件,复制进容器会自动解压。

  9. VOLUME:挂载目录

    格式为VOLUME ["/data"] 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

  10. USER

    格式为 USER daemon 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN useradd -s /sbin/nologin -M www。

  11. ENTRYPOINT

    两种格式: - [ ] ENTRYPOINT ["executable", "param1", "param2"] - [ ] ENTRYPOINT command param1 param2 (shell中执行) > 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。

  12. CMD

    支持三种格式 CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/bash 中执行,提供给需要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数; 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

  13. ONBUILD:在构建本镜像时不生效,在基于此镜像构建镜像时生效

    格式为 ONBUILD [INSTRUCTION] 配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 ENTRYPOINT 和 CMD 的区别:ENTRYPOINT 指定了该镜像启动时的入口,CMD 则指定了容器启动时的命令,当两者共用时,完整的启动命令像是 ENTRYPOINT + CMD 这样。使用 ENTRYPOINT 的好处是在我们启动镜像就像是启动了一个可执行程序,在 CMD 上仅需要指定参数;另外在我们需要自定义 CMD 时不容易出错。

    使用 CMD  Dockerfile
    [root@sta2 test]# cat Dockerfile 
    FROM mysql
    CMD ["echo","test"]
    
    使用 ENTRYPOINT  Dockerfile
    [root@sta2 entrypoint]#  cat  Dockerfile 
    FROM mysql
    ENTRYPOINT ["echo","test"]
    

Dockerfile

  • 自定义镜像示例 Dockerfile

    FROM centos:7
    MAINTAINER yehao "[email protected]"
    
    RUN yum -y install wget
    #安装jdk
    #拷贝当前目录的jdk1.7到镜像中的/usr/local/jdk1.7
    COPY  jdk1.7 /usr/local/jdk1.7
    
    #安装tomcat
    RUN wget -P /usr/local/tomcat https://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz
    RUN tar xzf /usr/local/tomcat/apache-tomcat-7.0.82.tar.gz -C /usr/local/tomcat
    RUN rm -rf /usr/local/tomcat/apache-tomcat-7.0.82.tar.gz
    
    #安装maven
    RUN wget -P /usr/local/maven  https://mirrors.cnnic.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
    RUN tar xzf /usr/local/maven/apache-maven-3.5.2-bin.tar.gz -C /usr/local/maven
    RUN rm -rf /usr/local/maven/apache-maven-3.5.2-bin.tar.gz
    
    #配置环境变量
    ENV JAVA_HOME /usr/local/jdk1.7
    ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-7.0.82
    ENV M2_HOME /usr/local/maven/apache-maven-3.5.2
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$M2_HOME/bin
    
    #暴露端口
    EXPOSE 8080
    
    #启动tomcat服务器
    CMD ["/usr/local/tomcat/apache-tomcat-7.0.82/bin/catalina.sh","run"]
    
    
  • 运行自己的的web项目 Dockerfile

    FROM registry-xxx.com/tomcat_maven ##基础镜像
    COPY . /code
    RUN cd /code && mvn clean package -Dmaven.test.skip=true && cp ./target/*.war /usr/local/tomcat/webapps
    WORKDIR /usr/local/tomcat
    
    CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
    
    

docker资源

  • Docker官方英文资源:
  1. docker官网:http://www.docker.com
  2. Docker windows入门:https://docs.docker.com/windows/
  3. Docker Linux 入门:https://docs.docker.com/linux/
  4. Docker mac 入门:https://docs.docker.com/mac/
  5. Docker 用户指引:https://docs.docker.com/engine/userguide/
  6. Docker 官方博客:http://blog.docker.com/
  7. Docker Hub: https://hub.docker.com/
  8. Docker开源: https://www.docker.com/open-source
  • Docker中文资源:
  1. Docker中文网站:http://www.docker.org.cn
  2. Docker入门教程: http://www.docker.org.cn/book/docker.html
  3. Docker安装手册:http://www.docker.org.cn/book/install.html
  4. 一小时Docker教程 :https://blog.csphere.cn/archives/22
  5. docker从入门到实践:http://dockerpool.com/static/books/docker_practice/index.html
  6. Docker纸质书:http://www.docker.org.cn/dockershuji.html
  7. DockerPPT:http://www.docker.org.cn/dockerppt.html

猜你喜欢

转载自blog.csdn.net/David_snjly/article/details/78664130