资讯专栏INFORMATION COLUMN

Docker Compose 1.18.0 之服务编排详解

Seay / 2081人阅读

摘要:新建一个你能记住的目录,这个目录是应用镜像的上下文,该目录用于存放构建该镜像的资源在这个目录里面将会新建一个文件进入目录创建一个文件,将启动您的博客和一个多带带的实例并挂载数据持久化到宿主机内容如下指定服务的镜像名称或镜像。

一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器
Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。

服务编排工具使得Docker应用管理更为方便快捷。

Docker Compose网站:https://docs.docker.com/compose

使用Compose基本上是三个步骤:

1.定义Dockerfile

2.编写docker-compose.yml

3.最后运行 docker-compose up 启动服务

系统环境

Ubuntu 17.04 x64
Docker CE: 17.12.0-ce
Docker Compose: 1.18.0

参考-https://docs.docker.com/compose/install/#prerequisites

在Linux上,您可以从GitHub上的Compose存储库版本页面下载Docker Compose 最新二进制文件

Compose 安装

运行此命令下载最新版本的Docker Compose

</>复制代码

  1. $ curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

对二进制文件应用可执行权限

</>复制代码

  1. $ chmod +x /usr/local/bin/docker-compose

验证

</>复制代码

  1. $ docker-compose --version
  2. docker-compose version 1.16.1, build 6d1ac21

卸载

要卸载 Docker Compose,如果使用 curl 以下安装:

</>复制代码

  1. $ rm /usr/local/bin/docker-compose
入门示例 WordPress

使用Docker Compose 可以轻松地在Docker容器中,构建独立环境运行的WordPress,在开始之前必须安装Docker Compose

编写配置

1.创建一个空的项目目录。

新建一个你能记住的目录,这个目录是应用镜像的上下文,该目录用于存放构建该镜像的资源

在这个目录里面将会新建一个docker-compose.yml文件

</>复制代码

  1. $ mkdir my_wordpress

2.进入my_wordpress 目录

</>复制代码

  1. $ cd my_wordpress

3.创建一个docker-compose.yml文件,将启动您的 WordPress博客和一个多带带的MySQL实例并挂载数据持久化到宿主机

</>复制代码

  1. $ touch docker-compose.yml
  2. $ vi docker-compose.yml

内容如下

</>复制代码

  1. version: "3"
  2. services:
  3. db:
  4. image: mysql:5.7
  5. volumes:
  6. - db_data:/var/lib/mysql
  7. restart: always
  8. environment:
  9. MYSQL_ROOT_PASSWORD: somewordpress
  10. MYSQL_DATABASE: wordpress
  11. MYSQL_USER: wordpress
  12. MYSQL_PASSWORD: wordpress
  13. wordpress:
  14. depends_on:
  15. - db
  16. image: wordpress:latest
  17. ports:
  18. - "8000:80"
  19. restart: always
  20. environment:
  21. WORDPRESS_DB_HOST: db:3306
  22. WORDPRESS_DB_USER: wordpress
  23. WORDPRESS_DB_PASSWORD: wordpress
  24. volumes:
  25. db_data:

image

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

所以我们不需要先拉取镜像

volumes

- db_data:MySQL实例挂载数据持久化到宿主机/var/lib/docker/volumes/mywordpress_db_data/_data

PS

</>复制代码

  1. $ docker run -v /var/lib/mysql --name mywordpress_db_data -e MYSQL_ROOT_PASSWORD=wordpress -d mysql
  2. $ docker run --name some-wordpress --link mywordpress_db_data:mysql -p 8002:80 -d wordpress

以上命令的意思是新建mywordpress_db_data some-wordpress容器。等同于:docker-compose.yml 内容

启动服务

</>复制代码

  1. root@souyunku:/opt/my_wordpress# docker-compose up -d

如果看到如下信息就证明没毛病

</>复制代码

  1. Pulling db (mysql:5.7)...
  2. 5.7: Pulling from library/mysql
  3. f49cf87b52c1: Pull complete
  4. 78032de49d65: Pull complete
  5. 837546b20bc4: Pull complete
  6. 9b8316af6cc6: Pull complete
  7. 1056cf29b9f1: Pull complete
  8. 86f3913b029a: Pull complete
  9. f98eea8321ca: Pull complete
  10. 3a8e3ebdeaf5: Pull complete
  11. 4be06ac1c51e: Pull complete
  12. 920c7ffb7747: Pull complete
  13. Digest: sha256:7cdb08f30a54d109ffffded59525937592cb6852ff635a546626a8960d9ec34c30
  14. Status: Downloaded newer image for mysql:5.7
  15. Pulling wordpress (wordpress:latest)...
  16. latest: Pulling from library/wordpress
  17. e7bb522d92ff: Pull complete
  18. 75651f247827: Pull complete
  19. dbcf8fd0150f: Pull complete
  20. de80263f26f0: Pull complete
  21. 65be8ad4c5fd: Pull complete
  22. 239d5fed0dda: Pull complete
  23. 5ab39b683a9f: Pull complete
  24. 4a3f54f2d93a: Pull complete
  25. 28c970ad99e9: Pull complete
  26. 5d1e20c7c396: Pull complete
  27. 05f877a23903: Pull complete
  28. e0a5c61bdaa6: Pull complete
  29. d27d2d70a072: Pull complete
  30. ba039fef4b7e: Pull complete
  31. fd026e22f5c3: Pull complete
  32. a523c6d55ab4: Pull complete
  33. 025590874132: Pull complete
  34. d1f0ca983d7b: Pull complete
  35. 40d597c8be8b: Pull complete
  36. Digest: sha256:573257b41e1c3554cfe3a856d3c329030a821194172e2aeb1d3a7f5dd896ccb4
  37. Creating mywordpress_db_1 ... done
  38. Creating mywordpress_db_1 ...
  39. Creating mywordpress_wordpress_1 ... done
  40. root@souyunku:/opt/my_wordpress#
查看容器

</>复制代码

  1. root@souyunku:/opt/my_wordpress# docker container ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. d715012934dc wordpress:latest "docker-entrypoint.s…" 2 hours ago Up 19 seconds 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
  4. ce956cf8d74b mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 3306/tcp mywordpress_db_1
查看镜像

</>复制代码

  1. root@souyunku:/opt/my_wordpress# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. mysql 5.7 f008d8ff927d 2 days ago 409MB
  4. wordpress latest 28084cde273b 9 days ago 408MB
  5. root@souyunku:/opt/my_wordpress#
访问服务

编写参考

每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

image

image 指定镜像tag或者ID。示例:

</>复制代码

  1. image: mysql
  2. image: redis
  3. image: ubuntu:14.04
  4. image: tutum/influxdb
  5. image: example-registry.com:4000/postgresql
  6. image: a4bc65fd

注意,在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。

build

用来指定一个包含Dockerfile文件的路径。一般是当前目录.build并生成一个随机命名的镜像。

实例

</>复制代码

  1. ├── app
  2. │   ├── Dockerfile
  3. │   └── docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar
  4. ├── docker-compose.yml

Dockerfile 内容

</>复制代码

  1. root@souyunku:/opt/app# cat Dockerfile
  2. FROM java:8
  3. VOLUME /tmp
  4. ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar
  5. RUN bash -c "touch /app.jar"
  6. EXPOSE 9000

docker-compose.yml 内容

</>复制代码

  1. root@souyunku:/opt# cat docker-compose.yml
  2. app:
  3. build: ./app
  4. ports:
  5. - "9090:80"
  6. expose:
  7. - 80

./app 是放Dockerfile 的路径

ports 用于暴露端口 同docker run -p

command

用来覆盖缺省命令。示例:

</>复制代码

  1. command: bundle exec thin -p 3000

command也支持数组形式

</>复制代码

  1. command: [bundle, exec, thin, -p, 3000]
links

用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。

docker run --link。示例:

</>复制代码

  1. links:
  2. - db
  3. - db:mysql
  4. - redis

使用了别名将自动会在容器的/etc/hosts文件里创建相应记录:

</>复制代码

  1. 172.17.2.186 db
  2. 172.17.2.186 mysql
  3. 172.17.2.187 redis

所以我们在容器里就可以直接使用别名作为服务的主机名。

ports

用于暴露端口。同docker run -p

示例:

</>复制代码

  1. ports:
  2. - "3000"
  3. - "8000:8000"
  4. - "49100:22"
  5. - "127.0.0.1:8001:8001"
expose

expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose

</>复制代码

  1. expose:
  2. - "3000"
  3. - "8000"
volumes

挂载数据卷。同docker run -v

示例:

</>复制代码

  1. volumes:
  2. - /var/lib/mysql
  3. - cache/:/tmp/cache
  4. - ~/configs:/etc/configs/:ro

进入MySQL容器

查看容器ID

</>复制代码

  1. root@souyunku:# docker container ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 559e49f8dc01 wordpress:latest "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
  4. 3c207b3e16bd mysql:5.7 "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 3306/tcp mywordpress_db_1

通过容器ID进入MySQL容器

</>复制代码

  1. root@souyunku:# docker exec -it 3c207b3e16bd bash

进入MySQL容器的存储目录

</>复制代码

  1. root@3c207b3e16bd:/# cd var/lib/mysql
  2. root@3c207b3e16bd:/var/lib/mysql# ls
  3. auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys wordpress
  4. ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem test.txt
  5. root@3c207b3e16bd:/var/lib/mysql# cat test.txt
  6. 1234

新建一个文本,用于测试MySQL容器的挂载目录,有没有同步到宿主机

</>复制代码

  1. root@3c207b3e16bd:/var/lib/mysql# touch test.txt
  2. root@3c207b3e16bd:/var/lib/mysql# echo "1234" >test.txt

宿主机查看容器挂载是否同步

</>复制代码

  1. root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# pwd
  2. /var/lib/docker/volumes/mywordpress_db_data/_data
  3. root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# ls
  4. auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys wordpress
  5. ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test.txt
  6. root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# cat test.txt
  7. 1234
  8. root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data#
volumes_from

挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:

</>复制代码

  1. volumes_from:
  2. - service_name
  3. - service_name:ro
  4. - container:container_name
  5. - container:container_name:rw

container:container_name格式仅支持version 2

environment

添加环境变量。同docker run -e。可以是数组或者字典格式:

</>复制代码

  1. environment:
  2. RACK_ENV: development
  3. SESSION_SECRET:
  4. environment:
  5. - RACK_ENV=development
  6. - SESSION_SECRET
depends_on

用于指定服务依赖,一般是mysql、redis等。
指定了依赖,将会优先于服务创建并启动依赖。

links也可以指定依赖。

external_links

链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

</>复制代码

  1. external_links:
  2. - redis_1
  3. - project_db_1:mysql
  4. - project_db_1:postgresql

注意,external_links链接的服务与当前服务必须是同一个网络环境。

extra_hosts

添加主机名映射。

</>复制代码

  1. extra_hosts:
  2. - "somehost:162.242.195.82"
  3. - "otherhost:50.31.209.229"

将会在/etc/hosts创建记录:

</>复制代码

  1. 162.242.195.82 somehost
  2. 50.31.209.229 otherhost
extends

继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

</>复制代码

  1. extends:
  2. file: common.yml
  3. service: webapp

service必须有,file可选。service是需要继承的服务,例如webdatabase

net

设置网络模式。同docker--net参数。

</>复制代码

  1. net: "bridge"
  2. net: "none"
  3. net: "container:[name or id]"
  4. net: "host"
dns

自定义dns服务器。

</>复制代码

  1. dns: 8.8.8.8
  2. dns:
  3. - 8.8.8.8
  4. - 9.9.9.9
更多

cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir

这些命令都是单个值,含义请参考

编写 docker-compose 请参考官方文档

Compose file version 3

https://docs.docker.com/compose/compose-file/

Compose file version 2

https://docs.docker.com/compose/compose-file/compose-file-v2/

Compose file version 1

https://docs.docker.com/compose/compose-file/compose-file-v1/

参考

https://docs.docker.com/compose/overview/

https://docs.docker.com/compose/

Contact

作者:鹏磊

出处:http://www.ymq.io/2018/01/17/Docker-Compose-example

Email:admin@souyunku.com

版权归作者所有,转载请注明出处

Wechat:关注公众号,"搜云库",专注于开发技术的研究与知识分享

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27206.html

相关文章

  • docker 编排服务.md

    摘要:参考周立与微服务实战安装官方文档安装自动补全工具编写表示该文件使用的是指定服务名称指定服务所使用的镜像启动清空缓存,强制重新构建并启动停止重启一个服务服务名称来自于里的定义 参考 周立 《Spring cloud 与Docker 微服务实战》 安装compose 官方文档 sudo curl -L https://github.com/docker/compose/releases/d...

    yck 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    SegmentFault 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    Neilyo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<