传统的容器管理:Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的创建和启动
容器编排管理:Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系 -> 执行docker-compose命令指定配置模板文件,根据模板文件的配置一键完成所有镜像的构建和容器的创建启动
一、Compose概述
1、Compose的相关概念
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker-compose up命令就像执行脚本一样,一个一个的安装并部署容器。
本质上就是在yaml格式的docker-compose配置模板文件里定义一个或多个服务及其容器的启动参数和依赖关系,并使用docker-compose命令根据配置模板文件中的参数来启动和管理容器。
2、docker-compose的作用
docker镜像管理的问题
-
需要多次使用Dockerfile Build Image或者DockerHub拉取Image;
-
需要创建多个Container,多次编写启动命令;
-
Container互相依赖,如何进行管理和编排;
当我们服务数量增多的时候,上面三个问题就会更加的被放大,如果这三个问题不解决,其实从虚拟机到容器化除了机器减少一些浪费以外,好像没有更多的变化。Docker有没有什么好的方法,可以让我们通过一个配置就搞定容器编排和运行呢?这个时候Docker Compose就站出来了。
Docker Compose的解决方案
- 提供工具用于定义和运行多个docker容器应用;
- 使用yaml文件来配置应用服务(docker-compse.yml);
- 可以通过一个简单的命令docker-compse up可以按照依赖关系启动所有服务;
- 可以通过一个简单的命令docker-compose down停止所有服务;
- 当一个服务需要的时候,可以很简单地通过--scale进行扩容;
3、Compose的特征
1、多容器管理
Compose 可以通过一个单一的 YAML 文件来定义和管理多个容器。这个文件中描述了所有的服务、网络和存储卷,使得应用的部署和管理变得简单且一致。
2、环境隔离
Compose 可以在不同的环境中运行相同的应用配置,比如开发、测试和生产环境。通过使用不同的 Compose 文件或覆盖文件,可以轻松切换环境。
3、网络配置
Compose 可以轻松地配置服务之间的网络连接。每个服务可以自动连接到一个默认的网络,或者连接到用户定义的网络。这使得服务之间的通信变得简单和直观。
4、数据卷管理
Compose 支持定义数据卷,并在多个服务之间共享数据卷。这使得持久化数据的管理更加方便,并且可以确保数据在容器重启或重新创建时不会丢失。
5、服务扩展
可以通过简单的命令扩展服务的实例数量。例如,可以通过 docker-compose up --scale web=3
命令来扩展 web
服务的实例数量为 3 个,以便进行负载均衡和高可用部署。
6、与 Docker 集成
Compose 与 Docker 深度集成,可以使用 Docker 的所有特性和功能。通过 Compose,可以方便地管理容器的生命周期、监控容器状态、查看日志和调试容器。
7、一致的开发环境
Compose 可以帮助开发者在本地创建一个与生产环境一致的开发环境。这样,开发者可以在本地测试和调试代码,确保在生产环境中能够正常运行。
4、docker-compose的三大概念:
- 项目project
- 服务service
- 容器container
项目project -> 包含一个或多个服务service -> 包含容器container的镜像、端口映射、数据卷、环境变量、依赖关系等启动参数
- 默认使用项目的目录名作为project的项目名,也支持使用 -p 或 --project-name 选项指定项目名称。
- 项目目录里要包含一个docker-compose配置模板文件,默认为docker-compose.yml,也支持使用 -f 或 --file 选项指定项目的配置模板文件。
- 在配置模板文件里要包含一个或多个服务及其容器的配置,每个服务要包含容器的名称、镜像、映射端口、数据卷、网络模式、依赖关系等容器的启动参数。
5、Docker Compose 常用命令
|----------------|---------------------------------|
| image | 使用本地镜像或从仓库拉取镜像创建容器 |
| build | 使用dockerfile现场构建镜像创建容器 |
| context | 指定dockerfile文件所在的目录路径 |
| dockerfile | 指定dockerfile文件名 |
| command | 设置容器的启动命令,会覆盖镜像中的CMD指令 |
| container_name | 设置容器名 --name |
| environment | 设置环境变量 -e -env |
| networks | 设置容器使用的自定义网络和IP --ip |
| network_mode | 设置容器的网络模式 --network |
| ports | 设置容器端口映射 -p |
| volumes | 设置数据卷挂载 -v |
| volumes_from | 设置数据卷容器挂载,版本3不支持 --volumes-from |
| hostname | 设置容器主机名 -h --hostname |
| sysctls | 设置容器的内核参数 --sysctl |
| links | 设置容器互联 --link |
| privileged | 设置容器拥有root权限 --privileged |
| restart | 设置容器重启策略 --restart |
| depends_on | 设置容器的依赖关系 |
二、compose 部署
1. Docker Compose 环境安装
Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose
#下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version
2、YAML 文件格式及编写注意事项
YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json 数据描述语言,语法比 json 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。
(1)使用 YAML 时需要注意事项
●大小写敏感
●通过缩进表示层级关系
●不支持制表符 tab 键缩进,只能使用空格缩进
●缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
●用 # 号注释
●符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
●如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思
(2)yaml文件格式
yaml格式文件: 文件名以 .yaml .yml 为后缀,用空格缩进表示字段的层级关系,特点:可读性高,易于管理。
#一级字段
key1: value1 #一个key只有一个值,值的类型为 纯量
key2:
- value1 #一个key有多个值的纵向格式,值的类型为 列表
- value2
key3: ["value1", "value2"] #一个key有多个值的横向格式,值的类型为 数组
key4:
#二级字段
subkey1: value1 #用 空格缩进 表示字段的层级关系,同一层字段要靠左对齐
subkey2:value2
subkey3: #key的值也是键值对,值的类型为 对象
#三级字段
sskey1: value1
sskey2: value2
三、Docker-compose 搭建LNMP
1、准备依赖文件
2、配置nginx的Dockerfile文件
mkdir lnmp
cd lnmp
mkdir nginx mysql php
vim /opt/lnmp/nginx/Dockerfile
FROM centos:7
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.22.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
COPY nginx.conf /usr/local/nginx/conf/
ADD wordpress-6.4.2-zh_CN.tar.gz /usr/local/nginx/html
RUN chmod -R 777 /usr/local/nginx/html
EXPOSE 80
VOLUME ["/usr/local/nginx/html/"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
3、配置mysql的Dockerfile
vim /opt/lnmp/mysql/Dockerfile
FROM centos:7
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 4 && make install
COPY my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql && chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ && systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME ["/usr/local/mysql"]
ENTRYPOINT ["/usr/sbin/init"]
4、部署php的Dockerfile
vim /opt/lnmp/php/Dockerfile
FROM centos:7
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel && useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
COPY php.ini /usr/local/php/lib
COPY php-fpm.conf /usr/local/php/etc/
COPY www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT ["/usr/local/php/sbin/php-fpm","-F"]
5、编辑yml文件
cd /opt
mkdir compose
cd compose/
mkdir lnmp-compose
cd lnmp-compose/
touch docker-compose.yml
mkdir nginx mysql php
cd nginx
将所需要的软件包移到该目录下
/opt/compose/lnmp-compose
vim docker-compose.yml
version: "3"
services:
web:
build:
context: ./nginx/
dockerfile: Dockerfile
container_name: nginx
ports:
- 80:80
volumes:
- ./nginx/html:/usr/local/nginx/html
networks:
mynetwork:
ipv4_address: 172.18.0.10
db:
image: mysql:lnmp
container_name: mysql
privileged: true
volumes:
- db-data:/usr/local/mysql
networks:
mynetwork:
ipv4_address: 172.18.0.20
php:
image: php:lnnmp
container_name: php
ports:
- 9000:9000
volumes:
- db-data:/usr/local/mysql
- ./nginx/html:/usr/local/nginx/html
networks:
mynetwork:
ipv4_address: 172.18.0.30
depends_on:
- web
- db
networks:
mynetwork:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
volumes:
db-data:
docker-compose -f docker-compose.yml up -d