Docker-compose

使用Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排,服务编排有很多技术方案,今天就看看Docker官方产品Docker compose

Docker-compose简介

Dockerfile 可以让用户管理一个单独的应用容器,而compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(也可以称为一个project(项目)) ,例如一个web服务容器再加上后端的数据库服务容器等

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 consul

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理

Docker-compose部署

bash 复制代码
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

YAML文件格式及编写注意事项

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高,类似于XML数据描述语言,语法比XML简单的很多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 括起来,hash用花括号 { } 括起来

使用 YAML 时需要注意下面事项:

大小写敏感

通过缩进表示层级关系

不支持制表符 tab 键缩进,只能使用空格缩进

缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格

用 # 号注释

符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -

如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思 name: "Hi,\nTom"

bash 复制代码
# yaml 格式 示范
languages:       #序列的映射
  - Java
  - Golang
  - Python
websites:        #映射的映射
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G 
bash 复制代码
#数据结构
对象映射:键值对 冒号后要空一格
animal: pets


#序列数组:一组按次序排列的列表
- Cat
- Dog
- Goldfish

#如果后面没有跟随的也可以使用数组的方式
["Cat", "Dog", "Goldfish"]


#布尔值
debug: true
debug: flase

#键值对 
#键:{值}

name: emmm
  languages: 
    - java
    - pythod
    - c++
  
#json格式
{
  languages: [
    'Java',
    'Golang',
    'Python'	
  ],
  resources: {
    cpu: '2',
    memory: '1024M',
    swap: '2048M',
    disk: '60G'
  }
}

Docker-compose配置常用字段

bash 复制代码
字段                               		描述
build                              		指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile                         		构建镜像上下文路径
context                            		可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image                              		指定镜像
command:                          		执行命令,覆盖容器启动后默认执行的命令
container_name                     		指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy                             		指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment                        		添加环境变量
networks                           		加入网络,引用顶级networks下条目
network_mode							设置容器的网络模式,如 host,bridge,...
ports                              		暴露容器端口,与 -p 相同,但端口不能低于 60
volumes                            		挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from							从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname                           		容器主机名
sysctls									在容器内设置内核参数
links									连接到另外一个容器,- 服务名称[:服务别名]
privileged								用来给容器root权限,注意是不安全的,true | false
restart                            		设置重启策略,no,always,nounless-st-failure,oped
										no,默认策略,在容器退出时不重启容器。
										on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
										on-failure:3,在容器非正常退出时重启容器,最多重启3次。
										always,在容器退出时总是重启容器。
										unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
depends_on							    在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
php:
  depends_on:
    - apache
    - mysql

Docker Compose 常用命令

bash 复制代码
# docker-compose 字段  

字段                    					描述
build                   					重新构建服务
ps                      					列出容器
up                      					创建和启动容器	
exec                    					在容器里面执行命令
scale                   					指定一个服务容器启动数量
top                     					显示容器进程
logs                    					查看容器输出
down                    					删除容器、网络、数据卷和镜像
stop/start/restart      					停止/启动/重启服务

Docker Compose 文件结构

bash 复制代码
#文件结构
yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml				#创建模板脚本
├── nginx
│   ├── Dockerfile					#创建容器脚本
│   ├── nginx-1.12.0.tar.gz			#复制源码包
│   └── run.sh						#启动服务脚本
└── wwwroot
    └── index.html					#站点网页

构建nginx镜像

bash 复制代码
#创建所需文件夹
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx


将nginx压缩包放在当前文件夹下


#编写Dockerfile文件
vim Dockerfile

#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <emmm>
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.22.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.22.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

#在wwwroot文件夹下创建主页面,用于测试
echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html


#编写配置文件docker-compose.yml
vim /opt/compose_nginx/docker-compose.yml

version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1000:80
      - 1100:443
    networks:
      lnmp:
        ipv4_address: 172.19.0.10
    volumes:
      - ./wwwroot:/user/local/nginx/html
networks:
  lnmp:
    driver:bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16



#切换到 /opt/compose_nginx/
cd  /opt/compose_nginx/

#使用docker-compose 启动
docker-compose -f docker-compose.yml up -d

=========================================================================================
 -f --file FILE: 使用特定的 compose 模板文件,默认为 docker-compose.yml
 -p --project-name NAME: 指定项目名称,默认使用目录名称
 -d 在后台运行

构建tomcat镜像

bash 复制代码
#构建tomcat镜像

mkdir -p /opt/compose_tomcat/tomcat
cd /opt/compose_tomcat/tomcat

准备jdk的安装包和tomcat的安装包

vim Dockerfile

FROM centos:7
MAINTAINER this is tomcat image <hmj>
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_291 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]

vim /opt/compose_tomcat/docker-compose.yml

version: '3'
services:
  nginx:
    container_name: tomcat1
    hostname: tomcat
    build:
      context: ./tomcat
      dockerfile: Dockerfile
    ports:
      - 1200:8080
    networks:
      lnmp:
        ipv4_address: 172.19.0.20
    volumes:
      - ./wwwroot:/user/local/nginx/html
networks:
  lnmp:
    driver:bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

docker-compose -f docker-compose.yml up -d
bash 复制代码
可以使用 docker-compose -f yml文件名 down 关闭网络和容器
相关推荐
XIAOHEZIcode14 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化