Docker三剑客——Docker Compose

news2024/11/20 0:27:45

目录

一、概述

二、Docker Compose工作流程

 三、安装Docker Compose

四、Docker Compose管理命令

(1)docker-compose build

(2)docker-compose kill

(3)docker-compose logs

(4)docker-compose pause/unpause

(5)docker-compose port 

(6)docker-compose ps

(7)docker-compose pull

(8)docker-compose restart

(9)docker-compose rm

(10)docker-compose run

(11)docker-compose start/stop

(12)docker-compose scale

(13)docker-compose down

 五、Docker Compose的配置文件

1. 配置文件解析

2. 准备工作目录

3. 运行Docker Compose 配置文件

4. 查看容器

5. 网页访问测试

六、Docker Compose配置实战

1. 准备工作目录及配置文件

(1)创建工作目录

(2)创建子目录

(3)创建一个 nginx 测试容器

(4)上传安装包并编写Dockerfile

(5)配置两个测试首页文件

(6)编写 docker-compose.yml 文件

2. 运行并测试

(1)启动所有容器服务

(2)查看启动情况

(3)检测负载均衡


官方文档地址:Overview | Docker Documentation

一、概述

        Docker Compose 是 Docker 官方的编排工具通过它可以编写一个模板文件,然后通过这个模板文件快速构建和管理基于Docker容器的集群。

        在创建Docker镜像之后,往往需要通过手动pull来获取镜像,然后执行 run 命令来运行。当服务器需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是非常繁琐的。

        Docker Compose 技术,就是通过一个.yml 配置文件,将所有容器的部署方法、文件映射、容器连接等一系列的配置写在一个配置文件里,将所有容器的部署方法、文件映射、容器连接等一系列的配置写在一个配置文件里,最后只需要执行 docker-compose up 命令,就像执行脚本一样,去一个个安装容器并部署他们。

二、Docker Compose工作流程

        Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在Compose 中可以使用 YAML 语法来配置应用服务,然后使用命令即可创建并启动配置的所有服务。使用 Compose 仅需以下三步:

(1)在 Dockerfile 里定义应用程序的环境,这样它就可以在任何地方再现。

(2)在 docker-compose.yml 里定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。

(3)执行 docker-compose up 命令,Compose 启动并运行整个应用程序。

docker-compose.yml 示例:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

 三、安装Docker Compose

两种下载方式:

(1)curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

(2)curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose(GitHub比较慢,用的这个)
 

[root@docker01 ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   423  100   423    0     0    296      0  0:00:01  0:00:01 --:--:--   297
100 16.2M  100 16.2M    0     0  2308k      0  0:00:07  0:00:07 --:--:-- 3221k

分配权限:

[root@docker01 ~]# chmod +x /usr/local/bin/docker-compose

 查看版本信息:

[root@docker01 ~]# docker-compose --version
docker-compose version 1.25.1, build a82fef07

四、Docker Compose管理命令

Docker Compose运行时需要知道 service 名称,可以同时指定多个,也可以不指定。不指定时,默认是对配置文件中所有的 service 执行命令,常用参数如下:

-f:用于指定配置文件

-p:用于指定项目名称

(1)docker-compose build

功能:创建或重新创建服务使用的镜像

docker-compose build service_a
#创建一个名为 service_a的镜像

(2)docker-compose kill

        功能:通过容器发送 SIGKILL 信号强行停止服务

(3)docker-compose logs

        功能:显示 service 的日志信息

(4)docker-compose pause/unpause

        功能:用于暂停或者恢复被暂停的服务

(5)docker-compose port 

        功能:查看服务中的端口与物理机的映射关系

#查看服务中的80端口映射到物理机的哪个端口
docker-compose port nginx_web 80

(6)docker-compose ps

        功能:显示当前项目下的容器

        注意:此命令与 docker ps 命令作用不同,此命令会显示停止后的容器,只针对某个项目。

(7)docker-compose pull

        功能:拉取服务依赖的镜像

(8)docker-compose restart

        功能:重启某个服务中的所有容器

docker-compose restart service_name
注意:只有正在运行的服务可以使用重启命令,停止的服务不可以重启。

(9)docker-compose rm

        功能:删除停止的服务(服务里的容器)

常用参数:

-f:强制删除

-v:删除与容器相关的卷

(10)docker-compose run

        功能:在服务中运行一个一次性的命令。这个命令会新建一个容器,它的配置和service的配置相同。

注意:

(1)run 指定的命令会直接覆盖掉 service配置中指定的命令

(2)run命令启动的容器不会创建在service配置中指定的端口,如果需要,可以使用             --service-ports 指定。 

(11)docker-compose start/stop

        功能:用于 启动/停止 运行某个服务的所有容器 

(12)docker-compose scale

        功能:指定某个服务启动的容器个数

(13)docker-compose down

        功能:关闭并删除项目的所有容器

 五、Docker Compose的配置文件

1. 配置文件解析

Docker Compose 的配置文件是一个 .yml 格式的文件。

示例:

version: "3"
services:
    nginx:
        container_name: web-nginx
        image: nginx:latest
        restart: always
        ports:
            - 80:80
        volumes:
        - ./webserver:/webserver
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf

整个配置文件包括三部分,分别如下:

第一部分:

指定语法的版本

version: "3"

第二部分:

services:    #定义服务
    nginx:   #服务的名称,-p参数后接服务名称
        container_name: web-nginx    #容器的名称
        image: nginx:latest          #镜像
        restart: always
        ports:                       #端口映射
            - 80:80

第三部分:

           volumes:    #物理机与容器的磁盘映射关系
        - ./webserver:/webserver
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf

2. 准备工作目录

(1)在 /home 目录下创建 docker目录:

[root@docker01 home]# mkdir docker

(2)在docker目录下创建nginx目录、webserver目录以及docker-compose.yml文件

[root@docker01 docker]# ll
total 0
-rw-r--r-- 1 root root  0 Jan  7 20:07 docker-compose.yml
drwxr-xr-x 2 root root 24 Jan  7 20:04 nginx
drwxr-xr-x 2 root root 24 Jan  7 20:00 webserver

(3)创建nginx测试容器

        拉取nginx镜像,先创建一个nginx的容器,将该容器的nginx.conf文件复制到宿主机的 /home/docker/nignx 目录下,然后将这个测试容器删除。

[root@docker01 docker]# docker pull nginx

[root@docker01 docker]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx         latest    1403e55ab369   2 weeks ago     142MB

[root@docker01 docker]# docker run -d -p 80:80 --name nginx_test nginx

[root@docker01 docker]# docker cp nginx_test:/etc/nginx/nginx.conf /home/docker/nginx/nginx.conf

[root@docker01 docker]# docker rm -f nginx_test

(4)创建nginx访问页

在webserver目录下新建 index.html 文件,写入以下内容:

welcome to zy's nginx erver!(test docker-compose.yml)

(5)docker-comoise.yml内容

volumes挂载目录和文件:

宿主机的 ./webserver 目录与容器 /usr/share/nginx/html 目录挂载

宿主机的 ./nginx/nginx.conf 文件和容器 /etc/nginx/nginx.conf 文件挂载

version: "3"
services:
    nginx:
        container_name: zy_nginx
        image: nginx:latest
        restart: always
        ports:
            - 80:80
        volumes:
        - ./webserver:/usr/share/nginx/html
        - ./nginx/nginx.conf:/etc/nginx/nginx.conf

(6)配置文件与各关联文件或服务之间的目录结构:

[root@docker01 docker]# tree ./
./
├── docker-compose.yml
├── nginx
│   └── nginx.conf
└── webserver
    └── index.html

2 directories, 3 files

3. 运行Docker Compose 配置文件

[root@docker01 docker]# docker-compose up -d
Creating network "docker_default" with the default driver
Creating zy_nginx ... done

4. 查看容器

可以看到 zy_nginx的容器已经启动

[root@docker01 docker]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
c98bf0e4ecc1   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   zy_nginx

5. 网页访问测试

可以看到成功显示了内容

六、Docker Compose配置实战

使用Docker Compose部署Nignx代理的Tomcat集群,并实现负载均衡。

整个配置过程大体分为以下4步:

(1)准备Tomcat和JDK文件(安装包)

(2)编写 Dockerfile 来部署 Tomcat 与 Java环境,生成镜像文件。

(3)编写 docker-compose.yml 配置文件,启动所有容器服务

(4)测试负载均衡

1. 准备工作目录及配置文件

需要的整个目录结构如下:

[root@docker01 java]# tree ./
./
├── docker-compose.yml
├── etc
│   └── localtime -> /usr/share/zoneinfo/Etc/UTC
├── nginx
│   └── nginx.conf
├── tomcat
│   ├── apache-tomcat-8.5.55.tar.gz
│   ├── Dockerfile
│   └── jdk-8u162-linux-x64.tar.gz
└── webserver
    ├── tomcatA
    │   └── index.jsp
    └── tomcatB
        └── index.jsp

6 directories, 8 files

下面来创建这些目录和文件:

(1)创建工作目录

在宿主机的 /home目录下新建 java目录,作为工作目录:

[root@docker01 home]# mkdir java

 (2)创建子目录

在java目录下,新建 etc,nginx,tomcat,webserver目录

[root@docker01 java]# mkdir {etc,nginx,tomcat,webserver}
[root@docker01 java]# ll
total 0
drwxr-xr-x 2 root root 6 Jan  7 20:45 etc
drwxr-xr-x 2 root root 6 Jan  7 20:45 nginx
drwxr-xr-x 2 root root 6 Jan  7 20:45 tomcat
drwxr-xr-x 2 root root 6 Jan  7 20:45 webserver

(3)创建一个 nginx 测试容器

        将nginx 测试容器对应配置文件复制到宿主机 的etc和nginx目录下(与上面第五节的道理一样),复制完删除该测试容器:

[root@docker01 java]# docker run -d -p 80:80 --name nginx_test nginx

[root@docker01 java]# docker cp nginx_test:/etc/nginx/nginx.conf /home/java/nginx/nginx.conf
[root@docker01 java]# docker cp nginx_test:/etc/localtime /home/java/etc/localtime

[root@docker01 java]# docker rm -f nginx_test

修改 nginx.conf 文件 ,添加负载均衡配置,添加 upstream 模块server 模块

[root@docker01 nginx]# cat nginx.conf 
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
    
#添加 upstream模块 和 server模块
    upstream webserver {        
	 server tomcat1:8080 weight=3;
	 server tomcat2:8080 weight=7;
    }
    server {
        listen       80;
        listen  [::]:80;
        server_name  192.168.65.130; #服务器的IP
 
    location / {
        proxy_pass http://webserver;  #这里的名字要和 upstream 配置的名称一致
    }
}
}

(4)上传安装包并编写Dockerfile

将 Tomcat 和 JDK 安装包上传至宿主机 /home/java/tomcat 目录下,并在该目录下编写Dockerfile文件:

[root@docker01 tomcat]# ll
total 195504
-rw-r--r-- 1 root root  10371538 Jan  7 20:55 apache-tomcat-8.5.55.tar.gz
-rw-r--r-- 1 root root       236 Jan  7 21:05 Dockerfile
-rw-r--r-- 1 root root 189815615 Jan  7 20:56 jdk-8u162-linux-x64.tar.gz

Dockerfile文件内容:

FROM centos
MAINTAINER zhangyin
ADD jdk-8u162-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_162
ADD apache-tomcat-8.5.55.tar.gz /usr/local
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.5.55/bin/catalina.sh","run"]

(5)配置两个测试首页文件

在webserver目录下新建 tomcatA 和 tomcatB目录,并在各自目录下创建 index.jsp 文件。

[root@docker01 webserver]# mkdir {tomcatA,tomcatB}

[root@docker01 webserver]# cat tomcatA/index.jsp 
welcome to tomcat-A server
[root@docker01 webserver]# cat tomcatB/index.jsp 
welcome to tomcat-B server

(6)编写 docker-compose.yml 文件

在 /home/java 目录下编写 docker-compose.yml 文件,内容如下:

[root@docker01 java]# cat docker-compose.yml 
version: "3"
services: 
    nginx:
        container_name: zy_nginx
        image: nginx:latest
        restart: always
        ports:
          - 80:80
        links:
          - tomcat1:tomcat1
          - tomcat2:tomcat2
        volumes:
          - ./webserver:/usr/share/nginx/html
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf
          - ./etc/localtime:/etc/localtime
        depends_on:
          - tomcat1
          - tomcat2
    tomcat1:
        hostname: tomcat1
        build: ./tomcat
        volumes:
          - ./webserver/tomcatA:/usr/local/apache-tomcat-8.5.55/webapps/ROOT
          - ./etc/localtime:/etc/localtime
    tomcat2:
        hostname: tomcat2
        build: ./tomcat
        volumes:
          - ./webserver/tomcatB:/usr/local/apache-tomcat-8.5.55/webapps/ROOT
          - ./etc/localtime:/etc/localtime

2. 运行并测试

(1)启动所有容器服务

在 java 目录下执行:docker-compose up 命令:

[root@docker01 java]# docker-compose up
Creating network "java_default" with the default driver
Building tomcat1
Step 1/7 : FROM centos
 ---> 5d0da3dc9764
Step 2/7 : MAINTAINER zhangyin
 ---> Running in 0cb5c3b43533
Removing intermediate container 0cb5c3b43533
 ---> 7512bd53d089
Step 3/7 : ADD jdk-8u162-linux-x64.tar.gz /usr/local
 ---> 227ea07ebb13
Step 4/7 : ENV JAVA_HOME /usr/local/jdk1.8.0_162
 ---> Running in fe23e3656efd
Removing intermediate container fe23e3656efd
 ---> 2757572ae8cb
Step 5/7 : ADD apache-tomcat-8.5.55.tar.gz /usr/local
 ---> 652fd5fa8af9
Step 6/7 : EXPOSE 8080
 ---> Running in 134eaf173653
Removing intermediate container 134eaf173653
 ---> 3e41b8b02647
Step 7/7 : ENTRYPOINT ["/usr/local/apache-tomcat-8.5.55/bin/catalina.sh","run"]
 ---> Running in cf4c5b942a27
Removing intermediate container cf4c5b942a27
 ---> abd13583648f
Successfully built abd13583648f
Successfully tagged java_tomcat1:latest

(2)查看启动情况

[root@docker01 java]# docker-compose ps
     Name                   Command               State                Ports              
------------------------------------------------------------------------------------------
java_tomcat1_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp                        
java_tomcat2_1   /usr/local/apache-tomcat-8 ...   Up      8080/tcp                        
zy_nginx         /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp

(3)检测负载均衡

访问10次,会发现7次是tomcat-B,3次是tomcat-A,证明负载均衡实现。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 实现千人同屏

作为开发人员,我们总是关注性能,包括CPU和GPU。随着场景变得越来越大越来越复杂,保持良好的性能变得越来越有挑战性,尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题,所以我们决定…

springcloud-gateway

网关zuul: https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway:Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关; 但在2.x版本中,zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中,每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题:2、思路:——并查集、DFS3、代码方法1:并查集方法2:DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离,它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问,可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目,微服务这块技术点其实松哥是讲过很多了,图文版的教程视频版的教程都有,不过确实缺乏一个项目,所以我在想等 TienChin 项目搞完之后,和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories,找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩,配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据,就免不了搜索,而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法,绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频:安装不算完事,只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记:Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章,该文章提出了基于全景相机的MVS pipeline。 文章链接:点击前往 代码链接:暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么?首先分析代码,a是数组名,是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码(空行:最后一 个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。) 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实…

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问I2C/SPI 设备的时候,为此引入了 Regmap 子系…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗,我其实就一个问题:为啥这么可爱的狗狗会拉屎撒尿呀? 自从崽崽来了我们家之后,最让我们头疼的就是它乱拉、乱尿的问题了,以前会在家里到处乱来,最近一段时间好了很多&…

机器学习(整体结构)

国科大《机器学习》内容,周晓飞老师讲的挺不错的,浅显易懂。 本来是想整理下课程内容的,然而动手后才发现内容过多(很想吐槽,为啥这么多模型?不能相互替代么?)简略画个思维导图算啦…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-返回值处理

前言 上回我们回答了ReqeustMappingHandlerAdapter调用目标方法的参数解析问题,今天我们再来回答第二个问题:怎么处理方法调用的返回值。 深入分析返回值处理需求 RequestMapping处理器的返回值类型 相信很多同学对于这个返回值的第一个反应就是返回一…

图解JDK1.7中HashMap头插法扩容造成的死循环问题

JDK1.7中HashMap头插法扩容造成的死循环问题 文章目录JDK1.7中HashMap头插法扩容造成的死循环问题一、背景二、源码解读三、图解单线程环境中扩容多线程环境中扩容四.总结一、背景 HashMap是线程不安全的,在并发使用HashMap时很容易出现一些问题,其中最…

ArcGIS基础实验操作100例--实验66符号图层的保存与加载

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验66 符号图层的保存与加载 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…