Docker Compose 1.18.0 之服务编排详解
一个使用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
$ curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
对二进制文件应用可执行权限
$ chmod +x /usr/local/bin/docker-compose
验证
$ docker-compose --version docker-compose version 1.16.1, build 6d1ac21
卸载
要卸载 Docker Compose,如果使用 curl 以下安装:
$ rm /usr/local/bin/docker-compose
入门示例
WordPress
使用Docker Compose 可以轻松地在Docker容器中,构建独立环境运行的WordPress,在开始之前必须安装Docker Compose。
编写配置
1.创建一个空的项目目录。
新建一个你能记住的目录,这个目录是应用镜像的上下文,该目录用于存放构建该镜像的资源
在这个目录里面将会新建一个docker-compose.yml文件
$ mkdir my_wordpress
2.进入my_wordpress 目录
$ cd my_wordpress
3.创建一个docker-compose.yml文件,将启动您的 WordPress博客和一个单独的MySQL实例并挂载数据持久化到宿主机
$ touch docker-compose.yml $ vi docker-compose.yml
内容如下
version: '3'services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
image
image: 指定服务的镜像名称或镜像 ID image: mysql,image: wordpress:latest。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
所以我们不需要先拉取镜像
volumes
- db_data: 指MySQL实例挂载数据持久化到宿主机/var/lib/docker/volumes/mywordpress_db_data/_data
PS
$ docker run -v /var/lib/mysql --name mywordpress_db_data -e MYSQL_ROOT_PASSWORD=wordpress -d mysql $ docker run --name some-wordpress --link mywordpress_db_data:mysql -p 8002:80 -d wordpress
以上命令的意思是新建mywordpress_db_data和some-wordpress容器。等同于:docker-compose.yml 内容
启动服务
root@souyunku:/opt/my_wordpress# docker-compose up -d
如果看到如下信息就证明没毛病
Pulling db (mysql:5.7)... 5.7: Pulling from library/mysql f49cf87b52c1: Pull complete 78032de49d65: Pull complete 837546b20bc4: Pull complete 9b8316af6cc6: Pull complete 1056cf29b9f1: Pull complete 86f3913b029a: Pull complete f98eea8321ca: Pull complete 3a8e3ebdeaf5: Pull complete 4be06ac1c51e: Pull complete 920c7ffb7747: Pull complete Digest: sha256:7cdb08f30a54d109ddded59525937592cb6852ff635a546626a8960d9ec34c30 Status: Downloaded newer image for mysql:5.7 Pulling wordpress (wordpress:latest)... latest: Pulling from library/wordpress e7bb522d92ff: Pull complete 75651f247827: Pull complete dbcf8fd0150f: Pull complete de80263f26f0: Pull complete 65be8ad4c5fd: Pull complete 239d5fed0dda: Pull complete 5ab39b683a9f: Pull complete 4a3f54f2d93a: Pull complete 28c970ad99e9: Pull complete 5d1e20c7c396: Pull complete 05f877a23903: Pull complete e0a5c61bdaa6: Pull complete d27d2d70a072: Pull complete ba039fef4b7e: Pull complete fd026e22f5c3: Pull complete a523c6d55ab4: Pull complete 025590874132: Pull complete d1f0ca983d7b: Pull complete 40d597c8be8b: Pull complete Digest: sha256:573257b41e1c3554cfe3a856d3c329030a821194172e2aeb1d3a7f5dd896ccb4 Creating mywordpress_db_1 ... doneCreating mywordpress_db_1 ... Creating mywordpress_wordpress_1 ... doneroot@souyunku:/opt/my_wordpress#
查看容器
root@souyunku:/opt/my_wordpress# docker container ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d715012934dc wordpress:latest "docker-entrypoint.s…" 2 hours ago Up 19 seconds 0.0.0.0:8000->80/tcp mywordpress_wordpress_1 ce956cf8d74b mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 3306/tcp mywordpress_db_1
查看镜像
root@souyunku:/opt/my_wordpress# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 f008d8ff927d 2 days ago 409MB wordpress latest 28084cde273b 9 days ago 408MB root@souyunku:/opt/my_wordpress#
访问服务
编写参考
每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。
image
image 指定镜像tag或者ID。示例:
image: mysql image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
注意,在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。
build
用来指定一个包含Dockerfile文件的路径。一般是当前目录.build并生成一个随机命名的镜像。
实例
├── app │ ├── Dockerfile │ └── docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar ├── docker-compose.yml
Dockerfile 内容
root@souyunku:/opt/app# cat Dockerfile FROM java:8 VOLUME /tmp ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar'EXPOSE 9000
**docker-compose.yml ** 内容
root@souyunku:/opt# cat docker-compose.yml app: build: ./app ports: - "9090:80" expose: - 80
./app 是放Dockerfile 的路径
ports 用于暴露端口 同docker run -p
command
用来覆盖缺省命令。示例:
command: bundle exec thin -p 3000
command也支持数组形式
command: [bundle, exec, thin, -p, 3000]
links
用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。
同docker run --link。示例:
links: - db - db:mysql - redis
使用了别名将自动会在容器的/etc/hosts文件里创建相应记录:
172.17.2.186 db 172.17.2.186 mysql 172.17.2.187 redis
所以我们在容器里就可以直接使用别名作为服务的主机名。
ports
用于暴露端口。同docker run -p。
示例:
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
expose
expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。
expose: - "3000" - "8000"
volumes
挂载数据卷。同docker run -v。
示例:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
进入MySQL容器
查看容器ID
root@souyunku:# docker container ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 559e49f8dc01 wordpress:latest "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:8000->80/tcp mywordpress_wordpress_1 3c207b3e16bd mysql:5.7 "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 3306/tcp mywordpress_db_1
通过容器ID进入MySQL容器
root@souyunku:# docker exec -it 3c207b3e16bd bash
进入MySQL容器的存储目录
root@3c207b3e16bd:/# cd var/lib/mysqlroot@3c207b3e16bd:/var/lib/mysql# lsauto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys wordpress ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem test.txt root@3c207b3e16bd:/var/lib/mysql# cat test.txt1234
新建一个文本,用于测试MySQL容器的挂载目录,有没有同步到宿主机
root@3c207b3e16bd:/var/lib/mysql# touch test.txtroot@3c207b3e16bd:/var/lib/mysql# echo '1234' >test.txt
宿主机查看容器挂载是否同步
root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# pwd/var/lib/docker/volumes/mywordpress_db_data/_data root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# lsauto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys wordpress ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test.txt root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# cat test.txt 1234 root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data#
volumes_from
挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
container:container_name格式仅支持version 2。
environment
添加环境变量。同docker run -e。可以是数组或者字典格式:
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
depends_on
用于指定服务依赖,一般是mysql、redis等。 指定了依赖,将会优先于服务创建并启动依赖。
links也可以指定依赖。
external_links
链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
注意,external_links链接的服务与当前服务必须是同一个网络环境。
extra_hosts
添加主机名映射。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
将会在/etc/hosts创建记录:
162.242.195.82 somehost 50.31.209.229 otherhost
extends
继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
extends: file: common.yml service: webapp
service必须有,file可选。service是需要继承的服务,例如web、database。
net
设置网络模式。同docker的--net参数。
net: "bridge"net: "none"net: "container:[name or id]"net: "host"
dns
自定义dns服务器。
dns: 8.8.8.8 dns: - 8.8.8.8 - 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
-
作者:鹏磊
-
-
Email:admin@souyunku.com
-
版权归作者所有,转载请注明出处
-
Wechat:关注公众号,"搜云库",专注于开发技术的研究与知识分享

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
利用Redis实现分布式锁
秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题。对这类问题,有三种优化性能的思路: 1:写入内存而不是写入硬盘 2:异步处理而不是同步处理 3:分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应对。更好的是,Redis能够满足上述三点。因此,用Redis就能轻松实现秒杀系统。用我这个方案,无论是电商平台特价秒杀,12306火车票秒杀,都不是事:) 下面介绍一下为什么上述三种性能优化思路能够解决秒杀系统的性能问题: 写入内存而不是写入硬盘 传统硬盘的读写性能是相当差的。SSD硬盘比传统硬盘快100倍。而内存又比SSD硬盘快10倍以上。因此,写入内存而不是写入硬盘,就能使系统的能力提升上千倍。也就是说,原来你的秒杀系统可能需要1000台服务器支撑,现在1台服务器就可以扛住了。你可能会有这样的疑问:写入内存而不是持久化,那么如果此时计算机宕机了,那么写入的数据不就全部丢失了吗?如果你就这么倒霉碰到服务器宕机,那你就没秒到了,有什么大不了?最后,后面真正处理秒杀订单时,我们会把信息持久化到硬盘中。因此不会丢失关键数据。Redis是一个缓存系统,数据写入内存后就返回给客户端了,...
- 下一篇
kubernetes集群中利用etcd和grpc实现golang服务间通信
kubernetes集群中利用etcd和grpc实现golang服务间通信 注:文中涉及工作环境相关的网址和IP已经被替换 1. 项目背景 服务运行于docker容器中 使用kubernetes管理容器 服务有多个节点作为一个集群 使用rest接口设置服务缓存中的信息 需要将信息同步到集群中其他节点 2. 项目方案 使用grpc做服务间通信 从etcd中读取服务所有状态为running的节点信息,包括:podIp、status、hostIp、startedAt(启动时间) 服务启动时选取运行时间最长的节点,调用grpc接口请求缓存的信息同步到本容器的服务中 使用rest接口设置缓存的时候,遍历所有节点(不包括自身),调用grpc接口将信息同步到其他节点 方案特点: - 不需要借助额外的配置管理工具(如:zookeeper) - 不需要自行管理节点的配置信息(因为kubernetes的etcd中已经有完整的节点信息) - grpc开发、传输效率高,扩展性好 - grpc使用http2.0方便后续提供rest接口 1. etcd简介 etcd 是用 golang 实现的一种 K-V 分布式...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题