— java — 1 min read
近些年容器技术非常流行,可以解决环境上的问题。让不同的应用之间环境隔离,不会冲突。在团队开发中,使用容器技术可以统一团队成员之间的环境问题,不用担心我本地可以,测试和生产不行的问题了。
容器技术目前主流的是以docker
为代表,这里就介绍下将原有的老项目迁移到docker
的方案。当然最简单的就是直接迁移docker
不考虑管理和编排。
docker
针对不同的GNU/Linux
发型版有不同的安装方法,下面以REHL/CentOS
为示例安装:
注意:
Docker
对Linux
内核版本的最低要求是3.10
(请先查看内核版本,命令:uname -r
注意以下部分命令需要sudo
权限(取决你是普通用户),如果是root用户无需添加sudo.
检查docker是否已经安装:
1$ sudo docker -v
如果有输出docker版本信息,则可以跳过安装步骤
安装依赖包:
1$ sudo yum install -y yum-utils \2 device-mapper-persistent-data \3 lvm2
添加docker稳定版本源:
1$ sudo yum-config-manager \2 --add-repo \3 https://download.docker.com/linux/centos/docker-ce.repo
安装docker最新版:
1$ sudo yum install docker-ce -y
启动docker服务:
1$ sudo systemctl start docker
验证docker是否可用。
1$ sudo docker run hello-world
有如下信息则说明docker已经安装成功并且服务正常
1Unable to find image 'hello-world:latest' locally2latest: Pulling from library/hello-world31b930d010525: Pull complete4Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf55Status: Downloaded newer image for hello-world:latest67Hello from Docker!8This message shows that your installation appears to be working correctly.910To generate this message, Docker took the following steps:11 1. The Docker client contacted the Docker daemon.12 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.13 (amd64)14 3. The Docker daemon created a new container from that image which runs the15 executable that produces the output you are currently reading.16 4. The Docker daemon streamed that output to the Docker client, which sent it17 to your terminal.1819To try something more ambitious, you can run an Ubuntu container with:20 $ docker run -it ubuntu bash2122Share images, automate workflows, and more with a free Docker ID:23 https://hub.docker.com/2425For more examples and ideas, visit:26 https://docs.docker.com/get-started/
docker命令每次加sudo很烦,不加权限不够. 将用户加入docker用户组(docker会自动创建docker组)
1$ sudo usermod -aG docker $USER
重新登入ssh或者新建终端生效
提供以下常用docker命令方便维护容器。
查看正在运行的容器:
1$ docker ps
查看已经停止的容器:
1$ docker ps -ak
停止正在运行的容器:
1$ docker stop 容器名称
启动已经停止的容器:
1$ docker start 容器名称
注意,不一定可以启动成功。如果启动失败,请检查日志并分析原因。
查看容器日志
1$ docker logs -f 容器名称
此方案适合单服务器项目,如果是多服务器容器集群。需要用到容器编排服务,如docker-compose
或docker swarm
或者k8s
。
由于公司项目的tomcat
服务一般不暴露外网访问,前面有nginx
反向代理。所以可以采用单机部署方案。
如果是nginx
集群则不能使用单机部署方案,存在跨服务器容器之间无法通信问题,需要采用容器编排工具进行编排。
迁移tomcat
服务到docker
容器进行测试:
需要复制的内容(
conf
下的context.xml
,和server.xml
bin
下的catalina.sh
(JVM参数配置)虽然单机部署可以使用docker run --name tomcat
这种方式,但是这种方式不利于维护和后期扩展。
所以建议将配置写到配置文件中。
本地或者测试环境使用docker-compose
做为容器编排工具。
生产环境请使用docker-swarm
或者k8s
。
下载docker-compose
:
1$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
设置可执行权限:
1$ sudo chmod +x /usr/local/bin/docker-compose
创建快捷方式:
1sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
检查是否安装成功:
1$ docker-compose --version
如果有输出docker-compose版本信息则安装成功。
编写hhr的配置文件:
1ersion: '3'2services:3 tomcat:4 # 主机名称5 hostname: hhr-tomcat6 # 容器名称7 container_name: hhr-tomcat8 # 指定镜像版本9 image: tomcat:8.5.5010 # 映射端口11 ports:12 - 9093:80801314 volumes:15 # 映射war包目录16 - /app/docker/hhr/tomcat/webapps/:/usr/local/tomcat/webapps/17 # 映射context.xml18 - /app/docker/hhr/tomcat/conf/context.xml:/usr/local/tomcat/conf/context.xml19 # 映射server.xml20 - /app/docker/hhr/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml21 # 映射logs目录22 - /app/docker/hhr/tomcat/logs/:/usr/local/tomcat/logs/23 #映射catalina.sh24 - /app/docker/hhr/tomcat/bin/catalina.sh:/usr/local/tomcat/bin/catalina.sh25 # 映射config目录26 - /app/docker/hhr/tomcat/bin/config:/usr/local/tomcat/config27 restart: always
注意以上映射文件里面的内容,里面的地址一定要修改成容器里面的路径而不是本机的路径,docker里面的tomcat读取的路径是docker里面的 volumes冒号分隔的前面部分就是本地映射目录,冒号后面的对应容器里面的目录地址 ports为本地和容器之间的端口映射,注意容器后面的8080应该对应tomcat配置文件中的启动端口
在启动docker-compose之前,将本地映射目录的目录和文件创建好(如果先启动容器则会自动创建对应的目录)
创建映射目录后,开始启动。
进入docker-compose.yml
的文件目录,在终端输入以下命令启动:
1$ docker-compose up
注意,这是以控制台方式启动方便看日志。按ctrl-c会中断停止服务。
如果想以后台启动服务则使用命令:
1$ docker-compose up -d
强烈推荐这种,docker-compose up中断后会自动删除容器的
先后台启动然后再查看日志,
1$ docker logs -f 容器名称
查看日志信息没问题后,就可以通过地址访问了,注意访问的时候要通过映射的端口访问。上面映射的是9093,所以访问的地址也是9093。
成功部署一台到服务器后,就可以把其余服务器也部署了,方法有好几种:
将当前容器打包成镜像,上传到docker
的仓库,然后其他服务器使用docker pull
再运行就可以 了。由于dockerhub
免费账号仓库只能是公开的,所以除非自己搭建私服。不然不建议这种方式。
将docker-compose.yml
复制到其他服务器,然后直接docker-compose up -d
同样的也启动成功了。
推荐,映射目录也要同上先创建好
将docker
容器打包成压缩包,复制到其他服务器,使用docker
命令解压运行即可。
(完)