docker知识7---docker-compose介绍

docker-compose
  多数的现代应用通过多个更小的服务互相协同来组成一个完整可用的应用。比如一个简单的示例应用可能由如下 4 个服务组成。
    Web前端。
    订单管理。
    品类管理。
    后台数据库。
  将以上服务组织在一起,就是一个可用的应用。部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。
Docker Compose,能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理。
Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。

 

 ##案例1:docker启动多容器

 

 ##案例2:docker-compose启动多容器 wordpress、mysql

cat <<eof> docker-compose.yml
version: '3'

services:

  wordpress:
    image: wordpress
    ports:
      - 1080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge

volumes:
  mysql-data:

networks:
  my-bridge:
    driver: bridge
eof
docker-compose up
[root@controller bin]# docker-compose up
Creating network "bin_my-bridge" with driver "bridge"
Creating volume "bin_mysql-data" with default driver
Creating bin_wordpress_1 ... done
Creating bin_mysql_1     ... done
Attaching to bin_mysql_1, bin_wordpress_1
mysql_1      | 2021-08-02 12:27:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started.
wordpress_1  | WordPress not found in /var/www/html - copying now...
mysql_1      | 2021-08-02 12:27:23+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_1      | 2021-08-02 12:27:23+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started.
mysql_1      | 2021-08-02 12:27:23+00:00 [Note] [Entrypoint]: Initializing database files
mysql_1      | 2021-08-02T12:27:23.374792Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.26) initializing of server in progress as process 40
mysql_1      | 2021-08-02T12:27:23.390372Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2021-08-02T12:27:24.263737Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
wordpress_1  | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1  | No 'wp-config.php' found in /var/www/html, but 'WORDPRESS_...' variables supplied; copying 'wp-config-docker.php' (WORDPRESS_DB_HOST WORDPRESS_DB_PASSWORD)
mysql_1      | 2021-08-02T12:27:26.525255Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:26.525755Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:26.553145Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1  | [Mon Aug 02 12:27:27.376843 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.22 configured -- resuming normal operations
wordpress_1  | [Mon Aug 02 12:27:27.377214 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
mysql_1      | 2021-08-02 12:27:30+00:00 [Note] [Entrypoint]: Database files initialized
mysql_1      | 2021-08-02 12:27:30+00:00 [Note] [Entrypoint]: Starting temporary server
mysql_1      | 2021-08-02T12:27:31.451164Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.26) starting as process 87
mysql_1      | 2021-08-02T12:27:31.553054Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2021-08-02T12:27:32.667455Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2021-08-02T12:27:33.300315Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:33.300660Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:33.303590Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2021-08-02T12:27:33.304035Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2021-08-02T12:27:33.308182Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2021-08-02T12:27:33.350230Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.26'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_1      | 2021-08-02T12:27:33.350283Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
mysql_1      | 2021-08-02 12:27:33+00:00 [Note] [Entrypoint]: Temporary server started.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql_1      | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql_1      | 2021-08-02 12:27:37+00:00 [Note] [Entrypoint]: Creating database wordpress
mysql_1      | 
mysql_1      | 2021-08-02 12:27:37+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql_1      | 2021-08-02T12:27:37.672903Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.26).
mysql_1      | 2021-08-02T12:27:38.662161Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.
mysql_1      | 2021-08-02 12:27:38+00:00 [Note] [Entrypoint]: Temporary server stopped
mysql_1      | 
mysql_1      | 2021-08-02 12:27:38+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
mysql_1      | 
mysql_1      | 2021-08-02T12:27:38.968138Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.26) starting as process 1
mysql_1      | 2021-08-02T12:27:38.980098Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_1      | 2021-08-02T12:27:39.247591Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_1      | 2021-08-02T12:27:39.501385Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:39.501621Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
mysql_1      | 2021-08-02T12:27:39.502807Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_1      | 2021-08-02T12:27:39.503103Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_1      | 2021-08-02T12:27:39.506041Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1      | 2021-08-02T12:27:39.550616Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.26'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
mysql_1      | 2021-08-02T12:27:39.550639Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock

  

 ##案例3:docker-compose启动多容器flask、redis

mkdir /root/compose-flask-redis/
cd !$

cat <<eof> app.py
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)
eof

cat <<eof> Dockerfile
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
eof

cat <<eof> docker-compose.yml
version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 2080:5000
    environment:
      REDIS_HOST: redis
eof

docker-compose -f docker-compose.yml
curl http://192.168.66.10:2080/ 

 

 案例4:docker-compose案例3:LB-SCALE

mkdir /root/compose-LB-SCALE/
cd !$

cat <<eof> app.py
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)
eof

cat <<eof> Dockerfile
FROM python:2.7
LABEL maintaner="chalon"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
eof

cat <<eof> docker-compose.yml
version: "3"

services:

  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis

  lb:
    image: dockercloud/haproxy
    links:
      - web
    ports:
      - 1080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 
eof

docker-compose -f docker-compose.yml up
curl http://192.168.66.10:1080/ 

docker-compose scale web=3 #设置web服务的数量为3个;
curl http://192.168.66.10:1080/ #验证web服务;
curl http://192.168.66.10:1080/ #验证web服务;
curl http://192.168.66.10:1080/ #验证web服务;

 

 

 

##docker-compose案例4:voting-app
  应用架构:5个模块;voting app负责对外提供投票服务,其投票产生的数据由redis消息队列进行缓存,java worker从消息队列读取投票数据后并将其写入数据库,result app从数据库读取数据进行统计并输出结果。

mkdir voting-pro
cd voting-pro
cat <<eof> docker-compose.yml  #字段未设置参数时表示使用默认参数,如front-tier:;
version: "3"

services:
  voting-app:
    build: ./voting-app/.
    volumes:
     - ./voting-app:/app
    ports:
      - "5000:80"
    links:
      - redis
    networks:
      - front-tier
      - back-tier

  result-app:
    build: ./result-app/.
    volumes:
      - ./result-app:/app
    ports:
      - "5001:80"
    links:
      - db
    networks:
      - front-tier
      - back-tier

  worker:
    build: ./worker
    links:
      - db
      - redis
    networks:
      - back-tier

  redis:
    image: redis
    ports: ["6379"]
    networks:
      - back-tier

  db:
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - back-tier

volumes:
  db-data:

networks:
  front-tier:
  back-tier:
eof

~~~上传程序源代码:voting app、woker、result app;
docker pull java:7
docker pull postgres:9.4
docker pull redis
docker pull python:2.7
docker pull node:0.10
docker-compose build  #先将dockerfile创建镜像
docker images 
docker-compose up     #启动多容器;

 

 

 

  

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2021-08-02 13:42  chalon  阅读(153)  评论(0编辑  收藏  举报