• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Docker Compose 1.18.0 之服务编排详解

技术杂谈 勤劳的小蚂蚁 2个月前 (02-09) 121次浏览 已收录 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 安装

运行此命令下载最新版本的 DockerCompose
  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

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

编写配置

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:mysqlimage: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:7cdb08f30a54d109ddded59525937592cb6852ff635a546626a8960d9ec34c30
  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         Up19 seconds       0.0.0.0:8000->80/tcp     mywordpress_wordpress_1
  4. ce956cf8d74b        mysql:5.7                          "docker-entrypoint.s…"   2 hours ago         Up2 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
注意,在 version1里同时使用image和build是不允许的, version2则可以,如果同时指定了两者,会将 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      Up18 minutes       0.0.0.0:8000->80/tcp     mywordpress_wordpress_1
  4. 3c207b3e16bd        mysql:5.7                          "docker-entrypoint.s…"   18 minutes ago      Up18 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格式仅支持 version2

environment

添加环境变量。同 docker run-e。可以是数组或者字典格式:
  1. environment:
  2.  RACK_ENV: development
  3.  SESSION_SECRET:
  4. environment:
  5.  - RACK_ENV=development
  6.  - SESSION_SECRET

depends_on

用于指定服务依赖,一般是 mysqlredis等。 指定了依赖,将会优先于服务创建并启动依赖。
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是需要继承的服务,例如 web、 database

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

更多

cpushares, cpuquota, cpuset, domainname, hostname, ipc, macaddress, memlimit, memswaplimit, privileged, readonly, restart, shmsize, stdinopen, tty, user, working_dir
这些命令都是单个值,含义请参考
编写 docker-compose 请参考官方文档
Compose file version 3
Compose file version 2
Compose file version 1
参考


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Docker Compose 1.18.0 之服务编排详解
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00