Docker单机编排Compose

1.Docker Compse介绍

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用docker 单机编排工具 docker-compose

docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,比如: 可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,docker-compose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止等手工的操作

因此,如果说docker命令就像linux的命令,docker compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件

docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,docker-compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)

1.1yml 语言

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

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

  • 大小写敏感

  • 通过缩进表示层级关系

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

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

  • 用 # 号注释

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

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

  • 指令作用演示
    build指定构建上下文和可选的Dockerfile用于构建镜像。build: context: /opt/test dockerfile: Dockerfile
    dockerfile指定Dockerfile的路径。通常在build部分中使用。dockerfile: Dockerfile.prod
    context指定构建上下文的路径,即包含Dockerfile和构建上下文的目录路径context: /opt/test
    image指定用于服务/容器的镜像名称。image: myapp:latest
    command覆盖由镜像指定的默认命令command: ["python", "app.py"]
    container_name为容器指定自定义名称。container_name: my_container
    deploy指定部署选项,如副本和放置deploy: replicas: 3
    environment为服务指定环境变量environment: - DEBUG=true
    networks指定连接服务的网络networks: - frontend - backend
    network_mode指定容器的网络模式network_mode: "host"
    ports:将容器端口映射到主机端口ports: - "8080:80"
    volumes挂载主机或其他容器的卷volumes: - "nginx-data:/usr/local/nginx/html
    volumes_from从另一个服务/容器挂载卷volumes_from: - data-container
    hostname:指定主机名hostname: my-container
    sysctls为容器设置内核参数sysctls: - net.core.somaxconn=1024
    restart重启策略restart: always
    depends_on指定该服务依赖的其他服务depends_on: - mysql

    1.3常用指令

命令只能在docker-compose.yml的目录下执行

命令解释
build#构建镜像
bundle#从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备份文件
config -q#查看当前配置,没有错误不输出任何信息
create#创建服务,较少使用
down#停止和删除所有容器、网络、镜像和卷
events#从容器接收实时事件,可以指定json 日志格式,较少使用
exec#进入指定容器进行操作
help#显示帮助细信息
images#显示镜像信息,较少使用
kill#强制终止运行中的容器
logs#查看容器的日志
pause#暂停服务
port#查看端口
ps#列出容器,较少使用
pull#重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用
push#上传镜像
restart#重启服务,较少使用
rm#删除已经停止的服务
run#一次性运行容器
scale#设置指定服务运行的容器个数
start#启动服务 ,较少使用
stop#停止服务,较少使用
top#显示容器运行状态
unpause#取消暂定
up#创建并启动容器 ,较少使用

2.安装和准备

2.1 安装Docker Compose

2.1.1 yum安装

yum install  epel-release.noarch  -y
yum -y install docker-compose

2.1.2 二进制安装

[root@localhost data]#ls
docker-compose-Linux-x86_64-1.27.4
[root@localhost data]#cp  docker-compose-Linux-x86_64-1.27.4    /usr/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln  -s   /usr/local/bin/docker-compose   /usr/bin

2.2 查看命令格式

docker-compose --help
Define and run multi-container applications with Docker.
Usage:
 docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
 docker-compose -h|--help
#选项说明:  
-f,–file FILE #指定Compose 模板文件,默认为docker-compose.yml
-p,–project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。
--verbose   #显示更多输出信息
--log-level LEVEL    #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) 
--no-ansi #不显示ANSI 控制字符
-v, --version #显示版本



#以下为命令选项,需要在docker-compose.yml|yaml 文件所在在目录里执行
build  #构建镜像
bundle #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备份文件
config  -q #查看当前配置,没有错误不输出任何信息
create #创建服务,较少使用
down #停止和删除所有容器、网络、镜像和卷
events #从容器接收实时事件,可以指定json 日志格式,较少使用
exec #进入指定容器进行操作
help #显示帮助细信息
images #显示镜像信息,较少使用
kill #强制终止运行中的容器
logs #查看容器的日志
pause #暂停服务
port #查看端口
ps #列出容器,较少使用
pull #重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用
push #上传镜像
restart #重启服务,较少使用
rm #删除已经停止的服务
run #一次性运行容器
scale  #设置指定服务运行的容器个数
start #启动服务 ,较少使用
stop #停止服务,较少使用
top #显示容器运行状态
unpause #取消暂定
up #创建并启动容器 ,较少使用

2.2.1显示 docker-compose 拉起的容器

[root@localhost ~]# cd /data/harbor/
[root@localhost harbor]# docker-compose ps

2.2.2docker compse文件格式

docker compose 文件是一个yaml格式的文件,所以注意行首的缩进很严格默认docker-compose命令会调用当前目录下的docker-compose.yml的文件,因此一般执行docker-compose命令前先进入docker-compose.yml文件所在目录

docke- compose文件的格式很不同版本,版本不同,语法和格式有所不同,参看以下列表

3.演示

3.1 启动单台容器

docker compose 文件可在任意目录,创建文件名为docker-compose.yml 配置文件,要注意前后的缩进

[root@localhost harbor]# mkdir /mnt/docker-compose
[root@localhost harbor]# cd  /mnt/docker-compose/
[root@localhost docker-compose]# vim docker-compose.yml

3.1.1 准备yml文件

server-nginx-web:
  image: nginx
  container_name: web1
  expose:
   - 80
   - 443
  ports:
    - "80:80"
    - "443:443"

3.1.2 检测语法

[root@localhost docker-compose]#docker-compose  config
services:
  server-nginx-web:
    container_name: web1
    expose:
    - 80
    - 443
    image: nginx
    network_mode: bridge
    ports:
    - 80:80/tcp
    - 443:443/tcp
version: '1'
#语法正确

[root@localhost docker-compose]#docker-compose  config
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for server-nginx-web: 'container name'
#语法有误

3.1.3 启动

docker-compose up

后台启动

[root@localhost docker-compose]#docker-compose up -d
Starting web1 ... done

3.1.4 关闭

使用docker-compose down 会将容器直接删除 镜像也会删除

使用docker-compose kill 只是退出容器

只删除停止的容器
[root@localhost docker-compose]#docker-compose rm

3.1.5 查看事件docker-compose events

[root@localhost docker-compose]#docker-compose  events
2024-08-06 23:48:01.074031 container attach 6969aebfd1fa56aaa06d4bc8cabf4d520742b6617d63a05c4753dd78163791cd (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=web1)
2024-08-06 23:48:01.402957 container start 6969aebfd1fa56aaa06d4bc8cabf4d520742b6617d63a05c4753dd78163791cd (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=web1)


#json 格式
#docker-compose events --json


# 启动
[root@localhost docker-compose]#docker-compose up 

3.2 启动多个容器

server-nginx-web:
  image: nginx
  container_name: web1
  expose:
   - 80
   - 443
  ports:
    - "8001:80"
    - "8443:443"
server-tomcat:
  image: tomcat
  container_name: tomcat1

[root@localhost docker-compose]#docker-compose config -q
# -q 静默不输出 如果有错误则会显示输出

启动

[root@localhost docker-compose]#docker-compose up
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                                                            NAMES
07abae209147   tomcat    "catalina.sh run"         15 seconds ago   Up 14 seconds   8080/tcp                                                                         tomcat1
d63f4d1552ad   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:8001->80/tcp, :::8001->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   web1

3.3 调用 dockerfile文件 执行编排

FROM  centos:centos7.9.2009
LABEL author="zhou cloud"  \
      version="1.0"       \
      description="test"
RUN   rm -rf  /etc/yum.repos.d/
ADD   qh.repo   /etc/yum.repos.d/
RUN   yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib  zlib-devel openssl openssl-devel wget
ADD   nginx-1.18.0.tar.gz   /usr/local/src
RUN   cd  /usr/local/src/nginx-1.18.0  && ./configure  --prefix=/apps/nginx  && make   &&  make install
COPY  index.html    /apps/nginx/html
EXPOSE 80
CMD   ["-g","daemon off;"]
ENTRYPOINT   ["/apps/nginx/sbin/nginx"]



[root@localhost centos7]#docker  build   -t  c7:n3   .
[root@localhost centos7]#docker run  -d  -p 80:80 --name web1  c7:n3

编写 compose 文件

vim /opt/compose_nginx/docker-compose.yml 

services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: /data/dockerfile/system/centos/centos7/
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      mynet:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16


services: 定义了要运行的服务。

nginx: Nginx 服务的配置。

container_name: 指定容器的名称为 web1。

hostname: 指定容器的主机名为 nginx。

build: 指定了构建 Nginx 容器所需的上下文和 Dockerfile。

ports: 将主机端口 1216 映射到容器的 80 端口,将主机端口 1217 映射到容器的 443 端口。

networks: 将服务连接到名为 lnmp 的自定义网络。

volumes: 将主机上的 ./wwwroot 目录挂载到容器中的 /usr/local/nginx/html 目录。

networks: 定义了自定义网络。

lnmp: 自定义网络的配置。

driver: 网络驱动程序为 bridge。

ipam: IP 地址管理配置。

config: 子网配置,指定了 IP 地址范围。

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

docker ps -a
CONTAINER ID   IMAGE                 COMMAND     CREATED              STATUS              PORTS                                         NAMES
b48dceee248f   compose_nginx_nginx   "/run.sh"   About a minute ago   Up About a minute   0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

cd /opt/compose_nginx/
docker-compose ps					#必须在docker-compose.yml所在目录执行此命令


docker-compose -f docker-compose.yml up -d

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值