Docker Compose入门

  5 分钟   5683 字    |    

Docker Compose入门

简介

Docker Compose是用于定义和运行多个 Docker 容器的应用

使用Dockerfile模板文件可以定义单独的应用容器,若需要多个容器相互配合来完成某项任务的情况,则需要

用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

定制镜像

在使用Docker Compose对容器进行编排前,需要先用Dockerfile定制镜像,Dockerfile 是一个文本文件,其内包含了一条条的指令,例如

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

其中:

FROM指定基础镜像:定制镜像就是以一个镜像为基础,FROM 是必备的指令,并且必须是第一条指令。

RUN执行命令:包括shell和exec两种格式,尽量只使用一个RUN指令,并使用 && 将各个所需命令串联起来

- shell格式:RUN <linux命令>
- exec格式:RUN ["可执行文件", "参数1", "参数2"]

其他指令包括:

COPY将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

ADDCOPY 基础上增加了一些功能:<源路径> 可以是一个 URL,<源路径> 为一个 tar 压缩文件会自动解压缩

CMD指定默认的容器主进程的启动命令,推荐使用 exec 格式,比如CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT类似于CMD,但可在执行docker run后增加参数

ENV 设置环境变量

VOLUME <路径>存储层挂载

EXPOSE <端口1> [<端口2>...]声明容器运行时提供服务的端口

WORKDIR <工作目录路径>指定当前工作目录

最后构建镜像:

docker build [选项] <上下文路径/URL/->,比如在Dockerfile 文件所在目录执行:docker build -t nginx:v3 .指定了最终镜像的名称为nginx:v3

Compose

  1. 安装(linux):


    • arm: sudo pip install -U docker-compose
    • x86:

    $ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    # 国内用户可以使用以下方式加快下载
    $ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    $ sudo chmod +x /usr/local/bin/docker-compose
    
  2. 示例

  • 场景:用 Python 来建立一个能够记录页面访问次数的 web 网站

  • web应用:

    app.py

    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    
  • Dockerfile

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
  • docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"

  redis:
    image: "redis:alpine"
  • 运行:docker-compose up
  1. 模版文件

docker-compose.yml

version: '3'

services:
  webapp: # 运行容器名
      build:
        context: ./dir    # 指定Dockerfile所在文件夹路径
        dockerfile: Dockerfile-alternate # Dockerfile文件名
        args:
          buildno: 1 # 指定变量
      command: echo "hello world"
      ports: # 端口映射
      	- "80:80"
    	volumes: # 持久化映射
      	- "/data:/var/lib/mysql"
      devices: # 设备映射
        - "/dev/ttyUSB1:/dev/ttyUSB0"
      depends_on: # 先启动db和redis ,后启动webapp
        - db
        - redis
   redis:
   		image:redis # 从dockerhub拉取镜像
   		tmpfs: # 挂载tmpfs 文件系统到容器
        - /run
        - /tmp
   db:
   		image:postgres
   		expose:# 暴露端口
 				- "3000"
     

每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像

image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像

build:指定 Dockerfile 所在文件夹的路径,Compose 将会利用它自动构建这个镜像,然后使用这个镜像

command:覆盖容器启动后默认执行的命令

devices:指定设备映射关系

depends_on:解决容器的依赖、启动先后的问题

tmpfs :挂载tmpfs 文件系统到容器

expose:暴露端口,但不映射到宿主机,只被连接的服务访问

ports:暴露端口信息,使用 宿主端口:容器端口 (HOST:CONTAINER) 格式形成映射

volumes:数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER)

environment:配置容器环境变量

参考

[ 1 ] https://yeasy.gitbook.io/docker_practice/

~  ~  The   End  ~  ~


 赏 
感谢您的支持,我会继续努力哒!
支付宝收款码
tips
文章二维码 分类标签:技术docker
文章标题:Docker Compose入门
文章链接:http://120.46.217.131:82/archives/51/
最后编辑:2023 年 2 月 7 日 14:52 By Yang
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 5 + 3 =
快来做第一个评论的人吧~