Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)
Docker的概念及基本指令学习---全
- 一、Docker的安装(centos7环境下)
- 二、Docker管理
- (1)核心概念:
- (2)Docker镜像管理(使用官方仓库)
- (3)Docker容器管理
- (4)Docker网络管理
- 三、docker file ( 利用docker file 创建一个自己的镜像,产品给客户部署 )
- 四、docker 服务编排
- docker-compose命令
- docker compose 网络管理
- 五、docker CI部署样例
- 六、docker集群
- (1)Docker Swarm 配置准备以及部署
- (2)管理节点
一、Docker的安装(centos7环境下)
- 检查当前系统中是否已经安装过docker软件
yum list installed docker
- 如果已经安装过了docker 需要卸载到目前系统中的docker
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
- 安装docker依赖的软件包
yum-utils
:主要用于仓库管理,在安装docker之前需要设置对应的仓库,所以需要安装yum-utils工具包
device-mapper
:docker使用的自己的存储管理,所以需要使用device-mapper-persistent-data 以及 lvm2工具包完成内部存储和物理磁盘分区之间的映射关系管理
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
- 设置docker存储库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 检查仓库中docker的版本信息
yum list docker-ce --showduplicates | sort -r
- 安装docker
docker-ce
:docker的主体程序
docker-cli
: docker工具
containerd.io
:容器管理
yum install docker-ce docker-ce-cli containerd.io
- 启动docker服务
systemctl start docker
- 验证docker安装结果
docker info
二、Docker管理
(1)核心概念:
仓库, 注册服务器、镜像,标签,容器,Dockerfile,compose file (容器编排)
注意:
- 注册服务器可以包含若干个仓库,默认使用docker hub(官方的仓库
hub.docker.com),国内的注册服务器主要包括阿里云、腾讯云、网易云等。没有特殊要求的场景下默认使用官网的仓库最好。 - 仓库是一批镜像的合集。仓库的命名通常为 (注册服务器)/(仓库名) 例如:private-docker.com/centeros
可以理解为 private-docker.com这个服务器下有一个centeros仓库,这个仓库中可以包含若干个版本的centOS的镜像 - 镜像是一个模版,能够启动多个容器,在市场用,通常会存在有两大种类的镜像官方镜像以及第三方镜像,建议使用的时候需要注意,最好使用官方的镜像。
- 仓库 + 标签能确定唯一一个镜像
- 容器是通过镜像启动的一个虚拟环境
- Dockerfile是一个文件,其中规定了制作一个镜像的流程,能够打包镜像
- 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 images
或 docker image ls
查看当前本地docker中已经下载的镜像信息
docker rmi 镜像:tag
删除一个镜像(需要注意镜像如果有容器正在运行,需要先删除容器后在删除镜像)
docker tag 原镜像名 新镜像名
拷贝镜像 原镜像不需要后可以删除掉
(3)Docker容器管理
- 查询目前系统中的容器信息
查看启动了的
docker ps
查看全部
docker ps -a
- 使用镜像启动容器
例如:docker run nginx
使用nginx镜像启用一个容器(这种启用方式默认会占用当前终端,用户无法进行后续操作),为了解决此类问题我们可以附加参数更好地控制容器:
参数名称 | 说明 |
---|---|
-d | 让docker 容器在后台运行 |
-P | 使用随机的宿主机端口映射容器端口 |
-p | 使用指定端口映射内容端口 -p 宿主机端口:docker 端口 |
-e 参数名=参数值 | 向容器传递参数 |
-v | 挂载数据目录 |
- 容器日志查看
代码 | 说明 |
---|---|
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 abc | greap Chrome |
- 容器控制
代码 | 说明 |
---|---|
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 创建一个自己的镜像,产品给客户部署 )
- docker file是用来构建docker 镜像的文件,在开始学习构建镜像之前,我们需要先来了解一下docker镜像的基本结构
- 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中常用的命令以及参数使用
- docker-compose命令
常用参数:
-f
默认docker-compose会在当前文件夹下询招Dockercompose.yml文件,如果需要自定义文件名,可以使用-f 文件名 形式来指定
-p
指定项目名称 指定项目后,通过compoose创建的所有容器都会自动添加项目名称前缀
-v
查看当前docker-compose的版本信息 - docker-compose 环境变量
docker compose 默认的环境变量为.env,在其中我们可以使用对应的键值对模式给compose传递值 --env-file 参数可以动态制动compose需要使用的配置文件位置 - 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 网络管理
- 默认场景下,使用docker compose编排服务,会自动创建对应的网络。可以使用docker network ls
以及docker inspect 网络id 进行相关的查询。 - 可以在compose文件中,使用networks
定义一个网络,并在服务中使用networks属性加入一个自定义网络。这时候有三种结果,如果所有的服务都加入到了自定义网络,则docker,会创建自定义网络,并将所有的服务容器添加到对应的网络中,如果没有任何服务声明加入自定义网络,则docker会创建默认网络,然后将容器添加到默认网络,而不会创建自定义网络,如果有的服务声明添加到自定义网络,而有的服务没有声明,则docker会创建两个网络,一个是自定义网络,而另一个是默认网络,并将对应的容器添加到对应的网络中。 - 使用固定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.100ports:- "13306:3306"environment:MYSQL_ROOT_PASSWORD: 'root'cslcp_centos:container_name: 'test_centos'image: "centos"tty: truenetworks:cslcp_net:ipv4_address: 192.168.13.11
networks:cslcp_net:ipam:config:- subnet: "192.168.13.0/24"gateway: "192.168.13.1"
- 使用服务策略
当compose启动成功后可以直接使用ping 访问服务名 - 使用网络别名策略
networks:cslcp_net:ipam:config:- gateway: 192.168.13.1subnet: 192.168.13.0/24
services:cslcp_centos:container_name: test_centosdepends_on:cslcp_web:condition: service_startedimage: centoslinks:- cslcp_web:cwnetworks:cslcp_net:ipv4_address: 192.168.13.11tty: truecslcp_mysql:environment:MYSQL_ROOT_PASSWORD: rootimage: mysqlnetworks:cslcp_net:ipv4_address: 192.168.13.100ports:- published: 13306target: 33064cslcp_web:build:context: /root/docker/dockercompose/cslcp/webdockerfile: Dockerfileimage: cslcp_web_image:v01networks:cslcp_net: nullports:- published: 19090target: 8080
version: '3.3'
- 使用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: trueports:- "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:latesthostname: hs-ldaprestart: alwaysports:- "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:roenvironment:- LDAP_ORGANISATION=jn- LDAP_DOMAIN=jn.com- LDAP_ADMIN_PASSWORD=P@ssword- LDAP_CONFIG_PASSWORD=P@ssword- TZ=Asia/Shanghairedmine:image: redminerestart: alwaysports:- "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:roenvironment:REDMINE_DB_MYSQL: dbREDMINE_DB_PASSWORD: schoolcloudREDMINE_SECRET_KEY_BASE: supersecretkeyREDMINE_DB_ENCODING: utf8db:image: mysql:5.7restart: alwaysports:- "10010:3306"command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_civolumes:- /home/docker_vol/redmine/mysql/data:/var/lib/mysql- /home/docker_vol/redmine/mysql/conf:/etc/mysql/conf.d- /etc/localtime:/etc/localtime:roenvironment:MYSQL_ROOT_PASSWORD: schoolcloudMYSQL_DATABASE: redmineTZ: Asia/Shanghaidb_nextcloud:image: mysql:5.7restart: alwaysports:- "10011:3306"command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_civolumes:- /home/docker_vol/nextcloud/mysql/data:/var/lib/mysql- /home/docker_vol/nextcloud/mysql/conf:/etc/mysql/conf.d- /etc/localtime:/etc/localtime:roenvironment:MYSQL_ROOT_PASSWORD: schoolcloudMYSQL_PASSWORD: schoolcloudMYSQL_DATABASE: nextcloudMYSQL_USER: nextcloudTZ: Asia/Shanghaidevops-nextcloud:image: nextcloudrestart: alwaysports:- "10002:80"volumes:- /home/docker_vol/nextcloud/html1:/var/www/html- /etc/localtime:/etc/localtime:roenvironment:REDMINE_DB_MYSQL: db_nextcloudREDMINE_DB_PASSWORD: schoolcloudREDMINE_SECRET_KEY_BASE: supersecretkeyREDMINE_DB_ENCODING: utf8heimdall:image: linuxserver/heimdallrestart: alwayscontainer_name: heimdallenvironment:- PUID=1000- PGID=1000- TZ=Asia/Shanghaivolumes:- /home/docker_vol/heimdall/config:/configports:- 80:80- 443:443restart: unless-stoppedgitlab:privileged: trueimage: gitlab/gitlab-cerestart: alwaysports:- "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/gitlabtty: truejenkins:privileged: truetty: trueimage: jenkins/jenkins:2.289.1-lts-centos7restart: alwaysports:- "9302:8080"- "50000:50000"volumes:- /home/docker_vol/jenkins:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.socksonarqube:restart: alwaysimage: sonarqubetty: trueenvironment:- SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=trueports:- "9000:9000"
六、docker集群
(1)Docker Swarm 配置准备以及部署
- 准备三台宿主机器ip地址分别是192.168.0.4、192.168.0.6以及192.168.0.7,其中192.168.0.4是作为manager节点(管理根节点)其他两台机器是作为work节点来使用。
- 创建swarm集群
docker swarm init --advertise-addr 192.168.0.4
docker swarm join --token SWMTKN-1-69kuzr0khh1slvbuul0wn99t8ydf3f1hwaprvyx2r3kho4lxj4-87c2vnklddpwu1wvemex5d6wb 192.168.0.4:2377
- 端口开放
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
- 修改主机名解析
hostnamectl set-hostname manager vi /etc/hosts 不是必须要做的 192.168.0.4 manager 192.168.0.6 worker01 192.168.0.7 worker02
- 在worker节点中使用生成的命令将当前节点添加到管理节点中
docker swarm join --token SWMTKN-1-69kuzr0khh1slvbuul0wn99t8ydf3f1hwaprvyx2r3kho4lxj4-87c2vnklddpwu1wvemex5d6wb 192.168.0.4:2377
- 在管理节点查看集群节点信息
docker node list docker inspect 节点id
(2)管理节点
- 查询目前集群中的节点信息
docker node ls (管理节点) docker inspect 节点id
- 关于节点的状态
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状态的节点)
- 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
删除所有的服务节点
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!
Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)相关推荐
- Maven学习总结(四)——Maven核心概念
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平 ...
- Spark学习之路---Spark核心概念
Spark核心概念简介 一个Spark应用都由驱动器程序发起集群上的各种并发操作,一个驱动器程序一般包含多个执行器节点,驱动器程序通过一个SaprkContext对象访问saprk.RDD(弹性分布式 ...
- 区块链学习 | 区块链的核心概念
想要学习区块链的相关知识,区块链的核心概念--区块.哈希算法.公钥和私钥.时间戳等是必须要弄懂的.区块链由多个相连的区块构成,所以我们先从了解区块的概念开始! 一.区块 区块的结构图 先看上面的区块的 ...
- 【快速上手 MongoDB】介绍、安装、核心概念、基本操作
MongoDB 快速上手 简介 使用 Docker 安装 核心概念 数据库 Database 集合 Collection 文档 Document 基本操作 库 集合 文档 插入 删除 更新 英文官方文 ...
- 基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...
- 【Python学习系列四】Python程序通过hadoop-streaming提交到Hadoop集群执行MapReduce
场景:将Python程序通过hadoop-streaming提交到Hadoop集群执行. 参考:http://www.michael-noll.com/tutorials/writing-an-had ...
- linux 跨物理 集群,linux学习之使用keepalived结合lvs搭建高可用负载均衡集群
环境如下: 192.168.2.199 vm1.example.com HA主服务器 192.168.2.202vm2.example.com HA备服务器 192.168.2.205vm3.exam ...
- Linux学习笔记016---CentOS7虚拟机设置使用静态IP上网_配置集群的时候可以用
JAVA技术交流QQ群:170933152 注意这里: 按下面的装完以后,可能本地ping不通centos虚拟机,这个时候:可以这样设置一下: 到控制面板,找到网络VMware Network Ada ...
- Hadoop学习之虚拟机环境配置,防火墙、selinux关闭、集群时间同步(LinuxcentOS7版本)
目录 1. 镜像文件下载 2.Linux-centOS安装 第三步与第三步需在root用户下进行操作 3.虚拟机关闭防火墙 4.设置selinux 5.集群时间同步 1. 镜像文件下载 ...
- EdgeX Foundry第一弹 容器运行时docker与服务编排
本文为Edgex系列第一篇文章,主要探讨容器化相关内容. 一.了解Edgex为什么先学习容器? 1.应用服务调度.Edgex服务众多,包含应用服务.支持服务.设备服务.安全服务.中间件等,使用容器部署 ...
最新文章
- Ubuntu14.04 工作区设置
- 满分简便解法:1002 写出这个数 (20分)
- 个人的博客搭建(持续更新)
- springboot 系列技术教程目录
- 二进制转换为三进制 ——C++实现
- php twig输出html,php – HTML不呈现[Twig] / [Slim]
- iOS开发UIAlertController之UIAlertAction加图片(UIAlertController按钮加图片)
- VS C# string 字符查找 寻找指定字符
- 解决libc.so.6: version `GLIBC_2.14#39; not found问题
- 使用opencv的nonfree模块
- 订单审批流程 数据库表设计
- 穿山甲android对接错误码40029,头条 穿山甲广告 错误码列表
- 37 一次获取redis连接阻塞引起的 Thread pool is EXHAUSTED
- 程序员讨论《黑客帝国》(一)真实与虚拟
- ​2022年个税专项附加扣除,开始确认,​拿到软考证书即可抵扣
- Matplotlib绘图9种经典风格,你喜欢哪种?
- 视频解码器的功能及应用
- 人生的“甲方”和“乙方”
- 中国中医科学院医学实验中心杨洪军/陈鹏提出蛋白芯片
- 广播(broadcast)的简单解析与实例运用