docker部署Portainer

2023-01-13 12:35:19

一、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用户设置密码:
image

单机版这里选择local即可,选择完毕,点击Connect即可连接到本地docker:
image

注:

注意:该页面上有提示需要挂载本地 /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管理节点

  • 作者:杰哥的技术杂货铺
  • 原文链接:https://blog.csdn.net/cljdsc/article/details/110931241
    更新时间:2023-01-13 12:35:19