博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker Compose 1.18.0 之服务编排详解
阅读量:7024 次
发布时间:2019-06-28

本文共 9085 字,大约阅读时间需要 30 分钟。

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

Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。

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

Docker 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

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 --versiondocker-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: wordpressvolumes:    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/mysqlf49cf87b52c1: Pull complete78032de49d65: Pull complete837546b20bc4: Pull complete9b8316af6cc6: Pull complete1056cf29b9f1: Pull complete86f3913b029a: Pull completef98eea8321ca: Pull complete3a8e3ebdeaf5: Pull complete4be06ac1c51e: Pull complete920c7ffb7747: Pull completeDigest: sha256:7cdb08f30a54d109ddded59525937592cb6852ff635a546626a8960d9ec34c30Status: Downloaded newer image for mysql:5.7Pulling wordpress (wordpress:latest)...latest: Pulling from library/wordpresse7bb522d92ff: Pull complete75651f247827: Pull completedbcf8fd0150f: Pull completede80263f26f0: Pull complete65be8ad4c5fd: Pull complete239d5fed0dda: Pull complete5ab39b683a9f: Pull complete4a3f54f2d93a: Pull complete28c970ad99e9: Pull complete5d1e20c7c396: Pull complete05f877a23903: Pull completee0a5c61bdaa6: Pull completed27d2d70a072: Pull completeba039fef4b7e: Pull completefd026e22f5c3: Pull completea523c6d55ab4: Pull complete025590874132: Pull completed1f0ca983d7b: Pull complete40d597c8be8b: Pull completeDigest: sha256:573257b41e1c3554cfe3a856d3c329030a821194172e2aeb1d3a7f5dd896ccb4Creating 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                    NAMESd715012934dc        wordpress:latest                   "docker-entrypoint.s…"   2 hours ago         Up 19 seconds       0.0.0.0:8000->80/tcp     mywordpress_wordpress_1ce956cf8d74b        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             SIZEmysql                              5.7                 f008d8ff927d        2 days ago          409MBwordpress                          latest              28084cde273b        9 days ago          408MBroot@souyunku:/opt/my_wordpress#

访问服务

my_wordpress

my_wordpress

my_wordpress

编写参考

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

image

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

image: mysqlimage: redisimage: ubuntu:14.04image: tutum/influxdbimage: example-registry.com:4000/postgresqlimage: 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:8VOLUME /tmpADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jarRUN 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  db172.17.2.186  mysql172.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                    NAMES559e49f8dc01        wordpress:latest                   "docker-entrypoint.s…"   18 minutes ago      Up 18 minutes       0.0.0.0:8000->80/tcp     mywordpress_wordpress_13c207b3e16bd        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       wordpressca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  ibtmp1   performance_schema  public_key.pem    server-key.pem     test.txtroot@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/_dataroot@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       wordpressca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test.txtroot@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# cat test.txt 1234root@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  somehost50.31.209.229   otherhost

extends

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

extends:  file: common.yml  service: webapp

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

net

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

net: "bridge"net: "none"net: "container:[name or id]"net: "host"

dns

自定义dns服务器。

dns: 8.8.8.8dns:  - 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

Compose file version 2

Compose file version 1

参考

Contact

  • 作者:鹏磊
  • 出处:
  • Email:admin@souyunku.com
  • 版权归作者所有,转载请注明出处
  • Wechat:关注公众号,"搜云库",专注于开发技术的研究与知识分享

关注公众号-搜云库

你可能感兴趣的文章
今天的工作日志
查看>>
Opensuse12.2配置 Apache2+PHP5+MySQL(LAMP)
查看>>
经典SQL语法大全
查看>>
使用数据库统一管理ssh登陆用户密钥信息
查看>>
Active 与 Service 的生命周期、保存数据----Day04 2014.5.29
查看>>
ip6tables 基本配置
查看>>
C语言控制mplayer
查看>>
分布式项目(七)consul 服务注册与发现
查看>>
魂断实习之——结束。开始..........
查看>>
[Android学习笔记四] 自定义Android组件之组合方式创建密码框组件
查看>>
ciscodk教你卸载Linux软件
查看>>
Linux Shell脚本生产环境下安全地删除文件
查看>>
Oracle中scn讲解
查看>>
在Java中实现MongoDB的Group功能
查看>>
我的友情链接
查看>>
Haproxy+Keepalived+apache实现高可用
查看>>
python网络编程实现TCP和UDP连接
查看>>
Java数据库连接代码集合
查看>>
MHA配置文件参数
查看>>
php测试耗时
查看>>