Docker 三剑客之docker-compose

一、Compose简介
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用o N ` _ $ ? ;一个命令,就可以从配置中创建并启动所有服L P ; P n Y u务。

Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker-compose up命令就像执行脚本一样,一个& = j L . l M一个的安装并部署容器。

Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器,例如一个 Web 服务容器再加上后端的数据库服务容器等。
Docker 三剑客之docker-compose

docker-compose的术语:
服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
项目(project):由一组关联的应用容器组/ i i B 3 .成的一个完# i N F -整的业务单元。

由此可以得出:一个项目可以由多个服务(容器)关联而成,而compose是面向项目进行管理的。
二、Compose的安装及使用
若想使用compose这个容器编排工具,那么,必须是基于docker这个服务,安装docker,然后下载docker-compose这个命令,我们可以去github官方网站搜索“docker/compose”
Docker 三剑客之docker-compose
Docker 三剑客之docker-compose
Docker 三剑客之docker-compose
1、在do; _ y ! m B 5 $cker主机上执行git? + ? x Ehub0 & 2 ? 6 D w上得到的命令

[root@docker01 ~]# curl -L htF * O gtps://github.com/docker/compose/releases/download/X ] Q ;1.24.0/docker-compose-`uname -s`-`uname -m`K J ( ] 9 ; -o /usr/loca3 ! G Q a m rl/bin/docker-compose
[root@docker01 ~]# chmod +x /usr/local/bii 5 - @n/docker-compose

执行上面的两条W @ ? a J +命令后,我们就可以使用docker-compose这个编排工具了。

在进行编写.yml文件之前,我们需要知道每个compose版本所支持的dock! c - eer版本是哪些?在我们下载compod L t b Q @ { %se命令时,其实下面已经给出了参考列表。
前面是版本号,后面是对应的版U f 8 6 k h本所支持的docker服务版本
Docker 三剑客之docker-compose
查看docker的版本:

[root@dockeb = w N | X D ^r01 ~]# docker -v
Docker version 18.09.0, build 4d60db4% 3 0 D

通过上述查看操作,可以知道,当前我的docker版本是q X o $ ; b18.09,那么基本可以n D 3 E ;使用所有的compose版本,因为其) u 0 S (可以向下兼容,只要高于compose版本所支持的docker版本即可
三、编写.yml文件
1、构建简单的Nginx服务.yml文件

[root@do2 ? h # = ^ C # Rcka | i d U I F per01 ~]# mkdir compose
[root@docker01 ~]# cd compose/
[root@dockere I C @ ]01 compose]# vim docker-compose.yml
version: "3"
services:
nginx:
container_name: web-nginx
image: nginx:lO ^ U 4 9 Latest
restart: always
ports:
- 80:80
volumes:
- /root/c@ d _ompose/webser. & f ?  l W / Qver:/usr/share/nginx/html
[root@docker01 compose]# docker-compose up -d} | v #
#执行上述命令后,会自动在当前目录下生成一个webserver的目录,对应的就是容器中的html目录
[root@docker01 compose]# echo "hello world" >U D O 7 q R ]; webserver/index.~ D g jhtml
[root@docker01 compose]# curl 127.0.0.1       # 访问本机测试
hello world

我们基于自己写dockerfile文件构建镜像并运行容器后,都需@ s K b ] = 1 g要进入容器手动启动一下其运行的服务,而通过上面的的例子,可以看到,容器运行后,其服务也是出于运行状态的,这是& 0 G p %怎么做到的呢?我们可以/ 9 z w F通过执行“docker p` i E x e i ys”命令进行K 5 (查看容器的运行信息
Docker 三剑客之docker-compose

[root@docker03 compo! 7 = hse]# alias dc='docker-compose'
[root@docker01 ~]# dc -f compose/dock5 $ N 1 N k Cer-compose.yml0 J & 6 T e h = up -d
#若运行时,没有与.yml文件出于同一目录,那么可以使用-f选项指定.yml文件的路径

2、compose+dockerfile构建镜像

[root@docker03 compose]# vim docker-C Y [ ` !  ScompoX _ y I x  = Ase.yml
version: "3"
services:
nginx:
build: .
container_nam} D ; * Q k t de: web-nginx
image: mynginx:1.0
restart: always
ports:
- 80:80
vd Z ? iolumes:
- /root/compose/webserver:/usr/share/nginx/html
[root@docker03 compose]# vim Dockerfile
FROM nginx:latest
ADD html /usr/share/nginx/html
VOLUME /etc/nginx
[root@docker03 compose]# mkdir html          # 创建dockerfile中指定的目录
[root@dK [ Q F R . Q C 8ocker03 compose]# docker-compose bi | * _ Iuild          # 使用.yml构建镜像
[root@docker03 compose]# docker run -itd --name nginx-test -p 80 mynginx:1.0
[root@docker03 compose]#: J x V w z 9 docker ps          # 查看映射的端口

客户端访问其映射到docker主机上的端口,看到x m m S j %的页面如下(可以看到,在dockerfile中的& & ADD配置行并没有生效):

查看容器的/etc/nginx目录是否挂载到了docker主机上:

[root@docker03 composeA % f 6 o = ^ ]# docker inspect nginx-test 

Docker 三剑客之docker-compose

#切换至本地映射的目录v x 4 ~ W ,
[root@docker03 compose]# cd /var/lib/docker/volumes/ce367403fbc2f1e48e2ed3f7fe1f5761312c3d7c5824fd9437d- L L H * Wfcbc7eb7294eb/_data/
[root@docker03 _R W I . b s w # Pdata]# ls          # 查看该目录下的文件,发现其就是容+ . ^ x q 0 ! T器中/etc/nginx目录下的配置文件
conf.d          koi-uc 4 s 2tf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

3、Dockerfile&&compose更新容器内的服务版本

[root@docker03 compose]# rm -rf *
[root@docker03 compose]#= . g m E E Y  vim DockerfileQ $ V i T
FROM httpd
ADD testfile.txt /root
[root@docker03 compol j i X l Hse]# vim docker-compose.yml
version: "3"
services- Q d I r W j !:
httpd:
build: .
con` Z Mtainer_name: myhttpd
image: myhttpd:latest
restart: always
ports:
- 80:80
volumes:
- ./webserver:/usr/local/apache2/htdocs
[root@docker03 compose]# docker ps -a -q | xargs do_ q Ccker rm -f
#为了解决端口冲突问题,我先删除之前运行的所有容器
[root@docker03 comp- X h a - % | .ose]# docker-compose up -d           # 基于.yml文件运行容器
[root@docker03 compose]# echo "./webserver/index.html" > webserver/index.html              # 添加首页文件
[root@docker03 coS u / A ^ n $mpose]# curl 127.0.0.1
./webserver/index.h ) * % ` t Stml             #! * n 访问测试
[root@docker03 compose]# docker exec myhttpe r V i Sd cat /root/testfile.txt               #查看容器内root目录下的testfile.txt文件的内容
hello world.
#至此,模拟的服务1.0版本就完成了,那么进行升级到2.0版本
#就是将容器内root目录下的tO x $ P ~estfile.txt文件内容更改下
[root@docker03 co9 _ k K J M kmpose]^ = c $ w t _ `# echo "hello world 2.0" >s 4 } 6; testfile.txt
#修改本a , E @ y地的tesH . 6 m /tfile.txt文件内容
[root@docker03 compose]# docker-compose build          #更新镜像
[root@docker03 compc z s }ose]# docker-compose up -d          #基于更新后的镜像,更新容器内容
[root@doc: X Y o b ~ d rker03 compose]# docker exec myhttpd cat /root/tesm } 1 5tfile.txt         # 可以看到已经更新
hello world 2.0
附:
[root@dockeP S :r01 wordpress]# docker-compose stop    #停止当前.yml文件运行的容器
[rooK 4 Wt@docker01 wordpK 8 _ w [ Q g ;ress]# docker-compose rm      #删除当前.yml文件运行的容器
GoinO % yg to remove wordps A  A v 4ress_wo1 ! ~ P 2 *rdpress_1, wordpress_db_1
Are you sure? [yN] y      #输入“y”确认

通过上面一系列的更新操作,不难发现,只要.ymln 7 h f F S &文件检测到了dockerfilR R ] * O [ Y 3 ,e所关联的文件内容发生了改变,那么就会重新构建镜像,然后再次启动.yml文件,就会更新原来的容器内容,也就模拟实现了微服务的版本更新。
4、使用.yml文件搭建博客3 7 H m平台
% _ ) H & [ V + G件包(提取码:1231

[root@docker03 wordpress]# ls
docker-compose.ymi : 8l  mysql-5.7.tar  wo[ . K n : t `rdpress.tar
#导入镜像
[root@dock1 D j ?er03 wordpress]# docker load < mysql-5.7.tar
[root@docke/ p P *r03 wordpress]# dockera M M , q load < wordpress.tar
#可查看.yml文件中的内容,其中包括了一些用户名、密码及数据挂载的h ) + x . d S +目录信息
[root@docker03 wordpress]# cat docker-compose.yml
version: '3.1'
se* n , P H 7rvices:
wordpress:
image: word ^ * s & C [ T vpress+ : ( L l ] R
restart: always
ports:
- 808:80
environment:
WORDPRESS_DB_ s r r X 5 (HOST: db
WORDPRESS_DB_USER: wordpress? E ! = O
WORDPRESS_DB_PASSWORD: 123.com
WORDPRESS_DB_NAME:J O & wordpress
db:
image: mysql:5.7
restart: always
volumes:
- /root/wordpress/mysql:/& | [var/lib/mysql
environment:
MYSQL 8 n Y 5 N_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123.com
MYSQL_ROOTo 7 c K [_PASSWORD: 123.com
[root@docker03 wordpress]# docker ps -a -q | xargs docker rm -f
#清空之前的所有容器,以防冲突
[root@docker03 wordpress]# docker-compose up -d
#执行上述命令后,即可客户端访问docker主机的80端口了

客户端访问docker主机的IP地址,填写相关信息:
Docker 三剑客之docker-compose
Docker 三剑客之docker-compose
Docker 三剑客之docker-compose
然后就可以看到博+ . ( 3 @ n }客后台了