docker web控制台安装
- 查找镜像
- 编写docker-compose文件
- 为portainer添加ssl支持
查找镜像
docker search portainer
这里拉取portainer/portainer-ce这个镜像
编写docker-compose文件
version: '3'
services:
portainer:
image: portainer/portainer-ce
container_name: portainer
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock #因为需要管理docker,所以需要配置docker.sock文件映射
- ./data:/data #portainer默认挂载的数据目录
networks:
portainer:
ipv4_address: "10.10.110.80"
networks:
portainer:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.0.0/16
运行portainer
docker-compose up -d
第一次访问页面需要配置账号密码
选择docker
点击local进入容器管理界面
为portainer添加ssl支持
这里我没有具体去看过portainer官方的ssl配置,就使用nginx反向代理的方式实现ssl
1.在同级目录下创建ssl目录
# 当前目录为/root/portainer,创建之后为/root/portainer/ssl
mkdir ssl && cd ssl
这里生成证书我使用的是cfssl进行生成,下载地址 https://pkg.cfssl.org/
或者执行以下脚本进行安装
wget -O /usr/local/sbin/certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x /usr/local/sbin/certinfo
wget -O /usr/local/sbin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x /usr/local/sbin/cfssl
wget -O /usr/local/sbin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x /usr/local/sbin/cfssljson
2.编写ca-config.json文件
使用cfssl打印默认ca-config文件,对其进行修改
cfssl print-defaults config > ca-config.json
修改后的ca-config.json
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"portainer": {
"expiry": "876000h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
}
}
}
}
3.编写ca-csr.json文件
使用cfssl命令打印默认ca-csr配置
cfssl print-defaults csr > ca-csr.json
修改后的ca-csr.json
{
"CN": "www.portainer.com.cn",
"hosts": [
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
4.生成ca根证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
目录如下
5.编写server端证书配置
cfssl print-defaults csr > server-csr.json
修改后的server-csr.json
{
"CN": "www.portainer.com.cn",
"hosts": [
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
6.生成server端证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=portainer server-csr.json | cfssljson -bare server
目录如下
7.在docker-compose.yml添加nginx
返回到portainer目录,修改docker-compose.yml文件,内容如下
docker-compose.yml
version: '3'
services:
portainer:
image: portainer/portainer-ce
container_name: portainer
#ports:
#- 9000:9000 不需要暴露端口,通过nginx暴露
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
networks:
portainer:
ipv4_address: "10.10.110.80"
nginx:
image: nginx:alpine
container_name: portainer-web
ports:
- 443:443
volumes:
- ./ssl:/opt/ssl/portainer
- ./conf.d:/etc/nginx/conf.d
networks:
- portainer
networks:
portainer:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.0.0/16
8.编写nginx配置文件
在同级目录创建conf.d目录
mkdir conf.d && cd conf.d
编写portainer.conf文件
upstream portainer {
ip_hash;
server 10.10.110.80:9000 weight=1;
}
server {
listen 443 ssl http2 default_server;
server_name www.portainer.com.cn [::]:443 ssl http2 default_server;
ssl_certificate /opt/ssl/portainer/server.pem; # pem文件的路径
ssl_certificate_key /opt/ssl/portainer/server-key.pem; # key文件的路径
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_set_header X-Real-IP $remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里
proxy_pass http://portainer;
}
}
目录如下
9.启动容器
返回到portainer目录
cd ..
目录结构如下
执行docker-compose.yml脚本
docker-compose up -d
通过浏览器访问页面效果如下
因为是自签证书,所以这里报的是不安全