Blog.084 Docker Compose 编排
本章目录
1. Docker Compose 简介
1.1 使用场景
1.2 YML 文件
1.3 Docker Compose 使用步骤
2. Compose 的部署
2.1 Docker Compose 环境安装
2.2 YAML 文件格式及编写注意事项
2.3 数据结构
2.4 Docker Compose 配置常用字段
2.5 Docker Compose 常用命令
3. 使用 Docker Compose 部署 LNMP
3.1 Nginx
3.2 MySQL
3.3 PHP
3.4 编写 YML 文件
3.5 检查
我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排 Docker Compose。
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project, 即项目)例如一个 web 服务容器再加上后端的数据库服务容器等。
- Docker Compose 非常适合组合使用多个容器进行开发的场景
- Docker Compose 的前身是 Fig,它是一个定义及运行多个容器的工具
- 使用 Docker Compose 不再需要使用 shell 脚本来启动容器
- 通过 Docker Compose 可以使用 YML 文件来配置应用程序所需要的的所有服务
YAML(YML)是一种标记语言很直观的数据序列化格式,非常适合用来表达或者编辑数据结构、各种配置文件、文件大纲等。
例如:许多电子邮件标题格式和 YAML 非常接近。
- 使用 Dockerfile 定义应用程序的环境
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
- 最后执行 docker-compose up 命令来启动并运行整个应用程序。
2. Compose 的部署
2.1 Docker Compose 环境安装
Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后再单独安装Docker Compose。
1 ##下载 2 curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 3 4 或 5 6 ##直接将 docker compose 上传 7 ls docker-compose 8 docker-compose 9 10 ##修改权限,给与执行权限 11 chmod +x docker-compose 12 ll docker-compose 13 14 ##将 docker-compose 移动到 /usr/local/bin 15 mv docker-compose /usr/local/bin/ 16 docker-compose --version

YAML 是一种标记性语言,它可以很直观的展示数据序列格式,可读性高。类似于 XML 数据描述语言,语法比 XML 简单的很多。
- YAML 数据结构通过缩进来表示
- 连续的项目通过减号来表示(列表)
- 键值对用冒号分隔
- 数组用中括号 [ ] 括起来
- hash 用花括号{ } 括起来
- 大小敏感
- 通过缩进表示层级关系
- 不支持制表符tab 键缩进,只能使用空格缩进
- 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2 个空格
- 用 # 号注释
- 符号字符后缩进 1 个空格,如 "冒号 :" "逗号 ," " 短横杠 -"
- 如果包含特殊字符,用单引号( '') 引起来会作为普通字符串处理,双引号("") : 特殊字符作为本身想表示的意思。
1 对象: 键值对的字典 2 animal: pets 3 4 数组: 一组按次序排列的列表 5 - cat 6 - dog 7 - goldfish 8 9 布尔值 10 debug: "true" 11 debug: "false" 12 13 14 ##Yaml示例 15 languages: 16 - Java 17 - Golang 18 - Python 19 websites: 20 Baidu: www.baidu.com 21 Wangyi: www.163.com 22 Souhu: www.souhu.com 23 24 25 ##或者 26 languages: ["Java","Golong","Python"] 27 websites: 28 Baidu: 29 www.baidu.com 30 Wangyi: 31 www.163.com 32 Souhu: 33 www.souhu.com 34 35 36 37 ##Json格式 38 { 39 languages: [ 40 'Java', 41 'Golong', 42 'Python', 43 ], 44 websites: [ 45 Baidu: 'www.baidu.com', 46 Wangyi: 'www.163.com', 47 Souhu: 'www.souhu.com', 48 ] 49 }
| 字段 | 描述 |
| build |
指定 Dockerfile 文件名 (要指定的 Dockerfile 文件需要在 build 标签的子级标签中用 dockerfile 标签指定) |
| dockerfile | 构建镜像上下文路径 |
| context | 可以是 dockerfile 路径,或者是执行 git 仓库的 url 地址 |
| image | 指定镜像(已存在) |
| command | 执行命令,会覆盖容器启动后默认执行的命令(会覆盖 Dockerfile 的 CMD 指令) |
| container_name |
指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale |
| deploy | 指定部署和运行服务相关配置,只能在 Swarm 模式使用 |
| enviroment | 添加环境变量 |
| networks | 加入网络,引用顶级 networks 下条目 |
| ports |
暴露容器端口,与 -p 相同,但是端口不能低于 60 |
| volumes |
挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称 |
| volumes_from |
从另一个服务或容器挂载卷,可选参数 :ro 和 :rw |
| hostname |
容器主机名 |
| sysctls | 在容器内设置内核参数 |
| links |
连接到另一个容器,- 服务名称 [ : ] |
| restart |
重启策略,定义是否重启容器: |
| depends_on |
此标签用于解决容器的依赖,启动先后问题。如启动应用容器,需要先启动数据库容器 php: |
| 字段 | 描述 |
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行命令 |
| scale | 指定一个服务容器启动数量 |
| top | 显示正在运行的容器进程 |
| logs | 查看服务容器的输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |
3. 使用 Docker Compose 部署 LNMP
3.1 Nginx
1 ##创建项目目录 compose_nginx; 2 ##创建服务子目录 3 4 [root@host103 ~]# mkdir /opt/compose_nginx/ 5 [root@host103 ~]#cd /opt/compose_nginx 6 [root@host103 compose_nginx]# mkdir nginx mysql php wwwroot 7 8 ##上传wordpress软件包 9 10 [root@host103 nginx]# cd /opt/compose_nginx/wwwroot/ 11 [root@host103 wwwroot]# ls wordpress-4.9.4-zh_CN.tar.gz 12 wordpress-4.9.4-zh_CN.tar.gz 13 [root@host103 wwwroot]# tar xf wordpress-4.9.4-zh_CN.tar.gz 14 [root@host103 nginx]# tar xf wordpress-4.9.4-zh_CN.tar.gz 15 16 17 ##上传nginx软件包 18 19 [root@host103 compose_nginx]# cd nginx/ 20 [root@host103 nginx]# ls nginx-1.12.0.tar.gz 21 nginx-1.12.0.tar.gz 22 23 24 ##编写nginx的Dockerfile文件 25 26 [root@host103 nginx]# vim Dockerfile 27 28 FROM centos:7 29 MAINTAINER this is nginx image <zhi> 30 RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make 31 RUN useradd -M -s /sbin/nologin nginx 32 ADD nginx-1.12.0.tar.gz /usr/local/src/ 33 WORKDIR /usr/local/src/nginx-1.12.0 34 RUN ./configure \ 35 --prefix=/usr/local/nginx \ 36 --user=nginx \ 37 --group=nginx \ 38 --with-http_stub_status_module && make -j8&& make install 39 ENV PATH /usr/local/nginx/sbin:$PATH 40 RUN sed -i 's/#charset koi8-r;/charset utf-8;/' /usr/local/nginx/conf/nginx.conf \ 41 && sed -i '45 s/index index.html index.htm;/index index.html index.php;/' /usr/local/nginx/conf/nginx.conf \ 42 && sed -i '65,71 s/#//' /usr/local/nginx/conf/nginx.conf \ 43 && sed -i 's/fastcgi_pass 127.0.0.1:9000;/fastcgi_pass 172.18.0.30:9000;/' /usr/local/nginx/conf/nginx.conf \ 44 && sed -i 's#/scripts#/usr/local/nginx/html#' /usr/local/nginx/conf/nginx.conf 45 46 EXPOSE 80 47 EXPOSE 443 48 ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]


1 ##进入mysql子目录 2 3 [root@host103 ~]# cd /opt/compose_nginx/mysql/ 4 5 ##将mysql包上传到此目录 6 7 [root@host103 mysql]# ls mysql-boost-5.7.20.tar.gz 8 mysql-boost-5.7.20.tar.gz 9 10 ##编写mysql的Dockerfile文件 11 12 [root@host103 mysql]# vim Dockerfile 13 14 FROM centos:7 15 MAINTAINER this is mysql image <zhi> 16 RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make 17 RUN useradd -M -s /sbin/nologin mysql 18 ADD mysql-boost-5.7.20.tar.gz /usr/local/src/ 19 WORKDIR /usr/local/src/mysql-5.7.20/ 20 RUN cmake \ 21 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ 22 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ 23 -DSYSCONFDIR=/etc \ 24 -DSYSTEMD_PID_DIR=/usr/local/mysql \ 25 -DDEFAULT_CHARSET=utf8 \ 26 -DDEFAULT_COLLATION=utf8_general_ci \ 27 -DWITH_INNOBASE_STORAGE_ENGINE=1 \ 28 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ 29 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 30 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ 31 -DMYSQL_DATADIR=/usr/local/mysql/data \ 32 -DWITH_BOOST=boost \ 33 -DWITH_SYSTEMD=1 && make -j8 && make install 34 RUN chown -R mysql:mysql /usr/local/mysql/ 35 ADD my.cnf /etc/ 36 RUN chown mysql:mysql /etc/my.cnf 37 ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH 38 WORKDIR /usr/local/mysql/ 39 RUN bin/mysqld \ 40 --initialize-insecure \ 41 --user=mysql \ 42 --basedir=/usr/local/mysql \ 43 --datadir=/usr/local/mysql/data 44 RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ 45 EXPOSE 3306 46 CMD /usr/local/mysql/bin/mysqld 47 48 ##配置myslq主配置文件my.cnf(用来复制到容器) 49 50 [root@host103 mysql]# vim my.cnf 51 [client] 52 port = 3306 53 socket = /usr/local/mysql/mysql.sock 54 55 [mysql] 56 port = 3306 57 socket = /usr/local/mysql/mysql.sock 58 59 [mysqld] 60 user = mysql 61 basedir = /usr/local/mysql 62 datadir = /usr/local/mysql/data 63 port = 3306 64 character_set_server=utf8 65 pid-file = /usr/local/mysql/mysqld.pid 66 socket = /usr/local/mysql/mysql.sock 67 server-id = 1 68 69 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
1 [root@host103 php]# cd /opt/compose_nginx/php/ 2 3 ##将php包上传 4 5 [root@host103 php]# ls php-7.1.10.tar.bz2 6 php-7.1.10.tar.bz2 7 8 ##编写php的dockerfile 9 10 [root@host103 php]# vim Dockerfile 11 12 FROM centos:7 13 MAINTAINER this is php image <zhi> 14 RUN yum -y install gd \ 15 libjpeg libjpeg-devel \ 16 libpng libpng-devel \ 17 freetype freetype-devel \ 18 libxml2 libxml2-devel \ 19 zlib zlib-devel \ 20 curl curl-devel \ 21 openssl openssl-devel \ 22 gcc gcc-c++ make pcre-devel 23 RUN useradd -M -s /sbin/nologin nginx 24 ADD php-7.1.10.tar.bz2 /usr/local/src/ 25 WORKDIR /usr/local/src/php-7.1.10 26 RUN ./configure \ 27 --prefix=/usr/local/php \ 28 --with-mysql-sock=/usr/local/mysql/mysql.sock \ 29 --with-mysqli \ 30 --with-zlib \ 31 --with-curl \ 32 --with-gd \ 33 --with-jpeg-dir \ 34 --with-png-dir \ 35 --with-freetype-dir \ 36 --with-openssl \ 37 --enable-fpm \ 38 --enable-mbstring \ 39 --enable-xml \ 40 --enable-session \ 41 --enable-ftp \ 42 --enable-pdo \ 43 --enable-tokenizer \ 44 --enable-zip && make && make install 45 ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH 46 47 48 RUN \cp /usr/local/src/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini \ && sed -i 's#mysqli.default_socket =#mysqli.default_socket = /usr/local/mysql/mysql.sock#' /usr/local/php/lib/php.ini \ && sed -i '939 s#;date.timezone =#date.timezone = Asia/Shanghai#' /usr/local/php/lib/php.ini 49 50 RUN \cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf \ 51 && sed -i '17 s/^;//' /usr/local/php/etc/php-fpm.conf 52 53 RUN \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \ 54 && sed -i 's#user = nobody#user = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \ 55 && sed -i 's#group = nobody#group = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \ && sed -i 's#listen = 127.0.0.1:9000#listen = 172.18.0.30:9000#' /usr/local/php/etc/php-fpm.d/www.conf 56 57 EXPOSE 9000 58 ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
1 ##先拉取镜像centos:7 2 3 [root@host103 compose_nginx]# docker pull centos:7 4 5 6 [root@host103 ~]# vim /opt/compose_nginx/docker-compose.yml 7 8 ##使用版本2(3版本不支持指令volumes_from) 9 10 version: '2' 11 services: 12 #配置nginx服务 13 nginx: 14 #设置主机名为nginx 15 hostname: nginx 16 #使用dockerfile创建镜像。Dockerfile文件在当前目录的nginx目录下,文件名为Dockerfile 17 build: 18 context: ./nginx 19 dockerfile: Dockerfile 20 #容器名为nginx 21 container_name: nginx 22 #暴露端口80和443 23 ports: 24 - 80:80 25 - 443:443 26 #加入到lnmp网络中,使用ip172.18.0.10 27 networks: 28 lnmp: 29 ipv4_address: 172.18.0.10 30 #将当前目录的wwwroot目录挂载到容器的/usr/local/nginx/html 31 volumes: 32 - ./wwwroot/:/usr/local/nginx/html 33 #配置服务mysql 34 mysql: 35 hostname: mysql 36 build: 37 context: ./mysql 38 dockerfile: Dockerfile 39 container_name: mysql 40 ports: 41 - 3306:3306 42 networks: 43 lnmp: 44 ipv4_address: 172.18.0.20 45 #设置/usr/local/mysql为数据卷 46 volumes: 47 - /usr/local/mysql 48 #配置服务php 49 php: 50 hostname: php 51 build: 52 context: ./php 53 dockerfile: Dockerfile 54 container_name: php 55 ports: 56 - 9000:9000 57 networks: 58 lnmp: 59 ipv4_address: 172.18.0.30 60 #从nginx容器和mysql容器获取数据卷 61 volumes_from: 62 - nginx 63 - mysql 64 #php容器需要在nginx和mysql之后启动 65 depends_on: 66 - nginx 67 - mysql 68 #php和容器nginx,容器mysql连接 69 links: 70 - nginx 71 - mysql 72 #配置网络模式和网络名 73 networks: 74 #设置网络名lnmp 75 lnmp: 76 #网络模式为bridge桥接模式 77 driver: bridge 78 ipam: 79 config: 80 #使用的网段为172.18.0.0/16 81 - subnet: 172.18.0.0/16 82 83 84 #在工作目录使用此命令。 85 #-f: --file-name, 指定模板文件。默认为docker-compose.yml 86 #-p: --project-name NAME ,指定项目名称,默认使用目录名 87 #-d: 在后台运行 88 [root@host103 compose_nginx]# docker-compose -f docker-compose.yml up -d

-
浙公网安备 33010602011771号