# 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
```
`上一节关联链接请点击:`