百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

Docker-compose解析 docker-compose privileged

qiyuwang 2024-11-03 16:32 19 浏览 0 评论

Docker-Compose项目是Docker官方的一个开源项目,其主要职责是负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,分别是工程(project)、服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。同时,Docker-Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

关于微服务环境中的本地开发,我经常使用此工具。它也是轻量级的,只需要很小的努力。通过此工具,我们可以预先配置所需的环境和服务,然后专注于当前服务的开发,而不必过多去关注每个服务的运行方式以及服务与组件的相互调用关系,真没必要,除非迫不得已。

借助Docker-Compose,我们可以为应用服务、卷、挂载点、环境变量(几乎所有内容)以及所所涉及的依赖组件配置一个合理的网络。

在介绍Docker-Compose工具之前,我们先了解下Dockerfile。Dockerfile是一个文本文件,其中包含用户可以在命令行上调用以组装镜像(Images)的所有命令。 我们可将其视为一个Shell Script。它将多个命令收集到一个文档中,以完成一个任务。其简要的流程如下所示:

Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN、CMD、FROM、EXPOSE、ENV等指令进行相关操作。

下面我们看下Dockerfile的基础模版,以Nginx组件服务为例,具体如下所示:

 [administrator@JavaLangOutOfMemory ~ %]vi Dockerfile 
# Version 1.0


# Base images 基础镜像
FROM centos:7.6.1810


# MAINTAINER 维护者信息
MAINTAINER  Leon<lijie_2016@migu.cn>


# 定义服务组件版本信息
ENV TENGINE_VERSION 2.1.2


# 定义服务组件环境变量
ENV CONFIG "\
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_auth_request_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-file-aio \
    --with-http_spdy_module \
    --with-ipv6 \
    --with-jemalloc \
    "
# 定义文件目录操作相关信息
ADD ngx_user.patch /


ADD repositories /etc/apk/repositories


# 执行相关操作
RUN \
  addgroup -S nginx \
  && adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx \
  && apk add --no-cache --virtual .build-deps \
    gcc \
    libc-dev \
    make \
    openssl-dev \
    pcre-dev \
    zlib-dev \
    linux-headers \
    curl \
    jemalloc-dev \
  && curl "http://tengine.taobao.org/download/tengine-$TENGINE_VERSION.tar.gz" -o tengine.tar.gz \
  && mkdir -p /usr/src \
  && tar -zxC /usr/src -f tengine.tar.gz \
  && rm tengine.tar.gz \
  && cd /usr/src/tengine-$TENGINE_VERSION/src/os/unix/ \
  && mv /ngx_user.patch ./ngx_user.patch \
  && patch ngx_user.c ngx_user.patch \
  && rm ngx_user.patch \
  && cd ../../../ \
#  && cd /usr/src/tengine-$TENGINE_VERSION \
  && ./configure $CONFIG --with-debug \
  && make \
  && mv objs/nginx objs/nginx-debug \
  && ./configure $CONFIG \
  && make \
  && make install \
  && rm -rf /etc/nginx/html/ \
  && mkdir /etc/nginx/conf.d/ \
  && mkdir -p /usr/share/nginx/html/ \
  && install -m644 html/index.html /usr/share/nginx/html/ \
  && install -m644 html/50x.html /usr/share/nginx/html/ \
  && install -m755 objs/nginx-debug /usr/sbin/nginx-debug \
  && strip /usr/sbin/nginx* \
  && runDeps="$( \
    scanelf --needed --nobanner /usr/sbin/nginx \
      | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
      | sort -u \
      | xargs -r apk info --installed \
      | sort -u \
  )" \
  && apk add --virtual .nginx-rundeps $runDeps \
  && apk del .build-deps \
  && rm -rf /usr/src/nginx-$NGINX_VERSION \
  && apk add --no-cache gettext \
  \
  # forward request and error logs to docker log collector
  && ln -sf /dev/stdout /var/log/nginx/access.log \
  && ln -sf /dev/stderr /var/log/nginx/error.log


# 定义文件的相关操作信息
COPY nginx.conf /etc/nginx/nginx.conf


COPY nginx.vh.default.conf /etc/nginx/conf.d/default.conf


# 定义服务组件所暴露的端口信息
EXPOSE 80 443


# 定义服务组件启动命令
CMD ["nginx", "-g", "daemon off;"]

以上为简要的Dockerfile文件,然后我们对进行构建,具体命令如下所示:

[administrator@JavaLangOutOfMemory ~ %]docker build  -f Dockerfile -t leon-tengine .
  • docker build:用 Dockerfile 构建镜像的命令关键词。
  • [OPTIONS] : 命令选项,常用的指令包括 -t 指定镜像的名字。
  • -f 显示指定构建镜像的 Dockerfile 文件(Dockerfile 可不在当前路径下)。
  • 如果不使用 -f,则默认将上下文路径下的名为 Dockerfile 的文件认为是构建镜像的 “Dockerfile” 。
  • 上下文路径|URL:指定构建镜像的上下文的路径,构建镜像的过程中,可以且只可以引用上下文中的任何文件。

至此,一个完整的容器镜像构建完成,此时,只需要借助Docker命令行直接启动即可。通过上面的介绍可以看出,Dockerfile还是蛮个性化的,它可以依据我们个人喜好进行自定义镜像开发。

接下来,我们解析下Docker-Compose工具,上面的实例借助Docker命令启动仅仅为单一组件的容器部署,若在某一特定场景下,我们需要快速部署集群式应用场景或多个不同组件的服务,同时方便管理,此时Docker-Compose工具最合适不过了。

以下为简要的模板,具体如下:

[administrator@JavaLangOutOfMemory ~ %]vi docker-compose-elk.yaml
version: '3'
services:
  elasticsearch:
    image: docker.leon.com/elasticsearch/elasticsearch:7.4.2
    container_name: elasticsearch
    restart: always
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "9200:9200"
    networks:
      - elastic
    environment:
      - discovery.type=single-node
  
  kibana:
    image: docker.leon.com/kibana/kibana:7.4.2
    container_name: kibana
    restart: always
    volumes:
      - kibana:/usr/share/kibana/config:rw
      - /etc/localtime:/etc/localtime
    depends_on:
      - elasticsearch
    ports:
      - "5601:5601"
    networks:
      - elastic
    environment:
      SERVER_NAME: kibana.example.org
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200


  logstash:
    image: docker.leon.com/logstash/logstash:7.4.2
    container_name: logstach
    command: logstash -f /usr/share/logstash/conf/logstash-kafka.conf
    restart: always
    tty: true 
    ports:
      - "5044:5044"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - logstash:/usr/share/logstash/conf/
    networks:
      - elastic
    depends_on:
      - elasticsearch
    environment:
      - elasticsearch.hosts=http://elasticsearch:9200
      - xpack.monitoring.elasticsearch.hosts=http://elasticsearch:9200


  zookeeper:
    image: docker.leon.com/zookeeper
    container_name: zookeeper
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - zookeeper:/data
      - zookeeper_log:/datalog
    networks:
      - elastic
    ports:
      - "2181:2181"


  kafka:
    container_name: kafka
    image: docker.leon.com/kafka
    depends_on:
      - zookeeper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - kafka:/kafka
      - /etc/localtime:/etc/localtime:ro
    links:
      - zookeeper
    ports:
      - "9092:9092"
    networks:
      - elastic
    environment:
      - KAFKA_LISTENERS=INTERNAL://kafka:9092, OUT://kafka:29092
      - KAFKA_ADVERTISED_LISTENERS=INTERNAL://kafka:9092, OUT://kafka:29092
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,OUT:PLAINTEXT
      - KAFKA_INTER_BROKER_LISTENER_NAME=OUT
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_MESSAGE_MAX_BYTES=2000000
      - KAFKA_CREATE_TOPICS=logs:1:1


volumes:
  elasticsearch:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/elasticsearch/
  kibana:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/kibana/
  logstash:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/logstash/conf/
  zookeeper:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/zookeeper/data/
  zookeeper_log:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/zookeeper/datalog/
  kafka:
    driver: local-persist
    driver_opts:
      mountpoint: /elk/kafka/


networks:
  elastic:

基于上述yaml文件,我们针对“核心”的标签作简要分析如下:

Docker-Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。

Docker-Compose标准模板文件包含version、services、networks 三大部分,最关键的是services和networks两个部分。

version标签:Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。

image标签:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Docker-Compose将会尝试拉取镜像。

depends_on标签:用于解决容器的依赖、启动先后的问题。在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。

volumes标签:挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。如果不使用宿主机的路径,可以指定一个volume_driver。例如:volume_driver: mydriver。

links标签:链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS)。

networks标签:主要设置网络模式。

以下为Docker-compose相关命令行:

[administrator@JavaLangOutOfMemory ~ %] docker-compose up (-d)
... docker-compose down
... docker-compose build 
... docker-compose logs (-f) 
... docker-compose run (--no-deps)
... 

具体完整操作,可参考之前文章:Docker GUI工具-Portainer浅析。

以上为关于Docker-Compose工具的相关解析,希望对技术爱好者,尤其是初学者有所帮助,有关各种技术问题,欢迎大家随时留言沟通。

相关推荐

你真的会用Word画线吗?(word画线技巧)

【你真的会用Word画线吗?】①输入三个“=”回车,是一条双直线;②输入三个“”,回车,就是一条波浪线;③输入三个“”回车,就是一条虚线;④输入三个“-”,回车,就是一条细直线.....新技能get√...

「干货」Word技巧知识——进阶篇(2)

Hello,大家好,我是无拘无束的分享知识,每天跟大家分享点有用的知识,话不多说。感兴趣的朋友可以点赞、关注、收藏哦。1.将word文档中的硬回车全部消除从事来稿阅读、编辑的工作者,最头痛的事就是打...

办公室人员必备! Word快捷键大全(办公中常用的快捷键)

【Word里超简单的画线方法!】简历、总结里文字太多怎么办?用线条分隔!Word画线秘籍:①输三个"="回车,是一条双直线②输三个"~"回车,是一条波浪线③输三个"-"回车,就是一条细直线。(来源...

Word笔记大全(详细步骤)(word怎么写笔记)

字处理一、文档的基本操作1.打开/新建2.快速新建ctrl+n3.利用模板创建文件--新建--选择模板officeplus4.保存5.保护文件--信息--保护文档--限制编辑--对话框:勾选每一项...

如何删除word文档空白页?(怎么删除word里的空白页?)

在日常办公或学习中,我们经常会遇到Word文档中出现空白页的情况,这不仅影响文档的美观,还可能造成打印浪费。下面,我将为大家详细介绍如何在Office和WPS中的Word里轻松删除这些恼人的空白页。...

Win11学院:如何在Windows 11装机时禁用BitLocker磁盘加密

IT之家5月7日消息,微软计划在Windows1124H2装机过程默认启用BitLocker加密,对于用户来说有两方面的影响:其一是影响硬盘的性能,其二是用户如果没有解密密钥,可能...

办公小技巧:Word“安全模式”用通透

大家都知道Windows的安全模式。其实,Word也有安全模式。那么,Word的安全模式又是什么?何时使用这种模式?使用这种模式有何限制?当Word运行中遇到问题需要启用安全模式运行时,如何按照软件给...

段落结束敲回车,下一段格式变样了怎么处理#每天学习一点点

段落换行后的格式发生变化。段落结束敲回车键,下一段格式变样了怎么处理?大家有时候遇到文章敲回车键,在下一段打字之后会发现这一段的样子就会和之前的段落不一样,当然可以调整一下或者用格式刷刷一下,但是稍微...

硬回车、软回车等介绍(硬回车键和软回车键)

1.硬回车:硬回车占两个字节,在word中敲击Enter键即可输入硬回车,硬回车是真正的段落标记,在两个硬回车之间的文字自成一个段落。代码是^p(小写)。2.软回车:用Shift+Enter产...

Word里超简单的画线方法!(word中如何画线条)

小厅分享【Word里超简单的画线方法!】简历、总结里文字太多怎么办?用线条分隔!Word画线秘籍:①输三个"="回车,是一条双直线②输三个"~"回车,是一条波浪线③输三个"-"回车,就是一条细直线...

Word 如何更改图片、删除与删除背景,勾选图片等问题

  如果插入到Word文档中的图片想另外换一张,更换方法有两种,一种是把原图删除另外插入一张,另一种是直接更换图片。Word2016提供了更改图片的功能,用此功能更换图片会自动把原图删除,就像...

Word中批量删除空行(多种方案)(批量删除word中的空行)

如下图,在Word文档中存在大量空行(回车),为了文档整洁,需要批量取消这些回车;方法一Ctrl+h,在查找内容中输入”^p^p”,在替换为输入”^p”,单击全部替换即可(^符号在英文输入法下按Shi...

Word文档如何取消自动编号?(word文档如何取消自动编号功能)

在word文档中,当我们编辑有序号的文本内容时,word会自动识别给文本编号,如果直接删除序号再按回车键,序号又会自动填充。但有时候我们并不需要它自动编号或不喜欢它的编号格式,如何才能取消word自动...

最全的Word知识点,抓紧时间收藏起来

Word知识点1.1word工作界面Word2010的窗口组成∶窗口分标题栏、菜单栏、常用工具栏、格式工具栏、标尺、编辑区滚动条、状态栏、任务窗格。1.标题栏∶显示所编辑的文档名和程序名称。单击标题...

Word中的页眉横线就是删不掉?其实按下这个键,1秒就能去除

不知道大家在用Word的同时,有没有遇到过难删除的页眉横线呢?以前小编就是遇到这条横线,不得已将里面的文字复制到一个新的文档中,如今终于知道该怎样删除这条横线了,下面我们就来看看删除方法。一、删除页眉...

取消回复欢迎 发表评论: