传统的linux搭建java项目,步骤比较麻烦,每款软件的安装配置等是多样化的。每款软件有各自的安装步骤,繁琐的命令,着实让人头疼。笔者从接触docker技术后,整理了该教程。让自己成长,还有和技术朋友们共同进步~~~
Docker的作用:缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个大盒子,里面可以装很多物件,如果需要这些物件的可以直接将这个大盒子拿走,而不需要从这个大盒子中一件件的取。)docker鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)
传统虚拟机于容器技术的对比:
虚拟机 | 容器 | |
---|---|---|
占用磁盘空间 | 非常大,GB级 | 小,MB甚至KB级 |
启动速度 | 慢,分钟级 | 快,秒级 |
运行形态 | 运行于Hypervisor上 | 直接运行在宿主机内核上 |
并发性 | 一台宿主机上十几个,最多几十个 | 上百个,甚至数百上千个 |
性能 | 逊于宿主机 | 接近宿主机本地进程 |
资源利用率 | 低 | 高 |
命令这种东西只有敲了才是自己的,所以docker的命令,笔者放在实际操作中去介绍以及显示,跟着流程一步一步去实现,多操作可以记住。
话不多说跟着笔者直接一步一步进行操作:
搭建环境说明:Docker要求CentOS系统的内核版本高于 3.10,必须是 64 位操作系统,centos系统下查看内核版本命令
uname -r
一般系统会帮我们安装好yum,如果没有的话,这里有教程:https://blog.51cto.com/3069201/2058781
已有yum的,更新最新版本yum:
(1)yum 包更新到最新:
sudo yum update
(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)设置yum源为阿里云(国内的话设置为国内地址比较快,原因你懂的!):
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(1)安装docker
sudo yum install docker-ce
(2)安装后查看docker版本
docker -v
网上许多教程说添加或者修改daemon.json文件,进行修改docker的镜像源,改为国内的镜像源,下载比较快。其实,默认拉取的最新版本docker中已经帮我们,配置了国内的镜像源。看图1,图2。
如果想改为其他的镜像源请搜索一下国内镜像源网址,编辑该文件修改:
vi /etc/docker/ademon.json
重启docker服务:
systemctl stop docker
systemctl start docker
直接重启:
systemctl restart docker
设置开机启动:
systemctl enable docker
这时候是从ustc获取镜像,而且速度很快~
需要开启docker的远程访问(在开发和学习时都能带来便利,外部网络环境尽量避免)后续有用:
修改宿主机的docker配置,让其可以远程访问:
vi /lib/systemd/system/docker.service
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
运行java项目,使用docker先安装一个容器化的centos7系统,以后许多其它软件(镜像)的制作是基于这个系统做出来的
拉取centos的镜像:
docker pull centos:7
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
挂载文件夹命令作用是:我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。创建容器 添加-v参数 后边为 宿主机目录:容器目录。
通俗的说是:让容器化的centos系统方便同步宿主机(未容器化的,外部的centos系统)的文件安装
笔者在宿主机中路径/usr/local/
下创建了文件夹WEB
使用命令创建并启动容器,同时挂载文件夹到容器化的centos系统中:
docker run -i -t -v /usr/local/centos/:/usr/local/centos --name 创建的容器名字 镜像名字 /bin/bash
centos安装完成。需要退出当前容器的命令:exit
笔者把jdk和一些需要安装到系统中的软件上传到宿主机的/usr/local/WEB/
中:
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
在/usr/local/WEB
路径下(安装包一起的路径下)创建文件Dockerfile
(名字必须是这个)
有两种方法写运行容器运行脚本,一种是打开拉下来该文件重写,然后覆盖文件。一种是进入容器安装vi或者vim编辑器进去文件直接写,笔者是选择拉下来将该文件重写覆盖:
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER YaoXinHong
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_231
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $JAVA_HOME/bin:$PATH
创建该镜像(名字为jdk1.8,是后面maven插件有用):
docker build -t jdk1.8 .
莫忘记后面的 .
创建启动jdk容器
docker run -di --name=jdk1.8 jdk1.8
登录jdk容器中查看是否成功命令:
docker exec -it jdk1.8 /bin/bash
重新编写Dockerfile文件脚本:
拉取镜像:
docker pull tomcat
创建容器:
docker run -di --name=容器名字 -p 8080:8080 tomcat:latest
登入容器内可以看到jdk可以不安装的原因,我们拉取的默认最新的tomcat镜像版本,登录进去容器内部,可以看到它已经帮我们安装好jdk环境:
拉取镜像:
docker pull nginx
创建容器:
docker run -di --name=容器名字 -p 80:80 nginx:latest
启动容器后访问80端口效果:
容器 nginx 反向代理多台tomcat,操作方式一(每次修改需要登录进入容器):
修改文件之前先查看下tomcat的容器地址:
容器的ip ,运行后得到 IPAddress
docker inspect 容器id
对于容器来说,宿主机ip就是IPAddress
查看所有的容器id地址
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
或者进入容器,查看容器ip
cat /etc/hosts
登录容器修改/etc/nginx/nginx.conf文件:
修改文件需要安装vi/vim编辑工具
进入容器
docker exec -it 容器id /bin/bash
安装vim
apt-get update
apt-get install vim
安装过后,如果下次不想再次安装,可以把该安装了vi编辑器的容器做成镜像,方便下次生成容器
生成新镜像
docker commit 容器id 新镜像名
查看本地镜像
docker images
在nginx.conf中添加以下如以下内容:
upstream tomcat_client {
server Ip地址:端口号 weight=2;
}
server {
server_name "";
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
修改号配置文件后,重启nginx容器:
关闭nginx:
nginx -s stop
启动容器
docker start 容器名字
操作方式二(修改宿主机源文件就可以同步修改容器文件):
挂载nginx容器文件夹到宿主机文件夹中,通过修改宿主机文件,同步到容器nginx的配置文件.
先开启一个容器,把容器内的配置文件复制在宿主机内(因为docker有时候不能同步复制文件,最好自己把文件复制下来比较妥当):
挂载并启动容器里的nginx配置文件夹和nginx日志文件:
docker run --name mynginx -d -p 80:80 -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/logs:/var/log/nginx -d docker.io/nginx
直接对宿主机的/usr/local/nginx/conf/nginx.conf文件修改nginx反向代理的配置,输入如上面操作方式一的一样配置代码,然后重启容器就可以了。每次操作直接免了去登录容器内修改的步骤。我推荐使用第二种。
如果有强迫证删除之前创建的用来复制配置文件的nginx容器:
先暂停容器
docker stop 容器名字
删除容器
docker rm 容器名字
拉取镜像:
docker pull redis
创建容器并加上密码:
docker run --name redis-dev -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "密码"
docker pull centos/mysql-57-centos7
创建容器:
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 centos/mysql-57-centos7
使用Navicat Premium 12测试效果:
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run -di --name=容器名字 -p 5000:5000 registry
(3)打开浏览器 输入地址http://ip地址:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
(4)修改ademon.json (/etc/docker/ademon.json),如果没有添加一个
添加以下内容,保存退出。
{"insecure-registries":["ip地址:5000"]}
此步用于让 docker信任私有仓库地址
(5)重启docker 服务
systemctl restart docker
上传镜像到私有仓库例子:
(1)标记此镜像为私有仓库的镜像
docker tag jdk1.8 ip地址:5000/jdk1.8
(2)再次启动私服容器
docker start registry
(3)上传标记的镜像
docker push ip地址:5000/jdk1.8
1.使用dockermaven插件需要先开启docker的远程访问设置,上面有安装docker的时候先开了,不再赘述。
2.在要发布的项目pom文件中引入该代码:
<build>
<finalName>appfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.2.1version>
<configuration>
<imageName>ip地址/${project.artifactId}:${project.version}imageName>
<baseImage>jdk1.8baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]entryPoint>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}
directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
<dockerHost>http://ip地址:2375(docker远程访问端口)dockerHost>
configuration>
plugin>
plugins>
build>
3.在windows的命令提示符下,进入项目所在的目录,输入以下命令,进行打包和上传镜像
mvn clean package docker:build ‐DpushImage
这里有个坑,项目名字不能有大写形式,确保docker远程已开启,私有仓库也开启,否则自动构建失败!!!
4.进入宿主机查看上传的镜像:
docker images
5.启动容器
docker run -di -p 8081:10001 镜像名字
以上是使用docker发布java项目的整个过程,其他项目的发布也大同小异了。
镜像相关命令:
查看所有的镜像 | docker images |
---|---|
删除镜像 | docker rmi 镜像名字:版本号 例如 yaoxinhong:latest |
查询镜像版本 | docker search 镜像名称 |
拉取镜像(不指定版本默认拉取最多星星的那个) | docker pull 镜像名:版本号 |
镜像保存为tar包备份下来 | docker save -o .tar 镜像名字 |
从tar包中恢复为镜像 | docker load -i XXX.tar |
容器相关命令:
查看正在运行的容器 | docker ps |
---|---|
查看所有容器 | docker ps -a |
后台挂着登录容器方式 | docker exec -di 容器名字 /bin/bash |
进入容器显示前台输入登录方式 | docker exec -it 容器名字 /bin/bash |
后台挂着创建并启动容器方式 | docker run -di -p 00:00 --name=新建容器名字 镜像名字 |
进入容器显示前台输入登录方式 | docker run -it -p 00:00 --name=新建容器名字 镜像名字 |
启动容器 | docker start 容器名字 |
关闭容器 | docker stop 容器名字 |
从容器中拷贝资料出来宿主机 | docker cp 容器名字:容器目录 需要拷贝的文件或目录 |
从宿主机中拷贝资料到容器里 | docker cp 需要拷贝的文件或目录 容器名称:容器目录 |
删除容器 | docker rm 容器名字 |
容器保存为镜像 | docker commit 容器名字 镜像名字 |
对这篇文章有什么问题,尽情留下,一起学习解决,共同进步~~~