上一篇,我们将项目打包,然后上传到镜像仓库中,现在来部署项目。

如果没有安装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作为反向代理-负载均衡器

  1. 创建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 filechmod a=rwx file)

设置拥有者可读写,其他人不可读写执行

chmod 600 file (等价于  chmod u=rw,g=---,o=--- filechmod 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

保存并退出。

注意:

  1. 我们正在基于’traefik:latest’Docker窗图像创建一个名为’traefik’的新容器。
  2. 'traefik’容器将在名为’traefik-net’的自定义docker网络上运行,并公开外部端口HTTP 80和HTTPS 443。
  3. 容器将安装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 "]

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐