docker-compose

基本命令及安装

1
2
3
4
5
6
7
8
9
10
11
docker-compose --verison
# linux
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 启动
docker-compose up
docker-compose up -d # 后台
docker-compose -f docker-compose.yml up
docker-compose images
docker-compose down

部署一个 WordPress

详细文档查看官方hub

1
2
3
4
# 启动一个 mysql container
docker run -d --name mysql -v mysql-data://var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
# 启动 wordpress container
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress

docker-compose.yml

概念

  • Services
  • Networks
  • Volumes

Services

一个Service代表一个container,这个container可以从dockerhubimage来创建,或者从本地的Dockerfile`build出来的image`来创建

Service的启动类似的docker run,我们可以给其指定networkvolume,所以可以给service指定networkVolume的引用

wordpress example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

flask-redis example

  • docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3"

services:

redis:
image: redis

web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
  • app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
  • Dockerfile
1
2
3
4
5
6
7
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" ]

扩展+负载均衡

1
2
3
docker-compose up --scale web=3 -d
# 后端运行三台 web container,可以随便扩展
# 在上面的 flask 中会因为 ports 不能重复利率用二报错 删掉即可
  • Dockerfile
1
2
3
4
5
6
7
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
  • app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
  • docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

run

1
2
3
4
5
6
7
8
9
10
11
12
docker-compose up -d
docker-compose ps
curl 127.0.0.1:8080
dcoker-compose up --scale web=3 -d # 运行 3 个在后台
docker-compose ps
curl 127.0.0.1:8080 # 多 run 几次
curl 127.0.0.1:8080
Hello Container World! I have been seen 3 times and my hostname is 54389c4f203a.
curl 127.0.0.1:8080
Hello Container World! I have been seen 4 times and my hostname is 121e4d6e88db.
curl 127.0.0.1:8080
Hello Container World! I have been seen 5 times and my hostname is 6d2929bbaae4.

部署复杂的应用

1
docker-compose build