专栏首页JacobDocker-compose 安装与基本使用(四)

Docker-compose 安装与基本使用(四)

安装 Docker-Compose

Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。

  1. 通过以下命令自动下载并安装适应系统版本的 Compose:
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 为安装脚本添加执行权限
chmod +x/usr/local/bin/docker-compose

这样, Compose就安装完成了。 可使用以下命令测试安装结果:

docker-compose --version

可输出类似于如下的内容:4 586bhjnkmv

docker-compose version 1.10.0, build 4bd6f1a

说明 Compose已成功安装。

安装 Compose命令补全工具

现在已成功安装 Compose,然而当输 Docker Compose并按下Tab键时, Compose并没有补全命令。要想使用 Compose的命令补全,需要安装命令补全工具。 命令补全工具在Bash和zsh下的安装方式不同,本次以Bash安装为主。 执行以下命令,即可安装命令补全工具:

curl -l https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

这样,在重新登录后,输入 docker-compose并按下Tab键,compose就可自动补全命令了。

Docker Compose 快速入门

基本步骤

使用 Docker Compose 大致有 3 个步骤:

  • 使用 Dockerfile (或其他方式)定义应用程序环境,以便在任何地方重现该环境。
  • 在 docker-compose.yml 文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
  • 运行 docker-compose up 命令,启动并运行整个应用程序。

人门示例

下面以 wzq-swagger-mng 为例讲解 compose 的基本步骤。

  1. 使用 mvn clean package 命令打包项目,获得 wzq-swagger-mng.jar。
  2. 在 wzq-swagger-mng.jar 所在路径(默认是项目的 target 目录)创建 Dockerfile 文件,并在其中添加如下内容。
FROM java:8
VOLUME /tmp
ADD wzq-swagger-mng.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 10086
ENTRYPOINT ["java","-Djava.security.edg=file:/dev/.urandom","-jar","/app.jar"]
  1. 在 wzq-swagger-mng.jar 所在路径创建文件 docker-compose.yml,在其中添加如下内容。
version: '2'# 表示该docker-compose.yml文件使用的是version 2 file
services:
  wzq-swagger-mng:# 指定服务名称
    build:#指定Dockerfile所在文件夹的路径
      context: ./
      dockerfile: ./Dockerfile
    ports:
     - "10086:10086"# 指定端口映射,类似 docker run 的 -p 选项,注意使用字符串形式。
  1. 在 docker-compose.yml 所在路径执行以下命令: docker-compose up Compose就会自动构建镜像并使用镜像启动容器。也可使用 docker-compose up -d后台启动并运行这些容器。
  2. 测试访问

工程、服务、容器

Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件( docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。 对应上面案例中工程名称是 docker-compose.yml 所在的目录名。该工程包含了1个服务,服务名称是 wzq-swagger-mng。执行 docker-compose up -d 时,启动了 wzq-swagger-mng 服务的1个容器实例。

docker-compose.yml 常用命令

docker-compose.yml是 Compose的默认模板文件。该文件有多种写法,例如 Version 1 file format、 Version2 file format、Version2. 1 file format、 Version3 file format等。其中, Version 1 file format将逐步被被弃用, Version2x及 Version3x基本兼容,是未来的趋势。本次只讨论 Version2 file format下的常用命令。

  1. build 配置构建时的选项, Compose会利用它自动构建镜像。buld的值可以是一个路径 例如
build:./Dockerfile

也可以是一个对象,用于指定 Dockerfile和参数, 例如

build:
  context: ./
  dockerfile: ./Dockerfile
agrs:
  jacob: 1
  1. command 覆盖容器启动后默认执行的命令,示例
command: bundle exec thin -p 3000

也可以是一个list,类似于 Dockerfile中的CMD指令,格式如下:

command: [bundle, exec, thin,-p, 3000]
  1. dns 配置dns服务器。可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
  1. dns_search 配置DNS的搜索域,可以是一个值,也可以是一个列表。示例
dns_search:example.com
dns_search:
  - dc1.example.com
  - dc2.example.com
  1. environment 环境变量设置,可使用数组或字典两种方式。示例:
environment
  RACK_ENV: development
  SHOW: true
  SESSION SECRET

environment
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  1. env_file 从文件中获取环境变量,可指定一个文件路径或路径列表。如果通过 docker-compose FILe指定了 Compose 文件,那么 eny_file中的路径是 Compose 文件所在目录的相对路径。使用 environment 指定的环境变量会覆盖 eny_file指定的环境变量。示例
eny_file: .env
eny_file
  - /common.env
  - /apps/web.env
  - /opt/secrets. env
  1. expose 暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。示例:
expose:
  - "3000"
  - "8090"
  1. external_links 连接到 docker-compose.yml外部的容器,甚至并非 Compose 管理的容器,特别是提供共享或公共服务的容器。格式跟 links类似,例如:
external_links:
  - redis_1
  - project_db_1: mysql
  - project_db_1: postgresql
  1. image 指定镜像名称或镜像Id,如果本地不存在该镜像, Compose会尝试下载该镜像。 示例
image: Java
  1. links 连接到其他服务的容器。可以指定服务名称和服务别名( SERVICE: ALIAS),也可只指定服务名称。例如:
web:
  links:
    - db
    - db:database
    - redis
  1. networks 详细查看:Docker-compose 常用命令及网络设置(五)
  2. network_mode 设置网络模式。示例
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
  1. ports 暴露端口信息,可使用H0ST:CONTAINER的格式,也可只指定容器端口(此时宿主机将会随机选择端口),类似于 docker run-p。 需要注意的是,当使用H0ST:CONTAINER格式映射端口时,容器端口小于60将会得到错误的接口,因为yaml会把xx:yy的数字解析为60进制。因此,建议使用字符串的形式。示例:
ports
  - "3000"
  - "3000-3905"
  - "8000:8000"
  - "9099-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127,0.0.1:5000-5010:5000-5010"
  1. volumes 卷挂载路径设置。可以设置宿主机路径(HOST:CONTAINER),也可指定访问模式(HOST:C0ONTAINER:ro)。示例:
volumes
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql
  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql
  # Path on the host relative to the Compose file
  - ./cache:/tmp/cache
  # User-relative path
  - ~/configs:/etc/configs/:ro
  #f Named volume
  - datavolume:/var/lib/mysql
  1. volumes_from 从另一个服务或容器挂载卷。可指定只读(ro)或读写(rw),默认是读写(rw)。 示例
volumes from
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

docker-compose.yml还有很多其他命令,比如 depends_on、pid、 devices等。 本次仅挑选常用的命令进行讲解,其他命令不再赘述。感兴趣的读者们可参考官方文档:https://docs.docker.com/compose/compose-file/

学习于:《Spring Cloud与Docker 微服务架构实战》 — 周立

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker-compose 常用命令及网络设置(五)

    这样就可输出 nginx服务8080端口所绑定的公共端口。 6. ps 列出所有容器。示例

    Jacob丶
  • 设计模式 之 工厂模式

    东汉《风俗通》记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事。开天辟地之初,大地上并没有生物,只有苍茫大...

    Jacob丶
  • IllegalArgumentException:argument type mismatch

    Jacob丶
  • 初识docker compose工具

    AlicFeng
  • Docker 入门到实战教程(十三)Docker Compose

    这里构建一个运行在Docker Compose上的简单Python Web应用程序。该应用程序使用Flask框架,并在Redis中维护一个计数器。尽管该示例使用...

    小东啊
  • ASP.NET那点不为人知的事(二)

    上一篇博文《ASP.NET那点不为人知的事(一)》中我们提到HttpApplication有19个标准事件,在HttpApplication的第8个事件P...

    用户1161731
  • go设计模式之抽象工厂

    在上一篇文章中,通过手机的例子对工厂方法进行了展开。制造商不单单只生产手机这一种产品,同时也生产pc,如果工厂扩展其它业务,工厂方法模式就不适用了。为了实现工厂...

    暮雨
  • 科学瞎想系列之五十一 电流传感器(1)

    搞电的宝宝们经常会和电流、电压之类的东东打交道,电压的测量比较方便,只需把电压表的两端直接怼到被测的两点上就可轻松测得这两点之间的电压,当然在高电压场合这样干...

    标准答案
  • php 使用html5 XHR2实现上传文件与进度显示功能示例

    本文实例讲述了php 使用html5 XHR2实现上传文件与进度显示功能。分享给大家供大家参考,具体如下:

    砸漏
  • 教你88秒插入1000万条数据到mysql数据库表

    其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下:

    java思维导图

扫码关注云+社区

领取腾讯云代金券