zoukankan      html  css  js  c++  java
  • Docker,DockerCompose

    Docker 是世界领先的软件容器平台。
      开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
      运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。
      企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

    Docker可以干嘛?

      将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。

      Docker容器间是进程隔离的,谁也不会影响谁。

           centos7安装并设置开机启动

    yum install -y docker
    sudo systemctl start docker
    
    [root@localhost ~]# docker --version
    Docker version 18.09.2, build 6247962
    
    vi /etc/docker/daemon.json
    
    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    
    # 设置开机启动
    systemctl enable docker

     

    Dockerfile示例

    Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

    docker build -t runoob/ubuntu:v1 .
    # This my first nginx Dockerfile
    # Version 1.0
    
    # Base images 基础镜像
    FROM centos
    
    #MAINTAINER 维护者信息
    MAINTAINER tianfeiyu 
    
    #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"]
    View Code

    联合文件系统

    Dockerfile中命令与镜像层一一相应。那么是否意味着docker build完成之后。镜像的总大小=每一层镜像的大小总和呢?答案是肯定的。

    依旧以上图为例:假设ubuntu:14.04镜像的大小为200MB,而run.sh的大小为5MB,那么以上三层镜像从上到下,每层大小依次为0、0以及5MB,那么终于构建出的镜像大小的确为0+0+5+200=205MB。

    尽管终于镜像的大小是每层镜像的累加,可是须要额外注意的是:Docker镜像的大小并不等于容器中文件系统内容的大小(不包含挂载文件,/proc、/sys等虚拟文件)。个中缘由,就和联合文件系统有非常大的关系了。

    首先来看一下这个简单的Dockerfile样例(假如在Dockerfile当前文件夹下有一个100MB的压缩文件compressed.tar):

    FROM ubuntu:14.04
    ADD compressed.tar /
    RUN rm /compressed.tar
    ADD compressed.tar /

    1.FROM ubuntu:镜像ubuntu:14.04的大小为200MB;

    2.ADD compressed.tar /: compressed.tar文件为100MB,因此当前镜像层的大小为100MB,镜像总大小为300MB。

    3.RUN rm /compressed.tar:删除文件compressed.tar,此时的删除并不会删除下一层的compressed.tar文件。仅仅会在当前层产生一个compressed.tar的删除标记,确保通过该层将看不到compressed.tar,因此当前镜像层的大小也为0。镜像总大小为300MB。

    4.ADD compressed.tar /:compressed.tar文件为100MB,因此当前镜像层的大小为300MB+100MB。镜像总大小为400MB。

    分析完成之后,我们发现镜像的总大小为400MB。可是假设执行该镜像的话,我们非常快能够发如今容器根文件夹下执行du -sh之后。显示的数值并不是400MB,而是300MB左右。基本的原因还是:联合文件系统的性质保证了两个拥有compressed.tar文件的镜像层,仅仅会容器看到一个。同一时候这也说明了一个现状,当用户基于一个非常大,甚至好几个GB的镜像执行容器时。在容器内部查看根文件夹大小,发现居然仅仅有500MB不到,设置更小。

    分析至此,有一点大家须要非常注意:镜像大小和容器大小有着本质的差别。

    镜像共享关系

    Docker镜像说大不大,说小不小。可是一旦镜像的总数上来之后,岂不是对本地磁盘造成非常大的存储压力?平均每一个镜像500MB,岂不是100个镜像就须要准备50GB的存储空间?

    结果往往不是我们想象的那样,Docker在镜像复用方面设计得非常出色,大大节省镜像占用的磁盘空间。

    Docker镜像的复用主要体如今:多个不同的Docker镜像能够共享同样的镜像层。

    假设本地镜像存储中仅仅有一个ubuntu:14.04的镜像。我们以两个Dockerfile来说明镜像复用:

    FROM ubuntu:14.04
    RUN apt-get update
    FROM ubuntu:14.04
    ADD compressed.tar /

    假设终于docker build构建出来的镜像名分别为image1和image2。因为两个Dockerfile均基于ubuntu:14.04。因此。image1和image2这两个镜像均复用了镜像ubuntu:14.04。

    假设RUN apt-get update改动的文件系统内容为20MB,终于本地三个镜像的大小关系应该例如以下:

    ubuntu:14.04: 200MB

    image1:200MB(ubuntu:14.04)+20MB=220MB

    image2:200MB(ubuntu:14.04)+100MB=300MB

    假设仅仅是单纯的累加三个镜像的大小,那结果应该是:200+220+300=720MB,可是因为镜像复用的存在,实际占用的磁盘空间大小是:200+20+100=320MB,足足节省了400MB的磁盘空间。在此,足以证明镜像复用的巨大优点。

     DockerCompose

    Docker-compose 是 Docker 的编配工具,用于完成自动配置、协作和管理服务等过程。使用 Docker-compose,可以用一个 YAML 文件定义一组要启动的容器,以及容器运行时的属性。Compose 称这些容器为“服务”。

     可以把每个doker作为一个单独的启动:建立一个compose文件夹,文件夹下建立各个对应docker名称子文件夹,在子文件夹下建立docker-compose.yml文件;启动方式,进入到底层目录,执行docker-compose up -d/停止docker-compose stop。

    version: '3'
    services:
        web:
          image: 'gitlab/gitlab-ce'
          restart: always
          hostname: 'gitlab.example.com'
          privileged: true
          container_name: 'gitlab'
          ports:
            - '8020:8020'
            - '8443:443'
            - '2222:22'
          volumes:
            - /data/gitlab/config:/etc/gitlab
            - /data/gitlab/data:/var/opt/gitlab
            - /data/gitlab/logs:/var/log/gitlab
    View Code

    也可以把所有docker放在一个docker-compose.yml中

    version: "3"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - 5000:80
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - 5001:80
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints: [node.role == manager]
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    View Code

     如果多个docker紧密相关,可以放在一个yml中,否则建议分开单独放。因dockercompose命令针对的是整体,如果放一起更新某个镜像会导致所有镜像都需停止重启。

  • 相关阅读:
    自动装箱和==和equals
    4.1 java 类加载器
    23种设计模式
    ionic2打包 配置路径
    ionic2 native app 更新用户头像暨文件操作
    Spring Security三种认证
    maven设置本地仓库地址和设置国内镜像
    ps选框工具全解
    最长公共子序列问题
    内部排序算法的稳定性
  • 原文地址:https://www.cnblogs.com/wishonline/p/13471272.html
Copyright © 2011-2022 走看看