Docker Compose 零基础入门

文章目录

[隐藏]

  • 安装
  • 使用
    • 简单 web 应用
    • down
  • 最后

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用,它是由 python 编写。

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

Compose 有两个重点

  • docker-compose.yml compose 配置文件
  • docker-compose 命令行工具

在前面的教程中,我们运行一个要一堆的参数,如 –network, –volume, -p 等等,如果有多个容器组合成一个项目,比如一个 webserver,数据库,缓存等等容器,我们就需要一个个的定义网络等参数,然后一个个启动,有了 compose 我们只需要一个简单的 docker-compose up ,它就会自动帮我们构建镜像,配置网络等功能。

安装

windows 和 mac 中 docker-compose 在安装 docker 的时候就已经捆绑安装了。

linux 中需要自己安装,不过非常的简单只需要几条命令就行

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose  # 下载 docker-compose 到 /usr/local/bin/docker-compose 中  $ sudo chmod +x /usr/local/bin/docker-compose  # 给 docker-compose 执行权限  $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose  # bash 自动补全  
$ sudo rm /usr/local/bin/docker-compose  # 卸载 docker-compose  
使用

使用 docker-compose 我们主要的任务是编写 docker-compose.yml 文件。我们可以看一个 WordPress yaml文件模板。

version: '3' # 定义版本,不指定默认为版本 1,新版本功能更多    services: # 容器,就像 docker run     db: # 名称,它也是 network 中 DNS 名称       image: mysql:5.7 # 镜像,如果像自定义镜像可以不指定这个参数,而用 build       volumes: # 定义数据卷,类似 -v         - db_data:/var/lib/mysql         - .:/aaa # 挂载当前目录到容器中的 /aaa 无需使用绝对路径       restart: always # 类似 --restart       # 'no' 默认,不自动重启,以为 no 是 yaml 关键字所以加引号       # always 总是自动重启       # on-failure 当失败时自动重启,也就是 exit code 不为 0 时       # unless-stopped 除非手动停止,否者一直重启       environment: # 定义环境变量,类似 -e         MYSQL_ROOT_PASSWORD: somewordpress         MYSQL_DATABASE: wordpress         MYSQL_USER: wordpress         MYSQL_PASSWORD: wordpress     wordpress: # 第二个容器       labels:         com.example.description: "This label will appear on all containers for the web service"       # 为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。       depends_on: # 帮助 compose 理解容器之间的关系       # db 将会在 wordpress 之前被启动       # 关闭时 wordpress 将会在 db 之前关闭       # 我们指定只启动 wordpress,db 也会跟着启动         - db       image: wordpress:latest       ports: # 端口,类似 -p         - "8000:80"       restart: always       environment:         WORDPRESS_DB_HOST: db:3306         WORDPRESS_DB_USER: wordpress         WORDPRESS_DB_PASSWORD: wordpress    volumes: # 可选,需要创建的数据卷,类似 docker volume create    db_data:    networks: # 可选,需要创建的网络,类似 docker network create  

如果不了解 yaml 文件,可以使用在线 yaml 转换成 json。

简单 web 应用

我们现在使用 nodejs 和 redis 写一个简单的,web 应用。

我们需要 nodejs 环境,然后新建一个文件夹执行

$ npm init -y # 新建 package.json 文件  $ npm i -S koa ioredis # 安装 koa 和 ioredis 依赖  # koa 用来编写 web 应用  # ioredis 用来连接 redis  

然后我们新建 index.js 文件,写入如下代码

const Koa = require('koa');  const Redis = require('ioredis');    const app = new Koa();  const redis = new Redis({    host: 'redis',  });    app.use(async ctx => {    ctx.body = '计数:' + (~~(await redis.get('count')) + 1);    redis.incr('count');  });    app.listen(3000, () => {    console.log('app 正在监听 3000 端口');  });  

然后新建一个 .dockerignore 文件

.vscode  .idea  node_modules  npm-debug.log*  yarn-debug.log*  yarn-error.log*  

还有 Dockerfile 文件

FROM node:alpine    WORKDIR /app    COPY package.json .  RUN npm i --registry=https://registry.npm.taobao.org && npm cache --force clean  COPY . .    EXPOSE 3000    CMD ["node", "index.js"]  

最后就是编写 docker-compose.yml 文件啦

version: '3'    services:    redis:      image: 'redis'    app:      build: . # 相当于 docker build .      ports:        - '3000:3000'      depends_on:        - redis  

我们上面要构建自定义镜像使用了 build 字段,如果要自定义 Dockerfile 我们可以写作一个 map。

build:      context: ./dir # 指定上下文      dockerfile: Dockerfile.dev # 指定 Dockerfile      args: # 类似 Dockerfile 中的 ARG 指令。      # 定义变量,不同于环境不按量只能在构建时访问          gitcommithash: cdc3b19      target: prod # docker build 中的 --target 参数  

现在我们就可以使用 docker-compose 命令行工具启动我们这个应用了。

$ docker-compose up  # 启动我们这个项目  # `-d` 类似 docker run -d  # `--build` 在启动容器之前构建镜像  # 如果我们修改了 Dockerfile 重新运行项目时,不会重新构建  # 这时候就需要 --build 命令,或者 `docker-compose build` 命令  

然后我们打开浏览器 127.0.0.1:3000 然后不断刷新,就会看到计数器不断增加。

$ docker ps  CONTAINER ID        IMAGE               COMMAND                     PORTS                    NAMES  782b26312c72        redis               "docker-entrypoint.s…"      6379/tcp                 compose1_redis_1  af93df76b5a0        compose1_app        "docker-entrypoint.s…"      0.0.0.0:3000->3000/tcp   compose1_app_1  

我们发现 docker-compose 自动生成容器名称,如果我们像自己指定容器名,可以使用

container_name: my-web-container  

docker-compose 还帮我们生成了自己构建镜像的镜像名,我们如果想自定义,可以在指定 build 的同时指定 image 字段。

$ docker network ls  NETWORK ID          NAME                DRIVER              SCOPE  66cccb01394d        compose1_default    bridge              local  

我们发现 docker-compose 自动新建了 compose1_default 虚拟网络

$ docker network inspect compose1_default  ...  "Containers": {      "1e10e7af6bf78ef1ecdd979c1f5d386e9d5a8221d3be49df05a13cea1f40f655": {          "Name": "compose1_app_1",          "EndpointID": "b20772ce05b34fb528b2986946c9535d467c9d09a6d66aeba9fdb9c8809f0909",          "MacAddress": "02:42:ac:14:00:03",          "IPv4Address": "172.20.0.3/16",          "IPv6Address": ""      },      "95b1592f453dd57d091456b9e623fae1aadc180599c5b343c7133ef8c61f3605": {          "Name": "compose1_redis_1",          "EndpointID": "5a86cdb12a84fd49de4b586bed1281cdec61cd45dc08ad230f46db8562ced722",          "MacAddress": "02:42:ac:14:00:02",          "IPv4Address": "172.20.0.2/16",          "IPv6Address": ""      }  }  ...  

并且自动将我们两个容器加入到这个网络中。

$ docker container inspect compose1_redis_1  ...  "Networks": {      "compose1_default": {          "IPAMConfig": null,          "Links": null,          "Aliases": [              "95b1592f453d",              "redis"          ],          "NetworkID": "66cccb01394da77edbe008d18057b66b819389aaa2e98a967f8096a1bae46ae1",          "EndpointID": "5a86cdb12a84fd49de4b586bed1281cdec61cd45dc08ad230f46db8562ced722",          "Gateway": "172.20.0.1",          "IPAddress": "172.20.0.2",          "IPPrefixLen": 16,          "IPv6Gateway": "",          "GlobalIPv6Address": "",          "GlobalIPv6PrefixLen": 0,          "MacAddress": "02:42:ac:14:00:02",          "DriverOpts": null      }  }  ...  

可以看到 compose1_redis_1 容器的 network alias 中包含了 redis,这也是我们在 docker-compose.yml 中定义的名称。这也解释了为什么 index.js 中 redis 的 host 参数可以写做 redis。

down

如果我们启动项目时加了 -d 参数,那么我们想停止项目时可以使用 down 命令。

$ docker-compose down  # 它会删除容器和网络  # -v 删除数据卷  # --rmi all 删除所有 service 镜像  # --rmi local 删除没有自定义标签的镜像 image 字段  
最后
$ docker-compose --help  # 我们可以执行这个命令查看 docker-compose 支持命令  # 可以发现有很多命令都类似于 docker 命令  

更多 docker-compose 知识,可以查看 docker-compose 文档。

编写 docker-compose.yml 可以查看 这里。

原文出处:juejin -> https://juejin.im/post/5d17442e518825559f46ed92

随机日志

最近评论

Archives