Docker 之Docker Compose 介绍

使用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不太适合应用
  
发布了261 篇原创文章 · 获赞 37 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/u014636209/article/details/103546794