1、网络规划
1.1、配置网络
docker network create --subnet=172.16.0.0/24 demo-net
1.2、查看网络
NETWORK ID NAME DRIVER SCOPE
da64fc1be0e9 bridge bridge local
1f34f85f1160 demo-net bridge local
e0d2d5bc89a7 host host local
0623f41d9d52 none null local
2、创建MySQL容器
2.1、创建MySQL的Volume
[root@localhost test]# docker volume create my-mysql-volume
my-mysql-volume
[root@localhost test]# docker volume ls
DRIVER VOLUME NAME
local my-mysql-volume
2.2、创建MySQL容器
docker run -d --name my-mysql -p 3306:3306 -v my-mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --network demo-net --ip 172.16.0.11 mysql:5.7
2.3、检查MySQL容器的命名、volume、网络IP是否正确
- 容器名称
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6a67493996e mysql:5.7 "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp my-mysql
- volume
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
local my-mysql-volume
[root@localhost _data]# docker volume inspect my-mysql-volume
[
{
"CreatedAt": "2021-03-07T12:53:52Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-mysql-volume/_data",
"Name": "my-mysql-volume",
"Options": {},
"Scope": "local"
}
]
[root@localhost ~]# ls /var/lib/docker/volumes/my-mysql-volume/_data
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
2.4、配置访问权限
进入容器
docker exec -it my-mysql /bin/bash
登录MySQL
root@3db857a0f6c3:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
授权root远程访问
mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.00 sec)
修改密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
刷新权限
FLUSH PRIVILEGES;
2.5、通过Navicat for MySQL访问并创建数据库、表结构
3、部署SpringBoot项目
3.1、打包
maven clean package
3.2、制作Dockerfile文件
FROM java:8
MAINTAINER itmrl
LABEL name="demo" version="1.0.0" author="itmrl"
COPY demo.jar demo.jar
EXPOSE 8080
CMD ["java","-jar","-Dfile.encoding=UTF-8","-Xms1024m","-Xmx1024m","demo.jar"]
3.3、构建镜像
[root@localhost demo]# docker build -t demo:1.0 .
Sending build context to Docker daemon 19.86MB
Step 1/6 : FROM java:8
---> d23bdf5b1b1b
Step 2/6 : MAINTAINER itmrl
---> Running in 8f0e66b0a555
Removing intermediate container 8f0e66b0a555
---> 1160a059ddcb
Step 3/6 : LABEL name="demo" version="1.0.0" author="itmrl"
---> Running in c0fa3e0aab5e
Removing intermediate container c0fa3e0aab5e
---> 0a7b8839130a
Step 4/6 : COPY demo.jar demo.jar
---> acbe71ed5013
Step 5/6 : EXPOSE 8080
---> Running in 81070e5afc2c
Removing intermediate container 81070e5afc2c
---> 75d0f60230ba
Step 6/6 : CMD ["java","-jar","-Dfile.encoding=UTF-8","-Xms1024m","-Xmx1024m","demo.jar"]
---> Running in aad2c8d8ad8f
Removing intermediate container aad2c8d8ad8f
---> 53b900ec786d
Successfully built 53b900ec786d
Successfully tagged demo:1.0
3.4、查看镜像
[root@localhost demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo 1.0 53b900ec786d 44 seconds ago 663MB
3.5、创建容器
- demo01
docker run -d --name demo01 -p 8081:8080 --network demo-net --ip 172.16.0.12 demo:1.0
- demo02
docker run -d --name demo02 -p 8082:8080 --network demo-net --ip 172.16.0.13 demo:1.0
- demo03
docker run -d --name demo03 -p 8083:8080 --network demo-net --ip 172.16.0.14 demo:1.0
3.6、检查demo01、demo02、demo03容器的命名、volume、网络IP是否正确
- 容器名称
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed37f2df5c8a demo:1.0 "java -jar -Dfile.en…" 2 minutes ago Up 2 minutes 0.0.0.0:8083->8080/tcp demo03
f998ac6855de demo:1.0 "java -jar -Dfile.en…" 2 minutes ago Up 2 minutes 0.0.0.0:8082->8080/tcp demo02
297de318ce45 demo:1.0 "java -jar -Dfile.en…" 3 minutes ago Up 3 minutes 0.0.0.0:8081->8080/tcp demo01
b6a67493996e mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp my-mysql
- 网络IP
[root@localhost ~]# docker exec -it demo01 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:10:00:0c brd ff:ff:ff:ff:ff:ff
inet 172.16.0.12/24 brd 172.16.0.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker exec -it demo02 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:10:00:0d brd ff:ff:ff:ff:ff:ff
inet 172.16.0.13/24 brd 172.16.0.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker exec -it demo03 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:10:00:0e brd ff:ff:ff:ff:ff:ff
inet 172.16.0.14/24 brd 172.16.0.255 scope global eth0
valid_lft forever preferred_lft forever
3.7、测试程序
- demo01
- demo02
- demo03
4、部署Nginx反向代理
4.1、在Linux上创建/tmp/nginx/nginx.conf文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream backend{
server 172.16.0.12:8080;
server 172.16.0.13:8080;
server 172.16.0.14:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
include /etc/nginx/conf.d/*.conf;
}
4.2、创建nginx容器
docker run -d --name my-ngx -p 80:80 -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf --network demo-net --ip 172.16.0.15 nginx