Docker-07-docker compose

1、docker運行wordpress案例

  • 第一步:建立一個mysql容器
[root@docker01 ~]# docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
05e9c5733c1784dc86582e633796e154118bbbefeadb4394bfff82d8a06054c4
  • 第二步:啓動wordpress容器,指定相應環境變量

官網地址:https://hub.docker.com/_/wordpress/html

[root@docker01 ~]# docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
97443a6db7650fe3ebd2c016008455238f95b692597012e05532d58363e32ef3
  • 第三步:網頁訪問http://host_ip:8080

2、什麼是Docker Compose

  • Docker Compose是一個基於docker的命令行工具;
  • 這個工具能夠經過一個yml文件定義多容器的docker應用;
  • 經過一條命令就能夠根據yml文件的定義去建立或管理多個容器;
  • docker-compose.yml是默認的yml配置文件名稱。

2.1 docker-compose版本

官網介紹:https://docs.docker.com/compose/compose-file/python

version2只支持單機mysql

version3能夠支持多機(建議使用)linux

2.2 docker-compose.yml文件

docker-compose的三大概念:git

  • Services
  • Networks
  • Volumes

2.2.1 Services

  • 一個service表明一個container,這個container能夠從dockerhub的image來建立,或者從本地的dockerfile build出來的image建立。
  • Service啓動相似docker run,咱們能夠給其指定network和volume,因此能夠給service指定network和volume的引用。

例(從docker hub拉取鏡像):github

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

等價於docker run命令:web

docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

例(本地構建dockerfile):redis

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

2.2.2 Volumes

建立一個volume,或者將volume掛載到容器:sql

volumes:
  mysql-data:

等價於:docker

docker volume create mysql-data

2.2.3 Networks

建立一個網絡,或者爲容器指定一個網絡

networks:
  my-bridge:
    driver: bridge

等價於:

docker network create my-bridge

3、docker-compose的安裝和使用

3.1安裝docker-compose

MAC和windows在安裝docker時已經安裝好docker-compose了。

在linux上安裝docker-compose

官網地址:https://docs.docker.com/compose/install/

3.1.1 下載可執行文件安裝

  • 第一步:下載可執行文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 第二步:爲文件添加執行權限
chmox +X /usr/local/bin/docker-compose
  • 第三步:查看安裝結果
docker-compose --version

3.1.2 經過pip安裝

  • 安裝python-pip,並經過pip安裝docker-compose
yum -y install epel-release
yum -y install python-pip
pip install docker-compose
  • 查看安裝結果
docker-compose --version

3.2 docker-compose的使用

3.2.1 docker-compose命令參數

  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

3.2.2 使用docker-compose

案例:經過docker-compose安裝wordpress

  • 編寫docker-compose.yml
[root@docker02 wordpress]# cat docker-compose.yml 
version: '3'

services:
  wordpress:
    image: wordpress
    ports:
      - 8080: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
  • 啓動docker-compose
docker-compose up
  • 後臺啓動docker-compose
[root@docker02 wordpress]# docker-compose up -d
Starting wordpress_wordpress_1 ... done
Starting wordpress_mysql_1     ... done
  • 查看docker-compose生成的容器
[root@docker02 wordpress]# docker-compose ps
        Name                       Command               State          Ports        
-------------------------------------------------------------------------------------
wordpress_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp 
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp
  • 中止docker-compose
docker-compose down
  • 進入到docker-compose啓動的容器

注意:後面跟的是在docker-compose.yml中定義的service名

[root@docker02 wordpress]# docker-compose exec mysql bash

 4、水平拓展負載均衡實驗

docker-compose命令中有一個參數:scale,能夠經過這個參數來調節容器的運行數量!

準備flask-redis案例(參考文章:http://www.javashuo.com/article/p-kopkpfqz-c.html

4.1 啓動多個web和一個redis

  • 第一步:準備三個實驗文件,而且都放在同一目錄

(1)python程序文件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)

(2)Dockerfile

FROM python:2.7
LABEL maintainer="this is test message"
COPY . /app/
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD ["python","app.py"]

(3)docker-compose.yml

version: '3'

services:
  redis:
    image: redis

  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis
  • 第二步:啓動docker-compose
docker-compose up -d
  • 第三步:查看docker-compose
[root@docker01 chapter6]# docker-compose ps
      Name                    Command               State    Ports  
--------------------------------------------------------------------
chapter6_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
chapter6_web_1     python app.py                    Up      5000/tcp
  • 第四步:調整web數量爲3
docker-compose up --scale web=3 -d
  • 第五步:再次查看docker-compose
[root@docker01 chapter6]# docker-compose ps
      Name                    Command               State    Ports  
--------------------------------------------------------------------
chapter6_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
chapter6_web_1     python app.py                    Up      5000/tcp
chapter6_web_2     python app.py                    Up      5000/tcp
chapter6_web_3     python app.py                    Up      5000/tcp

4.2 在前方增長HAProxy

  • 第一步:修改app.py、Dockerfile以及docker-compose.yml文件

(1)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)

(2)Dockerfile

FROM python:2.7
LABEL maintaner="this is test message"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

(3)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:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 
  • 第二步:啓動docker-compose
docker-compose up -d
  • 第三步:查看docker-compose容器,並訪問端口8080
#查看docker-compose啓動的容器,共有三個
[root@docker01 chapter6]# docker-compose ps
      Name                    Command               State                    Ports                 
---------------------------------------------------------------------------------------------------
chapter6_lb_1      /sbin/tini -- dockercloud- ...   Up      1936/tcp, 443/tcp, 0.0.0.0:8080->80/tcp
chapter6_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp                               
chapter6_web_1     python app.py                    Up      5000/tcp   


#訪問自身8080端口
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 1 times and my hostname is 2e7fe9be9d40.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 2 times and my hostname is 2e7fe9be9d40.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 3 times and my hostname is 2e7fe9be9d40.
  • 第四步:將web容器scale成3個節點
[root@docker01 chapter6]# docker-compose up --scale web=3 -d
chapter6_redis_1 is up-to-date
Starting chapter6_web_1 ... done
Creating chapter6_web_2 ... done
Creating chapter6_web_3 ... done
chapter6_lb_1 is up-to-date
[root@docker01 chapter6]# docker-compose ps
      Name                    Command               State                    Ports                 
---------------------------------------------------------------------------------------------------
chapter6_lb_1      /sbin/tini -- dockercloud- ...   Up      1936/tcp, 443/tcp, 0.0.0.0:8080->80/tcp
chapter6_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp                               
chapter6_web_1     python app.py                    Up      5000/tcp                               
chapter6_web_2     python app.py                    Up      5000/tcp                               
chapter6_web_3     python app.py                    Up      5000/tcp      
  • 第五步:再次訪問8080端口,發現已經能夠負載到後端的其餘容器了,實驗成功!!
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 4 times and my hostname is 2e7fe9be9d40.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 5 times and my hostname is b087d3960be1.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 6 times and my hostname is 986d2584749b.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 7 times and my hostname is 2e7fe9be9d40.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 8 times and my hostname is b087d3960be1.
[root@docker01 chapter6]# curl 127.0.0.1:8080
Hello Container World! I have been seen 9 times and my hostname is 986d2584749b.

已實現擴容和負載均衡,實驗過程到此結束~~

相關文章
相關標籤/搜索