文章目录

  • 使用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 Compose的使用(对上面项目进行改造)
      • 创建文件夹并编写Python的程序
      • 创建Dockerfile文件
      • 创建docker-compose.yml
        • docker-compose.yml 文件节点详解
          • version: '3'
          • services:
      • 文件目录结构如下
      • 启动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 timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.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 flaskDownloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
Collecting redisDownloading https://files.pythonhosted.org/packages/32/ae/28613a62eea0d53d3db3147f8715f90da07667e99baeedf1010eb400f8c0/redis-3.3.11-py2.py3-none-any.whl (66kB)
Collecting itsdangerous>=0.24Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Jinja2>=2.10.1Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting click>=5.1Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Werkzeug>=0.15Downloading https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl (327kB)
Collecting MarkupSafe>=0.23Downloading https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz
Building wheels for collected packages: MarkupSafeBuilding wheel for MarkupSafe (setup.py): startedBuilding 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=293afa3635708a72787c2e70e7f3dbdf57705de8b8d89e7cfdb057cf3bdb7649Stored 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  CurrentDload  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 timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.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 flaskDownloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
Collecting redisDownloading https://files.pythonhosted.org/packages/32/ae/28613a62eea0d53d3db3147f8715f90da07667e99baeedf1010eb400f8c0/redis-3.3.11-py2.py3-none-any.whl (66kB)
Collecting itsdangerous>=0.24Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Werkzeug>=0.15Downloading https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl (327kB)
Collecting click>=5.1Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Jinja2>=2.10.1Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting MarkupSafe>=0.23Downloading https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz
Building wheels for collected packages: MarkupSafeBuilding wheel for MarkupSafe (setup.py): startedBuilding 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=7d99db7a613823168d08b0c6975d1b9930ad7f22a35b449c2a6525bf911806e2Stored 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 imagesContainer           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 psName                      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不太适合应用

Docker 之Docker Compose 介绍相关推荐

  1. .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

    本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...

  2. Docker三剑客之Compose

    Docker三剑客之Compose Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用. Compose 基本介绍 Compose ...

  3. Docker 及 Docker Compose 安装及使用教程 (2020版)

    文章目录 图文详细教程 1 Docker原理 2 Docker安装 3 镜像(Image) 3.1 获取镜像 3.2 查找拖取镜像 3.3 列出镜像 3.4 删除镜像 3.5 创建的镜像 4 容器(C ...

  4. docker系列(三)docker三剑客之Compose

    docker-compose,快速对docker容器集群进行编排 Docker Compose 介绍 Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义 ...

  5. Docker与Docker Compose的安装以及Portainer容器管理工具

    Docker官网 概述 Docker 是一个用于开发.发布和运行应用程序的开放平台.Docker 能够将应用程序与基础架构分离,以便可以快速交付软件.使用 Docker,可以像管理应用程序一样管理基础 ...

  6. Docker 系列学习(二) 全面介绍docker

    Docker简介 Docker是一种遵从Apache2.0协议开源的Linux容器管理解决方案,它通过进程和进程通信技术对操作系统的文件资源和网络的进行隔离,实现了包含文件资源.系统资源(shell环 ...

  7. Docker编排工具Fig介绍

    本文讲的是Docker编排工具Fig介绍,[编者的话]Fig是一个基于Docker的用于快速搭建开发环境的工具,目前Fig团队已经加入Docker公司.Fig通过一个配置文件来管理多个Docker容器 ...

  8. 阿里云服务器Docker及Docker Compose的安装

    2019独角兽企业重金招聘Python工程师标准>>> 本文对阿里云ECS服务器如何安装Docker和Docker Compose进行说明,以centOS系统为例. 一.开通外网的E ...

  9. Android多开和虚拟化--Docker概念的详细介绍

    本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令. 通过阅读本文你将知道以下概念: 容器 什么是Docker? Docker思想 ...

  10. docker 查看容器_Docker介绍

    docker介绍 什么是docker?我们先看一下官方文档对docker的定义.翻译一下就是:Docker是一个集开发,发布和运行应用程序的开放平台.Docker能够分离应用和基础架构,从而可以使得用 ...

最新文章

  1. GCD BZOJ2818 [省队互测] 数学
  2. python 获取公网 外网 ip 几种方式
  3. Android关于Theme.AppCompat相关问题的深入分析
  4. mysql cluster 安装NDB二进制版本
  5. print python 如何加锁_深度解密Python单例模式
  6. Android 多媒体视频播放一( 多媒体理解与经验分享)
  7. 20220129--CTF WEB方向刷题-- WP--非常简单的webshell题
  8. flex布局水平垂直 垂直_垂直和水平装饰
  9. phpcms图片无法上传
  10. 网站建设中HTML编写技巧你必须掌握的30个 提升你的编写能力|网站建设
  11. 安卓移动办公软件_小企业使用的移动办公软件
  12. IDEA反编译java.class文件
  13. Winform:自定义滚动条——可自定义皮肤
  14. OpenEmbedded 简介
  15. python实现base64解码_Python实现base64编码解码
  16. 新闻推荐数据集MIND介绍
  17. mysql安装 防火墙,mysql8 参考手册--安装或卸载MySQL企业防火墙
  18. adb冲突 傲软_关于adb冲突导致无法连接(Win10系统)
  19. 福州大学计算机科学与技术 何x玲,林洛君 - 福州大学 - 数学与计算机科学学院...
  20. 2021年,薪酬最高的5种编程语言

热门文章

  1. 去除vivo开发安装包的时候需要输入密码验证的烦人过程
  2. mac压缩文件自动添加.DS_Store
  3. 股票自动化处理python脚本
  4. 【操作系统】内存管理设计性实验报告
  5. 隐藏虚拟按键, 当下拉时并显示出来(针对华为, 或者其他有虚拟按键的手机)
  6. java sslcontext_java – SSLContext初始化
  7. 扬帆起航,再踏征程(一)
  8. XWPFDocument word导出相关(分栏,纸张大小,页面排版,段落字体大小)
  9. table中设置tr行间距
  10. c语言源程序必含有,一个c源程序必须包含一个main函数吗