Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)

文章目录

  • 一、任务内容:
  • 二、过程步骤
    • 01 Dockers的安装
        • 1.1 查看系统的内核:uname -r
        • 1.2 查看系统配置 cat /etc/os-release
        • 1.3 下载需要的安装包
        • 1.5 更新yum软件包索引
        • 1.6 安装docker相关的配置
        • 1.7 启动Docker
        • 1.8 下载hello-world镜像进行测试
    • 02 准备镜像
        • 2.1 iamsso-centos8-jdk8镜像
          • 1.Dockerfile
          • 2.启动容器,确保运行
          • 3.测试java环境
          • 4.配置applocation.yml
        • 2.2 安装Nginx并配置、挂载(重难点)
          • 尝试进入容器
          • 1. 首先在本地准备我们的挂载目录以及配置文件
          • 2.建好目录后还需要二个配置文件
          • 3.测试:配置文件创建完成后新建一个index.html /home/hewcen/mynginx/nginx/html index.html
          • 4. 运行挂载目录
        • 2.3 部署mysql
          • 1、 创建容器内在本地的映射文件夹
          • 2、初始化mysql的配置文件*.cnf,在/root/mysql/conf
          • 3、创建docker容器并启动,将数据,日志,配置文件映射到本机
          • 4、登录docker容器,登录mysql
          • 5、查看文件是否本持久化到本地
          • 6、导入sql文件到数据库
    • 03 Docker Compose
        • 3.1 下载
        • 3.2 授权
        • 3.3 修改配置文件
        • 3.4 测试
        • 3.5 关闭
    • 04 自定义网络
        • 4.1 查下本机ip地址出现地方
        • 4.2 新建自定义网络
        • 4.3 修改docker-compose.yml
        • 4.4 修改nginx.conf、application.yml
        • 4.5 测试
  • 三、反思总结
  • 四、不懂就搜
        • Docker学习笔记合集(持续更新)

一、任务内容:

1、docker 学习实践

2、K8S学习实践

docker 的安装、mysql、tomcat的docker化部署

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第1张图片

概括一下是在服务器里 部署好三个软件的环境,并构造对应容器以单独运行nginx mysql iamsso等等,然后通过Docker Compare管理好多个容器的运作.

/home/Docker/dockerfile/system/centos/iamsso/

关键就是:

  • 安装包

    • JDK8 jdk-8u211-linux-x64.tar.gz
    • MYSQL 5.7.24 --怎么导入fuseiamdb.sql.tar
    • iamsso.tar.gz
  • dockerfile–构建镜像

    • 配置环境变量:确保软件运行
    • 数据卷:与本机实现数据共享,特指conf logs
  • 构建容器

    • 测试–通过检查version
  • yaml --管理容器

    • 安装compose
    • docker-compose up 即刻启动

二、过程步骤

01 Dockers的安装

具体步骤参考官网:https://docs.docker.com/engine/install/centos/

1.1 查看系统的内核:uname -r

系统内核版本为3.10.0

[root@zecan ~]# uname -r
3.10.0-1062.18.1.el7.x86_64

1.2 查看系统配置 cat /etc/os-release

[root@zecan ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

系统centos,从官网定位到:https://docs.docker.com/engine/install/centos/,如下图,按官网步骤来

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第2张图片

1.3 下载需要的安装包

yum install -y yum-utils

1.4 设置镜像的仓库

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #国外的地址
    
    # 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国外的地址

1.5 更新yum软件包索引

yum makecache fast

1.6 安装docker相关的配置

docker-ce 是社区版(官方推荐),docker-ee 企业版

 yum install docker-ce docker-ce-cli containerd.io

出现了completed即安装成功。

出现问题:docker安装错误:错误:软件包:docker-ce-rootless-extras-20.10.8-3.el7.x86_64 (docker-ce-stable)跳过(依赖问题

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第3张图片

原因:ce依赖关系问题,发现自己的文件夹少了CentOS-Base.repo这个源

解决:将/etc/yum.repos.d.bak/里面以CtenOS的都移到目录/etc/yum.repos.d/

参考:https://blog.csdn.net/qq_47855463/article/details/119656678

1.7 启动Docker

#启动 Docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker

结果:

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第4张图片

(模的照片是因为脱敏处理了一下)

1.8 下载hello-world镜像进行测试

出现问题:响应时间过长

[root@xxx yum.repos.d]# docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Head "https://registry-1.docker.io/v2/library/hello-world/manifests/latest": Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io": net/http: TLS handshake timeout.
See 'docker run --help'.

解决:先搜索docker search hello-world,再run

原因:估计是第一次访问耗时过长

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第5张图片

查看下载的hello world镜像

img

成功

02 准备镜像

2.1 iamsso-centos8-jdk8镜像

1.Dockerfile
#iamsso1.0
FROM centos:7
 
###############################################################
# Dockerfile to build java container images
# Based on CentOS
# zecan<[email protected]>
###############################################################
MAINTAINER qigangye [email protected]
 
RUN mkdir /var/tmp/jdk
COPY jdk-8u211-linux-x64.tar.gz /var/tmp/jdk
RUN tar xzf /var/tmp/jdk/jdk-8u211-linux-x64.tar.gz -C /var/tmp/jdk
RUN rm -rf /var/tmp/jdk/jdk-8u211-linux-x64.tar.gz

COPY fuseiamdb.sql.tar /home
COPY iamsso.tar.gz /home
RUN tar xf /home/fuseiamdb.sql.tar
RUN tar xzf /home/iamsso.tar.gz
 
ENV JAVA_HOME=/var/tmp/jdk/jdk1.8.0_211
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar
 
CMD ./iamsso/bin/iamsso start  && tail -f /dev/null    #关键

问题:这里因为最后CMD命令没写好导致多次出现容器启动后自动关闭的问题

分析:docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动退出的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。比如 docker hello-world

解决:开启一个可以常驻的前置进程:while(true) 的死循环(当然,sleep 一下)或者用 tail -f /dev/null

参考:https://blog.csdn.net/chendongpu/article/details/119059378

还有个更优雅的方法,但未亲测:https://www.ucloud.cn/yun/28079.html

问题:sh提示“no such file or directory”解决办法

分析:就是没找到文件

解决:./ 用相对路径

参考:https://www.php.cn/linux-419510.html

2.启动容器,确保运行
[root@xxxx web]# docker build -t iamsso-centos8-jdk8:2.0 .
[root@xxxx web]# docker run  -it -p 8089:8089 --name iamsso2.0.1 iamsso-centos8-jdk8:2.0
Starting iam-sso-dist...
Removed stale pid file: /iamsso/logs/iamsso.pid
3.测试java环境
[root@xxxx web]# docker run -it --rm iamsso-centos8-jdk8:latest bash
[root@7224d19546aa /]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

问题1:配置失败

参考文章:https://www.jb51.net/article/151237.htm

对比成功的文章:https://blog.csdn.net/xibei19921101/article/details/108385022

原因未总结

问题1:tar (child):XXX: Cannot open: No such file or directory问题

分析:找不到文件

解决:添加准确路径即可

参考:https://blog.csdn.net/m0_37482190/article/details/89189553

另附:linux tar.gz zip 解压缩命令

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第6张图片

4.配置applocation.yml

只显示与下面配置相关

# 数据库配置
db:
  url: jdbc:mysql://xx.xxx.xxx.xxx:3306/fuse_iam?useUnicode=yes&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
  username: root
  password: root
 
server:
  port: 8089
  context-path: /sso   #环境路径?

2.2 安装Nginx并配置、挂载(重难点)

什么是Nginx?我这里还狠狠补了一节课,整理了笔记:Nginx简单入门–学习笔记狂神说

是一个使用c语言开发的高性能的http服务器及反向代理服务器。Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

参考:https://blog.csdn.net/hnw13938056090/article/details/105782931

https://blog.csdn.net/weixin_44757670/article/details/104993869

尝试进入容器
docker pull nginx
# 尝试进入容器
docker run --name nginx -d -p 8080:80 nginx

报错:Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use.

分析:端口占用

解决:netstat -tanlp查端口,kill PID结束进程或者使用其他端口,这里查了一下端口太多,也不确定进程是啥,就用其他端口了

参考:https://blog.csdn.net/qq_47768542/article/details/114147974

1. 首先在本地准备我们的挂载目录以及配置文件

img

2.建好目录后还需要二个配置文件
  • /home/Docker/mynginx/nginx/conf nginx.conf
# nginx.conf文件内容,
user  nginx; #设置nginx服务的系统使用用户
worker_processes  1; #工作进程数

error_log  /var/log/nginx/error.log warn; #nginx的错误日志
pid        /var/run/nginx.pid; #nginx启动时候的pid

events {
    worker_connections  1024; #每个进程允许的最大连接数
}

http { #http请求配置,一个http可以包含多个server

    #定义 Content-Type
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #日志格式 此处main与access_log中的main对应
    #$remote_addr:客户端地址
    #$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录
    #$timelocal:nginx的时间
    #$request:请求method + 路由 + http协议版本
    #status:http reponse 状态码
    #body_bytes_sent:response body的大小
    #$http_referer:referer头信息参数,表示上级页面
    #$http_user_agent:user-agent头信息参数,客户端信息
    #$http_x_forwarded_for:x-forwarded-for头信息参数
    log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #访问日志,后面的main表示使用log_format中的main格式记录到access.log中
    access_log  /var/log/nginx/access.log  main;

    #nginx的一大优势,高效率文件传输
    sendfile        on;
    #tcp_nopush     on;

    #客户端与服务端的超时时间,单位秒
    keepalive_timeout  65;

    #gzip on;
    
    include /etc/nginx/conf.d/*.conf;
}
  • /home/Docker/mynginx/nginx/conf.d default.conf
server { #http服务,一个server可以配置多个location
      listen       80; #服务监听端口
      server_name  localhost; #主机名、域名
  
      #charset koi8-r;
      #access_log  /var/log/nginx/host.access.log  main;
  
      location / {
          root   /usr/share/nginx/html; #页面存放目录
          index  index.html index.htm; #默认页面
      }
  
      #error_page  404              /404.html;
  
      # 将500 502 503 504的错误页面重定向到 /50x.html
      error_page   500 502 503 504  /50x.html;
      location = /50x.html { #匹配error_page指定的页面路径
          root   /usr/share/nginx/html; #页面存放的目录
      }
  
      # proxy the PHP scripts to Apache listening on 127.0.0.1:80
      #
      #location ~ \.php$ {
      #    proxy_pass   http://127.0.0.1;
      #}
  
      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      #
      #location ~ \.php$ {
      #    root           html;
      #    fastcgi_pass   127.0.0.1:9000;
      #    fastcgi_index  index.php;
      #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
      #    include        fastcgi_params;
      #}
  
      # deny access to .htaccess files, if Apache's document root
      # concurs with nginx's one
      #
      #location ~ /\.ht {
      #    deny  all;
      #}
  }
3.测试:配置文件创建完成后新建一个index.html /home/hewcen/mynginx/nginx/html index.html


Welcome to nginx!



hello docker!

23也可以合并一起为nginx.conf

# nginx.conf文件内容,
user  nginx; #设置nginx服务的系统使用用户
worker_processes  1; #工作进程数

error_log  /var/log/nginx/error.log warn; #nginx的错误日志
pid        /var/run/nginx.pid; #nginx启动时候的pid

events {
    worker_connections  1024; #每个进程允许的最大连接数
}

http { #http请求配置,一个http可以包含多个server

    #定义 Content-Type
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #访问日志,后面的main表示使用log_format中的main格式记录到access.log中
    access_log  /var/log/nginx/access.log  main;

    #nginx的一大优势,高效率文件传输
    sendfile        on;
    #tcp_nopush     on;

    #客户端与服务端的超时时间,单位秒
    keepalive_timeout  65;

    #gzip on;
    
    server { #http服务,一个server可以配置多个location
      listen       80; #服务监听端口
      server_name  localhost; #主机名、域名
      
      location / {
          root   /usr/share/nginx/html;  #页面存放目录
          index  index.html index.htm;   #默认页面
      }
      
      location /sso  {
          proxy_pass http://xxx.xxx.xxx.xxx:8089/sso;
      }
  }
}
4. 运行挂载目录
docker run --name nginx03 -d -p 8089:8089 \
-v /home/Docker/mynginx/nginx/log:/var/log/nginx \
-v /home/Docker/mynginx/nginx/conf.d:/etc/nginx/conf.d \
-v /home/Docker/mynginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/Docker/mynginx/nginx/html:/usr/share/nginx/html nginx

日志目录 : /var/log/nginx 
配置目录 : /etc/nginx/conf.d 
主配置文件:/etc/nginx/nginx.conf 
项目目录 : /usr/share/nginx/html nginx

问题:容器启动后立马关闭

分析:开始以为又是前台没程序运行,导致直接关闭容器,但对比之前的nginx容器没加/bin/bash都可以持续运行,所以docker logs +容器查了一下日志,发现是配置文件里面有写错的地方

nginx: [emerg] unknown directive “//” in /etc/nginx/nginx.conf:2

解决:把上面这个无法识别的指令 // 给注释掉就可以了

参考:第三种自动关闭的情况https://blog.csdn.net/SeptDays/article/details/109336639

https://blog.csdn.net/Michel4Liu/article/details/80889977

测试:

问题:localhost 已拒绝连接。

问题:nginx启动 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

分析:一般原因是nginx端口被占用了,实际是nginx容器端口一致的话没法同时运行

解决:lsof -i :80 //查看端口属于哪个程序?端口被哪个进程占用 kill

参考:https://blog.csdn.net/qq_34802511/article/details/81569185

端口被占用命令
$ netstat -tln              // 查看端口使用情况,
$ netstat -tln | grep 80   //则是只查看端口80的使用情况
$ lsof -i :80  //查看端口属于哪个程序?端口被哪个进程占用
$ kill -9 进程id   //杀掉占用端口的进程

好家伙引出了下面这个问题:

问题:-bash: lsof: command not found 解决方法

解决:yum install lsof -y

参考:https://blog.csdn.net/weixin_34111819/article/details/92818163

同类型命令整理

2.3 部署mysql

参考:https://www.cnblogs.com/niunafei/p/12803829.html

1、 创建容器内在本地的映射文件夹

mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf

2、初始化mysql的配置文件*.cnf,在/root/mysql/conf

touch /root/mysql/conf/my.cnf

3、创建docker容器并启动,将数据,日志,配置文件映射到本机

创建容器返回container的id

docker run -p 3306:3306 --name mysql 
-v /root/mysql/conf:/etc/mysql/conf.d 
-v /root/mysql/logs:/var/log/mysql 
-v /root/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

-d: 后台运行容器,也可以使用镜像id
-p 将容器的端口映射到本机的端口
-v 将主机目录挂载到容器的目录
-e 设置参数  MYSQL_ROOT_PASSWORD 指定登录密码
4、登录docker容器,登录mysql

docker exec -it f46be2f4e1c7 /bin/bash

5、查看文件是否本持久化到本地

ls /root/mysql/data/
img

6、导入sql文件到数据库

参考:[Linux下导入SQL文件及MySQL常用命令](https://cloud.tencent.com/developer/article/1538426#:~:text=Linux系统下可以直接复制SQL语句进行导入,但是这个方法容易出现导入失败的现象,我们可以直接导入sql文件,可以大大提高成功率。 在导入sql文件前,先说一下 MySQL 的常用命令。 回车,再输入密码,进行登陆。 在MySQL模式下,直接输入 exit%3B,、 quit%3B 或者 q%3B 注意要有 %3B (分号)。)

[root@xxx ~]# docker exec -it f41c0f85f2d9 /bin/bash
root@f41c0f85f2d9:/# mysql -uroot -proot fuseiamdb < /var/lib/mysql/fuseiamdb.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1049 (42000): Unknown database 'fuseiamdb'
root@f41c0f85f2d9:/# mysql -uroot -p
Enter password:

mysql> create database fuseiamdb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| fuseiamdb          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use fuseiamdb
Database changed
mysql> show tables
    -> ;
Empty set (0.00 sec)

mysql> source /var/lib/mysql/fuseiamdb.sql

03 Docker Compose

3.1 下载

# 官网提供 (没有下载成功)
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
# 国内地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

3.2 授权

chmod +x /usr/local/bin/docker-compose

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第7张图片

参考:

  • https://blog.csdn.net/qq_38762237/article/details/109025023?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-5.no_search_link&spm=1001.2101.3001.4242.4

3.3 修改配置文件

/home/Docker/docker-compose.yml

version: "3.8" # 版本对比查找官网:https://docs.docker.com/compose/compose-file/
services:
  iamsso:
    build: .
    image: iamsso-centos7-jdk8:1.0
    depends_on:
      - mysql
    ports:
      - "8089:8089"
  
  mysql:
    container_name: mysqlcont
    image: mysql:5.7.24
    restart: always                      
    volumes:
      - /root/mysql/conf:/etc/mysql/conf.d 
      - /root/mysql/logs:/var/log/mysql 
      - /root/mysql/data:/var/lib/mysql 
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      
  nginx:
    container_name: nginxcont
    restart: always
    image: nginx
    ports:
      - 80:80
      - 443:443
      - 5050:5050
      - 4040:4040
    volumes:
      - /home/Docker/mynginx/nginx/log:/var/log/nginx 
      - /home/Docker/mynginx/nginx/conf.d:/etc/nginx/conf.d 
      - /home/Docker/mynginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
      - /home/Docker/mynginx/nginx/html:/usr/share/nginx/html
      
      

3.4 测试

[root@xxx Docker]# docker-compose up -d
Creating network "docker_default" with the default driver
Creating mysqlcont ... done
Creating nginxcont ... done
Creating docker_iamsso_1 ... done
 

done完成

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第8张图片

网站登录完成!

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第9张图片

3.5 关闭

docker-compose down
Stopping docker_iamsso_1 ... done
Stopping mysqlcont       ... done
Stopping nginxcont       ... done
Removing docker_iamsso_1 ... done
Removing mysqlcont       ... done
Removing nginxcont       ... done
Removing network docker_my-bridge
会全部暂停删除

04 自定义网络

背景: 要是换了一台服务器部署,就需要重新修改配置文件的ip地址,包括nginx的conf和应用的application。有没有更好的办法?

4.1 查下本机ip地址出现地方

nginx的nginx.conf

还有application.yml

这时我就冒出个疑问:docker 自定义网络后可用容器名代替配置文件的本机ip:端口吗?

​ 百度了一圈没有答案,只是在一些大项目的配置文档里看到有相关的,我感觉可以试试,毕竟基础知识告诉我:在docker0或者同个自定义网络中的容器是可以相互ping通的,而且可以用其名称,那么实验继续!

4.2 新建自定义网络

呃这里只是一个模拟,用compose管理容器的直接跳第三步

#创建
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#罗列网络
docker network ls

#查看网络具体参数
docker network inspect mynet

Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)_第10张图片

4.3 修改docker-compose.yml

version: "3.8" # 版本对比查找官网:https://docs.docker.com/compose/compose-file/
services:
  iamsso:
    container_name: iamsso-cont
    build: .
    image: iamsso-centos7-jdk8:1.0
    depends_on:
      - mysql
    networks: 
      - my-bridge 
    ports:
      - "8089:8089"
  
  mysql:
    container_name: mysql-cont
    image: mysql:5.7.24
    restart: always 
    networks: 
      - my-bridge   
    ports:
      - "3306:3306"                  
    volumes:
      - /root/mysql/conf:/etc/mysql/conf.d 
      - /root/mysql/logs:/var/log/mysql 
      - /root/mysql/data:/var/lib/mysql 
    
    environment:
      MYSQL_ROOT_PASSWORD: root
      
  nginx:
    container_name: nginx-cont
    image: nginx
    restart: always
    networks: 
      - my-bridge 
    ports:
      - 80:80
      - 443:443
      - 5050:5050
      - 4040:4040
    volumes:
      - /home/Docker/mynginx/nginx/log:/var/log/nginx 
      - /home/Docker/mynginx/nginx/conf.d:/etc/nginx/conf.d 
      - /home/Docker/mynginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
      - /home/Docker/mynginx/nginx/html:/usr/share/nginx/html

networks:
   my-bridge:
     driver: bridge  
      

这里弄的时候遇到个小问题:

**问题:**unsupported config option for services.nginx: ‘network’

**分析:**语法错误,特指network,实际上就是应该写成"networks",上网搜过差不多的99%都是因为语法错误

**解决:**写成networks即可

参考:https://stackoverflow.com/questions/58335543/unsupported-config-option-for-services-networks-ipam

4.4 修改nginx.conf、application.yml

nginx.conf就改反向代理地址,用应用容器地址代替本机ip

location /sso  {
     
          proxy_pass http://iamsso-cont:8089/sso;
      }

application.yml就用mysql容器的地址代替本机ip

# 数据库配置
db:
  url: jdbc:mysql://mysql-cont:3306/fuse_iam?useUnicode=yes&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
  username: root
  password: root

4.5 测试

还是上面成功登录的界面,这里不再贴图了,代码就非常简单,下面两句话搞定:

[root@xxx web]# docker-compose down
Stopping iamsso-cont ... done
Stopping nginx-cont  ... done
Stopping mysql-cont  ... done
Removing iamsso-cont ... done
Removing nginx-cont  ... done
Removing mysql-cont  ... done
Removing network docker_my-bridge
[root@xxx web]# docker-compose up -d
Creating network "docker_my-bridge" with driver "bridge"
Creating mysql-cont ... done
Creating nginx-cont  ... done
Creating iamsso-cont ... done
[root@daas237 web]# docker-compose down
Stopping iamsso-cont ... done
Stopping nginx-cont  ... done
Stopping mysql-cont  ... done
Removing iamsso-cont ... done
Removing nginx-cont  ... done
Removing mysql-cont  ... done
Removing network docker_my-bridge

三、反思总结

​ 由于是刚学完狂神的课程后迎来的第一次实操,很多基本步骤是非常不熟悉的(即便我都是跟着狂神敲的代码),甚至在做的过程中有时候连概念都有些模糊了,哈哈就是一脸懵逼了好一会儿,想着应该列三个镜像运行容器还是自定义个镜像运行三个容器…幸运的是真心搞不懂的地方有人能指点迷津。

​ 实际上有很多地方可以提高,这里罗列一下:

1.步骤可优化

​ 上述步骤实际上有些繁琐,大佬看的话肯定来一句:真是弟弟,哈哈也确实,三个点可以优化步骤,一个是安装基本新手或者新机才需要,二是用Compose管理容器直接写yml文件就行,没必要运行容器–配置–挂载等等一系列操作,三是测试在用compose之后基本也可以一次过,毕竟熟练度上来错误率也低很多,没必要逐步排查。

2.网络自定义

​ 实际在部署环境时,不同机器是不同ip地址,如果每次都要手动修改配置文件,这个也是略微麻烦的,为了向一键部署的目标前进,也很有必要自定义网络。

3.环境部署要更贴合实际些

​ 企业级开发基本都不用最新版,本次实操也遵循此规律mysql5.7.24、centos7,而nginx就没啥问题直接lastest

4.从根本上学会配置文件

​ 不能只是简单的“参考”网上的案例,即便再全也有某些功能没罗列出来, 需要找到具体的指南或文档,比如docker-compose、nginx,可以看我另外整理的文章:Docker知识点翻阅手册–Docker常用命令、Dockererfile、Compose、网络等整理合集

四、不懂就搜

  1. 127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。

  2. 冒号之前是宿主机端口,外网直接访问,冒号之后是容器端口

  3. Nginx 配置详解

  4. 测试日志用:通过docker run 命令来在容器内运行一个应用程序 输出Hello world

https://blog.csdn.net/LLQ_200/article/details/75645605

  1. docker拉取镜像查看版本

https://blog.csdn.net/ztx114/article/details/85096959

  1. Linux终端复制粘贴后前后会多出01

也不知道是什么原因

  1. nginx 之 proxy_pass详解

  2. Nginx配置Web服务器

  3. [如何将 Nginx 配置为Web服务器的方法](https://www.jb51.net/article/107975.htm#:~:text=抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求。,和域名的请求。 更具体的来说, Nginx 通过定义一系列 locations 来控制对 URIS 的选择。)

  4. 最全Nginx 配置文件详解及安装

  5. JDBC(数据库连接)——url写法

  6. IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了

Docker学习笔记合集(持续更新)

linux入门–服务器购买—宝塔部署环境说明
Nginx简单入门–学习笔记狂神说
Docker基础01–入门总结–(狂神说docker学习笔记)
Docker基础02–Docker容器数据卷详解–(狂神说docker学习笔记)
Docker基础03–Dockerfile详解与镜像发布–(狂神说docker学习笔记)
Docker基础04–Docker网络–(狂神说docker学习笔记)
Docker进阶01–Docker Compose–(狂神说docker学习笔记)

Docker知识点翻阅手册–Docker常用命令、Dockererfile、Compose、网络等整理合集
Docker实战:Mysql、Nginx、web的Docker化部署(安装、自定义镜像、compose管理容器、自定义网络、部署问题及解决)

你可能感兴趣的:(运维,#,Docker,docker,docker-compose,运维,linux,容器)