Docker部署jar,从零开始

Docker安装和使用

基本概念

  • Docker
    传统的程序运行时,环境配置较多,程序的迁移和扩展工作量较大。Docker正是解决这些问题最常用的方案。
    Docker给每个服务提供独立的稳定的环境,以保证程序环境的一致性(在不同机器上表现一致,避免开发机器可运行,而正式服务器出错的情况)。
    在持续集成、弹性扩展方面也可提供帮助。Docker也可以在一台服务器上启动多个服务,方便地构建微服务系统。
  • 镜像(image)
    镜像可以理解为一个服务的模板,包含了服务本身和必要环境依赖(Docker的意义所在)。
  • 容器(Container)
    运行镜像会产生一个容器,容器对外提供服务。容器和镜像的关系类似java中对象与类的关系,一个镜像可以被多次运行,产生多个容器,每个容器的修改和销毁,对镜像不会产生影响。
  • 宿主机
    我们把挂载容器的服务器称之为宿主机,Docker容器可以理解为低配的虚拟机,这个低配的虚拟机和宿主机具有相同的ip。即是说,若想访问容器的服务,用“宿主机:容器端口”即可。

Docker安装

我的服务器是CentOS7,其他环境的安装参考:Docker-菜鸟教程。
使用官方脚本自动安装。

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker

systemctl start docker

镜像使用

拉取镜像。hello-world是Docker官方镜像仓库Docker Hub提供的测试镜像,尝试拉取它。

docker pull hello-world

查看已有镜像。可以看到刚才拉取的hello-world镜像。

docker images

容器使用

hello-world镜像非常简单,他输出一段内容。现在运行hello-world镜像。

docker run hello-world

如果输出以下内容表示运行成功。

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
...
...
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

镜像运行后产生容器,查看容器。

#只查看运行中的容器
docker ps
#查看所有容器
docker ps -a

注意容器的CONTAINER ID,大部分对容器的操作都要用此字段。Docker的常用指令:Docker命令大全-菜鸟教程。

常用中间件

接下来我们安装一些常用的中间件,我的项目中用到了mysql和redis,用他们来举例。Docker启动服务的基本步骤就是拉取镜像、运行镜像(启动容器)。
与传统概念不同,Docker中每一个服务都要单独拉取镜像,并运行在独立的容器中。而非在一个linux容器中安装所有服务,因为这样的操作方式和传统部署无异。
所以我们要分别拉取每个中间件的镜像并运行。

mysql

拉取镜像,这里用5.7版本。

docker pull mysql:5.7

运行镜像。

docker run -d --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1

释义:

docker run:运行镜像。
-d:后台运行。
–name:为容器命名,此名称不可重复,否则运行失败。
-p 13306:3306:宿主机与容器之间的端口映射,格式为 宿主机端口:容器端口,通过访问宿主机的13306端口即可访问到容器的3306端口。Docker的配置都是宿主机在前,容器在后。这里特意用不同的端口以作区分。
-e MYSQL_ROOT_PASSWORD=root:mysql的参数,指定root用户密码,此参数为必填。
mysql:5.7:启动的镜像名称:版本。如不指定版本,则会启动latest版,如果本地镜像中没有latest版,将会自动从镜像库尝试pull。
–lower_case_table_names=1:表名忽略大小写。

用 docker ps -a 查看所有容器。如果mysql正常启动,它的状态应该是 Up xxx。
注意,即使run镜像失败,也会产生相应的容器,要启动同名的容器,必须先用 docker rm 容器id 将其移除。

可以用 docker logs 来查看容器日志。

docker logs --tail 200 -f mysql

接下来进入刚才启动的容器,修改root默认密码。

docker exec -it mysql /bin/bash

现在我们已经在容器内部(就是一个linux),可以使用容器内的mysql服务。

mysql -uroot -p

修改mysql默认密码

#切换数据库
use mysql;
#修改密码
update user set authentication_string=password('123456') where user='root';
#刷新权限
flush privileges;

redis

拉取镜像

docker pull redis

启动镜像

docker run -d -p 16379:6379 --name redis-master redis --requirepass 123456

释义

--requirepass 123456:设置密码

官方镜像的redis映射宿主机配置文件有一些问题,本人还在研究中。

rabbitmq

# 拉取镜像
docker pull rabbitmq:management
# 运行镜像
docker run -dit --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
# 如果需要mqtt则拉取
docker pull cyrilix/rabbitmq-mqtt
# 然后运行
docker run -d -p 1883:1883 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 8883:8883 -p 15672:15672 -p 25672:25672 -p 15675:15675 --name rabbitmq-mqtt cyrilix/rabbitmq-mqtt

释义

-e RABBITMQ_DEFAULT_USER=admin:默认账号为admin
-e RABBITMQ_DEFAULT_PASS=admin:默认密码为admin
-p 15672:15672 -p 5672:5672:15672是后端端口,5672是前端端口

运行后访问服务器的5672端口,如图,可以用账号密码登录了。
Docker部署jar,从零开始_第1张图片

后端jar包部署

jar包部署的原理是将jar包制作成为一个镜像,然后将其运行。就像运行一个mysql镜像一样。

编写Dockerfile

Dockerfile就是制作镜像的配置文件。先把需要部署的jar包上传到服务器,在jar包相同的目录创建一个名为Dockerfile的文件。

#编辑文件,如没有则会创建
vi Dockerfile

文件内容如下。

FROM java:8
MAINTAINER tom
ADD demo-0.0.1.jar demo.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","demo.jar"]

释义:

FROM java:8:制作的镜像继承自java:8这个镜像。
MAINTAINER tom:作者是tom。
ADD demo-0.0.1.jar demo.jar:将宿主机的 demo-0.0.1.jar 文件添加到镜像中,并命名为 demo.jar。
EXPOSE 8081:容器的端口为8081,也就是该服务的端口。
ENTRYPOINT [“java”,"-jar",“demo.jar”]:容器启动之后执行的命令,也就是启动该服务。

制作镜像

Dockerfile准备好就可以制作镜像了,指令如下:

docker build -t myimage/demo:1 .

释义:

myimage/demo:1:分组/镜像名:版本号。
最后的点表示Dockerfile在当前目录。

制作镜像完成后,docker images可以看到我们制作完成的镜像,就可以像运行其他镜像一样将其运行起来。

#运行镜像
docker run -d --name demo -p 8081:8081 myimage/demo:1
#查看容器列表
docker ps -a
#查看容器日志
docker logs --tail  300 -f demo

后端build镜像也可以用idea的Docker插件,本文不详细说。

前端nginx部署

将前端文件加上传后并解压。比如我的前端压缩包是:dist.zip

unzip dist.zip

然后在同级目录创建Dockerfile和nginx.conf。

vi Dockerfile
vi nginx.conf

Dockerfile内容如下:

# 继承自nginx的alpine版本镜像,该版本体积较小
FROM nginx:alpine
# 添加配置文件到镜像
ADD nginx.conf /etc/nginx/nginx.conf
# 添加前端程序包到镜像
ADD dist/ /usr/docker/nginx/dist/

nginx.conf内容如下:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events {
  use epoll;
  worker_connections 65535;
}

http {
  include mime.types;
  default_type application/octet-stream;
  log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
  
  access_log  /var/log/nginx/access.log  main;

  #charset gb2312;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
  
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 60;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  gzip on; 
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
 
  #limit_zone crawler $binary_remote_addr 10m;
  server {
    root         /usr/docker/nginx/dist;#项目路径
        
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
	    
    # 解决web单页面开发模式 nginx代理后刷新显示404
    location / {
      index index.html;
      try_files $uri $uri/ /index.html;	
    }
	
    error_page 404 /404.html;
      location = /40x.html {
    }
	
    error_page 500 502 503 504 /50x.html;
      location = /50x.html {
    }
	       
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
      expires 30d;
      # access_log off;
    }
    
    location ~ .*\.(js|css)?$ {
      expires 15d;
      # access_log off;
    }
    
    access_log off;
    
  }
}

之后就是制作镜像并运行了。

# 制作前端镜像
docker build -t dist:1 .
docker run -d -p 80:80 --name dist dist:1

现在就可以访问前端啦。

你可能感兴趣的:(java,docker,java,linux,数据库,mysql)