一, Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具. 通过 Compose, 可以使用 YAML 文件来配置应用程序的服务. 然后, 使用一个命令, 就可以从配置中创建并启动所有服务.
Docker-Compose 是一个容器编排工具. 通过一个. YAML 或. YAML 文件, 将所有的容器的部署方法, 文件映射, 容器端口映射等情况写在一个配置文件里, 执行 docker-compose up 命令就像执行脚本一样, 一个一个的安装并部署容器.
Dockerfile 可以让用户管理一个单独的应用容器; 而 Compose 则允许用户在一个模板 (YAML 格式) 中定义一组相关联的应用容器, 例如一个 web 服务容器再加上后端的数据库服务容器等.
docker-compose 的术语:
服务(service): 一个应用容器, 实际上可以运行多个相同镜像的实例.
项目(project): 由一组关联的应用容器组成的一个完整的业务单元.
由此可以得出: 一个项目可以由多个服务 (容器) 关联而成, 而 compose 是面向项目进行管理的.
二, Compose 的安装及使用
若想使用 compose 这个容器编排工具, 那么, 必须是基于 docker 这个服务, 安装 docker, 然后下载 docker-compose 这个命令, 我们可以去 GitHub 官方网站 https://github.com/search?q=docker/compose 搜索 "docker/compose"
1, 在 docker 主机上执行 GitHub 上得到的命令
- [root@docker01 ~]# curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- [root@docker01 ~]# chmod +x /usr/local/bin/docker-compose
执行上面的两条命令后, 我们就可以使用 docker-compose 这个编排工具了.
在进行编写. YAML 文件之前, 我们需要知道每个 compose 版本所支持的 docker 版本是哪些? 在我们下载 compose 命令时, 其实下面已经给出了参考列表.
前面是版本号, 后面是对应的版本所支持的 docker 服务版本
查看 docker 的版本:
- [root@docker01 ~]# docker -v
- Docker version 18.09.0, build 4d60db4
通过上述查看操作, 可以知道, 当前我的 docker 版本是 18.09, 那么基本可以使用所有的 compose 版本, 因为其可以向下兼容, 只要高于 compose 版本所支持的 docker 版本即可
三, 编写. YAML 文件
1, 构建简单的 Nginx 服务. YAML 文件
- [root@docker01 ~]# mkdir compose
- [root@docker01 ~]# cd compose/
- [root@docker01 compose]# VIM docker-compose.YAML
- version: "3"
- services:
- nginx:
- container_name: Web-nginx
- image: nginx:latest
- restart: always
- ports:
- - 80:80
- volumes:
- - /root/compose/webserver:/usr/share/nginx/html
- [root@docker01 compose]# docker-compose up -d
- # 执行上述命令后, 会自动在当前目录下生成一个 webserver 的目录, 对应的就是容器中的 HTML 目录
- [root@docker01 compose]# echo "hello world"> webserver/index.HTML
- [root@docker01 compose]# curl 127.0.0.1 # 访问本机测试
- hello world
我们基于自己写 dockerfile 文件构建镜像并运行容器后, 都需要进入容器手动启动一下其运行的服务, 而通过上面的的例子, 可以看到, 容器运行后, 其服务也是出于运行状态的, 这是怎么做到的呢? 我们可以通过执行 "docker ps" 命令进行查看容器的运行信息
- [root@docker03 compose]# alias dc='docker-compose'
- [root@docker01 ~]# dc -f compose/docker-compose.YAML up -d
- # 若运行时, 没有与. YAML 文件出于同一目录, 那么可以使用 - f 选项指定. YAML 文件的路径
2,compose+dockerfile 构建镜像
- [root@docker03 compose]# VIM docker-compose.YAML
- version: "3"
- services:
- nginx:
- build: .
- container_name: Web-nginx
- image: mynginx:1.0
- restart: always
- ports:
- - 80:80
- volumes:
- - /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@docker03 compose]# docker-compose build # 使用. YAML 构建镜像
- [root@docker03 compose]# docker run -itd --name nginx-test -p 80 mynginx:1.0
- [root@docker03 compose]# docker ps # 查看映射的端口
客户端访问其映射到 docker 主机上的端口, 看到的页面如下(可以看到, 在 dockerfile 中的 ADD 配置行并没有生效):
查看容器的 / etc/nginx 目录是否挂载到了 docker 主机上:
[root@docker03 compose]# docker inspect nginx-test
- # 切换至本地映射的目录
- [root@docker03 compose]# cd /var/lib/docker/volumes/ce367403fbc2f1e48e2ed3f7fe1f5761312c3d7c5824fd9437dfcbc7eb7294eb/_data/
- [root@docker03 _data]# ls # 查看该目录下的文件, 发现其就是容器中 / etc/nginx 目录下的配置文件
- conf.d koi-utf 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]# VIM Dockerfile
- FROM httpd
- ADD testfile.txt /root
- [root@docker03 compose]# VIM docker-compose.YAML
- version: "3"
- services:
- httpd:
- build: .
- container_name: myhttpd
- image: myhttpd:latest
- restart: always
- ports:
- - 80:80
- volumes:
- - ./webserver:/usr/local/apache2/htdocs
- [root@docker03 compose]# docker ps -a -q | xargs docker rm -f
- # 为了解决端口冲突问题, 我先删除之前运行的所有容器
- [root@docker03 compose]# docker-compose up -d # 基于. YAML 文件运行容器
- [root@docker03 compose]# echo "./webserver/index.html"> webserver/index.HTML # 添加首页文件
- [root@docker03 compose]# curl 127.0.0.1
- ./webserver/index.HTML # 访问测试
- [root@docker03 compose]# docker exec myhttpd cat /root/testfile.txt #查看容器内 root 目录下的 testfile.txt 文件的内容
- hello world.
- # 至此, 模拟的服务 1.0 版本就完成了, 那么进行升级到 2.0 版本
- # 就是将容器内 root 目录下的 testfile.txt 文件内容更改下
- [root@docker03 compose]# echo "hello world 2.0"> testfile.txt
- # 修改本地的 testfile.txt 文件内容
- [root@docker03 compose]# docker-compose build #更新镜像
- [root@docker03 compose]# docker-compose up -d #基于更新后的镜像, 更新容器内容
- [root@docker03 compose]# docker exec myhttpd cat /root/testfile.txt # 可以看到已经更新
- hello world 2.0
附:
- [root@docker01 WordPress]# docker-compose stop #停止当前. YAML 文件运行的容器
- [root@docker01 WordPress]# docker-compose rm #删除当前. YAML 文件运行的容器
- Going to remove wordpress_wordpress_1, wordpress_db_1
- Are you sure? [yN] y #输入 "y" 确认
通过上面一系列的更新操作, 不难发现, 只要. YAML 文件检测到了 dockerfile 所关联的文件内容发生了改变, 那么就会重新构建镜像, 然后再次启动. YAML 文件, 就会更新原来的容器内容, 也就模拟实现了微服务的版本更新.
4, 使用. YAML 文件搭建博客平台
软件包(提取码: 1231)
- [root@docker03 WordPress]# ls
- docker-compose.YAML MySQL-5.7.tar WordPress.tar
- # 导入镜像
- [root@docker03 WordPress]# docker load < MySQL-5.7.tar
- [root@docker03 WordPress]# docker load < WordPress.tar
- # 可查看. YAML 文件中的内容, 其中包括了一些用户名, 密码及数据挂载的目录信息
- [root@docker03 WordPress]# cat docker-compose.YAML
- version: '3.1'
- services:
- WordPress:
- image: WordPress
- restart: always
- ports:
- - 808:80
- environment:
- WORDPRESS_DB_HOST: db
- WORDPRESS_DB_USER: WordPress
- WORDPRESS_DB_PASSWORD: 123.com
- WORDPRESS_DB_NAME: WordPress
- db:
- image: MySQL:5.7
- restart: always
- volumes:
- - /root/WordPress/MySQL:/var/lib/MySQL
- environment:
- MYSQL_DATABASE: WordPress
- MYSQL_USER: WordPress
- MYSQL_PASSWORD: 123.com
- MYSQL_ROOT_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 地址, 填写相关信息:
然后就可以看到博客后台了
来源: http://blog.51cto.com/14227204/2519343