Docker学习(9) 使用Docker Compose部署应用

Docker学习(9) 使用Docker Compose部署应用

  • docker compose:可以在docker节点上,以单引擎模式进行多容器的部署与管理

使用Docker Compose部署应用——简介

  • 现在大多是的应用都是由更多小的服务相互协作组成的应用
    • 比如:
      • Web前端
      • 订单管理
      • 品类管理
      • 后台数据库
  • docker compose可以通过声明式的配置文件来描述整个应用,使用一条命令部署完成
  • 部署成功之后,通过命令对其完整声明周期的管理
  • 配置 文件还可以置于版本控制系统执行存储和管理

使用Docker Compose部署应用——详解

  • 详细步骤
    • Docker Compose的背景
    • 安装Docker Compose
    • Compose 文件
    • 使用Docker Compose部署应用
    • 使用Docker Compose管理应用

Docker Compose的背景

  • Docker Compose 的前身是Fig,Fig是基于docker的python工具
  • 2014年docker公司收购了Orchard公司,将Fig更名为Docker Compose

安装Docker Compose

lhf@lhf-virtual-machine:~$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/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    326      0 --:--:--  0:00:01 --:--:--   326
100 15.4M  100 15.4M    0     0   874k      0  0:00:18  0:00:18 --:--:-- 1358k
lhf@lhf-virtual-machine:~$ sudo chmod  +x /usr/local/bin/docker-compose 
lhf@lhf-virtual-machine:~$ docker-compose --version
docker-compose version 1.24.1, build 4667896b

Compose文件

  • Docker Compose 使用YAML文件定义多服务的应用,YAML是JSON的子集,也可以使用JSON
  • Dokcer Compose 默认使用文件名docker-compose.yml,使用-f参数指定具体文件
  • 使用compose文件,定义一个包含两个服务(web-fe和redis)的应用
lhf@lhf-virtual-machine:~/docker/counter-app-master$ cat docker-compose.yml 
version: "3.5"
services:
  web-fe:
    build: .
    command: python app.py
    ports:
      - target: 5000
        published: 5000
    networks:
      - counter-net
    volumes:
      - type: volume
        source: counter-vol
        target: /code
  redis:
    image: "redis:alpine"
    networks:
      counter-net:

networks:
  counter-net:

volumes:
  counter-vol:
  • 这个YAML的结构,首先包含4个一级key:version、services、networks、volumes

    • version:必须指定,位于文件第一行,定义compose文件格式的版本。
    • services:用于定义不同的应用服务,案例中定义了两个服务(web-fe的web前端和redis的内存数据库服务)
    • networks:用于指引docker创建新的网络。默认创建bridge网络:一种单机网络——实现同一主机上容器的连接。
    • volumes:指引docker来创建新的卷。
  • services部分定义两个二级:web-fe和redis

    • web-fe服务定义的指令:
      • build: .指定docker基于当前目录下的Dockerfile定义指令构建新的镜像,该镜像用于启动该服务的容器。
      • command: python app.py指定Docker在容器中执行名为app.py 的python脚本ports: 指定docker将容器内(target)的5000端口映射到主机的(pulished)
      • networks:是docker可以将服务连接到指定的网络
      • volumes:指定docker将counter-vol卷(source:)挂载到容器的/code目录下(target:)
  • redis服务定义的指令:

    • image:使docker基于redis:alpine镜像启动一个名为redis 的容器。
    • networks:配置redis容器连接到counter-net网络。

使用Docker Compose部署应用

  • 检查必要的文件
lhf@lhf-virtual-machine:~/docker/counter-app-master$ ls -l
总用量 20
-rw-rw-r-- 1 lhf lhf 599 10月 23 23:11 app.py
-rw-rw-r-- 1 lhf lhf 367 10月 23 23:11 docker-compose.yml
-rw-rw-r-- 1 lhf lhf 109 10月 23 23:11 Dockerfile
-rw-rw-r-- 1 lhf lhf 128 10月 23 23:11 README.md
-rw-rw-r-- 1 lhf lhf  11 10月 23 23:11 requirements.txt

  • 使用Docker Compose将应用启动
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose up  -d prod-equus-bass.yml -d
[1] 2141
lhf@lhf-virtual-machine:~/docker/counter-app-master$ Creating network "counter-app-master_counter-net" with the default driver
Creating volume "counter-app-master_counter-vol" with default driver
Building web-fe
Step 1/5 : FROM python:3.4-alpine

  • docker-compose up命令,构建所需的镜像,创建网络和卷,并启动容器。
  • 查看构建的镜像
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
counter-app-master_web-fe            latest              5378f5a84df1        29 minutes ago      84.5MB
multi                                stage               8b69a716c1a2        5 hours ago         210MB
<none>                               <none>              ffd654cfccfe        5 hours ago         757MB
<none>                               <none>              639a8715b042        6 hours ago         1.1GB
lhfdocker/web                        latest              983497a6f68f        32 hours ago        71.4MB
web                                  latest              983497a6f68f        32 hours ago        71.4MB
node                                 latest              4ac0e1872789        4 days ago          933MB
redis                                alpine              6f63d037b592        6 days ago          29.3MB
alpine                               latest              965ea09ff2eb        6 days ago          5.55MB
maven                                latest              3b2476ab3d10        9 days ago          616MB
ubuntu                               latest              cf0f3ca922e0        9 days ago          64.2MB
python                               3.4-alpine          c06adcf62f6e        7 months ago        72.9MB
java                                 8-jdk-alpine        3fd9dd82815c        2 years ago         145MB

  • 查看构建的容器
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker container ls
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
ca03b3e55ec2        counter-app-master_web-fe   "python app.py"          31 minutes ago      Up 31 minutes       0.0.0.0:5000->5000/tcp   counter-app-master_web-fe_1
e3a7f618d62c        redis:alpine                "docker-entrypoint.s…"   31 minutes ago      Up 31 minutes       6379/tcp                 counter-app-master_redis_1
  • 浏览器查看服务
12.png
  • 刷新页面,计数会累加
lhf@lhf-virtual-machine:~/docker/counter-app-master$ firefox localhost:5000
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
web-fe_1  | 172.18.0.1 - - [28/Oct/2019 15:02:10] "GET / HTTP/1.1" 200 -
web-fe_1  | 172.18.0.1 - - [28/Oct/2019 15:02:11] "GET /favicon.ico HTTP/1.1" 404 -
web-fe_1  | 172.18.0.1 - - [28/Oct/2019 15:03:56] "GET / HTTP/1.1" 200 -
web-fe_1  | 172.18.0.1 - - [28/Oct/2019 15:04:03] "GET / HTTP/1.1" 200 -
13.png

使用Dokcer Compose管理应用

  • 使用Docker Compose启动、停下和删除应用,以及获取应用的状态。

  • 关闭应用

lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose down
Stopping counter-app-master_web-fe_1 ... 
Stopping counter-app-master_redis_1  ... 
redis_1   | 1:signal-handler (1572275254) Received SIGTERM scheduling shutdown...
redis_1   | 1:M 28 Oct 2019 15:07:34.876 # User requested shutdown...
redis_1   | 1:M 28 Oct 2019 15:07:35.029 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 28 Oct 2019 15:07:35.031 * DB saved on disk
Stopping counter-app-master_web-fe_1 ... done
counter-app-master_redis_1 exited with code 0
counter-app-master_web-fe_1 exited with code 0
Removing counter-app-master_web-fe_1 ... done
Removing counter-app-master_redis_1  ... done
Removing network counter-app-master_counter-net
[1]+  已完成               docker-compose up

  • 特别注意 :counter-vol卷并没有删除,因为卷应该用于数据的长期持久化存储。卷的生命周期与容器是完全解耦的。
  • 查看卷
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker volume ls
DRIVER              VOLUME NAME
local               1c7824e5eccb82556e165af9b773cb7a10b4aa3fdebec6ac767b1591cb292692
local               counter-app-master_counter-vol

  • 再次启动应用
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose up -d
Creating network "counter-app-master_counter-net" with the default driver
Creating counter-app-master_redis_1  ... done
Creating counter-app-master_web-fe_1 ... done
  • 再次启动的时间很快,因为counter-vol卷已存在。
  • 查看应用的状态
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose ps
           Name                          Command               State           Ports         
---------------------------------------------------------------------------------------------
counter-app-master_redis_1    docker-entrypoint.sh redis ...   Up      6379/tcp              
counter-app-master_web-fe_1   python app.py                    Up      0.0.0.0:5000->5000/tcp

  • 列出各个服务容器内的进程
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose top
counter-app-master_redis_1
UID   PID    PPID   C   STIME   TTY     TIME         CMD     
-------------------------------------------------------------
999   3750   3712   0   23:11   ?     00:00:00   redis-server

counter-app-master_web-fe_1
UID    PID    PPID   C   STIME   TTY     TIME                    CMD                
------------------------------------------------------------------------------------
root   3787   3743   0   23:11   ?     00:00:01   python app.py                     
root   3939   3787   1   23:11   ?     00:00:01   /usr/local/bin/python /code/app.py

  • 停止应用。不删除资源,并查看状态
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose top
counter-app-master_redis_1
UID   PID    PPID   C   STIME   TTY     TIME         CMD     
-------------------------------------------------------------
999   3750   3712   0   23:11   ?     00:00:00   redis-server

counter-app-master_web-fe_1
UID    PID    PPID   C   STIME   TTY     TIME                    CMD                
------------------------------------------------------------------------------------
root   3787   3743   0   23:11   ?     00:00:01   python app.py                     
root   3939   3787   1   23:11   ?     00:00:01   /usr/local/bin/python /code/app.py
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose stop
Stopping counter-app-master_web-fe_1 ... done
Stopping counter-app-master_redis_1  ... done
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose ps
           Name                          Command               State    Ports
-----------------------------------------------------------------------------
counter-app-master_redis_1    docker-entrypoint.sh redis ...   Exit 0        
counter-app-master_web-fe_1   python app.py                    Exit 0        
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker container ls -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                          PORTS                  NAMES
728c56f892d0        counter-app-master_web-fe   "python app.py"          5 minutes ago       Exited (0) About a minute ago                          counter-app-master_web-fe_1
321c0e64e8bb        redis:alpine                "docker-entrypoint.s…"   5 minutes ago       Exited (0) About a minute ago                          counter-app-master_redis_1
eefa35f2eba5        lhfdocker/web:latest        "node ./app.js"          32 hours ago        Exited (255) 9 hours ago        0.0.0.0:80->8080/tcp   c1

  • 停止compose应用并不会再系统中删除对应用的定义,仅是对应用的容器停止
  • 再次启动应用
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose restart
Restarting counter-app-master_web-fe_1 ... done
Restarting counter-app-master_redis_1  ... done
lhf@lhf-virtual-machine:~/docker/counter-app-master$ docker-compose ps
           Name                          Command               State           Ports         
---------------------------------------------------------------------------------------------
counter-app-master_redis_1    docker-entrypoint.sh redis ...   Up      6379/tcp              
counter-app-master_web-fe_1   python app.py                    Up      0.0.0.0:5000->5000/tcp

使用Docker Compose部署应用的——命令

  • docker-compose up :部署一个compose应用。默认读取docker-compose.yml文件,可以使有-f参数指定文件,-d 参数在后台启动

  • docker-compose stop:停止compose应用的相关容器。可以通过docker-compose restart重新启动

  • docker-compose rm:删除已停止的compose应用的容器,会删除容器和网络,不会删除卷和镜像。

  • docker-compose 重启compose应用

    • 如果compose应用进行了变更,需要重启才能生效
  • docker-compose ps:列出compose应用的容器

    • 输出内容包括:状态、容器的运行命令,已经网络端口
  • docker-compose down:停止并删除运行中compose 的应用。会删除容器和网络,不会删除卷和镜像

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容