使用Portainer管理Docker镜像
上一篇,我们将项目打包,然后上传到镜像仓库中,现在来部署项目。这里写目录标题一、安装traefik作为反向代理-负载均衡器如果没有安装portainer的,可以搜下怎么安装,很简单,注意记得挂载目录。首先是创建服务:如果是单机Docker,可以直接运行创建service的命令,如果是集群,需要在docker的manager节点中运行。先看下Portainer是否正常启动:这里使用。一、安装trae
上一篇,我们将项目打包,然后上传到镜像仓库中,现在来部署项目。
目录:
如果没有安装portainer的,可以搜下怎么安装,很简单,注意记得挂载目录。
一、两步安装portainer
docker pull portainer/portainer
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /usr/soft/portainer_data:/data portainer/portainer
这里将portainer的端口映射到宿主机的9000上了。8000端口忘了是干嘛的了,这里也做个映射了。然后是挂载目录,这点是很重要的,防止容器重启后数据丢失。
第一次安装的时候,没有挂载目录:
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer
先看下Portainer是否正常启动:
然后直接访问IP+9000
即可。首次打开需要设置admin密码。设置密码后进入下图页面
如果是本机选择Local
点击Connect,进入portainer。
然后就可以创建和管理微服务了,但是如果是单机Docker,需要建一个伪集群,也就是只有一台服务器的集群,只有一个manager节点,然后才可以直接运行创建service的命令,如果是集群,需要在docker的manager节点中运行。
我这里就是只有一台docker服务器的伪集群。
二、创建Docker集群
在准备作为Docker集群管理节点的服务器上执行
docker swarm init
这里会初始化该服务器为docker集群的manager节点。
[root@localhost gc-manage-test]# docker swarm init
Swarm initialized: current node (a6m0a6dxjf9zq1tisutnfc8ac) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3p8iyw5v4lauw8x4hglqx69a1jgewjjhaz17dvjtsgbplzpthn-ck7h35yodyfrjtyjvetqfz8ya 192.168.106.51:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
可以看到正常初始化了。如果添加docker节点的话,可以在节点上执行上面中间一行提示的命令docker swarm join。。。
即可。
如果想脱离集群,则执行
docker swarm leave
至此,docker集群/伪集群就搭好了。
最后如果搭建了镜像仓库,则可以将搭建的镜像仓库添加进来,后面创建service后,可以直接拉取镜像执行:
三、安装traefik作为反向代理-负载均衡器
- 创建Traefik和容器应用的连接网络:
sudo docker network create traefik-net
注意这里创建的为bridge
类型的network,如果使用的是集群的话,需要创建overlay
类型的。
docker network create -d overlay traefik-net
然后使用命令:docker network ls
查看
或者在Portainer中看到新建的network
--------------------------------------2021-03-16---------------------------------
https://github.com/webees/traefik-swarm/blob/master/traefik.yml
在折腾了几天后,瞎猫碰上死耗子,使用上面的配置文件终于搭好了。。。。。。。。。
这个使用的集群配置,如果是单机docker可能不适用。可以试下下面3.12的。
这里防止github偶尔访问不了耽误事,这里我给上传到百度云上了:
链接: https://pan.baidu.com/s/1Tj__IVdDfreSRuVz_2IcFw 提取码: 2852
下载下来,然后上传到服务器,接着解压:
如果没有预装unzip命令的话,需要先装一下,否则无法解压zip压缩包:
yum list | grep zip/unzip
如果什么也没有,则表示未安装unzip命令包
安装zip和unzip命令:
yum install -y zip
yum install -y unzip
unzip traefik-swarm-master.zip
解压后文件:
其中 traefik.yml 文件内容很长,对应配置也应该很全了。我看traefik.yml
里面用到了:名为net_traefik
的network,这里我也提前创建了一个,但是它自己又创建了一个,就很神奇。
文件内默认的network需要改下名字。因为我本地已经创建了一个同名的bridge类型的network,所以这里我就改成net_traefik
了。如果不想改上面的文件,则下面执行创建network时,记得与traefik.yml 里面用到的保持一致。
docker network create -d overlay net_traefik
上面配置文件中写的用了traefik:latest版本的镜像,这次在另一台机器上安装的时候,本地还没有拉取traefik镜像,这里直接执行也是没有报错,然后看下镜像,好像这里运行下面的命令后直接构建了一个镜像了,没有版本标识的镜像:
解压后,在解压后的目录下,安装traefik:
docker stack deploy traefik -c traefik.yml
[root@localhost traefik-swarm-master]# docker stack deploy traefik -c traefik.yml
Creating network traefik_net_traefik
Creating service traefik_traefik
[root@localhost traefik-swarm-master]#
[root@localhost traefik-swarm-master]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9029f853cf8 traefik:latest "/entrypoint.sh --gl…" 3 seconds ago Up 2 seconds (health: starting) 80/tcp traefik_traefik.1.po6rhgmsuryz5rhv4ts422o3f
[16:46:59]0ea9dbfad88f 192.168.104.51:5000/centos/jdk8 "/bin/bash" 22 hours ago Up 22 hours jdk8
dba9163fbb1a portainer/portainer "/portainer" 4 days ago Up 4 days 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp portainer
7f402c2baab1 jenkinszh/jenkins-zh "/sbin/tini -- /usr/…" 4 days ago Up 4 days 0.0.0.0:50000->50000/tcp, 0.0.0.0:9999->8080/tcp jenkins
133c169a74d4 registry:2 "/entrypoint.sh /etc…" 2 weeks ago Up 4 days 0.0.0.0:5000->5000/tcp registry
[root@localhost traefik-swarm-master]#
可以看到,直接运行了traefik:latest
镜像,(截止2021-03-16,latest版本为2.0+)如果当前服务器上没有该镜像,则会自动拉取latest镜像。
然后自动创建了一个名为traefik_net_traefik
的network 和一个名为traefik_traefik
的服务。
-------------2021-03-30-------------------
后面发现了一个问题,在启动traefik的时候,日志里面提示acme.json的权限问题:unable to get ACME account: permissions 644 for /cert/acme.json are too open, please use 600"
。意思是这个文件的权限太大了,应该改为600。修改的命令是:chmod 600 acme.json
这里Linux文件权限为:
数字权限使用格式
在这种使用方式中,首先我们需要了解数字如何表示权限。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,
如:
rwx = 4 + 2 + 1 = 7
rw = 4 + 2 = 6
rx = 4 +1 = 5
即
若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7
若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6
若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5
上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。语法格式为 :
chmod <abc> file...
a,b,c各为一个数字,分别代表User、Group、及Other的权限。
相当于简化版的
chmod u=权限,g=权限,o=权限 file…
而此处的权限将用8进制的数字来表示User、Group、及Other的读、写、执行权限
设置所有人可以读写及执行
chmod 777 file (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file)
设置拥有者可读写,其他人不可读写执行
chmod 600 file (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )
这次在另一台服务器上安装traefik后,发现配置文件里面用到了一个名为net_traefik
的network,但是我本地并没有创建这个network,而是直接运行了构建的命令:docker stack deploy traefik -c traefik.yml
,竟然发现也是没有报错的,只是执行命令后,终端进程会停留一段时间,构建过程的时间长短应该跟服务器配置有关。
如果没有创建docker swarm的话,运行构建命令会提示初始化:
这时如果在portainer里面看到service菜单的话,该服务也应该是一直是Preding状态,并不是running状态的,需要给他点时间。并且docker ps 也是看不到运行中的traefik 相关的容器的。
之后发现这里创建了另外一个network,并且创建了一个名为traefik_traefik的服务。但是此服务启动需要点时间,命令执行结束后,我去portainer里面查看,发现该服务有一个实例,但是运行却是0个。此时使用docker images
查看本地镜像时,也是没有traefik的镜像的。
等了一分钟左右,刷新页面,发现实例已经正常启动了,并且本地也可以看到没有版本号的traefik镜像了。
如果安装了portainer,可以在service菜单里面看到,如果没有则退出登录再次查看即可看到左侧菜单栏的service菜单。
唯一我纠结的问题是,traefik_traefik的服务占用了80端口,这个可以理解,但是我把80端口改为别的端口,其负载均衡的功能仍然好使,我就很纳闷了。。。。。。。。
然后还有就是,traefik.yml 配置文件里面,貌似没有开启dasboard,所以访问8080端口,看不到控制面板页面。
看下labels的内容,这里将负载均衡的端口挂在8080了,我看别的博客里面说随意写一个端口就行,这里我就没改。
- traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$8EVjn/nj$$GiLUZqcbueTFeD23SuB6x0
这行是第一的验证账户密码的,账户密码都为admin
。
接着我再次创建服务,则就可以成功了。注意创建服务的命令中net-work的使用,需要本地存在这个network才行,按照我的想法,应该是需要跟上面traefik使用的是一致的,但是traefik中使用的是net_traefik
,运行起来却自动创建了一个名为traefik_net_traefik
的。所以下面我创建服务的时候,也就用了这个了。不确定这里面的对应关系。
这次使用的命令如下:
docker service create \
--mount type=bind,source=/data/logs/gc-manage-backend,dst=/workspace/gc-manage-backend/logs \
-e JAVA_OPTS='-server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow' \
-p 8888:8888 \
--name gc-manage-one \
--with-registry-auth \
--label traefik.port=8888 \
--label traefik.enable=true\
--label traefik.backend=gc-manage-one\
--network traefik_net_traefik \
--label traefik.backend.loadbalancer.sticky=true \
--label traefik.frontend.entryPoints=http,https \
--label traefik.frontend.priority=1 \
--label traefik.frontend.redirect.entryPoint=http \
--label traefik.frontend.rule=PathPrefix:/api \
192.168.104.51:5000/test/gc-manage-test:1.0_27
这里挂载目录使用的是mount,这种方式不会自动创建文件夹,也就是需要提前创建,否则会提示挂载的文件夹不存在,创建多层文件夹使用命令:mkdir -p /data/logs/gc-manage-backend
服务正常启动后,进度条才会走完,过程可能会慢点,只要不报错即可。如果docker镜像本身有问题的话,这里肯定是无法正常启动的。
这里贴下我创建服务的命令和项目的Dockerfile内容。
Dockerfile:
FROM 192.168.104.51:5000/centos/jdk8
VOLUME /tmp
COPY gc-manage-backend/distribution/target/spring-boot-plus-server-2.0/spring-boot-plus-server-2.0 /workspace/gc-manage-backend
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV JAVA_OPTS="" BASE_PATH="/workspace/gc-manage-backend" APPLICATION_JAR="bootstrap-2.0.jar" CONFIG_DIR="/workspace/gc-manage-backend/config/" LOG_DIR="/workspace/gc-manage-backend/logs/"
ENTRYPOINT [ "sh", "-c", "java ${JAVA_OPT} -Dfile.encoding=utf-8 -jar ${BASE_PATH}/lib/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} --logging.config=${CONFIG_DIR}logback.xml "]
这个Dockerfile还坑了我大半天,可以看下Dockerfile的基础语法,这样改动上面的内容时,还是很简单的。
之前是单模块的springboot项目,直接将maven构建的jar 添加过来再打包就好了,而这次项目是多模块的maven项目,maven打包之后,并没有将所有的依赖打包到一个jar里面,打包的目录为lib存放了所有的jar,包括依赖和各模块的jar,然后是config文件夹,存放的是项目的配置文件。
所以这里直接将整个文件夹copy到容器内部了。
COPY gc-manage-backend/distribution/target/spring-boot-plus-server-2.0/spring-boot-plus-server-2.0 /workspace/gc-manage-backend
然后改来改去,ENTRYPOINT
里面就变成了上面的一大堆,这是根据我的项目写的启动脚本,最简单粗暴的方式就是直接 java -jar -Application.jar
如果使用Jenkins构建docker镜像成功后,镜像运行不起来的话。可以单独测试maven打包的文件,直接运行是否正常,如果正常,则表示docker封装镜像的时候出错了,那就仔细检查Dockerfile文件的内容。
docker service create \
--mount type=bind,source=/data/logs/gc-manage-backend,dst=/workspace/gc-manage-backend/logs \
-e JAVA_OPTS='-server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow' \
-p 8888:8888 \
--name gc-manage-one \
--with-registry-auth \
--label traefik.port=8888 \
--label traefik.enable=true\
--label traefik.backend=net_room\
--network net_traefik \
--label traefik.backend.loadbalancer.sticky=true \
--label traefik.frontend.entryPoints=http,https \
--label traefik.frontend.priority=1 \
--label traefik.frontend.redirect.entryPoint=http \
--label traefik.frontend.rule=PathPrefix:/net_room \
192.168.104.51:5000/test/gc-manage-test:1.0_22
这个命令可以正常启动微服务打成的docker镜像,其中:
–mount type=bind,source=/data/logs/gc-manage-backend,dst=/workspace/gc-manage-backend/logs 为挂载的日志目录,貌似不正确,日志文件没有生成。
--label traefik.port=8888 代表映射此服务的运行端口,这样一看,貌似上面的-p 8888:8888 没用了。
traefik.backend=net_room 为微服务的名称,别的微服务可以直接使用此名称替代IP进行HTTP调用。
--------------------------------------2021-03-12---------------------------------
参考:https://www.howtoing.com/ubuntu-docker-traefik-proxy
Traefik预安装(仅供参考)
在创建所有traefik配置之前,我们需要安装’apache2-utils’来生成加密的htpasswd密码并创建新的traefik目录。
Ubuntu:使用下面的命令安装’apache2-utils’。
sudo apt install apache2-utils -y
CentOS:
yum -y install httpd-tools
然后为用户名linmengmeng
生成密码。
htpasswd -nb linmengmeng password
然后安装docker-compose
,Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.24.1。下载速度很迷。。。。。
上面路径下载文件到:/usr/local/bin/
下了。
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
新建 traefik
文件夹:mkdir /usr/soft/traefik ,进去该文件夹。
创建Traefik配置、使用vim编辑器创建一个新的配置文件’traefik.toml’。
vim traefik.toml
也可以看下默认样板的配置文件:
使用命令下载配置文件:wget https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml
,此命令会下载到当前文件夹下。如果提示:Unable to establish SSL connection.
,则在命令后加--no-check-certificat
这里使用自定义的新文件:traefik.toml
内容如下:
#Traefik Global Configuration
debug = false
checkNewVersion = true
logLevel = "ERROR"
#Define the EntryPoint for HTTP and HTTPS
defaultEntryPoints = ["https","http"]
#Enable Traefik Dashboard on port 8080
#with basic authentication method
#mohammad and password
[web]
address = ":8080"
[web.auth.basic]
users = ["linmengmeng:$apr1$j.5GChSD$DjTk3/npiY/MD7.1ZDipB1"]
#Define the HTTP port 80 and
#HTTPS port 443 EntryPoint
#Enable automatically redirect HTTP to HTTPS
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
#Enable retry sending a request if the network error
[retry]
#Define Docker Backend Configuration
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "traefik.test.io"
watch = true
exposedbydefault = false
#Letsencrypt Registration
#Define the Letsencrypt ACME HTTP challenge
[acme]
email = "linmengmeng@qq.com"
storage = "acme.json"
entryPoint = "https"
OnHostRule = true
[acme.httpChallenge]
entryPoint = "http"
创建Traefik Docker Compose脚本
现在创建docker-compose yml脚本。
vim docker-compose.yml
内容为:
version: '3'
services:
traefik:
image: traefik:latest
command: --docker --docker.domain=test.io
ports:
- 80:80
- 443:443
networks:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./acme.json:/acme.json
labels:
- "traefik.frontend.rule=Host:traefik.test.io"
- "traefik.port=8080"
container_name: traefik
restart: always
networks:
proxy:
external: true
保存并退出。
注意:
- 我们正在基于’traefik:latest’Docker窗图像创建一个名为’traefik’的新容器。
- 'traefik’容器将在名为’traefik-net’的自定义docker网络上运行,并公开外部端口HTTP 80和HTTPS 443。
- 容器将安装traefik配置’traefik.toml’和’acme.json’,包括docker sock文件。
traefik,前端域名和traefik端口的标签配置。
Letsencrypt ACME配置
traefik.toml
上的acme配置用于自动生成SSL letsencrypt。 并且它是存储文件’acme.json’所必需的。
创建一个新的JSON文件’acme.json’并将权限更改为’600’。
touch acme.json
chmod 600 acme.json
有关SSL letsencrypt信息的所有日志都将保存在文件中。
建立Traefik容器
现在我们准备使用上面的配置文件构建我们自己的traefik容器了。
ls -lah
可以看到所有配置,‘traefik.toml
’,'docker-compose.yml
’和’acme.json
’文件。
使用下面的docker compose命令构建容器。
docker-compose up -d
下载后,使用vim编辑/新增 traefik.toml
vim traefik.toml
然后修改文件内容:
debug = false
logLevel = "ERROR"
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[retry]
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "docker.localhost"
watch = true
exposedByDefault = false
usebindportip = true
swarmMode = false
network = "traefik-net"
这里是单机Docker,集群没有测试。
然后运行创建服务命令:
docker run -d \
--name traefik \
-p 8080:8080 \
-p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
traefik
如果没有创建该服务,在创建service里面使用了,则会提示:No such network: traefik-net
四、日志文件挂载后,宿主机上挂载文件夹为空
上面创建service
的时候,明明已经挂载了镜像内的日志文件夹到宿主机上
docker service create \
--mount type=bind,source=/data/logs/gc-manage-backend,dst=/workspace/gc-manage-backend/logs \
一度以为是项目的日志配置文件出问题了呢,今天准备换一个日志配置文件了,进入docker容器内部看了下,发现根目录下有个logs目录,进入一看,原来是日志文件正常生成了,但是不是我挂载的那个目录。。。
查找原因的过程:
[10:14:43][root@localhost ~]# docker ps
[10:14:44]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[10:14:44]cac79378e1a7 192.168.104.51:5000/test/gc-manage-test:1.0_29 "sh -c 'java ${JAVA_…" 3 minutes ago Up 3 minutes gc-manage-one.1.iq7lvl22n5a0rmmwtjnwqs3wx
[10:14:44]0ea9dbfad88f 192.168.104.51:5000/centos/jdk8 "/bin/bash" 9 days ago Up 9 days jdk8
[10:14:44]dba9163fbb1a portainer/portainer "/portainer" 12 days ago Up 12 days 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp portainer
[10:14:44]7f402c2baab1 jenkinszh/jenkins-zh "/sbin/tini -- /usr/…" 13 days ago Up 12 days 0.0.0.0:50000->50000/tcp, 0.0.0.0:9999->8080/tcp jenkins
[10:14:44]133c169a74d4 registry:2 "/entrypoint.sh /etc…" 3 weeks ago Up 12 days 0.0.0.0:5000->5000/tcp registry
[10:15:05][root@localhost ~]# docker exec -it cac79378e1a7 /bin/bash
[10:15:09][root@cac79378e1a7 /]# ls
[10:15:09]anaconda-post.log bin dev etc home jdk1.8.0_121 lib lib64 logs lost+found media mnt opt proc root run sbin srv sys tmp usr var workspace
[10:15:15][root@cac79378e1a7 /]# cd workspace/
[10:15:16][root@cac79378e1a7 workspace]# ls
[10:15:16]gc-manage-backend
[10:15:20][root@cac79378e1a7 workspace]# cd gc-manage-backend/
[10:15:26][root@cac79378e1a7 gc-manage-backend]# ls
[10:15:26]LICENSE README.md bin config lib logs
[10:15:32][root@cac79378e1a7 gc-manage-backend]# cd logs/
[10:15:33][root@cac79378e1a7 logs]# ls
[10:16:58][root@cac79378e1a7 logs]# ls
到这里发现容器里面对应的挂载的文件夹也是空的??? 这时候还在怀疑是日志文件没有生成呢。
[10:17:10][root@localhost ~]# docker ps
[10:17:10]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[10:17:10]cac79378e1a7 192.168.104.51:5000/test/gc-manage-test:1.0_29 "sh -c 'java ${JAVA_…" 6 minutes ago Up 5 minutes gc-manage-one.1.iq7lvl22n5a0rmmwtjnwqs3wx
[10:17:10]0ea9dbfad88f 192.168.104.51:5000/centos/jdk8 "/bin/bash" 9 days ago Up 9 days jdk8
[10:17:10]dba9163fbb1a portainer/portainer "/portainer" 12 days ago Up 12 days 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp portainer
[10:17:10]7f402c2baab1 jenkinszh/jenkins-zh "/sbin/tini -- /usr/…" 13 days ago Up 12 days 0.0.0.0:50000->50000/tcp, 0.0.0.0:9999->8080/tcp jenkins
[10:17:10]133c169a74d4 registry:2 "/entrypoint.sh /etc…" 3 weeks ago Up 12 days 0.0.0.0:5000->5000/tcp registry
[10:21:17][root@localhost ~]# docker exec -it cac79378e1a7 /bin/bash
[10:21:18][root@cac79378e1a7 /]#
[10:21:19][root@cac79378e1a7 /]#
[10:21:19][root@cac79378e1a7 /]#
[10:21:23][root@cac79378e1a7 /]# ls
[10:21:23]anaconda-post.log bin dev etc home jdk1.8.0_121 lib lib64 logs lost+found media mnt opt proc root run sbin srv sys tmp usr var workspace
[10:21:33][root@cac79378e1a7 /]# cd logs/
[10:21:34][root@cac79378e1a7 logs]# ls
[10:21:34]spring-boot-plus-error.log spring-boot-plus.log
这次进入容器内部发现,容器的根目录下有个logs文件夹,进去一看,果然日志文件原来在这里,然后去portainer里面修改容器挂载的目录
然后就可以在宿主机的/data/logs/gc-manage-backend
文件夹下面看到容器的日志文件了。
五、容器内日志文件中文乱码问题
在尝试了在Dockerfile
文件里面添加环境变量ENV LANG=C.UTF-8
后,还是中文乱码,然后在jvm里面添加参数-Dfile.encoding=UTF-8
就好使了。
最后的Dockerfile文件内容:
FROM 192.168.104.51:5000/centos/jdk8
VOLUME /tmp
COPY gc-manage-backend/distribution/target/spring-boot-plus-server-2.0/spring-boot-plus-server-2.0 /workspace/gc-manage-backend
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV LANG=C.UTF-8 JAVA_OPTS="" BASE_PATH="/workspace/gc-manage-backend" APPLICATION_JAR="bootstrap-2.0.jar" CONFIG_DIR="/workspace/gc-manage-backend/config/" LOG_DIR="/workspace/gc-manage-backend/logs/"
ENTRYPOINT [ "sh", "-c", "java ${JAVA_OPT} -Dfile.encoding=UTF-8 -jar ${BASE_PATH}/lib/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} --logging.config=${CONFIG_DIR}logback.xml "]
更多推荐
所有评论(0)