学习目标
- 为什么要使用Docker
- Docker简介
- 安装Docker
- Docker的基本使用
- Docker安装MySQL
- 部署SpringBoot应用到Docker
1、为什么要使用Docker
在开发过程中,往往程序在自己的电脑上跑的起来,放到别人电脑上却不行了,
因为一个项目跑起来,需要大量程序的支持,包块:jdk,Tomcat,MySQL,Redis,Nginx等等,而每个人的电脑上版本可能不同,这就很容易导致项目跑不起来。
2.Docker简介
2.1Docker是什么
-
Docker 是一个开源的应用容器引擎
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
2.2 Docker的应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
2.3 Docker的架构
重要概念:
-
Host 主机(运行Docker的服务器)
-
Daemon 守护进程(在后台执行Docker的操作)
-
Registry 仓库服务注册(远程服务器,保存大量仓库)
-
Repository 仓库(保存镜像文件的位置)
-
Image 镜像(保存进程或软件的文件)
-
Container 容器(镜像运行后的进程)
2.4Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
3.安装Docker
1、删除旧版本的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2、安装依赖包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3、安装docker
yum install docker
4、启动docker
systemctl enable docker
systemctl start docker
5、查看安装结果
docker version
6、配置镜像
加速镜像下载,创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
7、重启
systemctl restart docker
4、Docker的基本使用
常用Docker命令
- 查看镜像: docker images
- 搜索镜像: docker search 镜像名称
- 查看容器:docker ps
- 停止容器:docker stop 容器id
- 删除容器:docker rm 容器id
- 删除镜像:docker rmi 镜像id
- 运行镜像:docker run 镜像id
- 拉取镜像:docker pull 镜像名
- 创建镜像:docker build 镜像名 .
- 抓取仓库:docker pull library/hello-world
- 查看镜像:docker images
- 运行镜像:docker run hello-world
5.Docker安装MySQL
1.安装MySQL
docker pull mysql:8.0
2.运行MySQL镜像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql的镜像ID
-p 后面的端口是本机端口,映射到docker中MySQL的3306端口,后面设置了root密码
-d 是后台运行
3.查看容器ID
docker ps
4.上传数据库脚本到Linux,然后将脚本复制到docker的root目录中
docker cp erp.sql 21db7dd6618e:\root
erp.sql:数据库名称
21db7dd6618e:是数据库容器id
5.进入docker容器
docker exec -it 21db7dd6618e bash
6.进入MySQL
mysql -uroot -p123456
7.设置编码、创建数据库
set names utf8;
create database erp;
use erp;
8.导入sql脚本
source /root/erp.sql;
9.修改远程访问权限:
select host,user,plugin,authentication_string from mysql.user;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
10.看数据库是否有数据
select * from user
最后exit就可以了
6.部署SpringBoot应用到Docker
1.首先在springboot项目的pom.xml文件中添加Docker镜像名称:
<properties>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
在plugin中添加docker构建插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
2. 创建Dockerfile文件
FROM java:8
VOLUME /tmp
COPY jar文件名 app.jar
RUN bash -c "touch /app.jar"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=test", "--server.port=8080", "> /log/app.log"]
内容讲解:
FROM java:8是获取到远程仓库的jdk1.8镜像。
VOLUME指向了一个/tmp的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。效果就是在主机的/var/lib/docker目录下创建了一个临时文件,并连接到容器的/tmp。
将项目的jar文件复制为app.jar添加到容器
RUN表示在新创建的镜像中执行一些命令,然后把执行的结果提交到当前镜像。这里使用touch命令来改变文件的修改时间,Docker创建的所有容器文件默认状态都是“未修改”。这对于简单应用来说不需要,不过对于一些静态内容(比如:index.html)的文件就需要一个“修改时间”。
EXPOSE 容器暴露端口
ENTRYPOINT 应用启动命令 参数设定
3. 创建docker文件夹,将jar包与Dockerfile移动到该文件夹,进入该文件夹,运行命令:
docker build -t 镜像名称 .
4.查看镜像
docker images
5.运行镜像
docker run --rm -p 8080:8080 --link mysql容器ID:localhost docker镜像名称或ID
–rm 表示容器会自动删除
-p表示端口映射,冒号左边为docker容器外的端口号,右边为容器内的端口号
-d表示后台运行
–link 表示连接mysql容器(如果项目不需要数据库,可以去掉),冒号左边是mysql容器的id后面是容器的别名,这样jdbcUrl中配置的localhost会转换到mysql的docker容器上
解决Docker不能联网问题
启动项目后如果出现下面提示,表示Docker的网络出现问题
解决方法
vi /etc/sysctl.conf
添加ipv4转发
net.ipv4.ip_forward=1
重启网络
service network restart
重新启动Docker镜像后通过浏览器测试