一、安装
Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问
为了方便演示,本例子使用docker部署一个Portainer ,首先拉取Portainer 镜像
docker pull portainer/portainer
创建卷积
docker volume create portainer_data
然后运行容器,其中: 9000端口是我们要访问的Portainer web 界面
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
-p 8000:8000 -p 9000:9000
: 将容器内部的8000端口映射到宿主机的8000端口,将容器内部的9000端口映射到宿主机的9000端口。
本地访问Portainer
容器成功运行后,我们在外部浏览器访问Linux 9000端口,即可看到Portainer 管理界面
上面首次登录,需要设置新登陆密码,设置完成后,即可登录管理界面,看到容器列表,本地部署访问就成功了
docker-compose安装
version: "3"
services:
portainer:
image: portainer/portainer:latest
container_name: portainer
ports:
- "9000:9000"
volumes:
- /app/portainer/data:/data
- /var/run/docker.sock:/var/run/docker.sock
docker-compose -f portainer.yml up
二、远程访问Docker(不推荐)
开启Docker 2375端口,让远端主机能够访问
1. 查看远端主机Docker的版本信息
docker -H tcp://10.4.7.81:2375 version
info
可以看到,远程无法访问,只能得到简单的Docker版本信息。如果想要远程能够访问,则必须进行设置。
2. 防火墙开放2375端口(否则将无法访问)
sudo firewall-cmd --add-port=2375/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all (查看开放可访问的端口)
3.修改/usr/lib/systemd/system/docker.service
修改其中的ExecStart
.
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
- “unix:///var/run/docker.sock”:unix socket,本地客户端将通过这个来连接 Docker Daemon
- “tcp://0.0.0.0:2375”:tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon
修改完后执行
systemctl daemon-reload
systemctl restart docker
4.远程使用Docker
docker -H tcp://10.4.7.81:2375 info
可以看到,可以充远程访问Docker了。
通过Docker Client也可以对远程主机上的Docker服务进行操作了。
三、添加安全传输层协议(TLS)和CA认证(推荐)
为了更便捷地打包和部署,服务器需要开放2375端口才能连接docker,但如果开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,任何知道你IP的人,都可以管理这台主机上的容器和镜像,非常不安全。
为了解决安全问题,只要使用安全传输层协议(TLS)进行传输并使用CA认证即可。
制作证书及秘钥
我们需要使用OpenSSL制作CA机构证书、服务端证书和客户端证书,以下操作均在安装Docker的Linux服务器上进行。
- 创建一个目录用于存储生成的证书和秘钥
mkdir /docker-ca && cd /docker-ca
- 创建CA证书私钥,期间需要输入两次密码,生成文件为
ca-key.pem
openssl genrsa -aes256 -out ca-key.pem 4096
- 根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,然后依次输入国家是 CN,省例如是Guangdong、市Shenzhen、组织名称、组织单位、姓名或服务器名、邮件地址,都可以随意填写,生成文件为
ca.pem
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
- 创建服务端私钥,生成文件为
server-key.pem
openssl genrsa -out server-key.pem 4096
- 创建服务端证书签名请求文件,用于CA证书给服务端证书签名。IP需要换成自己服务器的IP地址,或者域名都可以。生成文件
server.csr
openssl req -subj "/CN=192.168.3.171" -sha256 -new -key server-key.pem -out server.csr
- 配置白名单,用多个用逗号隔开,例如: IP:192.168.3.171,IP:0.0.0.0,这里需要注意,虽然0.0.0.0可以匹配任意,但是仍然需要配置你的服务器IP,如果省略会造成错误
echo subjectAltName = IP:192.168.3.171,IP:0.0.0.0 >> extfile.cnf
- 将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
- 创建CA证书签名好的服务端证书,期间需要输入CA证书私钥密码,生成文件为
server-cert.pem
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
- 创建客户端私钥,生成文件为
key.pem
openssl genrsa -out key.pem 4096
- 创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件
client.csr
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
- 要使密钥适合客户端身份验证,请创建扩展配置文件
echo extendedKeyUsage = clientAuth >> extfile.cnf
- 创建CA证书签名好的客户端证书,期间需要输入CA证书私钥密码,生成文件为
cert.pem
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
- 删除不需要的文件,两个证书签名请求
rm -v client.csr server.csr
- 修改证书为只读权限保证证书安全
- 归集服务器证书
最终生成文件如下,有了它们我们就可以进行基于TLS的安全访问了
- ca.pem CA证书
- ca-key.pem CA证书私钥
- server-cert.pem 服务端证书
- server-key.pem 服务端证书私钥
- cert.pem 客户端证书
- key.pem 客户端证书私钥
配置Docker支持TLS
- 修改docker.service文件
- 修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
- 重新加载daemon
systemctl daemon-reload && systemctl restart docker
- 重启docker
service docker restart
配置idea
- 保存相关客户端的pem文件到本地
四、应用
进入容器节点
界面说明
containers:容器
images:镜像
networks:网络
volumes:逻辑卷(存储)
容器
start:启动
stop:停止
kill:强制停止
restart:重启
pause:暂停
resume:从暂停状态恢复
remove:删除
add container:添加容器
查看单个容器
镜像
界面说明
Dashboard菜单
- 打开Dashboard菜单可以看到Docker环境的概览信息,比如运行了几个容器,有多少个镜像等;
App Templates菜单
- 打开App Templates菜单可以看到很多创建容器的模板,通过模板设置下即可轻松创建容器,支持的应用还是挺多的;
Containers菜单
- 选择一个容器,点击Logs按钮,可以直接查看容器运行日志,可以和docker logs命令说再见了;
- 点击Inspect按钮,可以查看容器信息,比如看看容器运行的IP地址;
- 点击Stats按钮,可以查看容器的内存、CPU及网络的使用情况,性能分析不愁了;
- 点击Console按钮,可以进入到容器中去执行命令,比如我们可以进入到MySQL容器中去执行登录命令;
Images菜单
- 打开Images菜单,我们可以查看所有的本地镜像,对镜像进行管理;
Networks菜单
其他菜单
- 打开Users菜单,我们可以创建Portainer的用户,并给他们赋予相应的角色;
- 打开Registries菜单,我们可以配置自己的镜像仓库,这样在拉取镜像的时候,就可以选择从自己的镜像仓库拉取了。
五、IDEA远程访问
5.1环境配置
1、安装docker插件并重启
File->Settings->Plugins->Marketplace->搜索docker->Docker安装
2.Dockre配置
打开idea->settings->build execution deployment->docker->点击加号添加docker配置,选择tcp链接,输入链接docker地址。这里首先要把docker端口2375对外开放才能链接。
配置完后,如果出现connection successfull,表示配置成功。
连接成功之后就可以使用服务器(虚拟机)上的docker了
5.2拉取镜像
idea可以通过可视化的方式拉取镜像,不用自己去敲命令
有时候会出现拉取的时间超时的情况,可以配置一下国内的镜像获取阿里云的加速器
5.3创建容器并运行(推荐命令行)
创建并且运行docker容器
创建成功之后可以看到新创建的容器,也可以在服务器(虚拟机)上用docker命令查看
重启容器、停止容器和删除容器等操作
5.4使用docker插件,实现一键自动化部署。
docker-maven-plugin可以不用Dockerfile,纯粹通过pom.xml的配置自动生成Dockerfile来构建Docker镜像。
dockerfile-maven依赖Dockerfile文件,需放到项目根目录下,也就是和pom.xml同级。
显然官方推荐的是 dockerfile-maven 这种依赖Dockerfile的方式,但是在部署 youlai-mall 项目使用 docker-maven-plugin 只要配置好 pom.xml 便无需修改外置配置了,所以更为方便省心,下面就这两种方式如何实现镜像构造进行逐一说明。其中统一以 youlai-mall 的 youlai-gateway 网关模块进行构建。
创建项目
我就以一个简单的Eureka项目演示。
File–> New -->Project --> Spring Initializr
配置项目
修改pom.xml文件,引入docker-maven-plugin插件相关配置. 改配置在<plugins>标签内
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,
用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名,这里是我们的项目名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签 这里指定的是镜像的版本,我们默认版本是latest-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定我们项目中Dockerfile文件的路径-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--指定远程docker 地址-->
<dockerHost>https://1.9.91.246:8080</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar包所在的路径 此处配置的即对应项目中target目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</plugin>
配置项目的基本配置。( 这里不是重点,一笔带过)
①修改application.properties,添加项目相关信息。(可略)
#项目启动的端口号和IP地址
server.port=9090
eureka.instance.hostname=127.0.0.1
# 是否将其注册到注册中心, 如果不是集群环境,false
eureka.client.register-with-eureka=false
# 是否检索服务,单机情况下为false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
② 找到项目启动类,添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
添加Dockerfile文件。
我们在EeurekaServer\src\main\resources目录下,添加文件名为Dockerfile的文件。
如果我们docker中没有java:8 这个镜像,请先使用docker pull java:8,将镜像先拉下来
FROM java:17
VOLUME /tmp
ADD *.jar app.jar
EXPOSE 9090
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar" ]
我们添加了一个VOLUME指向“/ tmp”的内容,因为这是Spring Boot应用程序默认为Tomcat创建工作目录的地方。效果是在“/var/lib/docker”下的主机上创建一个临时文件,并将其链接到“/ tmp”下的容器。对于我们在此处编写的简单应用程序,此步骤是可选的,但如果需要在文件系统中实际编写,则对于其他Spring Boot应用程序可能是必需的。
为了减少Tomcat的启动时间,我们添加了一个指向“/dev/urandom”的系统属性作为熵源。如果您使用Tomcat(或任何其他Web服务器)的“标准”版本,则不需要更新版本的Spring Boot。
maven打包,生成镜像
使用maven打包。我们在pom.xml中配置过,如果我们是用maven的package,那么就会自动使用Dockerfile文件进行构建。
我们从控制台可以看到,已经给我构建了一个和我们项目名相同的镜像文件。
我们在docker窗口可以看到,我们的镜像库中多个一个eurekaserver:latest镜像。
创建容器,项目部署到docker
我们在docker窗口中,找到我们刚才创建的镜像文件,鼠标右键,选择Create container,我们修改创建容器所需要的配置。
代补充