十四、docker-compose
Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
使用compose,可以使用yaml文件配置应用程序的服务。然后,通过一个命令,可以从配置中创建和启动所有服务。
官网:https://docs.docker.com/compose/overview/
官方文档:https://docs.docker.com/compose/
compose适用于所有环境:生产,开发,测试以及CI工作流程。
使用compose基本上是一个三步过程:
-
用dockerfile,或者镜像定义应用程序的环境,以便在任何地方复制。
-
在docker-compose.yml中定义组成应用程序的服务,以便它们可以在单独的环境中一起运行。
-
运行docker compose up启动并运行整个应用程序。
二、docekr-compose的安装
安装方式一:
[root@docker ~]# yum -y install libcurl libcurl-devel [root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose [root@docker ~]# ls anaconda-ks.cfg docker-compose [root@docker ~]# mv docker-compose /usr/local/bin/ [root@docker ~]# chmod +x /usr/local/bin/docker-compose [root@docker ~]# docker-compose --version docker-compose version 1.21.1, build 5a3f1a3
安装方式二:
通过pip -v检查pip 是否安装及版本 yum -y install epel-release 安装pip基础 yum install python-pip 安装pip的python 支持 pip install --upgrade pip 完成pip的安装 pip install docker-compose 来安装docker-compose
安装方式三:
yum install -y docker-compose
常用选项: --verbose:输出更多的调试信息 --version:查看compose的版本 -f --file FILE:使用特定的compose模板文件,默认为docker-compose.yml。 -p --project-name NAME 指定项目名称,默认使用目录名称。 常用命令: build:构建或重建服务 ps:查看已经启动的服务状态 kill:停止某个服务、杀掉容器 logs:可以查看某个服务的log、显示容器的输出内容 port:打印绑定的public port(开放端口) pull:拉取服务镜像 up:启动yml定义的所有服务 stop:停止yml中定义的所有服务 start:启动被停止的yml中的所有服务 kill:强行停止yml中定义的所有服务 rm:删除yml中定义的所有服务 restart:重启yml中定义的所有服务 scale:设置服务的容器数目 run:运行一个一次性命令
Yaml简介.YAML是一种标记语言,可读性很强。类似于XML数据描述语言,语法比XML简单的多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分割,数组用括号括起来, hash用花括号括起来。 YAML文件格式注意事项: 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符); 通常开头缩进2个空格;字符的后面缩进1个空格,比如冒号、逗号、横杆; 支持#注释; 允许在文件中加入选择性的空行,以增加可读性; docker-compose中YAML常用的字段: 字段 描述 build dockerfile 指定dockerfile文件名 context 构建镜像上下文路径 image 指定镜像 command 执行命令,覆盖默认命令 container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale deploy 指定部署和运行服务相关配置,只能在Swarm模式使用 environment 添加环境变量 networks 加入网络,引用顶级networks下条目 ports 暴漏端口,与-p相同,但端口不能低于60 volumes 挂载宿主机路径或命名卷在顶级volumes定义卷名称 restart 重启策略,默认no,always|on-failurel|unless-stopped hostname 容器主机名
docker-compose.yml 编排
案例1、docker-compose构建nginx容器
第一步:编写docker-compose.yml文件
version:"3" services: nginx: container_name: www-nginx image: nginx:latest restart: always ports: - 80:80 volumes: - /web:/usr/share/nginx/html
mkdir -p /web cd /web echo 'first docker-compose project' > index.html
docker-compose up -d
docker-compose.yml文件说明
version:版本号,通常写2和3
services: Docker容器服务的名称
container_name:容器的名字
restart: 设置为always,容器在停止或docker服务重启后,重启容器
image: docker镜像,如果本地没有,在官方镜像上去找
ports: 容器自己运行的端口号和需要暴露的端口号
volumes:数据卷,表示数据、配置文件等存放的位置。(- .表示docker-compose.yml当前目录)
[root@inode3 docker]# docker-compose config services: nginx: container_name: www-nginx image: nginx:latest ports: - 80:80/tcp restart: always volumes: - /web:/usr/share/nginx/html:rw version: '3.0' [root@inode3 docker]# docker-compose up Creating network "docker_default" with the default driver Creating www-nginx ... done Attaching to www-nginx www-nginx | 192.168.32.103 - - [09/Mar/2020:15:25:21 +0000] "GET / HTTP/1.1" 200 29 "-" "curl/7.29.0" "-" 访问测试 [root@inode3 ~]# curl 192.168.32.103 first docker-compose project
tomcat页面的发布目录:/usr/local/tomcat/webapps/ROOT 挂载宿主机的/web/ROOT目录到/usr/local/tomcat/webapps下
第一步:编写docekr-compose.yml文件
version: '3' services: nginx: container_name: web_nginx images: nginx:latest restart: always ports: - 80:80 volumes: - /web:/usr/share/nginx/html - /web/nginx.conf:/etc/nginx/nginx.conf - /web/default.conf:/etc/nginx/conf.d/default.conf links: - tomcat01 - tomcat02 - tomcat01: container_name: tomcat01 images: tomcat:latest restart: always volumes: - /web:/usr/local/tomcat/webapps tomcat02: container_name: tomcat02 images: tomcat:latest restart: always volumes: - /web:/usr/local/tomcat/webapps
第二步:创建发布目录
mkdir -p /web echo 'nginx to tomcat' > index.html echo 'It is error' > 50x.html
default.conf文件内容
upstream tomcat_web { server tomcat01:8080 max_fails=2 fail_timeout=5; server tomcat02:8080 max_fails=2 fail_timeout=5; } server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; proxy_pass http://tomcat_web; proxy_set_header host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
nginx.conf文件内容
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include conf.d/*.conf; }
第三步:docker-compose up -d
[root@inode3 docker]# docker-compose config services: nginx: container_name: web_nginx image: nginx:latest links: - tomcat01 - tomcat02 ports: - 80:80/tcp restart: always volumes: - /web:/usr/share/nginx/html:rw - /web/nginx.conf:/etc/nginx/nginx.conf:rw - /web/default.conf:/etc/nginx/conf.d/default.conf:rw tomcat01: container_name: tomcat01 image: tomcat:latest restart: always tomcat02 container_name: tomcat02 image: tomcat:latest restart: always version: '3.0'
[root@inode3 docker]# docker-compose up -d Pulling tomcat01 (tomcat:latest)... latest: Pulling from library/tomcat 50e431f79093: Pull complete dd8c6d374ea5: Pull complete c85513200d84: Pull complete 55769680e827: Pull complete e27ce2095ec2: Pull complete 5943eea6cb7c: Pull complete 3ed8ceae72a6: Pull complete 91d1e510d72b: Pull complete 98ce65c663bc: Pull complete 27d4ac9d012a: Pull complete Digest: sha256:2c90303e910d7d5323935b6dc4f8ba59cc1ec99cf1b71fd6ca5158835cffdc9c Status: Downloaded newer image for tomcat:latest Creating tomcat02 ... done Creating tomcat01 ... done Recreating www-nginx ... done
[root@inode3 docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ba3f8a9a8d1 nginx:latest "nginx -g 'daemon of…" 47 seconds ago Restarting (1) 10 seconds ago web_nginx 965e4e262cc5 tomcat:latest "catalina.sh run" 49 seconds ago Up 47 seconds 8080/tcp tomcat01 73d90a4a2ad3 tomcat:latest "catalina.sh run" 49 seconds ago Up 47 seconds 8080/tcp tomcat02
案例3: docker-compose和dockerfile结合使用
文件位置
[root@inode4 docker]# tree /server/docker/ /server/docker/ ├── docker-compose.yml └── kod ├── dockerfile ├── init.sh └── kodexplorer4.40.zip
docker-compose.yml
version: '3' kod: #指定服务名 build: ./kod #指定dockerile路径 ports: - "80:80" #指定端口映射 expose: - 80 #容器提供服务的i:端口
dockerfile
FROM centos:7 RUN yum install -y httpd php php-cli php-gd php-mbstring unzip WORKDIR /var/www/html COPY kodexplorer4.40.zip . RUN unzip kodexplorer4.40.zip RUN chown -R apache.apache /var/www/html RUN chmod 777 /var/www/html ADD init.sh /init.sh EXPOSE 80 ENTRYPOINT ["/bin/bash","/init.sh"]
#!/bin/bash /usr/sbin/httpd -k start tail -F /var/log/access_log
案例4:一键部署 LNMP 网站平台
version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 80:80 networks: - lnmp volumes: - ./nginx/php.conf:/usr/local/nginx/conf/vhost/php.conf - ./wwwroot:/usr/local/nginx/html php: hostname: php build: context: ./php dockerfile: Dockerfile networks: - lnmp volumes: - ./wwwroot:/usr/local/nginx/html mysql: hostname: mysql image: mysql:5.7 ports: - 3306:3306 networks: - lnmp volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/data:/var/lib/mysql command: --character-set-server=utf8 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: test MYSQL_USER: user MYSQL_PASSWORD: user123456 networks: lnmp: {}
案例5: 一键部署 LNMT网站平台
version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 80:80 networks: - lnmt volumes: - ./nginx/tomcat.conf:/usr/local/nginx/conf/vhost/tomcat.conf - ./webapps:/usr/local/tomcat/webapps tomcat01: hostname: tomcat01 build: ./tomcat networks: - lnmt volumes: - ./webapps:/usr/local/tomcat/webapps tomcat02: hostname: tomcat02 build: ./tomcat networks: - lnmt volumes: - ./webapps:/usr/local/tomcat/webapps mysql: hostname: mysql image: mysql:5.7 ports: - 3306:3306 networks: - lnmt volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: test MYSQL_USER: user MYSQL_PASSWORD: user123456 networks: lnmt: