一、Portainer概述
Portainer可以在Docker上运行,而且部署起来非常简单
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求
!
二、Portainer部署
2.1 单机部署
如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker镜像、容器等数据。
2.1.1 下载Portainer镜像
# docker pull portainer/portainer
Using default tag: latest
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
74a417ed7ac5: Pull complete
Digest: sha256:ac9aeaf784962573baf26c03cd9709114d7fbfe7e5bd690b1f8e3b46642e67ea
Status: Downloaded newer image for portainer/portainer:latest
2.1.2 创建卷组
# docker volume create portainer_data
2.1.3 生成Portainer容器
注意:如果是自己的虚拟机生成容器可能会报错,如下:
WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方法:
执行以下语句
echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf
重启network和docker服务
systemctl restart network && systemctl restart docker
完成以后,删除错误的容器,再次创建新容器,就不再报错了。
# docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
db5223f5c5eb54e144d409aed80de598bf6481577a9f14e29caf408aebd9e7a2
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db5223f5c5eb portainer/portainer "/portainer" 14 seconds ago Up 10 seconds 0.0.0.0:9000->9000/tcp portainer
注:
启动容器的语句,宿主机9000端口关联容器中的9000端口,并给容器起名为portainer。执行完该命令之后,使用该机器IP:PORT即可访问Portainer。
访问方式:http://IP:9000
首次登陆需要注册用户,给admin用户设置密码:
单机版这里选择local即可,选择完毕,点击Connect即可连接到本地docker:
注:
注意:该页面上有提示需要挂载本地 /var/run/docker.socker与容器内的/var/run/docker.socker连接。因此,在启动时必须指定该挂载文件。
是的,没错,至此,Portainer单机版已经部署完成并且可以使用!但Portainer的功能却远不止于此
二、集群运行
更多的情况下,我们会有一个docker集群,可能有几台机器,也可能有几十台机器,因此,进行集群管理就十分重要了,Portainer也支持集群管理。
Portainer可以和Swarm一起来进行集群管理操作。所以我们首先搭建一个Swarm
2.1 swarm部署
Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。这里有两种方法,一种是通过修改docker配置文件方式,另一种是通过一个轻量级的代理容器进行监听。
2.1.1 修改配置文件修改监听端口(推荐)
以下方法适用于centos 7 yum安装的docker
正确姿势是修改/lib/systemd/system/docker.service这个文件中的参数
在ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock配置后面添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# vim /lib/systemd/system/docker.service
14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
重启/启动Docker服务
# systemctl daemon-reload #刷新配置
# systemctl restart docker #重启docker服务
此时通过netstat -ntlp可以看到一个新开的2375端口,此乃默认的DockerHTTPAPI的端口
# netstat -lnptu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 948/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1073/master
tcp6 0 0 :::2375 :::* LISTEN 19708/dockerd
注意:
因为我们做的是一个集群,所以需要对所有要加入集群的docker节点都进行上面的修改配置文件的操作。
2.1.2使用docker-proxy代理服务
默认情况下,Docker引擎只侦听套接字。 我们可以重新配置引擎以使用TLS,或者您可以使用代理容器。 这是一个非常轻量级的容器,它只是将请求从TCP转发到Docker监听的Unix套接字。
下载镜像
# docker pull docker.io/shipyard/docker-proxy
Using default tag: latest
latest: Pulling from shipyard/docker-proxy
8f4ec95ceaee: Pull complete
ac77a345f217: Pull complete
43039e3ef672: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:da6bbd1a145581a940d44940cce0f43705d7f8ec552a4e97e77104ec1b6dc3d1
Status: Downloaded newer image for shipyard/docker-proxy:latest
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shipyard/docker-proxy latest cfee14e5d6f2 3 years ago 9.47MB
启动容器
# docker run -ti -d -p 2375:2375 --restart=always --hostname=$HOSTNAME --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 docker.io/shipyard/docker-proxy:latest
7f335547ef99e4e84bd1245ac5248f9adaff62902b3750ad58bc2753bbf32e2b
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f335547ef99 shipyard/docker-proxy:latest "/usr/local/bin/run" 6 seconds ago Up 3 seconds 0.0.0.0:2375->2375/tcp shipyard-proxy
# netstat -lnptu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 932/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1053/master
tcp6 0 0 :::2375 :::* LISTEN 4673/docker-proxy
注意:
该代理服务容器也需要在每个要加入集群的docker节点上启动,同时要保证该容器的正常运行,如果容器停止则无法发现节点。
综合以上两种方法,推荐使用修改配置文件修改监听端口更加方便,易维护
2.2.1 搭建Docker集群
拉取Swarm镜像
==注意:==
下载镜像时出现错误
# docker pull docker.io/swarm
Using default tag: latest
latest: Pulling from library/swarm
d85c18077b82: Pulling fs layer
1e6bb16f8cb1: Pulling fs layer
85bac13497d7: Pulling fs layer
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/ff/ff454b4a0e84e50c50e3df457ad44b80f1a67ec6ec75cff5117dd5dc46bf4965/data?verify=1551752883-usFd2%2FMN%2BvJvm2YHDNDHS6z6Y2U%3D: net/http: TLS handshake timeout
出现这个问题原因为国内网络问题,无法连接到 docker hub。 好在国内已经有 daocloud,docker指定该源即可。
centos7处理办法,其他系统版本处理方法类似,在docker配置文件(==/lib/systemd/system/docker.service==)中的ExecStart下添加参数 ==--registry-mirror=http://f2d6cb40.m.daocloud.io==
# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=http://f2d6cb40.m.daocloud.io
重启/启动Docker服务
# systemctl daemon-reload #刷新配置
# systemctl restart docker #重启docker服务
再次下载swarm镜像
# docker pull docker.io/swarm
Using default tag: latest
latest: Pulling from library/swarm
d85c18077b82: Pull complete
1e6bb16f8cb1: Pull complete
85bac13497d7: Pull complete
Digest: sha256:542d02f333d84ff5731514473c136e06d92cc211435e9721260ba0ddcff41265
Status: Downloaded newer image for swarm:latest
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
portainer/portainer latest 89c72b64ab63 4 weeks ago 74.2MB
swarm latest ff454b4a0e84 9 months ago 12.7MB
生成唯一token
在任意的docker节点创建一个==全世界唯一的token==(集群ID),记住这个token后面需要用到。(这里用的发现服务是dockhub内置的,当然还有其他的比如etcd、consul等。)
# docker run --rm swarm create
Token based discovery is now deprecated and might be removed in the future.
It will be replaced by a default discovery backed by Docker Swarm Mode.
Other mechanisms such as consul and etcd will continue to work as expected.
3880f2eb18bcf67a9483ac3114b2f76b
执行上面的命令之后,会生成一个token:==3880f2eb18bcf67a9483ac3114b2f76b==
启动Swarn Manager
Swarn Manager 只需要启动一个,所以可选取一个docker节点进行启动,选择后这个节点将成为portainer集群中的主节点!
# docker run -ti -d -p 2376:2375 --restart=always --name shipyard-swarm-manager docker.io/swarm:latest manage --host tcp://0.0.0.0:2375 token://3880f2eb18bcf67a9483ac3114b2f76b
ea9f50450ed7d5508abc635992ea14c392b2f9a3d776cab34e5df6a9a9cd1b7f
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea9f50450ed7 swarm:latest "/swarm manage --hos…" 17 seconds ago Up 14 seconds 0.0.0.0:2376->2375/tcp shipyard-swarm-manager
启动Swarm Agent
启动Swarm agent,将当前docker节点加入到集群中,Swarm Agent需要在每一个要加入到集群中的docker节点上启动。
# docker run -ti -d --restart=always --name shipyard-swarm-agent docker.io/swarm:latest join --addr 10.20.28.11:2375 token://3880f2eb18bcf67a9483ac3114b2f76b
7f6551bd20d5a577c7ac61b2e99ceadc167c7a416f9627d3f2b354f0343a822b
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f6551bd20d5 swarm:latest "/swarm join --addr …" 6 seconds ago Up 3 seconds 2375/tcp shipyard-swarm-agent
注:
上面这条命令中的IP地址项需要更换为要加入集群的docker节点的真实IP
查看docker节点情况
可以使用命令查看docker节点情况(任意docker节点上都可以执行):
# docker run --rm swarm list token://3880f2eb18bcf67a9483ac3114b2f76b
10.20.28.11:2375
10.20.29.43:2375
注意:此处显示的节点仅为slave节点IP地址
查看docker集群详情
可以使用命令查看docker集群的详情(可在任意docker节点上执行,IP地址是装了Swarm Master主机的IP):
docker -H 10.20.28.10:2376 info
# docker -H 10.20.28.10:2376 info
Containers: 10
Running: 2
Paused: 0
Stopped: 8
Images: 11
Server Version: swarm/1.2.9
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 2
localhost.localdomain: 10.20.29.43:2375
└ ID: 7PSS:54EX:R6HB:5YJZ:36KV:NUD2:MNQC:7JHM:QTUB:7ABL:FHZB:ZQC7|10.20.29.43:2375
└ Status: Healthy
└ Containers: 9 (1 Running, 0 Paused, 8 Stopped)
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.001 GiB
└ Labels: kernelversion=3.10.0-514.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), ostype=linux, storagedriver=overlay2
└ UpdatedAt: 2019-03-05T03:18:23Z
└ ServerVersion: 18.09.2
slave: 10.20.28.11:2375
└ ID: 4QFG:4SXU:RMY2:NZNM:OA6Y:Y3HX:PWPD:JX7G:3AHS:HWRC:LAON:6WSW|10.20.28.11:2375
└ Status: Healthy
└ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 494.1 MiB
└ Labels: kernelversion=3.10.0-862.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), ostype=linux, storagedriver=overlay2
└ UpdatedAt: 2019-03-05T03:17:49Z
└ ServerVersion: 18.09.3
Plugins:
Volume:
Network:
Log:
Swarm:
NodeID:
Is Manager: false
Node Address:
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: linux
Architecture: amd64
CPUs: 2
Total Memory: 1.484GiB
Name: ea9f50450ed7
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
Experimental: false
Live Restore Enabled: false
WARNING: No kernel memory limit support
portainer集群方式启动
# docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer
fa9b89a3e50ca359119b9f566de6464136514e18c06cc12d6d29408ef9187811
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa9b89a3e50c portainer/portainer "/portainer" 8 seconds ago Up 6 seconds 0.0.0.0:9000->9000/tcp portainer
ea9f50450ed7 swarm:latest "/swarm manage --hos…" About an hour ago Up About an hour 0.0.0.0:2376->2375/tcp shipyard-swarm-manager
接下来将进入portainer的web界面,web界面如何设置请查看
注:访问方式:http://IP:9000
此处的IP为你的portminer节点,即你的swarm管理节点