docker基础详解

Docker 是一个开源的应用容器引擎,基于Go语言 并遵Apache2.0协议开源,也是一种虚拟化技术。让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

一 . docker核心技术

容器规范
包括docker和Google在内的若干公司组成open container lnitiative (OCI)的组织,目的是指定开放的容器规范。目前发布两个规范:runtime sec和image format spec;

容器runtime
runtime是容器运行的地方和环境,runtime需要和操作系统kernel紧密协作,为容器提供运行环境;
lxc,runc和rkt是目前主流的容器runtime;

容器管理工具
用户用来管理容器的工具,对内与runtime交互,对外为用户提供interface(接口);
runc的管理工具是docker engine,docker engine后台包含两部分deamon和cli;
在这里插入图片描述

容器定义工具
允许用户定义容器的内容和属性,容器可以被保存,共享和重建;
image是容器的模板,runtime依据image创建容器;dockerfile是包含若干命令的文件,通过命令创建image;ACI(App container image)和docker image类似,是由coreOS开发的image;

仓库registry(注册)
统一存放dockers image的仓库叫做registry。Docker hub是docker为公共提供的托管registry;
企业可以通过docker image创建私有的registry;

容器OS
为容器定制的os,是专门运行容器的操作系统,与常规os比较,体积更小,启动更快;

二 . 容器平台技术

容器编排引擎
基于容器的服务一般会采用微服务架构,该架构下应用被分为不同组件,以服务的形式运行在各自的容器中,通过api对外提供服务。
编排含义是容器管理,调度,集群定义和服务发现。通过容器编排引擎,容器有机组合成微服务应用实现业务需求。
docker swarm 是 Docker 开发的容器编排引擎。kubernetes 是 Google 领导开发的开源容器编排引擎。

容器管理平台
支持多种编排引擎,抽象了编排引擎的底层细节,为用户提供方便的功能。
Rancher 和 ContainerShip 是容器管理平台的典型代表。

基于容器的paas
为微服务应用开发人员和公司提供开发部署和管理应用平台,用户不用关心底层基础设施;
Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。

三 . 容器支持技术

容器的基础设施

容器网络
容器的网络拓扑更加复杂和动态,需要专门的解决方案管理容器和容器,容器和其他实体之间的连通性和隔离性;
docker network是docker的原生网络解决方案

服务发现
动态变化是微服务的一大特点,负载增加时需要创建容器,负载减小时容器需要被销毁,在复杂的情况下容器内部的端口,ip和服务会发生变化,服务发现技术就是解决让客户端知道如何在变化的情况下访问容器内部的应用;它会保存容器最新信息;

监控
docker ps/top/stats是docker的原生命令监控工具。docker提供的stats API,用户可以通过http请求获取容器的状态信息;

数据管理
flocker数据管理工具保证容器会在不同host之间迁移,需要保证数据持久化和动态迁移;

日志管理
docker log是docker的日志工具;

四 . 容器和虚拟机的区别

在这里插入图片描述
虚拟化技术是在硬件物理资源的基础上,虚拟出多个os,然后在os的基础上构建相对独立的程序运行环境,而docker是在硬件物理资源os基础上进行虚拟,所有容器共享同一个os,使得容器在体积比虚拟机小很多。容器在启动方面不需要启动整个操作系统,所以部署和启动方面比虚拟机更快;

docker可以将任何应用和以及依赖的打包成一个轻量级,可移植,自包含的容器,容器可以在任何操作系统上运行;

docker基本架构
在这里插入图片描述
docker采用的是client/server架构,客户端向服务器发送请求,服务器负责构建,运行,分发,销毁容器。容器和服务器可以安装在同一个服务器也可以通过socket和REST API与远程的服务器通信!

五 . docker应用场景

Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。

六 . docker安装

实验环境

redhat7.3 firewalld和seliunx的状态为关闭状态

docker安装方法1:rpm包安装

[root@foundation60 docker]# ls
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
#安装完成启动docker程序
[root@foundation60 docker]# systemctl start docker

docker的镜像命令:

运行容器时,使用的镜像需要本地存在。如果不存在需要连网docker自动从docker镜像仓库中下载:
查看本地镜像:
[root@foundation60 docker]# docker images

查找镜像:需要连接网络查找:
OFFICIAL:是否docker官方发布
[root@foundation60 docker]# docker search httpd
               
获取新的镜像:我们获取httpd第一个镜像:
[root@foundation60 docker]# docker pull httpd 

删除本地一个或多少镜像:
[root@foundation60 ~]# docker rmi -f ubuntu

镜像加速器
下载镜像时太大会导致下载变慢,我们可以使用镜像加速来提高下载速度,具体配置如下:配置文件不存时需要创建

[root@foundation14 ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://fz55luup.mirror.aliyuncs.com"],
  "bip": "172.17.0.1/24"
}

容器使用:

#查看容器的使用命令:
[root@foundation60 images]# docker -help

#创建一个容器:
[root@foundation60 images]# docker run -d --name vm1 game2048(一个小游戏的镜像)
582cb5e2f7642a6e3e5a34b2d191c2fba5fad2fb94115d8053f811ffcacf07ce

#另外一种创建容器方法:创建一个新的容器但不启动它
[root@foundation60 images]# docker create -d  --name vm1  game2048
一些常用参数:
-d      ##让程序处于后台运行,并返回容器ID
--name  ##自定义命名容器
-i      ##以交互模式运行容器,通常与 -t 同时使用;
-p      ##端口映射,格式为:主机(宿主)端口:容器端口
-m      ##设置容器使用内存最大值;

容器的端口映射:
[root@foundation60 images]# docker run -p 800:800 -v /game:/game -d gam2048
使用镜像game2048,以后台模式启动一个容器,将主机的800端口映射到的容器800端口,主机的目录/game映射到容器的/game。

查看我们创建的容器:
[root@foundation60 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
582cb5e2f764        game2048            "/bin/sh -c 'sed -..."   About a minute ago   Up About a minute   80/tcp, 443/tcp     vm1
常用参数:
-a    ##显示所有的容器,包括未运行的
-l    ##显示最近创建的容器
-q    ##静默模式,只显示容器编号

查看docker运行的日志:
[root@foundation60 images]# docker logs -f  vm1(582cb5e2f7642a6e3e5a34b2d191c2fba5fad2fb94115d8053f811ffcacf07ce) ##可以写容器的id和容器的名字
172.17.0.1 - - [28/Jul/2018:15:38:16 +0000] "GET / HTTP/1.1" 200 4072 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"
常用参数:
-f   ##作用和tail -f一样的标准输出


查看容器的内部进程:
[root@foundation60 images]# docker top vm1(容器id或者名字)
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                13953               13936               0                   23:34               ?                   00:00:00            /bin/sh -c sed -i "s/ContainerID: /ContainerID: "$(hostname)"/g" /usr/share/nginx/html/index.html && nginx -g "daemon off;"
root                13974               13953               0                   23:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
100                 13975               13974               0                   23:34               ?                   00:00:00            nginx: worker process
docker pause :暂停容器中所有的进程
docker unpause :恢复容器中所有的进程

查看Docker的底层信息或者获取容器/镜像的元数据:
[root@foundation60 images]# docker inspect vm1
.........................
 "IPAddress": "172.17.0.2",
  ##容器的ip。我们可以通过浏览器访问我们刚才创建的小游戏
.........................

运行中的容器执行命令:
[root@foundation60 images]# docker exec -it vm1 /bin/sh /root/script.sh
##容器vm1执行/root/script.sh的脚本

连接正在运行的容器:
[root@foundation60 netns]# docker container attach vm1

将文件系统作为一个tar归档文件导出到STDOUT:
[root@foundation60 ~]# docker export -o game-`date +%Y%m%d`.tar vm1
[root@foundation60 ~]# ls game-`date +%Y%m%d`.tar
game-20180729.tar

从归档文件中创建镜像:
[root@foundation60 ~]# docker import  my_images.tar images.name
my_images.tar ##tar镜像源文件
images.name   ##指定镜像的名字
-c            ##应用docker 指令创建镜像

将镜像的tar文件导入本地镜像:
[root@foundation14 images]# docker load  -i game2048.tar 

从容器创建一个新的镜像:
[root@foundation60 ~]# docker commit [option] vm1  game:vm1
参数[option]:
-a    ##提交的镜像作者;
-c    ##使用Dockerfile指令来创建镜像;
-m    ##提交时的说明文字;
-p    ##在commit时,将容器暂停。

容器与主机之间的数据拷贝:
[root@foundation60 ~]# docker cp /www/game vm1:/www/
将主机/www/game文件拷贝到vm1容器的/www/目录下

停止容器:
[root@foundation60 images]# docker stop vm1
vm1

启动容器:
[root@foundation60 images]# docker start vm1

删除容器:删除容器时必须停止容器否则会报错
[root@foundation60 images]# docker rm vm1
vm1
[root@foundation60 images]# docker kill -s KILL vm1
-s    ##向容器发送一个信号

浏览器访问创建的小游戏:
这里写图片描述

使用Dockerfile文件安装httpd

1.[root@foundation60 ~]# docker rm -f `docker ps -aq`
2.[root@foundation60 tmp]# pwd
/tmp
[root@foundation60 tmp]# mkdir docker
[root@foundation60 tmp]# cd docker/
3.[root@foundation60 docker]# vim Dockerfile
FROM rhel7
MAINTAINER hello@westos.org
ENV HOSTNAME server1
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y httpd && yum clean all
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

#为docker容器内部设置yum源
4.[root@foundation60 docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.254.60/rhel7.3
gpgcheck=0

镜像的导入导出

Export命令用于持久化容器(不是镜像)

[root@localhost ~]# docker export vm1 > /root/httpd.tar

Save命令用于持久化镜像(不是容器)

[root@localhost ~]# docker save httpd > /root/http1.tar

tar镜像的导入

[root@localhost ~]# docker load < /root/game2048.tar

Docker镜像构建

1.docker commit 命令
创建新镜像最直观的方法,其过程包含三个步骤:
运行容器
修改容器
将容器保存为新的镜像

[root@localhost ~]# docker pull centos

[root@localhost ~]# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              5182e96772bf        6 weeks ago         200 MB

[root@localhost ~]# docker run -it centos

[root@5ef69ea7f61c /]# vim 
bash: vim: command not found

参考上面的方法将文件导致到镜像yum源或者参考下面方法apt-get update更新

[root@5ef69ea7f61c /]# yum install -y vim
重新开启新的窗口保存新的镜像:
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
5ef69ea7f61c        centos              "/bin/bash"          5 minutes ago       Up 5 minutes                              laughing_goldstine  #docker随机为镜像的命名

[root@localhost ~]# docker commit laughing_goldstine centos-with-vim
sha256:3f12389b98be1712cc32d63a25d3c2c7b8f4d89573582008b094f499ade8070b

[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
centos-with-vim         latest              3f12389b98be        About a minute ago   348 MB  #我们自己保存的镜像

[root@localhost ~]# docker run -it centos-with-vim

[root@97c804af9f8c /]# ls  
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@97c804af9f8c /]# vim anaconda-post.log  #可以使用vim编辑文件

2.Docketfile文件构建镜像

[root@localhost ~]# pwd
/root
[root@localhost ~]# ls
Dockerfile
[root@localhost ~]# cat Dockerfile 
FROM centos
RUN  yum install -y vim && yum install -y wget && yum install -y net-tools
[root@localhost ~]# docker build -t centos-with-dockerfile .
# -t  命名镜像名字   .   表示在当前目录下查询Dockerfile文件

[root@localhost ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
centos-with-dockerfile   latest              dc5ed57418c5        17 seconds ago      349 MB

#build context 为当前目录 /root,Dockerfile 中的 ADD、COPY 等命令可以将该目录下的所有文件和子目录都会被发送给 Docker daemon。因此放置文件时需要注意

#查看镜像制作过程中具体执行了什么命令
[root@localhost ~]# docker history centos-with-dockerfile
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dc5ed57418c5        9 minutes ago       /bin/sh -c yum install -y vim && yum insta...   150 MB              
5182e96772bf        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema....   0 B                 
<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:6340c690b08865d...   200 MB  
#Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。

3.dockerfile文件详细解释

FROM :指定需要的base镜像
COPY:将镜像的context目录下的文件复制到镜像里面;
ADD :和COPY命令类似,将context目录下文件复制到镜像里面,如果src时归档文件时会被解压到test
ENV :设置环境变量,环境变量可以被后面的指令使用;
EXPOSE: 指定容器的进程会监听某个端口
VOLUME :将文件或者目录声明为volume
WORKDIR : 为后面的run和cmd,entrypoint,add,copy指令设置镜像中当前工作目录;
RUN :在容器中运行指定的命令。
CMD : 容器启动时运行指定的命令。
Dockerfile: 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT:设置容器启动时运行的命令。

七 . 容器内部升级安装其他工具

以下内容在centos7系统实验:
有时我们进入容器内部想使用vim编辑工具却报错没有:

[root@localhost html]# docker exec -it nginx1 /bin/bash
root@a0920cbaf997:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a0920cbaf997:/# vim /usr/share/nginx/html/index.html 
bash: vim: command not found

可以使用以下命令进行升级安装其他工具:

root@a0920cbaf997:/# apt-get update
root@a0920cbaf997:/# apt-get install -y vim
root@a0920cbaf997:/# vim /usr/share/nginx/html/index.html 
<h1> welcome to docker1 </h1>

八 . nginx和启动多个容器做负载均衡

centos7系统,防火墙关闭,selinux状态为关闭状态

[root@server176 ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# getenforce 
Disabled

网易的镜像源:http://mirrors.163.com/

镜像里面自带docker,只需要直接安装即可!

[root@localhost ~]# yum install -y docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable  docker

再家目录下创建nginx/html目录下创建文件index.html

[root@localhost ~]# cd nginx/html/
[root@localhost html]# cat index.html 
<h1> welcome to docker1 </h1>

启动nginx容器1:
-p 将宿主机的8080端口映射为容器的nginx的80端口,-v 将我们创建好的index.html文件映射到容器的默认网页目录 -d 后台运行

[root@localhost html]# docker run -p 8080:80 --name nginx1 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html -d nginx

查看容器的详细信息

[root@localhost html]# docker inspect nginx1
最后面是容器的ip地址信息
"IPAddress": "172.17.0.3",

另外一种方法查看容器的ip地址:

[root@localhost html]# docker inspect --format '{{.NetworkSettings.IPAddress}}' nginx1
172.17.0.3

查看nginx访问网页:

[root@localhost html]# curl 172.17.0.3
<h1> welcome to docker1 </h1>

同样的方法创建第二个容器,将主机的8081端口映射为容器的80端口:

[root@localhost ~]# cd nginx/html/
[root@localhost html]# cat index.html 
<h1> welcome to docker2 </h1>
[root@localhost html]# docker run -p 8080:80 --name nginx2 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html -d nginx
[root@localhost html]# curl 172.17.0.2
<h1> welcome to docker2 </h1>

宿主机安装源码包nginx做负载均衡:
网上有很多安装方法,可以多看看,做负载均衡的配置文件如下:

将主机的8080和8081端口做后段服务器进行轮询
    upstream myweb {  #自定义服务器列表
         server 192.168.88.176:8080;   
         server 192.168.88.176:8081;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass         http://myweb;   #我们自己定义的服务器列表
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

参数详解参考:nginx proxy_set_header设置、自定义header

1.proxy_set_header   Host             $host;
允许重新定义或者添加发往后端服务器的请求头。
2. proxy_set_header    X-real-ip $remote_addr;
可以在web服务器端获得用户的真实ip
3. proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute(“X-Forwarded-For”)获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:
proxy_set_header X-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for; …proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute(“X-Forwarded-For”)获得的将会是客户端ip和第一台nginx的ip。

检查配置文件,启动nginx服务

[root@localhost html]# /usr/local/nginx/sbin/nginx -t
[root@localhost html]# /usr/local/nginx/sbin/nginx 

浏览器进行访问:
在这里插入图片描述
在这里插入图片描述

九 . Dockera安装zabbix步骤:

docker 官方网站安装zabbix详细安装步骤 https://hub.docker.com/u/zabbix
参考文章:docker+zabbix,使用docker搭建zabbix服务

Docker安装mysql数据库

1.拉取mysql数据库镜像

[root@data-node1 ~]# docker pull docker.io/mysql:5.7
[root@data-node1 ~]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                            5.7                 702fb0b7837f        5 days ago          372 MB

2.启动zabbix等镜像之前,需要先创建一个新的 Docker 网络。需要将后面的zabbix-server、mysql、web等容器都加入到此网络中,方便互相访问。

[root@localhost ~]# docker network create -d bridge zabbix_net
5a1b5fcdeaf22fdec33392cf45aa4d04108ddb2a2ddd951d0fec752f9b80f43f
##查看创建容器网络
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
90d7871a93c3        bridge              bridge              local
f20b390e3fc9        host                host                local
62b4a0713856        none                null                local
5a1b5fcdeaf2        zabbix_net          bridge              local

3.启动docker镜像mysql数据库:

[root@localhost ~]# docker run -dit -p 3306:3306 --name zabbix-mysql --network zabbix_net --restart=always -v /etc/localtime:/etc/localtime -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="redhat" mysql:5.7
28c5331aaaea824699ebbfd3d1955273ca9179de2ae2a91aa84da7717de5ee1c
###  -p 将本机的3306端口映射到容器的3306端口
###  -v /etc/localtime:/etc/localtime  将本机的目录映射到容器的目录
###  -e  MYSQL_ROOT_PASSWORD=root_pwd   初始化mysql数据库的密码为root_pwd
###  -e MYSQL_USER=zabbix  创建数据库用户zabbix
###  -e MYSQL_PASSWORD=zabbix  初始化数据库用户zabbix的密码为zabbix
###  -e MYSQL_DATABASE=zabbix    初始化数据库的zabbix数据库
###  --restart always  设置自启动
[root@data-node1 ~]# docker exec -it zabbix-mysql  /bin/bash   ##进入数据库容器
root@dbc489f02a05:/# mysql -uroot -p    ###密码redhat进入数据库

docker安装zabbix服务

环境变量:

如果指定了MYSQL_ROOT_PASSWORD或MYSQL_ALLOW_EMPTY_PASSWORD,那么该实例将尝试用MYSQL_PASSWORD创建MYSQL_USER用户,以便在Zabbix服务器上使用这些凭据。检查是否有MYSQL_DATABASE数据库。如果不存在,则创建MYSQL_DATABASE数据库名称检查是否有dbversion表。如果没有dbversion表,则创建Zabbix服务器数据库模式并上载初始数据示例

DB_SERVER_HOST:这个变量是MySQL服务器的IP或DNS名称。默认值是’mysql-server’
DB_SERVER_PORT:这个变量是MySQL服务器的端口。默认值是’3306’。
MYSQL_USER,MYSQL_PASSWORD:Zabbix服务器使用这些变量连接到Zabbix数据库。默认值是zabbix, zabbix。
MYSQL_DATABASE变量是Zabbix数据库名。默认情况下,值是zabbix。
ZBX_LOADMODULE变量是逗号分隔的可加载Zabbix模块列表。它适用于卷/var/lib/zabbix/modules.
ZBX_DEBUGLEVEL变量用于指定调试级别。默认值是3。它是zabbix_server.conf中的DebugLevel参数。允许的值如下所示:
0 - Zabbix工艺启动和停止的基本信息;
1 -关键信息
2 -错误信息
3 -警告
4 -调试(产生大量信息)
5 -扩展调试(产生更多信息)
ZBX_TIMEOUT该变量用于为处理检查指定超时。默认情况下,值是4。
ZBX_JAVAGATEWAY_ENABLE该变量允许与Zabbix Java Gateway通信,以收集与Java相关的检查。默认情况下,值为false。

1.拉取zabbix镜像:使用的是centos7.0系统

[root@data-node1 ~]# docker search zabbix
[root@data-node1 ~]# docker pull zabbix/zabbix-server-mysql:centos-latest 
[root@data-node1 ~]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
docker.io/zabbix/zabbix-server-mysql       centos-latest       a036f57eb823        3 weeks ago         326 MB

2.启动zabbix镜像服务:

[root@localhost ~]# docker run -dit -p 10051:10051  -v /etc/localtime:/etc/localtime -v /usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts --name=zabbix-server-mysql --restart=always --network zabbix_net -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" -e ZBX_JAVAGATEWAY="zabbix-java-gateway" zabbix/zabbix-server-mysql:centos-latest
2caa23bdf9ba9302d29394c453382834ebb6d913465359762f2f2ab90458c06b

docker安装nginx服务

1.拉取镜像:

[root@data-node1 ~]# docker pull zabbix/zabbix-web-nginx-mysql
[root@data-node1 ~]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
docker.io/zabbix/zabbix-web-nginx-mysql    latest              1a38a6f6ad00        2 weeks ago         163 MB

2.docker启动nginx服务:

[root@localhost ~]# docker run -dit -p 80:80 -v /etc/localtime:/etc/localtime --name zabbix-web-nginx-mysql --restart=always --network zabbix_net -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="root_pwd" -e ZBX_SERVER_HOST="zabbix-server-mysql" zabbix/zabbix-web-nginx-mysql:latest
0e8e11c8197c5050fa2a743ae2d3e72ae5de2baeff67af6bf29bc99bb3e9bc23

docker安装zabbix-java服务

1.拉取镜像

[root@data-node1 ~]# docker pull zabbix/zabbix-java-gateway
[root@data-node1 ~]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
docker.io/zabbix/zabbix-java-gateway       latest              a88ee407ca36        3 weeks ago         80.1 MB

2.docker启动zabbix-java-gateway镜像;

[root@localhost ~]# docker run -v /etc/localtime:/etc/localtime -dit --restart=always --name=zabbix-java-gateway --network zabbix_net zabbix/zabbix-java-gateway:latest
62c68d2b3fdf8b544c4fce30acbbbd7227fd673f414376767327b02531a72f28

浏览器页面进行查看
输入本机ip/zabbix,默认用户和密码为:admin/zabbix
在这里插入图片描述在这里插入图片描述

docker集群swarm搭建

三台centos7的虚拟机都需要安装docker,关闭防火墙以及selinux状态;

1.创建swarm集群

#初始化集群节点,节点之间相互通信的地址为192.168.88.176,端口号为2377
[root@server176 ~]# docker swarm init --advertise-addr 192.168.88.176
Swarm initialized: current node (q8ldazlt0ggf93wvmsu19kuve) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2310kxea8xfs4v9swoepmiwaamgkopy5sfqdm25bjx3231gfi8-b3z7uknbh0ryp7jwb6r395scr \
    192.168.88.176:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

#检查swarm的模式状态
[root@server176 ~]# docker info | grep -i swarm
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
WARNING: You're not using the default seccomp profile
WARNING: bridge-nf-call-ip6tables is disabled
Swarm: active

#默认监听两个端口,tcp2377端口为集群的管理端口,tcp7946为节点之间的通讯端口
[root@server176 ~]# netstat -lnpt | grep docker
tcp6       0      0 :::2377                 :::*                    LISTEN      938/dockerd-current 
tcp6       0      0 :::7946                 :::*                    LISTEN      938/dockerd-current 
tcp6       0      0 :::8080                 :::*                    LISTEN      2258/docker-proxy-c 
tcp6       0      0 :::8081                 :::*                    LISTEN      2328/docker-proxy-c 

#默认会创建一个overlay的网络ingress,还会创建一个桥接的网络docker_gwbridge
[root@server176 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ee6571fde36e        bridge              bridge              local
af1ba7724d71        docker_gwbridge     bridge              local
bcc9d98cb3e6        host                host                local
ipxuk8u2dwkh        ingress             overlay             swarm
77938edb7cb0        none                null                local

#查看集群的节点情况
[root@server176 ~]# docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
q8ldazlt0ggf93wvmsu19kuve *  server176  Ready   Active        Leader

#swarm的配置文件都在/var/lib/docker/swarm目录中
[root@server176 ~]# cd /var/lib/docker/swarm/
[root@server176 swarm]# ll
total 8
drwxr-xr-x 2 root root  72 Nov  7 05:19 certificates(使用的tls来进行安全通信)
-rw------- 1 root root 112 Nov  7 05:19 docker-state.json(用来记录通信的地址和端口,也会记录本地的地址和端口)
drwx------ 4 root root  53 Nov  7 05:19 raft(raft协议)
-rw------- 1 root root  70 Nov  7 05:19 state.json(manager的ip和端口)
drwxr-xr-x 2 root root  21 Nov  7 05:19 worker(记录工作节点下发的任务信息)

2.将其他节点加入集群

#查看加入节点的命令方法
[root@server176 swarm]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2310kxea8xfs4v9swoepmiwaamgkopy5sfqdm25bjx3231gfi8-b3z7uknbh0ryp7jwb6r395scr \
    192.168.88.176:2377

#查看加入主节点命令方法
[root@server176 swarm]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2310kxea8xfs4v9swoepmiwaamgkopy5sfqdm25bjx3231gfi8-afghxj63v5t45jzok8y6wzpqt \
    192.168.88.176:2377

将查询的命令在其他两个节点执行进行加入集群

[root@server177 ~]# docker swarm join --token SWMTKN-1-2310kxea8xfs4v9swoepmiwaamgkopy5sfqdm25bjx3231gfi8-b3z7uknbh0ryp7jwb6r395scr 192.168.88.176:2377
This node joined a swarm as a worker.

[root@serevr169 ~]# docker swarm join --token SWMTKN-1-2310kxea8xfs4v9swoepmiwaamgkopy5sfqdm25bjx3231gfi8-b3z7uknbh0ryp7jwb6r395scr 192.168.88.176:2377
This node joined a swarm as a worker.

3 . 查看集群信息

[root@server176 swarm]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8    serevr169              Ready   Active        
q8ldazlt0ggf93wvmsu19kuve *  server176              Ready   Active        Leader
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active    

4 . 节点之间角色转换

[root@server176 swarm]# docker node update --role manager serevr169
serevr169
[root@server176 swarm]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8    serevr169              Ready   Active        Reachable
q8ldazlt0ggf93wvmsu19kuve *  server176              Ready   Active        Leader
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active 

[root@server176 swarm]# docker node update --role worker server176
server176
[root@server176 swarm]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

#在manager上查看
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Active        Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Ready   Active        
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active     

5. 创建服务
在创建服务的时候,会经过几个状态,一个是prepared,表示准备,主要是从仓库拉取镜像,然后启动容器,也就是starting,最后会进行验证容器状态,从而最后变成running状态。
在查看服务的时候,会出现一个mode,也就是服务的类型,可以分为两种,一种replicated,表示副本,默认情况下是使用replicated模式,并且默认情况只会创建一个副本,主要使用的目的是为了高可用;另外一种为global,也就是必须在每个机器上运行一个task也就是容器,可以看到在使用global的模式的时候创建了三个容器。

#create表示创建一个服务,名称为web,镜像为nginx
[root@serevr169 ~]# docker service create --name web nginx
kmok4glirniagyj7a3a0u20wn

#创建一个名称问frontweb的服务,模式为global,镜像为nginx
[root@serevr169 ~]# docker service create --name frontweb --mode global nginx
8bqj70l0mesnrxghjn2jr3idh

#查看服务详情
[root@serevr169 ~]# docker service ls
ID            NAME      MODE        REPLICAS  IMAGE
8bqj70l0mesn  frontweb  global      1/3       nginx:latest
kmok4glirnia  web       replicated  0/1       nginx:latest

#查看web服务具体运行情况
[root@serevr169 ~]# docker service ps web
ID            NAME   IMAGE         NODE       DESIRED STATE  CURRENT STATE          ERROR  PORTS
k1vf1pj864ju  web.1  nginx:latest  serevr169  Running        Running 8 seconds ago         

#查看fronteb服务的具体运行情况
[root@serevr169 ~]# docker service ps frontweb
ID            NAME                                IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR                             PORTS
dj3ejbxormxc  frontweb.wf8dmokui5zt7fp8enhbqsmak  nginx:latest  localhost.localdomain  Running        Preparing less than a second ago                                    
hbvo9tydjjl4  frontweb.plzk3rll0e2f6ryhtodng99n8  nginx:latest  serevr169              Running        Running 22 seconds ago                                              
6wol8rw2583u  frontweb.wf8dmokui5zt7fp8enhbqsmak  nginx:latest  localhost.localdomain  Shutdown       Rejected less than a second ago   "No such image: nginx@sha256:b…"  
tvbr98gt5odk  frontweb.q8ldazlt0ggf93wvmsu19kuve  nginx:latest  server176              Running        Running about a minute ago                                          

#查看frontweb的详细信息
[root@serevr169 ~]# docker service inspect frontweb --pretty

ID:             8bqj70l0mesnrxghjn2jr3idh
Name:           frontweb
Service Mode:   Global
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Max failure ratio: 0
ContainerSpec:
 Image:         nginx:latest@sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e
Resources:
Endpoint Mode:  vip

6 . swarm 的集群缩容与扩容

#对于web服务进行扩容,扩容为3个
[root@serevr169 ~]# docker service scale web=3
web scaled to 3

#查看web服务含有三个容器
[root@serevr169 ~]# docker service ls
ID            NAME      MODE        REPLICAS  IMAGE
8bqj70l0mesn  frontweb  global      2/3       nginx:latest
kmok4glirnia  web       replicated  2/3       nginx:latest

#查看3个web服务的具体运行情况
[root@serevr169 ~]# docker service ps web
ID            NAME   IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR  PORTS
k1vf1pj864ju  web.1  nginx:latest  serevr169              Running        Running 17 minutes ago                   
lf323lop0ytr  web.2  nginx:latest  localhost.localdomain  Running        Preparing less than a second ago         
9oa3amjo6qja  web.3  nginx:latest  server176              Running        Running 50 seconds ago                   

#对于web服务进行缩容,缩容为2个容器
[root@serevr169 ~]# docker service scale web=2
web scaled to 2

#查看web服务缩容后的运行情况
[root@serevr169 ~]# docker service ps web
ID            NAME   IMAGE         NODE       DESIRED STATE  CURRENT STATE               ERROR  PORTS
k1vf1pj864ju  web.1  nginx:latest  serevr169  Running        Running 18 minutes ago             
9oa3amjo6qja  web.3  nginx:latest  server176  Running        Running about a minute ago         

当要让swarm的manager节点不运行容器的时候,只要更改节点的状态,从Active变成Drain即可,当manager宕机的时候,容器回运行到其他节点上
[root@serevr169 ~]# docker node update --availability drain serevr169
serevr169
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Drain         Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Ready   Active        
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active   
[root@serevr169 ~]# docker service ps web
ID            NAME       IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR  PORTS
9g1o5czqn7b7  web.1      nginx:latest  localhost.localdomain  Running        Preparing less than a second ago         
k1vf1pj864ju   \_ web.1  nginx:latest  serevr169              Shutdown       Shutdown 2 seconds ago                   
9oa3amjo6qja  web.3      nginx:latest  server176              Running        Running 4 minutes ago 

7 . 模拟节点服务故障迁移

在集群中,当其他服务器的docker服务宕机时,swarm会将服务进行转移;

[root@serevr169 ~]# docker service ps web
ID            NAME       IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR  PORTS
9g1o5czqn7b7  web.1      nginx:latest  localhost.localdomain  Running        Preparing less than a second ago         
k1vf1pj864ju   \_ web.1  nginx:latest  serevr169              Shutdown       Shutdown 5 seconds ago                   
dbsva7zsrrt8  web.2      nginx:latest  serevr169              Running        Ready 4 seconds ago                      
0q41hzva2c72   \_ web.2  nginx:latest  serevr169              Shutdown       Complete 5 seconds ago                   
9oa3amjo6qja  web.3      nginx:latest  server176              Running        Running 22 minutes ago 

#关闭节点服务器的docker服务,模拟节点服务器故障
[root@server176 swarm]# systemctl stop docker

#在manager上查看节点的状态,以及运行的服务
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Active        Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Down    Active      #状态变为down    
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active        

#将serevr176的服务转移到server169节点上
[root@serevr169 ~]# docker service ps web
ID            NAME       IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR  PORTS
9g1o5czqn7b7  web.1      nginx:latest  localhost.localdomain  Running        Preparing less than a second ago         
k1vf1pj864ju   \_ web.1  nginx:latest  serevr169              Shutdown       Shutdown 8 minutes ago                   
dbsva7zsrrt8  web.2      nginx:latest  serevr169              Running        Running 8 minutes ago                    
0q41hzva2c72   \_ web.2  nginx:latest  serevr169              Shutdown       Complete 8 minutes ago                   
k6sbm9r9scp4  web.3      nginx:latest  serevr169              Running        Running 16 seconds ago                   
9oa3amjo6qja   \_ web.3  nginx:latest  server176              Shutdown       Running 37 seconds ago 

#恢复节点服务器的docker服务,此时改节点会从新开启容器服务,而我们指定了3个web服务,所以会出现报错,只需要将web服务进行扩容之后,改节点会重新开启
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Active        Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Ready   Active        
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active        
[root@serevr169 ~]# docker service ps web
ID            NAME       IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR                             PORTS
9g1o5czqn7b7  web.1      nginx:latest  localhost.localdomain  Running        Preparing less than a second ago                                    
k1vf1pj864ju   \_ web.1  nginx:latest  serevr169              Shutdown       Shutdown 9 minutes ago                                              
dbsva7zsrrt8  web.2      nginx:latest  serevr169              Running        Running 9 minutes ago                                               
0q41hzva2c72   \_ web.2  nginx:latest  serevr169              Shutdown       Complete 9 minutes ago                                              
k6sbm9r9scp4  web.3      nginx:latest  serevr169              Running        Running about a minute ago                                          
9oa3amjo6qja   \_ web.3  nginx:latest  server176              Shutdown       Failed 7 seconds ago              "No such container: web.3.9oa3…"  
在上面会进行报错,之前的节点状态不能恢复

[root@serevr169 ~]# docker service scale web=4
web scaled to 4
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Active        Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Ready   Active        
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active        
[root@serevr169 ~]# docker service ps web
ID            NAME       IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR                             PORTS
9g1o5czqn7b7  web.1      nginx:latest  localhost.localdomain  Running        Preparing less than a second ago                                    
k1vf1pj864ju   \_ web.1  nginx:latest  serevr169              Shutdown       Shutdown 11 minutes ago                                             
dbsva7zsrrt8  web.2      nginx:latest  serevr169              Running        Running 11 minutes ago                                              
0q41hzva2c72   \_ web.2  nginx:latest  serevr169              Shutdown       Complete 11 minutes ago                                             
k6sbm9r9scp4  web.3      nginx:latest  serevr169              Running        Running 2 minutes ago                                               
9oa3amjo6qja   \_ web.3  nginx:latest  server176              Shutdown       Failed about a minute ago         "No such container: web.3.9oa3…"  
u9df3p3miw89  web.4      nginx:latest  server176              Running        Running 5 seconds ago 

8 . 访问服务
docker service rm 服务名 #删除创建的服务
访问服务:一种是内部访问的服务,一种是外部的服务;

[root@serevr169 ~]# docker service scale web=0
web scaled to 0
[root@serevr169 ~]# docker service create --name http --replicas=3 httpd
lqfn8507way2rxjoin6u3yjoa
[root@serevr169 ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
plzk3rll0e2f6ryhtodng99n8 *  serevr169              Ready   Active        Leader
q8ldazlt0ggf93wvmsu19kuve    server176              Ready   Active        
wf8dmokui5zt7fp8enhbqsmak    localhost.localdomain  Ready   Active        
[root@serevr169 ~]# docker service ps http
ID            NAME    IMAGE         NODE                   DESIRED STATE  CURRENT STATE                     ERROR  PORTS
qj2p65vkxnd5  http.1  httpd:latest  server176              Running        Preparing 38 seconds ago                 
rn5vi6ua4rg8  http.2  httpd:latest  localhost.localdomain  Running        Preparing less than a second ago         
s98i6spcw48j  http.3  httpd:latest  serevr169              Running        Preparing 39 seconds ago   
[root@serevr169 ~]# docker ps
CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
46de39f2c74c        nginx@sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e   "nginx -g 'daemon ..."   37 minutes ago      Up 37 minutes       80/tcp              frontweb.plzk3rll0e2f6ryhtodng99n8.v3qbh2u47n472iy00h5j4xckc
[root@serevr169 ~]# docker inspect 46de39f2c74c
 "IPAddress": "172.17.0.2",
 [root@serevr169 ~]# docker exec -it 46de39f2c74c /bin/bash
root@46de39f2c74c:/# echo "i'm ok !" >  /usr/share/nginx/html/index.html      
root@46de39f2c74c:/# exit
[root@serevr169 ~]# curl 172.17.0.2
i'm ok !

参考文章:每天5分钟玩转OpenStack

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值