官网文档地址: https://docs.docker.com/compose/overview/

docker镜像在创建之后,往往需要自己手动pull来获取镜像,然后执行run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。
docker-compose技术,就是通过一个 .yml 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。

一、docker-compose 的工作流程

1、用一个定义应用程序的环境,Dockerfile这样它就可以在任何地方再现。
2、定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
3、运行docker-compose up和撰写启动并运行整个应用程序。

二、docker-compose安装布署
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    396      0 --:--:--  0:00:01 --:--:--   397
100 10.3M  100 10.3M    0     0   678k      0  0:00:15  0:00:15 --:--:-- 1876k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose 
[root@localhost ~]# docker-compose -v
docker-compose version 1.22.0, build f46880fe
三、docker-compose管理命令介绍

1、compose具有管理应用程序整个生命周期的命令

启动,停止和重建服务
查看正在运行的服务的状态
流式传输运行服务的日志输出
在服务上运行一次性命令

2、常用命令

#帮助信息
[root@localhost ~]# docker-compose --help


#用来创建或重新创建服务使用的镜像
[root@localhost ~]# docker-compose build
例如:docker-compose build service_a    #创建一个镜像名叫service_a

#用于通过容器发送SIGKILL信号强行停止服务
[root@localhost ~]# docker-compose kill

#显示service的日志信息
[root@localhost ~]# docker-compose logs


#暂停和恢复服务
[root@localhost ~]# docker-compose pause/unpause
docker-compose pause    #暂停服务
docker-compose unpause  #恢复被暂停的服务

#用于查看服务中的端口与物理机的映射关系
[root@localhost ~]# docker-compose port
例如:docker-compose port nginx_web 80  #查看服务中80端口映射到物理机上的那个端口

#用于显示当前项目下的容器
[root@localhost ~]# dokcer-compose ps
注意,此命令与docker ps不同作用,此命令会显示停止后的容器(状态为Exited),只针对某个项目。

#用于拉取服务依赖的镜像
[root@localhost ~]# docker-compose pull


#用于重启某个服务中的所有容器
[root@localhost ~]# docker-compose restart
例如:docker-compose restart service_name  #只有正在运行的服务可以使用重启命令,停止的服务是不可以重启

#删除停止的服务(服务里的容器)
[root@localhost ~]# docker-compose rm
-f    #强制删除
-v    #删除与容器相关的卷(volumes)


#用于在服务中运行一个一次性的命令
[root@localhost ~]# docker-compose run

这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处
1、run指定的命令会直接覆盖掉service配置中指定的命令
2、run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用--service-ports指定


#启动/停止运行某个服务的所有容器
[root@localhost ~]# docker-compose start/stop
docker-compose start 启动运行某个服务的所有容器
docker-compose stop 停止运行某个服务的所有容器

#指定某个服务启动的容器个数
[root@localhost ~]# docker-compose scale
[root@localhost ~]# docker-compose scale --help


备注:
docker-compose 运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的service执行命令。
-f    #用于指定配置文件
-p    #用于指定项目名称
四、docker-compose配置文件实例

1、docker-compose.yml的实例文件

version: "3"
services:
  nginx:
    container_name: web-nginx
    image: nginx:latest
    restart: always
    ports:
      - 80:80
    volumes:
    - ./webserver:/webserver
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf


#下面将配置文件做个简单的解释说明
docker-compose的配置文件是一个.yml格式的文件
第一部分
version: "3"  #指定语法的版本

第二部分
services:     #定义服务
  nginx:      #服务的名称,-p参数后接服务名称
    container_name: web-nginx    #容器的名称
    image: nginx:latest          #镜像
    restart: always
    ports:                       #端口映射
      - 80:80

第三部分
volumes:       #物理机与容器的磁盘映射关系
    - ./webserver:/webserver
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf

2、目录结构

[root@localhost docker]# tree ./
./
├── docker-compose.yml
├── nginx
│?? └── nginx.conf
└── webserver
    └── index.html

2 directories, 3 files

3、配置文件

[root@localhost docker]# cat webserver/index.html 
welcome to nginx server!!!!!!!!!

[root@localhost docker]# cat nginx/nginx.conf
#user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    client_max_body_size 10m;  
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /webserver;
        index  index.html index.htm;
    }
}
    include /etc/nginx/conf.d/*.conf;
}

4、使用命令启动容器

[root@localhost docker]# docker-compose up -d
Pulling nginx (nginx:1.14)...
Trying to pull repository docker.io/library/nginx ... 
1.14: Pulling from docker.io/library/nginx
f2aa67a397c4: Already exists
6160d1ac49e9: Pull complete
046b67408776: Pull complete
Digest: sha256:85ab7c44474df01422fe8fdbf9c28e497df427e8a67ce6d47ba027c49be4bdc6
Status: Downloaded newer image for docker.io/nginx:1.14
Creating nginx-server ... done

[root@localhost docker]# lsof -i :80
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
docker-pr 891 root    4u  IPv6 1187080      0t0  TCP *:http (LISTEN)
[root@localhost docker]# docker ps |grep nginx
07ca899cc44b   nginx:1.14   "nginx -g 'daemon ..."   29 seconds ago  Up 28 seconds  0.0.0.0:80->80/tcp  nginx-server
#如果启动时不指定里面的服务名称,就是直接启动配置文件里所有的服务

5、浏览器测试是否正常访问
在这里插入图片描述

6、修改相应的首页文件

[root@localhost docker]# cat webserver/index.html 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome to nginx web stie</title>
</head>
<body>
   <h2>欢迎来nginx站点</h2>
</body>
</html>

7、再次打开浏览器查看效果
在这里插入图片描述

五、使用Docker-Compose部署nginx代理Tomcat集群,实现负载均衡

1、大体步骤分为以下四步

1、下载所需的文件tomcat,jdk
2、编写dockerfile来布署tomcat与java环境,生成镜像文件
3、编写docker-compose.yml配置文件,启动所有容器服务
4、测试负载均衡

2、具体配置文件

#整个目录结构
[root@master java]# tree ./
./
├── docker-compose.yml
├── etc
│   └── localtime
├── nginx
│   └── nginx.conf
├── tomcat
│   ├── apache-tomcat-8.5.31.tar.gz
│   ├── Dockerfile
│   └── jdk-8u144-linux-x64.tar.gz
└── webserver
    ├── tomcatA
    │   └── index.jsp
    └── tomcatB
        └── index.jsp
6 directories, 8 files


#两个测试首页文件
[root@master java]# cat webserver/tomcatA/index.jsp 
welcome to tomcat-A server

[root@master java]# cat webserver/tomcatB/index.jsp 
welcome to tomcat-B server


#配置文件
[root@master java]# cat docker-compose.yml 
version: "3"
services:
  nginx:
    image: nginx:1.14
    restart: always
    ports:
      - 80:80
    links:
      - tomcat1:tomcat1
      - tomcat2:tomcat2
    volumes:
      - ./webserver:/webserver
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./etc/localtime:/etc/localtime
    depends_on:
      - tomcat1
      - tomcat2
  tomcat1:
    hostname: tomcat1
    build: ./tomcat
    volumes:
      - ./webserver/tomcatA:/usr/local/apache-tomcat-8.5.31/webapps/ROOT
      - ./etc/localtime:/etc/localtime
  tomcat2:
    hostname: tomcat2
    build: ./tomcat
    volumes:
      - ./webserver/tomcatB:/usr/local/apache-tomcat-8.5.31/webapps/ROOT
      - ./etc/localtime:/etc/localtime

	  
#安装JAVA环境
[root@master java]# cat tomcat/Dockerfile 
FROM centos
ADD jdk-8u144-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ADD apache-tomcat-8.5.31.tar.gz /usr/local
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.5.31/bin/catalina.sh", "run"]

3、启动所有容器服务

[root@master java]# docker-compose up

4、查看启动情况

[root@master java]# docker-compose ps
     Name                   Command               State         Ports       
----------------------------------------------------------------------------
java_nginx_1     nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
java_tomcat1_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp          
java_tomcat2_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp  

5、检测负载均衡

[root@master java]# curl http://localhost
welcome to tomcat-A server
[root@master java]# curl http://localhost
welcome to tomcat-B server
[root@master java]# curl http://localhost
welcome to tomcat-A server
[root@master java]# curl http://localhost
welcome to tomcat-B server

6、浏览器访问测试负载均衡
在这里插入图片描述

六、补充

1、配置文件涉及到数据库内容

disconf-redis:
    image: redis:latest
disconf-mysql:
    image: mysql:5.7
    environment:
        - MYSQL_ROOT_PASSWORD=passw0rd
disconf-zoo:
    build: ../disconf-zoo
    ports:
        - "2181:2181"
disconf-app:
    build: ../disconf-app
    links:
        - disconf-redis
        - disconf-mysql
        - disconf-zoo
    volumes:
        - ../disconf-build/working/war:/home/work/dsp/disconf-rd/war
disconf-nginx:
    image: nginx:1.9
    links:
        - disconf-app
    volumes:
        - ../disconf-nginx/nginx.conf:/etc/nginx/nginx.conf:ro
        - ../disconf-build/working/war/html:/home/work/dsp/disconf-rd/war/html:ro
        - ../disconf-nginx/logs:/home/work/var/logs/disconf
    ports:
        - "8081:8081"

2、涉及网络相关

s1: # slave1
  build: ./s1
  container_name: s1
  volumes:
    - /home/ssab/config/mysql-s1/:/etc/mysql/:ro
    - /etc/localtime:/etc/localtime:ro
    - /home/ssab/config/hosts:/etc/hosts:ro
  networks:
    mysql:
      ipv4_address: 192.168.16.203
  links:
    - m1
  ulimits:
    nproc: 65535
  hostname: s1
  mem_limit: 1024m
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: passw0rd
	
s2: # slave2
  build: ./s2
  container_name: s2
  volumes:
    - /home/ssab/config/mysql-s2/:/etc/mysql/:ro
    - /etc/localtime:/etc/localtime:ro
    - /home/ssab/config/hosts:/etc/hosts:ro
  links:
    - m1
  networks:
    mysql:
      ipv4_address: 192.168.16.205
  ulimits:
    nproc: 65535
  hostname: s2
  mem_limit: 1024m
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: passw0rd

3、简单后端配置

version: '2'
services:
  db:
    image: mysql:5.5
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - "./.data/db:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: root

  redis:
    image: redis:3

  tomcat:
    build: ./build/tomcat/
    volumes:
      - "./.data/webapps:/opt/tomcat/webapps"
    links:
      - db
      - redis
    ports:
      - "8080:8080"
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐