简介:

docker可以一条命令就运行一个配置好的服务器,很是方便。

但是也有一个问题就是,当参数比较多,映射目录比较多,映射端口比较多…………

我以前就是写个脚本,用脚本来启动,很low啊。

也见到一些docker镜像的介绍页有介绍docker-compose,但是因为一直都是小型的应用,也就没认真看这个东西,今天就深入学习一下吧。

Docker Compose是一个用来定义和运行复杂应用的Docker工具

里面的数据结构比我几行脚本清晰的多。而且可以同时启动多个容器,并且是根据依赖关系来先后启动。

比如先启动数据库,再启动博客。

官方说明https://docs.docker.com/compose/

我学习的版本可能没有官方版本新,看不明白,或有更高级需求的,可以去看官方说明。

一:安装

和安装docker差不多。

安装docker是  dnf install docker

安装docker-compose是 dnf install docker-compose

dnf 是我使用的fedora的包管理工具,根据你的linux版本不同,可能不一样。

在使用CentOS时发现包管理里面没有这个包。

可以用docker官方推荐的方法来安装。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

二:无脑试用

创建docker-compose.yml文件

version: '2'
services:
ssh:
image: jackadam/alpine_with_ssh
ports:
- "2222:22"

然后在同目录下执行  docker-compose up -d

这样就启动了一个开放2222端口的apache。

关闭的时候在这里执行  docker-compose down

三:docker-compose命令

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

--tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器

四:docker-compose.yml

简介:

这个就是配置容器启动的参数的。

先看一下官方给的示例:

version: '3.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:

这还是非常方便的,先启动db,然后启动wordpress。

下面逐步解释如何编写docker-compose.yml

1.基本结构

一个docker-compose.yml包含三大部分:

version  services  容器

上面示例中,db 和 wordpress 就是两个容器。

相关内容的第一行,就是容器的名字了。

2.image

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd

3.bulid

大家也经常使用Dockerfile来自己生成镜像。docker-compose自然也是支持的。

不写image,改为写buile,则是根据dockerfile来生成镜像。

示例代码如下:

    build:
context: ../
dockerfile: path/of/Dockerfile

我暂时只用到了

build: .

类似于 docker build .

4.context(配合build)

context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的url,当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

5.dockerfile(配合build)

使用此 dockerfile 文件来构建,必须指定构建路径

    build:
context: .
dockerfile: Dockerfile-alternate

6.args(配合build)

添加构建参数,这些参数是仅在构建过程中可访问的环境变量
首先, 在Dockerfile中指定参数:

ARG fendo
ARG password RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"

然后指定 build 下的参数,可以传递映射或列表

    build:
context: .
args:
fendo: 1
password: fendo - fendo=1
- password=fendo

指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值(还没理解)

    args:
- fendo
- password

YAML布尔值(truefalseyesnoonoff)必须用引号括起来,这样分析器会将它们解释为字符串。

7.container_name

Compose 的容器名称格式是:<项目名称><服务名称><序号>

虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app

8.depends_on

在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

    version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres

9.ports

端口映射映射主机端口到容器端口

ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
- "12400-12500:1240"

10.expose

开放这个服务(容器)的端口

expose:
- "3000"
- "8000"

11.links

较为传统的link,连接本compose文件中的其他容器

web:
links:
- "db"
- "db:database"
- "redis"

12.external_links

扩展连接link,连接非本compose文件的其他容器,就像docker的--link,用来连接公共服务容器,比如说数据库。

external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

13.networks

由于--link一直说要被淘汰,建议使用network方式配置,类似于docker run --net模式

这个是网络的主配置。

services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:

注意:

在networks中声明的网络名称,会自从生成为  Folder_some-network      Folder_other-network,即在你设定的网络名称前面加上当前文件夹名,如果想有互相连通的compose,就把yaml放一个文件夹吧,然后使用docker-compose - ***.yaml [command]

如:

14.ALIASES

别名,网络中的别名,可以理解为计算机名。可以同时又多个别名。

services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2

下面示例展示了3个容器,使用两个网络进行互联的配置。

version: '2'

services:
web:
build: ./web
networks:
- new worker:
build: ./worker
networks:
- legacy db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql networks:
new:
legacy:

15.environment

环境变量也就是docker run -e

environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:963852741 environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET:

16.volumes

卷映射,目录映射,可以:ro 设置为只读

volumes:
# 仅创建目录到宿主机
- /var/lib/mysql # 创建真实路径到映射
- /opt/data:/var/lib/mysql # 从compose文件创建相对目录的映射
- ./cache:/tmp/cache # 在linux用户目录创建映射
- ~/configs:/etc/configs/:ro # 在目录空间中创建
- datavolume:/var/lib/mysql

17.restart

restart 选项,有下面几种

restart: "no"  #从不
restart: always #总是
restart: on-failure #失败时
restart: unless-stopped #除非停止

18.privileged

privileged选项

privileged: true

19.deploy

v3版本新加的参数,部署参数。有什么CPU限制,内存限制………………

因为deploy在使用的时候,有一些限制,但你的compose文件中出现如下配置项时,deploy就无法使用:

build
    cgroup_parent
    container_name
    devices
    tmpfs
    external_links
    links
    network_mode
    restart
    security_opt
    stop_signal
    sysctls
    userns_mode

20:logging

logging可以设置关于日志的东西。

logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"

我用到的也就设置日志大小而已。

logging:
options:
max-size: "200k"
  max-file: "10"

官方文档才是最新最全的。

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

五:实例

1.mariadb

mariadb.yaml

version: "" #版本3
services: #服务
mysql: #服务名mysql
image: mariadb #镜像名称
privileged: true #高级权限
tty: true #开一个终端
container_name: mysql #自定义容器名
networks: #网络
- mynet #属于网络mynet
ports: #开放端口映射3306-->3306
- 3306:3306 #冒号左边是宿主机开放端口,冒号右边是容器开放端口
environment: #启动变量
MYSQL_ROOT_PASSWORD:123456 #mysql的root密码
volumes: #目录映射
- /storage/mariadb:/var/lib/mysql #映射mariadb的数据库文件存储路径,冒号左边是宿主机路径,冒号右边是容器内路径
networks: #关于网络的服务
mynet: #声明网络mynet

2.wordpress

wordpress.yaml

version: ""   #版本3
services: #服务
wordpress: #服务名wordpress
image: wordpress #镜像名称
privileged: true #高级权限
tty: true #开一个终端
container_name: wordpress #自定义容器名
networks: #网络
- mynet #属于网络mynet
ports: #开放端口映射80-->80
- 80:80 ##冒号左边是宿主机开放端口,冒号右边是容器开放端口
environment: #启动变量mysql的root密码
WORDPRESS_DB_HOST: mysql #数据库服务器地址,直接用了另一个容器的容器名
WORDPRESS_DB_NAME: wordpress #数据库的库名
WORDPRESS_DB_USER: wordpress #数据库的用户名
WORDPRESS_DB_PASSWORD: wordpress #数据库的密码
volumes: #目录映射
- /storage/wordpress:/var/www/html/wp-content #映射wordpress存储路径(插件,主题,语言包,上传文件),冒号左边是宿主机路径,冒号右边是容器内路径
networks: #关于网络的服务
mynet: #声明网络mynet

3.使用方法

docker-compose -f mariadb.yaml up -d

#后台启动mariadb容器

#使用任意管理工具,连接3306端口,创建给wordpress用的数据库,库名:wordpress,用户名wordpress,密码wordpress,%(任意)主机登录

docker-compose - wordpress.yaml up -d

#后台启动wordpress容器。

由网络mynet来进行两个容器的自动联通。

docker-compose docker启动工具,容器互联的更多相关文章

  1. 控制Docker Compose的启动顺序的一个思路

    起源 守护进程daemon 从守护进程的角度看Docker Compose Docker的解决方案 思路 代码 结果 起源 Docker Compose提供了一个depends_on参数. https ...

  2. Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  3. Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  4. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  5. docker compose 服务启动顺序控制

    概要 docker-compose 可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序. docker-comp ...

  6. Docker系列(27)- 容器互联--link

    思考 思考一个场景,我们编写了一个微服务,database url=IP:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以使用名字来进行访问容器吗 实践 [root@localhost ...

  7. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  8. Docker深入浅出系列 | Docker Compose多容器实战

    目录 前期准备 Docker Compose是什么 为什么要用Docker Compose Docker Compose使用场景 Docker Compose安装 Compose Yaml文件结构 C ...

  9. [Docker6] Docker compose多容器运行与管理

    六.Docker compose docker compose就是通过yml文件来定义和运行多个容器docker应用程序的工具,三步过程就能跑起一个compose: 定义应用程序的环境(yml中) 定 ...

随机推荐

  1. 4.Python3运算符

    4.1算数运算符(以下假设变量a为10,变量b为21) 实例操作: print(3 + 5) #数字3与5相加 print(3 - 5) #数字3与5相减 print(3 * 5) #数字3与5相乘 ...

  2. tensorflow 的数据管理

    tensorflow api操纵和管理的是numpy矩阵数据 例子: import tensorflow as tf import numpy as np vector_np = np.array([ ...

  3. Centos7.2 Install subversion server

    l  安装svn yum install subversion   l  查看svn版本 svnserve  --version   l  创建svn版本库目录 mkdir -p /projects/ ...

  4. session删除

    <?php session_start(); //删除session $_SESSION=array(); //删除客户端cookie中存储的sessionID值 if(isset($_COOK ...

  5. Android Studio 添加已经移除的Module

    Android Studio 删除Module时,需要先在Project Structure中点击“-”来移除,此时小手机图标消失,但是这个时候Module并没有在硬盘中删除,只是和这个Project ...

  6. Java课程总结

    预备作业一 简要内容:我期望的师生关系 预备作业二 简要内容:学习基础和C语言基础调查 预备作业三 简要内容:Linux安装及学习 第一周作业 简要内容:Java入门 第二周作业 简要内容:学习基本数 ...

  7. 20175208 《Java程序设计》第四周学习总结

    第五章主要学习内容 1.子类的继承性: (1)子类与父类在同一包中的继承性:子类自然地继承了其父类中不是private的成员变量作为自己的成员变量. (2)子类与父类不在同一包中的继承性:子类只继承父 ...

  8. vue用mand-mobile ui做交易所移动版实战示例

    vue用mand-mobile ui做交易所移动版实战示例 先展示几个界面: 目录结构: main.js // The Vue build version to load with the `impo ...

  9. kindeditor4.1.11的使用方法

    在引入某个外部框架/功能件的 时候, 通常是 先引入css, 后引入js. css的必要属性是rel和href, js的必要属性是charset和src. js都是用javascript的,所以 cs ...

  10. Vue父子组件传值 | 父传子 | 子传父

    父传子 父容器 <template> <div> <zdy :module='test'></zdy> </div> </templa ...