文章目录
- 使用Docker Compose之前的项目搭建
- 构建一个Python的应用的image
- 创建composetest文件夹
- 在 /tmp/composetest文件夹下 创建app.py文件
- 创建requirements.txt文件
- 创建Dockerfile文件
- 构建Python这个应用程序的image
- 拉取redis的镜像
- 创建应用网络 docker network create --subnet=172.26.0.0/24 compose-test-net
- 启动Python应用
- 启动redis容器
- 访问测试
- Docker Compose
- 官网
- Docker Compose简介
- Docker Compose 安装 (这里操作linux系统的安装)
- Docker Compose的使用(对上面项目进行改造)
- Docker Comopose 常用命令
- docker-compose --version 查看版本
- docker-compose up 启动
- docker-compose images 查看当前compose下的镜像
- docker-compose stop 停止当前的compose下的容器
- docker-compose start 启动当前的compose下的容器
- docker-compose exec ${container-name} sh
- docker-compose ps 显示docker-compose.yml文件中定义的services
- docker-compose down 删除docker-compose,同时删除容器以及创建的网络和volume挂载目录
- 总结
使用Docker Compose之前的项目搭建
构建一个Python的应用的image
创建composetest文件夹
[root@izwz91h49n3mj8r232gqwez tmp]# pwd
/tmp
root@izwz91h49n3mj8r232gqwez tmp]# mkdir composetest
[root@izwz91h49n3mj8r232gqwez tmp]# cd composetest/ ls -la
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]#
在 /tmp/composetest文件夹下 创建app.py文件
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
备注
1.cache = redis.Redis(host='redis', port=6379)
这里的redis,是与后面创建的redis容器的名字是一致的,如果你的容器的名字不是redis,
那么这里需要改成你后面创建的容器的名字,6379是对应容器的端口
创建requirements.txt文件
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# vim requirements.txt
[root@izwz91h49n3mj8r232gqwez composetest]#
requirements.txt文件内容
flask
redis
创建Dockerfile文件
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# vim Dockerfile
[root@izwz91h49n3mj8r232gqwez composetest]#
Dockfile文件内容
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
构建Python这个应用程序的image
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# docker build -t python-app-image .
Sending build context to Docker daemon 4.608kB
Step 1/9 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
89d9c30c1d48: Pull complete
910c49c00810: Pull complete
7efe415eb85a: Pull complete
7d8d53519b81: Pull complete
519124ac136c: Pull complete
Digest: sha256:de9fc5bc46cb1a7e2222b976394ea8aa0290592e3075457d41c5f246f176b1bf
Status: Downloaded newer image for python:3.7-alpine
---> 8922d588eec6
Step 2/9 : WORKDIR /code
---> Running in 064aa863a5d1
Removing intermediate container 064aa863a5d1
---> e0d0f7a10b40
Step 3/9 : ENV FLASK_APP app.py
---> Running in 0c12a404e52b
Removing intermediate container 0c12a404e52b
---> b4ba157f615c
Step 4/9 : ENV FLASK_RUN_HOST 0.0.0.0
---> Running in ba3bf6ec86d2
Removing intermediate container ba3bf6ec86d2
---> 0584db739547
Step 5/9 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in 42f9c797d10b
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/12) Installing binutils (2.32-r0)
(2/12) Installing gmp (6.1.2-r1)
(3/12) Installing isl (0.18-r0)
(4/12) Installing libgomp (8.3.0-r0)
(5/12) Installing libatomic (8.3.0-r0)
(6/12) Installing libgcc (8.3.0-r0)
(7/12) Installing mpfr3 (3.1.5-r1)
(8/12) Installing mpc1 (1.1.0-r0)
(9/12) Installing libstdc++ (8.3.0-r0)
(10/12) Installing gcc (8.3.0-r0)
(11/12) Installing linux-headers (4.19.36-r0)
(12/12) Installing musl-dev (1.1.22-r3)
Executing busybox-1.30.1-r2.trigger
OK: 121 MiB in 47 packages
Removing intermediate container 42f9c797d10b
---> 9859b83b89e9
Step 6/9 : COPY requirements.txt requirements.txt
---> 65ea1158149c
Step 7/9 : RUN pip install -r requirements.txt
---> Running in f35c9718cb07
Collecting flask
Downloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
Collecting redis
Downloading https://files.pythonhosted.org/packages/32/ae/28613a62eea0d53d3db3147f8715f90da07667e99baeedf1010eb400f8c0/redis-3.3.11-py2.py3-none-any.whl (66kB)
Collecting itsdangerous>=0.24
Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Jinja2>=2.10.1
Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting click>=5.1
Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Werkzeug>=0.15
Downloading https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl (327kB)
Collecting MarkupSafe>=0.23
Downloading https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz
Building wheels for collected packages: MarkupSafe
Building wheel for MarkupSafe (setup.py): started
Building wheel for MarkupSafe (setup.py): finished with status 'done'
Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-cp37-cp37m-linux_x86_64.whl size=32320 sha256=293afa3635708a72787c2e70e7f3dbdf57705de8b8d89e7cfdb057cf3bdb7649
Stored in directory: /root/.cache/pip/wheels/f2/aa/04/0edf07a1b8a5f5f1aed7580fffb69ce8972edc16a505916a77
Successfully built MarkupSafe
Installing collected packages: itsdangerous, MarkupSafe, Jinja2, click, Werkzeug, flask, redis
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 Werkzeug-0.16.0 click-7.0 flask-1.1.1 itsdangerous-1.1.0 redis-3.3.11
Removing intermediate container f35c9718cb07
---> db2e815e7795
Step 8/9 : COPY . .
---> af81ca7db43d
Step 9/9 : CMD ["flask", "run"]
---> Running in 38c06fed8d87
Removing intermediate container 38c06fed8d87
---> d1ff3f955ba5
Successfully built d1ff3f955ba5
Successfully tagged python-app-image:latest
[root@izwz91h49n3mj8r232gqwez composetest]#
[root@izwz91h49n3mj8r232gqwez composetest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python-app-image latest d1ff3f955ba5 About a minute ago 213MB
[root@izwz91h49n3mj8r232gqwez composetest]#
拉取redis的镜像
[root@izwz91h49n3mj8r232gqwez composetest]# docker pull redis:alpine
alpine: Pulling from library/redis
89d9c30c1d48: Already exists
b2eb22a0b7db: Pull complete
c5ccbdf10203: Pull complete
592c37d15428: Pull complete
b70a614994bf: Pull complete
60027bdc030c: Pull complete
Digest: sha256:ee13953704783b284c080b5b0abe4620730728054f5c19e9488d7a97ecd312c5
Status: Downloaded newer image for redis:alpine
docker.io/library/redis:alpine
[root@izwz91h49n3mj8r232gqwez composetest]#
备注
redis:alpine:这个版本比较小
创建应用网络 docker network create --subnet=172.26.0.0/24 compose-test-net
[root@izwz91h49n3mj8r232gqwez ~]# docker network create --subnet=172.26.0.0/24 python-app-net
908680b363d9de50e1b3a76cc06dc5992721c609c370570407ae9886742bd6c0
[root@izwz91h49n3mj8r232gqwez ~]#
启动Python应用
[root@izwz91h49n3mj8r232gqwez ~]# docker run -d --name python-app-container -p 5000:5000 --net=python-app-net python-app-image
f20c6595a1b91b3985005131c45e956da37de458c26d47e8a8962d6f0c7ae8e3
[root@izwz91h49n3mj8r232gqwez ~]#
启动redis容器
[root@izwz91h49n3mj8r232gqwez ~]# docker run -d --name redis --net=python-app-net redis:alpine
c08887abf7597a7831b12df1d1a8418962bcc8c071ca174b3c0f2c294d5147e1
[root@izwz91h49n3mj8r232gqwez ~]#
访问测试
[root@izwz91h49n3mj8r232gqwez ~]# curl http://190.39.12.181:5000
Hello World! I have been seen 1 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://190.39.12.181:5000
Hello World! I have been seen 2 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://190.39.12.181:5000
Hello World! I have been seen 3 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://190.39.12.181:5000
Hello World! I have been seen 4 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://190.39.12.181:5000
Hello World! I have been seen 5 times.
[root@izwz91h49n3mj8r232gqwez ~]#
备注
1.每次自动增加1
Docker Compose
官网
https://docs.docker.com/compose/
Docker Compose简介
1.Docker Compose是对容器级别的管理
2.Docker Compose 是一种定义和启动Docker容器应用的工具;使用Compose,你可以用yaml文件去定义你的应用服务;
然后,我们可以使用简单的命令,通过yaml配置文件内容去创建和启动服务;
3.通俗的讲,以前的时候,我们可能部署一个应用,需要访问redis,这个时候部署的应用会通过应用的image启动容器
redis通过其image也会启动一个容器;
现在的话 我们通过Docker Compose和配置yaml文件,就可以将redis这个放到ymal文件中指定相关的配置,然后我们一键启动应用的时候
同时启动redis,并连接redis
Docker Compose 安装 (这里操作linux系统的安装)
官方地址
https://docs.docker.com/compose/install/
下载
[root@izwz91h49n3mj8r232gqwez ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/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 975 0 --:--:-- --:--:-- --:--:-- 974
100 16.2M 100 16.2M 0 0 3080k 0 0:00:05 0:00:05 --:--:-- 3987k
赋予可执行命令
[root@izwz91h49n3mj8r232gqwez ~]# sudo chmod +x /usr/local/bin/docker-compose
查看是否安装了Docker Compose
[root@izwz91h49n3mj8r232gqwez ~]# docker compose --version
Docker version 19.03.5, build 633a0ea
[root@izwz91h49n3mj8r232gqwez ~]#
Docker Compose的使用(对上面项目进行改造)
官方案例地址参考
https://docs.docker.com/compose/gettingstarted/
创建文件夹并编写Python的程序
创建文件夹,上面已经创建过了,可以忽略
[root@izwz91h49n3mj8r232gqwez tmp]# pwd
/tmp
root@izwz91h49n3mj8r232gqwez tmp]# mkdir composetest
[root@izwz91h49n3mj8r232gqwez tmp]# cd composetest/ ls -la
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]#
编译app.py程序,上面也有了
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
创建Dockerfile文件
跟上面一样
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
创建docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
docker-compose.yml 文件节点详解
version: ‘3’
1.docker-compose 的版本
services:
1.services:主要容器的定义
2.web/redis:主要是容器的别名
3.一个service标识一个容器
build .
1.在当前目录下构建镜像
ports
1.相当于-p 5000:5000
备注具体语言使用参考
文件目录结构如下
启动Docker Compose
[root@izwz91h49n3mj8r232gqwez ~]# cd /tmp/composetest1/
[root@izwz91h49n3mj8r232gqwez composetest1]# pwd
/tmp/composetest1
[root@izwz91h49n3mj8r232gqwez composetest1]# docker-compose up
Creating network "composetest1_default" with the default driver
Building web
Step 1/9 : FROM python:3.7-alpine
---> 8922d588eec6
Step 2/9 : WORKDIR /code
---> Using cache
---> e0d0f7a10b40
Step 3/9 : ENV FLASK_APP app.py
---> Using cache
---> b4ba157f615c
Step 4/9 : ENV FLASK_RUN_HOST 0.0.0.0
---> Using cache
---> 0584db739547
Step 5/9 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Using cache
---> 9859b83b89e9
Step 6/9 : COPY requirements.txt requirements.txt
---> 81f390e6e195
Step 7/9 : RUN pip install -r requirements.txt
---> Running in 71470915b84b
Collecting flask
Downloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
Collecting redis
Downloading https://files.pythonhosted.org/packages/32/ae/28613a62eea0d53d3db3147f8715f90da07667e99baeedf1010eb400f8c0/redis-3.3.11-py2.py3-none-any.whl (66kB)
Collecting itsdangerous>=0.24
Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Werkzeug>=0.15
Downloading https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl (327kB)
Collecting click>=5.1
Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Jinja2>=2.10.1
Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting MarkupSafe>=0.23
Downloading https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz
Building wheels for collected packages: MarkupSafe
Building wheel for MarkupSafe (setup.py): started
Building wheel for MarkupSafe (setup.py): finished with status 'done'
Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-cp37-cp37m-linux_x86_64.whl size=32331 sha256=7d99db7a613823168d08b0c6975d1b9930ad7f22a35b449c2a6525bf911806e2
Stored in directory: /root/.cache/pip/wheels/f2/aa/04/0edf07a1b8a5f5f1aed7580fffb69ce8972edc16a505916a77
Successfully built MarkupSafe
Installing collected packages: itsdangerous, Werkzeug, click, MarkupSafe, Jinja2, flask, redis
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 Werkzeug-0.16.0 click-7.0 flask-1.1.1 itsdangerous-1.1.0 redis-3.3.11
Removing intermediate container 71470915b84b
---> f447d3f215b9
Step 8/9 : COPY . .
---> 8cb3451f0767
Step 9/9 : CMD ["flask", "run"]
---> Running in abb9c82f8eeb
Removing intermediate container abb9c82f8eeb
---> b2270c2c1058
Successfully built b2270c2c1058
Successfully tagged composetest1_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating composetest1_web_1 ... done
Creating composetest1_redis1_1 ... done
Attaching to composetest1_redis1_1, composetest1_web_1
redis1_1 | 1:C 16 Dec 2019 23:50:07.066 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis1_1 | 1:C 16 Dec 2019 23:50:07.066 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
redis1_1 | 1:C 16 Dec 2019 23:50:07.066 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 * Running mode=standalone, port=6379.
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 # Server initialized
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis1_1 | 1:M 16 Dec 2019 23:50:07.067 * Ready to accept connections
web_1 | * Serving Flask app "app.py"
web_1 | * Environment: production
web_1 | WARNING: This is a development server. Do not use it in a production deployment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: off
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
1.docker-comose up 默认执行当前目录下的docker-compose.yml文件
如果要指定文件,可以使用下面的
docker-comose -f {文件目录} up
这里注意下,由于容器中访问的host是redis这个域名,因此需要在python的那个容器中配置一下hosts,
172.19.0.3 是python的那个web容器
172.19.0.2 redis的容器
[root@izwz91h49n3mj8r232gqwez ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29091b5a999b redis:alpine "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 6379/tcp composetest_redis1_1
f11f0d0e2dba composetest_web "flask run" 11 minutes ago Up 11 minutes 0.0.0.0:5000->5000/tcp composetest_web_1
effa9ca46624 pxc "/entrypoint.sh " 3 days ago Up 3 days 4567-4568/tcp, 0.0.0.0:3303->3306/tcp pxc-node3
389f7bc5a96e pxc "/entrypoint.sh " 3 days ago Up 3 days 4567-4568/tcp, 0.0.0.0:3302->3306/tcp pxc-node2
9c79dc31201a pxc "/entrypoint.sh " 3 days ago Up 3 days 4567-4568/tcp, 0.0.0.0:3301->3306/tcp pxc-node1
[root@izwz91h49n3mj8r232gqwez ~]#
[root@izwz91h49n3mj8r232gqwez ~]# docker exec -it composetest_web_1 sh
/code # vi /etc/hosts
1.这里注意下,我们发现启动的容器,容器的名字跟我们在docker-compose.yml文件中定义的不太一样;
如:文件中定义的容器名字:web,但是实际docker ps 之后显示的是composetest_web_1
如:文件中定义的容器名字:redis1,但是实际docker ps之后显示的是composetest_redis1_1
其命名规范就是:{当前docker-compose.yml文件所在的文件夹}_{docker-compose.yml文件中的容器的名字}_{序列化}
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.19.0.3 f11f0d0e2dba
# 相当于redis会去自动解析成172.19.0.2
172.19.0.2 redis
测试
然后测试
[root@izwz91h49n3mj8r232gqwez ~]# curl http://172.19.0.3:5000
Hello World! I have been seen 1 times.
[root@izwz91h49n3mj8r232gqwez ~]#
[root@izwz91h49n3mj8r232gqwez ~]# curl http://172.19.0.3:5000
Hello World! I have been seen 2 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://172.19.0.3:5000
Hello World! I have been seen 3 times.
[root@izwz91h49n3mj8r232gqwez ~]#
[root@izwz91h49n3mj8r232gqwez ~]# curl http://172.19.0.3:5000
Hello World! I have been seen 4 times.
[root@izwz91h49n3mj8r232gqwez ~]# curl http://172.19.0.3:5000
Hello World! I have been seen 5 times.
[root@izwz91h49n3mj8r232gqwez ~]#
Docker Comopose 常用命令
docker-compose --version 查看版本
[root@izwz91h49n3mj8r232gqwez ~]# docker-compose --version
docker-compose version 1.25.0, build 0a186604
[root@izwz91h49n3mj8r232gqwez ~]#
docker-compose up 启动
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# ls -la
total 24
drwxr-xr-x 2 root root 4096 Dec 18 17:08 .
drwxrwxrwt. 19 root root 4096 Dec 19 07:21 ..
-rw-r--r-- 1 root root 514 Dec 15 11:44 app.py
-rw-r--r-- 1 root root 109 Dec 17 08:12 docker-compose.yml
-rw-r--r-- 1 root root 240 Dec 15 11:50 Dockerfile
-rw-r--r-- 1 root root 12 Dec 15 11:47 requirements.txt
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose up
Creating composetest_web_1 ... done
Creating composetest_redis1_1 ... done
Attaching to composetest_redis1_1, composetest_web_1
redis1_1 | 1:C 18 Dec 2019 23:25:34.162 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis1_1 | 1:C 18 Dec 2019 23:25:34.163 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
redis1_1 | 1:C 18 Dec 2019 23:25:34.163 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis1_1 | 1:M 18 Dec 2019 23:25:34.164 * Running mode=standalone, port=6379.
redis1_1 | 1:M 18 Dec 2019 23:25:34.164 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis1_1 | 1:M 18 Dec 2019 23:25:34.164 # Server initialized
redis1_1 | 1:M 18 Dec 2019 23:25:34.164 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis1_1 | 1:M 18 Dec 2019 23:25:34.164 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis1_1 | 1:M 18 Dec 2019 23:25:34.168 * Ready to accept connections
web_1 | * Serving Flask app "app.py"
web_1 | * Environment: production
web_1 | WARNING: This is a development server. Do not use it in a production deployment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: off
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
docker-compose images 查看当前compose下的镜像
[root@izwz91h49n3mj8r232gqwez ~]# cd /tmp/composetest/
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose images
Container Repository Tag Image Id Size
-------------------------------------------------------------------------
composetest_redis1_1 redis alpine a49ff3e0d85f 29.31 MB
composetest_web_1 composetest_web latest 8589e863cf67 213.1 MB
[root@izwz91h49n3mj8r232gqwez composetest]#
docker-compose stop 停止当前的compose下的容器
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose stop
Stopping composetest_web_1 ... done
Stopping composetest_redis1_1 ... done
[root@izwz91h49n3mj8r232gqwez composetest]#
docker-compose start 启动当前的compose下的容器
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose start
Starting web ... done
Starting redis1 ... done
[root@izwz91h49n3mj8r232gqwez composetest]#
docker-compose exec ${container-name} sh
[root@izwz91h49n3mj8r232gqwez composetest]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a46f11a3cf4b composetest_web "flask run" 9 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp composetest_web_1
3ec52dbc5b02 redis:alpine "docker-entrypoint.s…" 9 minutes ago Up 2 minutes 6379/tcp composetest_redis1_1
effa9ca46624 pxc "/entrypoint.sh " 4 days ago Up 4 days 4567-4568/tcp, 0.0.0.0:3303->3306/tcp pxc-node3
389f7bc5a96e pxc "/entrypoint.sh " 4 days ago Up 4 days 4567-4568/tcp, 0.0.0.0:3302->3306/tcp pxc-node2
9c79dc31201a pxc "/entrypoint.sh " 4 days ago Up 4 days 4567-4568/tcp, 0.0.0.0:3301->3306/tcp pxc-node1
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose exec redis1 sh
/data #
1.container-name:这里是redis1,就是docker-compose.yml文件中定义的那个;
docker-compose ps 显示docker-compose.yml文件中定义的services
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
composetest_redis1_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetest_web_1 flask run Up 0.0.0.0:5000->5000/tcp
[root@izwz91h49n3mj8r232gqwez composetest]#
docker-compose down 删除docker-compose,同时删除容器以及创建的网络和volume挂载目录
[root@izwz91h49n3mj8r232gqwez composetest]# pwd
/tmp/composetest
[root@izwz91h49n3mj8r232gqwez composetest]# docker network ls
NETWORK ID NAME DRIVER SCOPE
38455e5a2df6 bridge bridge local
23837bec4fcc composetest_default bridge local
6f425e496441 host host local
d082dd604405 none null local
d1f57596c5c7 pxc-net bridge local
908680b363d9 python-app-net bridge local
[root@izwz91h49n3mj8r232gqwez composetest]# docker volume ls
DRIVER VOLUME NAME
local 570dd6b79f23b52c8e10c4f40d6e2e10628c2d06f2589fb8479c15c9b553cab0
local 776ab96d5ec80d782c04a9db700058a32255539080c71bb8dddbf697328e21ea
local 913fd743532b955efc5889d779bb8dc64f7ec99fb7f0fd8570e474a0806f6398
local bf9c00e7deebb7d2a30f3961d99cd7b57eb64013b7859c793024fbc3a4a6a078
local e6cf1291a2f972c3d6a10e0b2c8d6818718fcfe097bb689fb1e922ce8950f0c9
local pxc-v1
local pxc-v2
local pxc-v3
[root@izwz91h49n3mj8r232gqwez composetest]# docker-compose down
Stopping composetest_web_1 ... done
Stopping composetest_redis1_1 ... done
Removing composetest_web_1 ... done
Removing composetest_redis1_1 ... done
Removing network composetest_default
[root@izwz91h49n3mj8r232gqwez composetest]# docker network ls
NETWORK ID NAME DRIVER SCOPE
38455e5a2df6 bridge bridge local
6f425e496441 host host local
d082dd604405 none null local
d1f57596c5c7 pxc-net bridge local
908680b363d9 python-app-net bridge local
[root@izwz91h49n3mj8r232gqwez composetest]# docker volume ls
DRIVER VOLUME NAME
local 570dd6b79f23b52c8e10c4f40d6e2e10628c2d06f2589fb8479c15c9b553cab0
local 776ab96d5ec80d782c04a9db700058a32255539080c71bb8dddbf697328e21ea
local 913fd743532b955efc5889d779bb8dc64f7ec99fb7f0fd8570e474a0806f6398
local bf9c00e7deebb7d2a30f3961d99cd7b57eb64013b7859c793024fbc3a4a6a078
local e6cf1291a2f972c3d6a10e0b2c8d6818718fcfe097bb689fb1e922ce8950f0c9
local pxc-v1
local pxc-v2
local pxc-v3
[root@izwz91h49n3mj8r232gqwez composetest]#
总结
1.docker-compose:主要应用于单机(一台机器)的容器化集成部署,
如果需要分布式的部署,可能docker-compose不太适合应用