# 部署项目到Docker

{% hint style="info" %}
由于Linux下yun源默认都是国外的，下载某些东西格外的慢，推荐修改yum源为aliyun
{% endhint %}

{% content-ref url="linux/xiu-gai-linux-xia-yum-jing-xiang-yuan-wei-guo-nei-jing-xiang" %}
[xiu-gai-linux-xia-yum-jing-xiang-yuan-wei-guo-nei-jing-xiang](https://luchong.gitbook.io/note/linux/xiu-gai-linux-xia-yum-jing-xiang-yuan-wei-guo-nei-jing-xiang)
{% endcontent-ref %}

## 安装Docker

### 使用官方安装脚本自动安装：

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

### 启动Docker

```
sudo systemctl start docker
```

### 设置开机启动

```
sudo systemctl enable docker
```

### 验证版本

```
docker -v
```

## 安装MySQL

### 下载安装yum仓库

```
yum -y install https://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
```

### 安装

```
yum -y install mysql-community-server
```

### 启动

```
systemctl start mysqld
```

### 查看状态

```
systemctl status mysqld
```

### 查看初始密码

```
grep 'temporary password' /var/log/mysqld.log
```

### 登录测试(用初始化密码)

```
mysql -uroot -p
```

### 修改root登录密码

```
ALTER USER 'root'@'localhost' IDENTIFIED BY 'LUchong123.';
flush privileges;
```

{% hint style="info" %}
这里可能会报错，大多数是因为未配置环境变量
{% endhint %}

### 配置环境变量

#### 使用绝对命令vi打开profile

```
/bin/vi  /etc/profile
```

#### 在文件后面加上环境变量

```
export PATH=$PATH:/usr/local/mysql/bi
```

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MOv-V_8fvfGZRUFUMlC%2F-MOv3qSPinGEA8pLaRhq%2Fimage.png?alt=media\&token=c4d1e9c3-9af8-4e39-b3c1-ef2004f6b873)

#### 保存后退出

`ESC-->英文冒号-->x`

#### 更新配置文件

```
source /etc/profile
```

再次输入命令登录Mysql即可修改

#### 允许root远程访问

```
update mysql.user set host = '%' where user ='root';
```

接着尝试使用Navicat连接一下，如果使用的阿里云，默认是没有开放3306端口的，需要在防火墙开放一下。

## SpringBoot打包与Dockerfile

### 打包项目

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MOv7FFxNwH3Nut-h8hg%2F-MOv8Ypl42ITzPCVrVUx%2Fimage.png?alt=media\&token=db2c557b-f091-4bc8-9aa4-32f770d4822b)

### Dockerfile文件

```
FROM java:8
VOLUME /tmp
ADD eriz-1.0.0.jar /app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
```

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MOv7FFxNwH3Nut-h8hg%2F-MOv9OYdYPBeRKJaUP5q%2Fimage.png?alt=media\&token=bc2541d4-fde8-449f-a42a-6be8e4c5088b)

**解释：**

java:8是指Docker Hub上官方提供的java镜像，版本号是8也就是jdk1.8，有了这个基础镜像后，Dockerfile可以通过FROM指令直接获取它的状态，也就是在容器中java是已经安装的，接下来通过自定义的命令来运行Spring Boot应用。

VOLUME指向了一个/tmp的目录，由于Spring Boot使用内置的Tomcat容器，Tomcat默认使用/tmp作为工作目录。效果就是在主机的/var/lib/docker目录下创建了一个临时文件，并连接到容器的/tmp。

add将项目的jar文件作为app.jar添加到容器

RUN表示在新创建的镜像中执行一些命令，然后把执行的结果提交到当前镜像。这里使用touch命令来改变文件的修改时间，Docker创建的所有容器文件默认状态都是“未修改”。这对于简单应用来说不需要，不过对于一些静态内容（比如：index.html）的文件就需要一个“修改时间”。

ENTRYPOINT 应用启动命令 参数设定。

### jar、Dockerfile文件

然后将打好的jar包与Dockerfile放到linux下同个目录下

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MOvADVDewwfliy4feaq%2F-MOvCWT2o0-OvEoPtvay%2Fimage.png?alt=media\&token=d168c3f0-1647-4a04-b116-f9ff2dfea3c5)

运行命令制作镜像：

`docker build -t [容器名] .`  注意：后面有个点，表示当前目录下

第一次制作会慢一点，需要下载jdk等

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MOvFxuyZkkZt_h0Xvaa%2F-MOvVBKqy_gUQyEdJLsc%2Fimage.png?alt=media\&token=16b0beef-d295-4f3a-b45d-313acd8b5854)

### 运行mysql并连接navicat

运行MySQL并连接到navicat管理工具

#### 创建数据挂载点

```
docker volume create mysql_data
```

&#x20;创建数据挂载点（即存储数据的地方，这样即便mysql容器删除了，数据还是在）

#### 运行Mysql容器

```
docker run --name mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
```

#### 并使用`docker ps`可查看运行中的容器

**解释：**

\--name 镜像名称&#x20;

-p映射端口&#x20;

-v /mysql/datadir:/var/lib/mysql 设置本地挂载点

-e MYSQL\_ROOT\_PASSWORD=123456 设置密码

-d mysql 容器名称

#### 进入容器 /bin/bash

```
docker exec -it mysql bash
```

#### 进入Mysql

```
mysql -uroot -p
```

#### Mysql授权

```
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;

//刷新
FLUSH PRIVILEGES;
```

### 运行项目

#### 执行命令

```
docker run -it --net=host --name erizboot -p 8081:8081 reportsample
```

**解释：**

\--net=host 告诉 Docker 不要将容器网络放到隔离的名字空间中，即不要容器化容器内的网络。此时容器使用本地主机的网络，它拥有完全的本地主机接口访问权限。容器进程可以跟主机其 它 root 进程一样可以打开低范围的端口，可以访问本地网络服务比如 D-bus，还可以让容器做一些影响整个主机系统的事情，比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true，容器会被允许直接配置主机的网络堆栈。

可以运行命令：`docker ps` 查看正在运行中的容器
