portainer 安装
第一步:在docker仓库查找portainer的版本
docker search portainer
注意,docker portainer有两个版本:portainer/portainer
和 portainer/portainer-ce
:
portainer/portainer
是早期版本,已不再更新portainer/portainer-ce
是新版本,使用新版本
docker pull portainer/portainer-ce
docker run
: 这个命令用于启动一个新的 Docker 容器。-d
: 这个参数指定容器以 “detached” 模式运行,也就是在后台运行。-p 8888:9000
: 这个参数将容器的 8888 和 9000 端口映射到宿主机的对应端口上,这样我们就可以通过宿主机访问容器内的服务。--name portainer
: 给这个容器起名为 “portainer”。--restart=always
: 这个参数指定只要 Docker 启动,这个容器就自动重启。-v /var/run/docker.sock:/var/run/docker.sock
: 这个参数将宿主机的 Docker 套接字文件挂载到容器内部,这样 Portainer 就可以管理宿主机上的 Docker 服务。-v /app/portainer:/data
: 这个参数创建了一个名为 “portainer_data” 的数据卷,并挂载到容器的 /data 目录。这样可以保存 Portainer 的配置和数据。- -v /app/portainer/public-public:/public :将解压的汉化包目录挂载到Portainer容器的/public目录。
portainer/portainer-ce
: 这是 Portainer 的 Docker 镜像名称,告诉 Docker 使用这个镜像来创建容器。
-v /etc/localtime:/etc/localtime:ro
这个命令的作用是将宿主机上的时区设置文件(/etc/localtime
)挂载到Docker容器中相同的位置,使容器能够使用与宿主机相同的时区设置。
具体来说,这个命令的各部分意义如下:
-v
:这是Docker命令用来指定挂载卷的标志(Volume)。/etc/localtime
:这是宿主机上时区文件的路径。该文件包含了当前时区的信息。:/etc/localtime
:这是容器内部的挂载点,即容器内与宿主机/etc/localtime
文件对应的路径。:ro
:这表示以只读方式挂载(Read-Only)。容器可以读取该文件,但无法修改它,这样可以防止容器的操作影响宿主机的时区设置。
这样做的好处是保证容器内的应用程序可以正确处理与时区相关的操作,例如记录日志的时间戳、执行定时任务等。这对于需要时区一致性的应用程序来说非常重要。例如,如果你在上海运行宿主机,而你的容器也应当使用东京的时区,通过这种方式挂载/etc/localtime
,你的容器将会自动采用上海的时区,而无需在容器内单独配置时区。
等待最新镜像下载完成之后启动portainer。
docker run -d -p 8888:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /app/portainer:/data -v /app/portainer/public-public:/public -v /etc/localtime:/etc/localtime:ro
--name portainer portainer/portainer-ce
docker ps
查看运行的容器
3.验证登录
使用ip:8888
即可,这里的192.168.29.208是我的虚拟机,初次登陆时需要设置一个admin账号的密码,在admin下方输入8位密码创建用户,输入密码后点击创建用户即可 (下方的允许匿名我也勾选上了):
配置中文环境
1.下载汉化
下载地址如下,linux下载tar.gz文件
https://github.com/eysp/public/releases/tag/public
上传到linux服务器的目录中,并解压:
[root@localhost portainer]# tar -xzf public-public.tar.gz
[root@localhost portainer]#
在下一步环境中选择本地连接即可:
然后会进入如下界面:
点击local进入查看容器详情:
上面页面展示的对应如下命令
docker system df
界面操作
1.启动
启动已停止的mysql容器,勾选后点击启动:
可以看到由红色的stop变为绿色的running:
2.查看日志
点击文档标志:
会进入如下页面,可以设置日志显示的行数并下载:
3.查看容器的详细信息
点击如下的圆圈i图标
进入如下页面,展示容器的配置参数等:
4.查看监控信息
点击统计图标:
进入如下界面,显示各项占用:
5.执行容器命令
点击如下的大于号下划线图标:
在如下页面点击连接:
进入命令执行页面:
6.添加新容器
点击添加容器按钮
进入如下页面填写相关参数,这里以安装nginx为例,然后点击部署容器:
我这里80端口被占用,使用了81,可以用lsof -i :80
查看linux 80端口是否被占用
如果想做其他更多设置可以在高级设置中进行,这里就不做设置了:
如果不报错,结果如下:
编排方式安装监控
1.编排配置
Docker-Compose的使用参考:
https://blog.csdn.net/onePlus5T/article/details/139103477
结合本专栏前面的文章Docker-Compose的使用,利用之前的微服务,然后把portainer相关放在了最下面
services: #自定义的服务名,必须小写 eureka7001: #指定dockerfile来构建镜像并运行实例,context用来指定Dockerfile所在的目录 build: context: /wzy/cloud-images/eureka dockerfile: Dockerfile #image: eureka_docker:1.0 #如果有现成的镜像,可以在这里指定,直接用来运行容器,使用此项要注释掉build及其内容 #container_name: eureka01 指定容器的名字,如果不指定,会由docker自动生成 ports: - "7001:7001" #挂载容器卷 volumes: - /wzy/eurekaService:/data #指定使用的网络,所有服务的网络一致,即可以使用服务名通信忽略ip地址 networks: - wzy_net #自定义的服务名,必须小写 payment8001: build: context: /wzy/cloud-images/pay8001 dockerfile: Dockerfile #image: payment01_docker:1.0 #container_name: payment01 ports: - "8001:8001" volumes: - /wzy/paymentMysqlService:/data networks: - wzy_net #指定本服务依赖的服务,会等依赖的服务运行后在运行本服务 depends_on: - eureka7001 - mysql #自定义的服务名,必须小写 payment8002: build: context: /wzy/cloud-images/pay8002 dockerfile: Dockerfile #image: payment02_docker:1.0 #container_name: payment02 ports: - "8002:8002" volumes: - /wzy/paymentRedisService:/data networks: - wzy_net depends_on: - eureka7001 - redis #自定义的服务名,必须小写,也可以叫别的,springboot服务可以在yaml中将redis的ip换成这个名字 redis: image: redis:6.2.6 ports: - "6379:6379" volumes: - /wzy/redis/redis.conf:/etc/redis/redis.conf - /wzy/redis/data:/data networks: - wzy_net #运行指令 command: redis-server /etc/redis/redis.conf #自定义的服务名,必须小写,也可以叫别的,springboot服务可以在yaml中将redis的ip换成这个名字 mysql: image: mysql:latest #环境参数配置 environment: #注意这里的密码要和微服务连接mysql的配置对应上 MYSQL_ROOT_PASSWORD: '123456' MYSQL_ALLOW_EMPTY_PASSWORD: 'NO' MYSQL_DATABASE: 'mybatis-plus' MYSQL_USER: 'wzy' MYSQL_PASSWORD: '123456' ports: - "3306:3306" volumes: - /wzy/mysql/log:/var/log/mysql - /wzy/mysql/data:/var/lib/mysql - /wzy/mysql/conf:/etc/mysql/conf.d networks: - wzy_net command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 #portainer监控服务 portainer: image: portainer/portainer-ce ports: - 8000:8000 - 9000:9000 volumes: - /var/run/docker.sock:/var/run/docker.sock #挂载 Docker 套接字,以便 Portainer 可以管理 Docker 容器 - portainer_data:/data # 数据创建持久化存储卷 - /wzy/portainer/public-public:/public restart: always #确保 Portainer 容器在 Docker 主机重启后自动启动 networks: - wzy_net #定义 portainer_data 持久化存储卷。 volumes: portainer_data: #创建网络 networks: wzy_net:2.运行编排
运行编排文件检查命令:
docker-compose config -q
,无输出则证明yml格式正确。再执行编排:
docker-compose -f /wzy/docker-compose.yml up -d
[root@localhost wzy]# docker-compose config -q [root@localhost wzy]# docker-compose -f /wzy/docker-compose.yml up -d [+] Running 4/4 ✔ portainer Pulled 20.2s ✔ 0ea73420e2bb Pull complete 0.8s ✔ c367f59be2e1 Pull complete 0.8s ✔ b71b88d796e2 Pull complete 18.9s [+] Building 103.5s (20/20) FINISHED docker:default => [eureka7001 internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 579B 0.0s => [payment8002 internal] load metadata for docker.io/library/java:8 16.3s => [eureka7001 internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [eureka7001 internal] load build context 0.7s => => transferring context: 48.86MB 0.7s => CACHED [payment8002 1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba25 77.1s => => resolve docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c382 0.0s => => sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742 4.73kB / 4.73kB 0.0s => => sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f622 51.36MB / 51.36MB 5.5s => => sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b 42.50MB / 42.50MB 11.0s => => sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d18 2.00kB / 2.00kB 0.0s => => sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea6 18.54MB / 18.54MB 9.3s => => sha256:60170fec2151d2108ed1420625c51138434ba4e0223d30 593.15kB / 593.15kB 6.4s => => extracting sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a2 13.4s => => sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb396464 214B / 214B 6.7s => => sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b4 242B / 242B 7.1s => => sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a9 130.10MB / 130.10MB 22.3s => => sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433 289.05kB / 289.05kB 9.8s => => extracting sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea618414b8 2.8s => => extracting sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b0c7d50c 18.9s => => extracting sha256:60170fec2151d2108ed1420625c51138434ba4e0223d3023353d3f3 0.4s => => extracting sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb3964649 0.0s => => extracting sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b49 0.0s => => extracting sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a90998f7bd8 34.1s => => extracting sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433c711361bc 0.1s => [eureka7001 2/3] ADD cloud-eureka-server-1.0-SNAPSHOT.jar wzy_eureka.jar 1.1s => [eureka7001 3/3] RUN bash -c 'touch /wzy_eureka.jar' 1.2s => [eureka7001] exporting to image 0.2s => => exporting layers 0.2s => => writing image sha256:131a3a890a4752e6ee52f37241e34d93e8a7452e68612d1768ec 0.0s => => naming to docker.io/library/wzy-eureka7001 0.0s => [payment8002 internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 606B 0.0s => [payment8001 internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 606B 0.0s => [payment8001 internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [payment8002 internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [payment8001 internal] load build context 1.3s => => transferring context: 66.18MB 1.2s => [payment8002 internal] load build context 1.1s => => transferring context: 60.94MB 1.0s => [payment8002 2/3] ADD cloud-provider-payment8002-1.0-SNAPSHOT.jar wzy_paymen 2.0s => [payment8001 2/3] ADD cloud-provider-payment8001-1.0-SNAPSHOT.jar wzy_paymen 1.9s => [payment8002 3/3] RUN bash -c 'touch /wzy_payment8002.jar' 3.5s => [payment8001 3/3] RUN bash -c 'touch /wzy_payment8001.jar' 3.5s => [payment8001] exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:231e68f5fc55027ea54ec28db5e2aff53804494641dfe8160ec3 0.0s => => naming to docker.io/library/wzy-payment8001 0.0s => [payment8002] exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:13313f5be823f61526bb2b53b7b019545783f52e8d8cdda4bc43 0.0s => => naming to docker.io/library/wzy-payment8002 0.0s [+] Running 6/8 ✔ Network wzy_wzy_net Created 1.0s ✔ Volume "wzy_portainer_data" Created 0.0s ✔ Container wzy-portainer-1 Started 1.6s ✔ Container wzy-eureka7001-1 Started 1.3s ✔ Container wzy-mysql-1 Started 1.3s ✔ Container wzy-redis-1 Started 1.1s ✔ Container wzy-payment8002-1 Started 0.9s ✔ Container wzy-payment8001-1 Started 0.9s如上即为成功,然后访问portainer,看到所有容器均已启动运行:
Portainer管理远程docker
1,编辑远程docker 配置文件,开放2375端口
想要本机portainer连接远程docker需要远程docker修改配置文件 打开2375的访问权限
远程docker 服务器上 编辑docker文件:/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
修改ExecStart行为下面内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
2 重新加载docke 配置
systemctl daemon-reload // 1,加载docker守护线程
systemctl restart docker // 2,重启docker
systemctl status docker.service //查看服务
3,Portainer 上添加服务
docker的2375端口,出于安全性考虑即(Docker Remote API未授权访问漏洞),是不开放的,如果想要管理远程docker,可以使用TLS机制来进行访问,这里以Portainer访问连接为例
Portainer添加远程Docker(TLS加密)
创建脚本文件ca.sh,使用vi编辑
touch ca.sh
vi ca.sh
把下面命令粘贴进去:wq保存,生成证书私钥签名是比较繁琐的事情,不嫌麻烦一条条手打也是可以的
#!/bin/bash set -e #相关配置信息 #连接的服务器IP SERVER="149.28.94.205" #密码 PASSWORD="monster" #国家 COUNTRY="cn" #省 STATE="guangdong" #市 CITY="shenzhen" #组织名称 ORGANIZATION="monster" #单位名称 ORGANIZATIONAL_UNIT="monster" #邮箱 EMAIL="767267711@qq.com" #创建然后切换到生产密钥的目录 mkdir -p /data/ca cd /data/ca #生成ca私钥(使用aes256加密) openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048 #生成ca证书,填写配置信息 openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL" #生成server证书私钥文件 openssl genrsa -out server-key.pem 2048 #生成server证书请求文件 openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server.csr #配置白名单 sh -c 'echo "subjectAltName = IP:'$SERVER',IP:0.0.0.0" >> extfile.cnf' sh -c 'echo "extendedKeyUsage = serverAuth" >> extfile.cnf' #使用CA证书及CA密钥以及上面的server证书请求文件进行签发,生成server自签证书 openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile extfile.cnf #生成client证书RSA私钥文件 openssl genrsa -out key.pem 2048 #生成client证书请求文件 openssl req -subj '/CN=client' -new -key key.pem -out client.csr sh -c 'echo extendedKeyUsage=clientAuth >> extfile.cnf' #生成client自签证书(根据上面的client私钥文件、client证书请求文件生成) openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf #删除无用文件 rm client.csr server.csr
执行ca.sh脚本
sh ca.sh
在data/ca/下可以看见生成的文件
修改docker配置
vi /usr/lib/systemd/system/docker.service
更改ExecStart行的值,使docker守护程序仅接收来自提供CA信任的证书的客户端的链接
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/data/ca/ca.pem --tlscert=/data/ca/server-cert.pem --tlskey=/data/ca/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
然后重载配置并且重启docker
systemctl daemon-reload && systemctl restart docker
将/data/ca/下生成的ca.pem、cert.pem、key.pem导出到本地,待会要使用这三个文件连接docker
回到Portainer-Environments-Add environments-Docker Standalone-Start Wizard
还是通过API方式,但是这次需要勾选TLS,然后把导出的3个文件,对应上传才能连接上
不开启TLS只通过IP+端口的方式已经连不上了,服务器那边设置了需要验证证书才能连上
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)