Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)

一、Docker的安装(centos7环境下)

  1. 检查当前系统中是否已经安装过docker软件
yum list  installed  docker
  1. 如果已经安装过了docker 需要卸载到目前系统中的docker
yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
  1. 安装docker依赖的软件包
    yum-utils:主要用于仓库管理,在安装docker之前需要设置对应的仓库,所以需要安装yum-utils工具包
    device-mapper:docker使用的自己的存储管理,所以需要使用device-mapper-persistent-data 以及 lvm2工具包完成内部存储和物理磁盘分区之间的映射关系管理
 yum install -y yum-utils \  device-mapper-persistent-data \  lvm2
  1. 设置docker存储库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 检查仓库中docker的版本信息
 yum list docker-ce --showduplicates | sort -r
  1. 安装docker
    docker-ce :docker的主体程序
    docker-cli: docker工具
    containerd.io:容器管理
yum install docker-ce docker-ce-cli containerd.io
  1. 启动docker服务
systemctl start docker
  1. 验证docker安装结果
docker info

二、Docker管理

(1)核心概念:

仓库, 注册服务器、镜像,标签,容器,Dockerfile,compose file (容器编排)

注意:

  1. 注册服务器可以包含若干个仓库,默认使用docker hub(官方的仓库
    hub.docker.com),国内的注册服务器主要包括阿里云、腾讯云、网易云等。没有特殊要求的场景下默认使用官网的仓库最好。
  2. 仓库是一批镜像的合集。仓库的命名通常为 (注册服务器)/(仓库名) 例如:private-docker.com/centeros
    可以理解为 private-docker.com这个服务器下有一个centeros仓库,这个仓库中可以包含若干个版本的centOS的镜像
  3. 镜像是一个模版,能够启动多个容器,在市场用,通常会存在有两大种类的镜像官方镜像以及第三方镜像,建议使用的时候需要注意,最好使用官方的镜像。
  4. 仓库 + 标签能确定唯一一个镜像
  5. 容器是通过镜像启动的一个虚拟环境
  6. Dockerfile是一个文件,其中规定了制作一个镜像的流程,能够打包镜像
  7. compose file是一个编排文件,里面编排了一个或多个镜像的启动参数,启动后会产生一个或多个容器

(2)Docker镜像管理(使用官方仓库)

  • 在官方市场中查看相关的镜像有两种方式:第一可以采用网页方式登录 hub.docker.com然后在页面进行搜索
  • 使用docker cli 提供的命令来完成相关操作。

docker search [镜像的名字] 例如:docker search mysql 查看当前仓库中mysql镜像的相关信息。但是需要注意的是,使用docker命令无法查看版本,需要看tag的话要到官方站点来查询
docker pull [镜像名称]:[tag] 例如:docker pull mysql:5.7 docker pull mysql 如果不使用tag 则默认采用最后一个版本
docker imagesdocker image ls 查看当前本地docker中已经下载的镜像信息
docker rmi 镜像:tag 删除一个镜像(需要注意镜像如果有容器正在运行,需要先删除容器后在删除镜像)
docker tag 原镜像名 新镜像名 拷贝镜像 原镜像不需要后可以删除掉

(3)Docker容器管理

  1. 查询目前系统中的容器信息
查看启动了的
docker  ps   
查看全部
​docker ps -a
  1. 使用镜像启动容器

例如:docker run nginx 使用nginx镜像启用一个容器(这种启用方式默认会占用当前终端,用户无法进行后续操作),为了解决此类问题我们可以附加参数更好地控制容器:

参数名称说明
-d让docker 容器在后台运行
-P使用随机的宿主机端口映射容器端口
-p使用指定端口映射内容端口 -p 宿主机端口:docker 端口
-e 参数名=参数值向容器传递参数
-v挂载数据目录
  1. 容器日志查看
代码说明
docker logs 容器名展示容器日志
docker logs -f 容器名跟踪容器日志
docker logs --tail 10 或者 docker logs -n 10从日志的末尾显示日志
docker logs -t显示日志时间戳
docker logs -t --since=“2021-06-02T13:03:00Z” abc显示指定时间之后的日志
docker logs -t --until=“2021-06-02T13:03:00Z” abc显示指定时间之前的日志
docker logs abcgreap Chrome
  1. 容器控制
代码说明
docker stop 容器名停止容器
docker start 容器名启动容器
docker pause 容器名暂停一个容器运行
docker unpause 容器名恢复一个容器运行
docker restart 容器名重启一个容器
docker rm 容器名删除一个容器

(4)Docker网络管理

使用docker network ls 查看docker目前支持的网络。当安装完docker后,默认会创建三个网络:bridge网络,host网络和none网络。可以使用:

  • docker inspect 网络id 查看每一个网络的相关配置
  • netstat -lnpt 查看目前系统开放的端口
  • firewall-cmd --list-ports 查看防火墙开放的端口

docker的四种网络模式

1.host模式

  • 例如使用创建一个host模式的mysql容器 docker run -d -e MYSQL_ROOT_PASSWORD='mysql' --net='host' --name='cslcp_mysql' mysql 在容器外连接mysql使用的ip是linux的ip,端口同样是linux的端口3306
  • 使用docker ps -a的场景下,无法显示目前正在使用的端口。在这种情况下可以使用docker inspect镜像名来查看该镜像开放的端口号。或者使用docker logs 容器名 查看容器启动日志来查看启动占用的端口,或者通过docker inspect 容器名来查看容器占用的端口号
  • 另外需要注意的问题是,以host模式启动的容器,需要确保容器使用的端口在宿主机的防火墙中配置过开放策略,否则其他机器无法访问对应服务。 firewall-cmd --permanent --zone=public --add-port=80/tcp
  • 最后,在使用host模式的场景下,可以开启多个容器,虽然有时候能够启动成功,但是当容器运行一段时间后,会发现只有一个能够运行,其他的都异常关闭了,这是因为端口冲突的原因。至于最后能保留哪一个容器,这个运行的效果不一定。​

2.bridge模式(网桥模式,这是docker的默认网络模式)

  • 使用docker network ls 查看当前的docker开放的网络
  • 使用docker inspect 网络id 查看网桥的配置,通常docker的桥模式会在宿主机上创建一个叫做docker0的宿主机网络作为网 桥。可以在宿主机上使用ip addr查看相关的ip。如果不想使用宿主机上默认的ip可以在 /etc/docker/ 目录中添加 daemon.json 配置文件,在文件中添加{"bip":"192.168.100.1/24"} 配置来修改对应的ip配置。足以在修改上述配置的时候,需要先停止dokcer服务 systemctl stop docker 修改完成后再次启动docker服务
  • 重新启动docker服务器,再次开启容器,可以查看容器的ip按照新配置的方案进行ip设置
  • 如果不希望使用docker分配的ip地址,可以在启动的过程中使用
    –ip参数来指定容器需要使用的ip地址(需要注意的是默认的桥接模式不允许用户自定义ip)例如:docker run -itd --name='c6' --network=bridge --ip=192.168.100.7 centos 该命令在指定后会报出异常。
    当我们需要使容器与容器进行通信时。可以使用以下策略

静态配置策略

第一步:创建自定义网络

docker network  create   --subnet=192.168.90.0/24  cslcp_network

第二步:动容器并加入网络

docker run  -it  --name=cslcp_1  --network=csclp_network --ip=192.168.90.5 centos

使用link配置策略

docker run  -itd  --name=c1 centos
docker run -itd --name=c2 --link=c1:cnet1 centos

进入到centos输入ping cnet1查看是否连通

docker exec -it  c2 bash

这种配置的优势是可以不使用静态ip,只是使用容器别名就可以直接访问目标容器,避免了在宿主机中出现ip冲突的问题,缺点是容器有依赖关系,所以被依赖的容器一定需要先启动,在一个复杂的网络模型中使用起来比较麻烦。

使用自定义网络+网络别名方案(推荐)
第一步:创建自定义网络

docker network  create   --subnet=192.168.90.0/24  cslcp_network

第二步:启动容器

 docker run -itd  --name=c1 --network=cslcp_network --network-alias=c1_net centos

第三步:通过网络别名访问目标容器(进入到centos输入ping c1_net查看是否连通)

3.container模式
使用该模式可以让多个容器共享同一个ip地址。

docker run  -itd  --name c1 centos
docker run -itd --name nginx --net container:c1 nginx

4**.none模式**(全部手工配置,在生产环境下一般不使用该种模式,老师就没讲,有想了解的可以去其他帖子看看)

三、docker file ( 利用docker file 创建一个自己的镜像,产品给客户部署 )

  1. docker file是用来构建docker 镜像的文件,在开始学习构建镜像之前,我们需要先来了解一下docker镜像的基本结构
    图片来源于老师课件,具体从何而来未知,如有侵权请联系本人删除
  2. dockerfile由四部分组成

​ 第一部分是基础镜像信息

​ 第二部分是维护者信息(非必须)

​ 第三部分是镜像的操作指令

​ 第四部分是容器启动的时候需要执行的指令

docker file的编写

  • docker file是一个文本文件,通常该文件起名是Dockerfile,文件中第一部分需要编写基础镜像信息。使用FROM关键字,例如 FROM nginx 该语句的含义是指,创建的镜像文件是基础镜像是nginx,隐含的含义是新镜像也会包含nginx的基础镜像所以对于docker镜像来讲镜像的基础层都应该是操作系统 - 编写基础镜像后,可以在后面跟镜像的维护人信息,MAINTAINER <用户名 用户邮箱>
  • 第三部分需要编写针对目前读写容器进行的操作指令,需要注意的是,每一条指定都会改变镜像,所以每一条指定都会生成新的进行层,在工作中,镜像的层级尽量要少,镜像层多了后,会耗费较大的存储空间。常用的指定包括

1) RUN run指定代表在当前的容器层的shell中要执行的命令,例如在容器中创建一个文件夹(RUN mkdir /root/docker/content)。需要注意的是,每一次执行RUN指令都会需改当前的容器层状态,所以每次修改都会在当前容器中产生新的层,在生产活动中,就一个较为合理的使用建议是,镜像的层次尽量的少,所以建议在容器中采用&&号来连接多个需要RUN的指令,如果指令过长可以使用 “\”进行换行操作。RUN命令的执行时机是在构建镜像的时候。在build时候执行
2) EXPOSE 该指定代表容器运行之后向外开放的端口号。例如 EXPOSE 80 代表默认情况下,使用该镜像创建容器的时候,容器向宿主机开放80端口,如果需要向宿主机开放多个端口,可以直接写为 EXPOSE 90 80 1010
*** 3)*** ENV 设置docker容器的环境变量,在使用镜像启动容器的时候,我们有可能需要向容器中传递一些启动参数,这时候ENV就可以用来实施这个任务。在Dockerfile中,可以使用ENV MY_NAME=value的形式来设置名字叫做MY_NAME的环境变量,并赋予其初始值value,如果在启动容器的时候,需要改变其值,可以使用-e参数来进行重新指定,ENV设置的环境变量,在生效后,将会一直存在。想要观察环境变量的值,可以在容器启动后,进入容器后使用env命令来进行查看。此外,也可以在容器之外,使用 docker inspect命令来查看。在dockerfile中,声明了一个环境变量之后,可以使用 $环境变量的方式来进行引用
4) COPY在构建镜像的时候,如果需要将外部的文件拷贝的镜像内部,则可以使用COPY命令。命令格式为 COPY 宿主机文件 容器内地址。在生产环境下,有一个比较好的实施方式是,将需要拷贝的内容全部放到一个文件夹中,然后再dockerfile所在的目录进行镜像构建,尽量控制context的范围内的文件大小,因为在构建的过程中,docker需要将context中的所有文件都发送到docker的守护进程中,所以如果context内的文件太多,会造成构建镜像过大以及构建过程过长的问题。ADD和COPY相仿,它能够将宿主机的tar压缩包解压陈文件搞到镜像中。也可以下载宿主机没有的
5) USER通常指定为root账号。
6) WORKDIR,该指定会改变从WORKDIR指定之后的RUN以及CMD等相关指定的当前目录,例如 WORKDIR /root/web 则代表之后的指令的工作目录从root目录变更为/root/web目录。
7) VOLUME在构建镜像的时候,我们可以通过VOLUMN来给镜像指定一个挂载目标,在镜像内可以使用挂载目标直接访问在宿主机上的文件,如果没有指定挂载内容,则直接访问宿主机之内的内容。挂载目录或者是挂载文件可以在创建容器的时候使用-v参数来指定。 VOLUME可以接收一个数组型的参数,如果需要多个挂载点,可以在数组内直接声明。具体语法 VOLUME ["/root/vol","/root/tt"]
8) CMD,该指令与RUN的书写模式基本一致,但是她是在docker容器启动的时候需要执行的命令,在dockerfile中只能有一个CMD,如果写了多个也只会执行最后一个。在run或start执行。。demon off 守护模式关闭,进入当前控制台相当于没有-it
例如:

FROM nginx
USER root
RUN mkdir /root/web && mkdir /root/conf
COPY ./dist/* /root/web
COPY ./nginx.conf /root/conf/nginx.conf
EXPOSE 8080
CMD ["ngxin","-g","daemon off;","-c","/root/conf/ngxin.conf"]
FROM adoptopenjdk:11-jre-openj9
ENV ACTIVE=dev 
ENV JARNAME=cslcp-0.0.1-SNAPSHOT.jar
RUN mkdir /opt/app && mkdir /opt/file 
VOLUME ["/opt/app","/opt/file"]
#CMD ["java", "-jar", "/opt/app/cslcp-0.0.1-SNAPSHOT.jar" ,"--spring.profiles.active=${ACTIVE}"]
CMD java -jar /opt/app/${JARNAME} --spring.profiles.active=${ACTIVE}

四、docker 服务编排

  • docker 服务编排也叫docker compose,它的出现是应来解决使用docker部署大型应用的业务场景的问题。通常在生产环境中,使用docker部署一个应用需要使用多个容器,例如部署前端、后端、依赖服务、数据库等。如果每个容器都需要手工使用shell来启动则效率过于低下,所以在这样的场景中,我们可以采用docker compose来进行docker容器的编排工作。

第一步:下载docker compose

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

第二步:修改docker compose让其有可执行权限

chmod 744 /usr/local/bin/docker-compose

第三步:测试

docker-compose -version

第四部:docker-compose.yml文件的编写
在docker-compose.yml文件中可以编写相关的配置属性,用来管理compose的构建过程,主要的属性包括:
1)version 代表compose文件格式版本,按照官网的实例,建议目前采用‘3.9’版本
2)services 该属性是compose文件中的核心属性,在该属性之下,可以配置compose启动的各种服务。主要是需要compose启动的各种容器信息。也是compose文件中主要的开发内容。
常用属性:

属性名称说明
image当前服务使用什么镜像文件
ports当前容器需要映射的端口信息 - ”8080:80“
enviroments当前镜像需要传递的参数
volumes当前镜像的挂在点
tty:true代表使用-it模式启动服务
build指定dockerfile所在的路径,当使用docker compose编排一个容器,而且该容器需要构建的时候需要使用该参数
container_name指定编排容器的名称
restart:always在docker服务重启后,该容器是否自动重启
depends_on: 服务名设定服务依赖关系,通过该配置可以决定服务的启动顺序
env_file指定配置文件
context指定上下文
dockerfile指定需要使用的dockerfile文件

3)networks

例子1:在service中配置简单的服务信息,编写compose文件,启动一个nginx容器

version: '3.9'
services:
  my_nginx:
    image: "nginx"
    ports:
      - "8080:9090"
    volumes:
      - "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"
      - "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"
  • 使用docker-compose up命令 启动容器编排,需要注意的是,容器启动成功后,默认会占用当前的终端用来输出日志信息。我们可以重新打开一个终端,使用docker ps命令查看,发现docker中多了一个容器名字叫做 **my_nginx_1.这就是compose替我们启动的容器。
  • 在上面的例子中,my_nginx是一个服务的名字,也可以理解为是生成容器名字的其中一部分,image属性代表要使用什么镜像,ports 代表需要映射的端口,前边是宿主机的端口,而后面是容器内的端口。volumns代表要进行的文件挂载。
  • 此外,使用docker network ls命令可以发现,compose启动后,自动给我们创建了一个网络,通过 docker inspect 命令发现使用当前compose文件启动的容器默认都加入到了,新创建的网络中。

例子2:在tomcat-compose文件中构建一个服务,在本地docker中不存在有对应的镜像

version: '3.9'

services:
  my_tomcat:
    image: "tomcat"
  • 如果在compose中包含本地docker中不存在的镜像,则在运行compose的过程中会自动下载对应的镜像。理论上在一台安装有docker以及docker
  • compose的宿主机上,在保证网络畅通的前提下,我们只需要依靠docker-compose文件就可以直接安装对应的系统。
  • 此外,在当前的例子中,我们将compose文件认为的修改为
    tomcat-compose.yml,如果不使用默认的文件名,则需要在执行docker-compose up命令的时候加上 -f 参数,手工指定对应的yml文件。

例子3:一次启动多个容器

version: '3.9'

services:
  my_tomcat:
    image: "tomcat"
  my_nginx:
    image: "nginx"
    ports:
      - "8080:9090"
    volumes:
      - "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"
      - "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"

docker-compose命令

​ 在之前的例子中,我们使用了docker-compose up命令来启动一个容器编排,接下来,我们详细了解一下,在docker-compose中常用的命令以及参数使用

  1. docker-compose命令
    常用参数:
    -f 默认docker-compose会在当前文件夹下询招Dockercompose.yml文件,如果需要自定义文件名,可以使用-f 文件名 形式来指定
    -p 指定项目名称 指定项目后,通过compoose创建的所有容器都会自动添加项目名称前缀
    -v 查看当前docker-compose的版本信息
  2. docker-compose 环境变量
    docker compose 默认的环境变量为.env,在其中我们可以使用对应的键值对模式给compose传递值 --env-file 参数可以动态制动compose需要使用的配置文件位置
  3. docker-compose up 启动一个容器编排
    常用参数: `
参数名称说明
-d后台运行
–force-recreate强制更新已经存在的容器
–remove-orphans删除在compose文件中没有定义的容器,通常使用在修改了compose文件的场景下使用服务名 单独启动compose中的某一个服务,如果服务存在依赖,则被依赖的服务也会被启动
docker-compose down删除对应的容器,网络服务
docker-compose stop停止compose对应的所有服务
docker-compose start启动所有的服务容器
docker-compose ps查看与当前compse相关的服务容器
-q只列出id值,其他值不显示
docker-compose logs读取日志信息
docker-compose pull拉取服务对应的镜像
docker-compose build构建compose中的所有镜像、
docker-compose images查看所有的镜像信息
docker-compose config查看配置文件信息
docker-compose restart重启服务
docker-compose exec 服务名进行指定服务的容器
docker-compose rm删除所有已经停止的服务容器
以上命令涉及到某个服务的时候均可以通过:命令:服务名对相应的服务进行操作看左面

docker compose 网络管理

  1. ​默认场景下,使用docker compose编排服务,会自动创建对应的网络。可以使用docker network ls
    以及docker inspect 网络id 进行相关的查询。
  2. 可以在compose文件中,使用networks
    定义一个网络,并在服务中使用networks属性加入一个自定义网络。这时候有三种结果,如果所有的服务都加入到了自定义网络,则docker,会创建自定义网络,并将所有的服务容器添加到对应的网络中,如果没有任何服务声明加入自定义网络,则docker会创建默认网络,然后将容器添加到默认网络,而不会创建自定义网络,如果有的服务声明添加到自定义网络,而有的服务没有声明,则docker会创建两个网络,一个是自定义网络,而另一个是默认网络,并将对应的容器添加到对应的网络中。
  3. 使用固定ip策略
version: '3.3'
services:
  cslcp_web:
    image: "cslcp_web_image:v01"
    ports:
      - "19090:8080"
    build:
      context: "../web/"
      dockerfile: "Dockerfile"
    networks:
      - "cslcp_net"
  cslcp_mysql:
    image: "mysql"
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.100
    ports:
      - "13306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
  cslcp_centos:
    container_name: 'test_centos'
    image: "centos"
    tty: true
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
networks:
  cslcp_net:
    ipam:
      config:
        - subnet: "192.168.13.0/24"
          gateway: "192.168.13.1"
  1. 使用服务策略
    当compose启动成功后可以直接使用ping 访问服务名
  2. 使用网络别名策略
networks:
  cslcp_net:
    ipam:
      config:
      - gateway: 192.168.13.1
        subnet: 192.168.13.0/24
services:
  cslcp_centos:
    container_name: test_centos
    depends_on:
      cslcp_web:
        condition: service_started
    image: centos
    links:
    - cslcp_web:cw
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
    tty: true
  cslcp_mysql:
    environment:
      MYSQL_ROOT_PASSWORD: root
    image: mysql
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.100
    ports:
    - published: 13306
      target: 33064
  cslcp_web:
    build:
      context: /root/docker/dockercompose/cslcp/web
      dockerfile: Dockerfile
    image: cslcp_web_image:v01
    networks:
      cslcp_net: null
    ports:
    - published: 19090
      target: 8080
version: '3.3'
  1. 使用container 策略
version: '3.3'
services:
  cslcp_web:
    image: "cslcp_web_image:v01"
    build:
      context: "../web/"
      dockerfile: "Dockerfile"
    depends_on:
      - "cslcp_centos"
    network_mode: "service:cslcp_centos"
  cslcp_mysql:
    image: "mysql"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    depends_on:
      - "cslcp_centos"
    network_mode: "service:cslcp_centos"
  cslcp_centos:
    container_name: 'test_centos'
    image: "centos"
    tty: true
    ports:
      - "17070:8080"
      - "13306:3306"
    networks:
      cslcp_net:
        ipv4_address: 192.168.13.11
networks:
  cslcp_net:
    ipam:
      config:
        - subnet: "192.168.13.0/24"
          gateway: "192.168.13.1"

五、docker CI部署样例

记得先创建挂载出去的文件夹,网上教学据说不创建也能用,但是可能是我自己环境原因不太行,所以就提前创建好了。整套流程用的是LDAP(管理账号用的)+ heimdall(门户站点)+gitlab (代码仓库)+ jenkins (持续构建、流水线)+redmine(饭票)+ sonar (代码质量检测工具)+nextcloud(网盘) 部分功能持续更新中......

version: '3.1'

services:

  hs-ldap:
    image: osixia/openldap:latest
    hostname: hs-ldap
    restart: always
    ports:
      - "10001:389"
    volumes:
      - /home/docker_vol/openldap/slapd/database:/var/lib/ldap
      - /home/docker_vol/openldap/slapd/config:/etc/ldap/slapd.d
      - /etc/localtime:/etc/localtime:ro
    environment:
      - LDAP_ORGANISATION=jn
      - LDAP_DOMAIN=jn.com
      - LDAP_ADMIN_PASSWORD=P@ssword
      - LDAP_CONFIG_PASSWORD=P@ssword
      - TZ=Asia/Shanghai

  redmine:
    image: redmine
    restart: always
    ports:
      - "10003:3000"
    volumes:
      - /home/docker_vol/redmine/files:/usr/src/redmine/files
      - /home/docker_vol/redmine/log:/usr/src/redmine/log
      - /home/docker_vol/redmine/data:/home/redmine/data
      - /home/docker_vol/redmine/config/configuration.yml:/usr/src/redmine/config/configuration.yml
      - /home/docker_vol/redmine/plugins:/usr/src/redmine/plugins
      - /etc/localtime:/etc/localtime:ro
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: schoolcloud
      REDMINE_SECRET_KEY_BASE: supersecretkey
      REDMINE_DB_ENCODING: utf8

  db:
    image: mysql:5.7
    restart: always
    ports:
      - "10010:3306"
    command: mysqld  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - /home/docker_vol/redmine/mysql/data:/var/lib/mysql
      - /home/docker_vol/redmine/mysql/conf:/etc/mysql/conf.d
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: schoolcloud
      MYSQL_DATABASE: redmine
      TZ: Asia/Shanghai
      
  db_nextcloud:
    image: mysql:5.7
    restart: always
    ports:
      - "10011:3306"
    command: mysqld  --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - /home/docker_vol/nextcloud/mysql/data:/var/lib/mysql
      - /home/docker_vol/nextcloud/mysql/conf:/etc/mysql/conf.d
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: schoolcloud
      MYSQL_PASSWORD: schoolcloud
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      TZ: Asia/Shanghai
    
  devops-nextcloud:
    image: nextcloud
    restart: always
    ports:
      - "10002:80"
    volumes:
      - /home/docker_vol/nextcloud/html1:/var/www/html
      - /etc/localtime:/etc/localtime:ro
    environment:
      REDMINE_DB_MYSQL: db_nextcloud
      REDMINE_DB_PASSWORD: schoolcloud
      REDMINE_SECRET_KEY_BASE: supersecretkey
      REDMINE_DB_ENCODING: utf8

  heimdall:
    image: linuxserver/heimdall
    restart: always
    container_name: heimdall
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    volumes:
      - /home/docker_vol/heimdall/config:/config
    ports:
      - 80:80
      - 443:443
    restart: unless-stopped
  gitlab:
    privileged: true
    image: gitlab/gitlab-ce
    restart: always
    ports:
      - "5443:443"
      - "82:82"
      - "2222:22"
    volumes:
      - /home/docker_vol/gitlab/config:/etc/gitlab
      - /home/docker_vol/gitlab/data:/var/opt/gitlab
      - /home/docker_vol/gitlab/logs:/var/log/gitlab
    tty: true
  jenkins:
    privileged: true
    tty: true
    image: jenkins/jenkins:2.289.1-lts-centos7
    restart: always
    ports:
      - "9302:8080"
      - "50000:50000"
    volumes:
      - /home/docker_vol/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
  sonarqube:
    restart: always
    image: sonarqube
    tty: true
    environment:
      - SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true
    ports:
      - "9000:9000"
    

六、docker集群

(1)Docker Swarm 配置准备以及部署

  1. 准备三台宿主机器ip地址分别是192.168.0.4、192.168.0.6以及192.168.0.7,其中192.168.0.4是作为manager节点(管理根节点)其他两台机器是作为work节点来使用。
  2. 创建swarm集群
​ docker swarm init --advertise-addr 192.168.0.4
​ docker swarm join --token SWMTKN-1-69kuzr0khh1slvbuul0wn99t8ydf3f1hwaprvyx2r3kho4lxj4-87c2vnklddpwu1wvemex5d6wb 192.168.0.4:2377
  1. 端口开放
​ firewall-cmd --zone=public --add-port=2377/tcp --permanent

​ firewall-cmd --zone=public --add-port=7946/tcp --permanent

​ firewall-cmd --zone=public --add-port=7946/udp --permanent

​ firewall-cmd --zone=public --add-port=4789/tcp --permanent

​ firewall-cmd --zone=public --add-port=4789/udp --permanen
  1. 修改主机名解析
​ hostnamectl set-hostname manager

​ vi /etc/hosts 不是必须要做的

​ 192.168.0.4 manager

​ 192.168.0.6 worker01

​ 192.168.0.7 worker02
  1. 在worker节点中使用生成的命令将当前节点添加到管理节点中
​ docker swarm join --token SWMTKN-1-69kuzr0khh1slvbuul0wn99t8ydf3f1hwaprvyx2r3kho4lxj4-87c2vnklddpwu1wvemex5d6wb 192.168.0.4:2377
  1. 在管理节点查看集群节点信息
​ docker node list

​ docker inspect 节点id

(2)管理节点

  1. 查询目前集群中的节点信息
​ docker node ls (管理节点)

​ docker inspect 节点id
  1. 关于节点的状态

Active:节点目前处于空闲状态,可以被指派新的任务

Pause:节点目前处于不可接受新任务的状态,但目前的任务可以继续执行

Drain:节点目前处于不可接受新任务的状态,并且停止目前正在执行的任务

Down:废弃的节点

docker node update --availability drain manager 将管理节点调整为不接受新任务,也不再执行新任务的状态(专做管理)docker node update --availability drain work01

​ docker swarm leave (工作节点) 让当前节点离开集群,离开后在管理端 节点的状态变成down状态。

docker swarm leave --force (管理节点)解散集群

docker node rm 节点名称 删除一个节点(只能删除down状态的节点)

  1. Swarm节点部署服务与管理

docker service create --replicas 2 --name cslcp_web -p18080:80 nginx 创建服务

docker service ls 查看当前的集群中有那些服务

docker service ps 服务名 查看有那些节点为当前服务提供支持

docker service scale cslcp_web=3 修改服务节点数量

docker service rm cslcp_web 删除所有的服务节点

制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

么贺贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值