# 03_Docker快速入门到项目部署(三)

#如何系统的学习JAVA#

# 03_Docker快速入门到项目部署(三)



## 一、Docker基础-容器网络互连


### 1、docker 网络


默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上。










### 2、Docker的网络操作命令如下








### 3、docker 自定义网络 示例


```bash

# 1.首先通过命令创建一个网络

docker network create dzs


# 2.然后查看网络

docker network ls


# 结果:

NETWORK ID NAME DRIVER SCOPE

1a9f2f2cb7cf bridge bridge local

a74099fbb4fb dzs bridge local

a46e140595fd host host local

33e500702add none null local


# 其中,除了dzs以外,其它都是默认的网络


# 3.让dzs168和 mysql容器都加入该网络,注意,在加入网络时可以通过--alias给容器起别名

# 这样该网络内的其它容器可以用别名互相访问!

# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名

docker network connect dzs mysql --alias db


# 3.2.db容器,也就是我们的java项目

docker network connect dzs dzs168


# 4.进入dzs168容器,尝试利用别名访问db

# 4.1.进入容器

docker exec -it dzs168 bash


# 4.2.用db别名访问

ping db


# 结果

PING db (172.18.0.2) 56(84) bytes of data.

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=1 ttl=64 time=0.059 ms

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=2 ttl=64 time=0.079 ms

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=3 ttl=64 time=0.063 ms

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=4 ttl=64 time=0.061 ms



# 4.3.用容器名访问

ping mysql


# 结果:

PING mysql (172.18.0.2) 56(84) bytes of data.

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=1 ttl=64 time=0.036 ms

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=2 ttl=64 time=0.123 ms

64 bytes from mysql.dzs (172.18.0.2): icmp_seq=3 ttl=64 time=0.125 ms


```



### 4、示例图片















## 二、项目部署-部署Java应用


### 1、例如:dzs-all项目是一个maven聚合项目,使用IDEA打开项目,查看项目结构。

配置文件采用了多环境的方式,


### 2、其中dzs-all项目的application-dev.yaml配置文件是部署到开发环境的配置,application-local.yaml是本地运行时的配置。


application.yaml,中的JDBC地址并未写死,而是读取变量:


### 3、在dev开发环境(也就是Docker部署时)采用了mysql作为地址,刚好是的mysql容器名,只要两者在一个网络,就一定能互相访问。


### 4、将项目打包,并上传到虚拟机服务器上。


### 5、部署项目


```bash

# 1.构建项目镜像,不指定tag,则默认为latest

docker build -t dzs-all .


# 2.查看镜像

docker images


# 3.创建并运行容器,并通过--network将其加入dzs网络,这样才能通过容器名访问mysql

docker run -d --name dzs-all --network dzs -p 8080:8080 dzs-all


```


### 6、测试,通过浏览器访问:http://你的虚拟机地址:8080/search/list



## 三、项目部署-部署前端


### 1、需求:创建一个新的nginx容器,将nginx.conf、html目录与容器挂载。


1)dzs-all-portal和dzs-all-admin是前端代码,需要基于nginx部署。


2)html是静态资源目录,需要把dzs-all-portal以及dzs-all-admin都复制进去。


3)nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理。


### 2、整个nginx目录上传到虚拟机的/root目录下


nginx/html/dzs-all-admin/

nginx/html/dzs-all-portal/


nginx/nginx.conf 文件内容:


```bash


worker_processes 1;


events {

worker_connections 1024;

}


http {

include mime.types;

default_type application/json;


sendfile on;


keepalive_timeout 65;


server {

listen 18080;

# 指定前端项目所在的位置

location / {

root /usr/share/nginx/html/dzs-all-portal;

}


error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

location /api {

rewrite /api/(.*) /$1 break;

proxy_pass http://dzs-all:8080;

}

}

server {

listen 18081;

# 指定前端项目所在的位置

location / {

root /usr/share/nginx/html/dzs-all-admin;

}


error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

location /api {

rewrite /api/(.*) /$1 break;

proxy_pass http://dzs-all:8080;

}

}

}


```



### 3、创建nginx容器并完成两个挂载:


- 把 /root/nginx/nginx.conf 挂载到 /etc/nginx/nginx.conf

- 把 /root/nginx/html 挂载到 /usr/share/nginx/html


### 4、由于需要让nginx同时代理dzs-all-portal和dzs-all-admin两套前端资源,因此需要暴露两个端口:


- 18080:对应dzs-all-portal

- 18081:对应dzs-all-admin


### 5、命令如下:


```bash

docker run -d \

--name nginx \

-p 18080:18080 \

-p 18081:18081 \

-v /root/nginx/html:/usr/share/nginx/html \

-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \

--network dzs \

nginx


```


### 6、测试,通过浏览器访问:http://你的虚拟机ip:18080



## 四、项目部署-DockerCompose


### 1、Docker Compose


1)Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。


2)docker-compose.yml文件的基本语法可以参考官方文档:


https://docs.docker.com/reference/compose-file/legacy-versions/


3)docker compose 语法如下:


```bash

docker compose [OPTIONS] [COMMAND]

```


其中,OPTIONS和COMMAND都是可选参数,比较常见的有:








### 2、docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。


1)用docker run部署MySQL的命令如下:


```bash

docker run -d \

--name mysql \

-p 3306:3306 \

-e TZ=Asia/Shanghai \

-e MYSQL_ROOT_PASSWORD=123 \

-v /root/mysql/data:/var/lib/mysql \

-v /root/mysql/conf:/etc/mysql/conf.d \

-v /root/mysql/init:/docker-entrypoint-initdb.d \

--network dzs

mysql


```


2)用docker-compose.yml文件来定义 部署MySQL的命令如下:


```bash

version: "3.8"


services:

mysql:

image: mysql

container_name: mysql

ports:

- "3306:3306"

environment:

TZ: Asia/Shanghai

MYSQL_ROOT_PASSWORD: 123

volumes:

- "/root/mysql/conf:/etc/mysql/conf.d"

- "/root/mysql/data:/var/lib/mysql"

networks:

- new

networks:

new:

name: dzs


```


3)对比如下





### 3、docker-compose.yml文件,部署多个项目


```bash

version: "3.8"


services:

mysql:

image: mysql

container_name: mysql

ports:

- "3306:3306"

environment:

TZ: Asia/Shanghai

MYSQL_ROOT_PASSWORD: 123

volumes:

- "/root/mysql/conf:/etc/mysql/conf.d"

- "/root/mysql/data:/var/lib/mysql"

- "/root/mysql/init:/docker-entrypoint-initdb.d"

networks:

- dzs

dzs-all:

build:

context: .

dockerfile: Dockerfile

container_name: dzs-all

ports:

- "8080:8080"

networks:

- dzs

depends_on:

- mysql

nginx:

image: nginx

container_name: nginx

ports:

- "18080:18080"

- "18081:18081"

volumes:

- "/root/nginx/nginx.conf:/etc/nginx/nginx.conf"

- "/root/nginx/html:/usr/share/nginx/html"

depends_on:

- dzs-all

networks:

- dzs

networks:

dzs:

name: dzs

```


### 4、docker compose 示例代码


```bash

# 1.进入root目录

cd /root


# 2.删除旧容器

docker rm -f $(docker ps -qa)


# 3.删除镜像

docker rmi dzs-all


# 4.清空MySQL数据

rm -rf mysql/data


# 5.启动所有, -d 参数是后台启动

docker compose up -d


# 6.查看镜像

docker compose images


# 7.查看容器

docker compose ps

```





`上一节关联链接请点击:`


02_Docker快速入门到项目部署(二)

原文链接:,转发请注明来源!