1、docker 学习实践
2、K8S学习实践
docker 的安装、mysql、tomcat的docker化部署
概括一下是在服务器里 部署好三个软件的环境,并构造对应容器以单独运行nginx mysql iamsso等等,然后通过Docker Compare管理好多个容器的运作.
/home/Docker/dockerfile/system/centos/iamsso/
关键就是:
安装包
dockerfile–构建镜像
构建容器
yaml --管理容器
具体步骤参考官网:https://docs.docker.com/engine/install/centos/
系统内核版本为3.10.0
[root@zecan ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[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/,如下图,按官网步骤来
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 #国外的地址
yum makecache fast
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)跳过(依赖问题
原因:ce依赖关系问题,发现自己的文件夹少了CentOS-Base.repo这个源
解决:将/etc/yum.repos.d.bak/里面以CtenOS的都移到目录/etc/yum.repos.d/
参考:https://blog.csdn.net/qq_47855463/article/details/119656678
#启动 Docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
结果:
(模的照片是因为脱敏处理了一下)
出现问题:响应时间过长
[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
原因:估计是第一次访问耗时过长
查看下载的hello world镜像
成功
#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
[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
[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 解压缩命令
只显示与下面配置相关
# 数据库配置
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 #环境路径?
什么是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
# 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;
}
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;
#}
}
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;
}
}
}
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
同类型命令整理
参考:https://www.cnblogs.com/niunafei/p/12803829.html
mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
touch /root/mysql/conf/my.cnf
创建容器返回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 指定登录密码
docker exec -it f46be2f4e1c7 /bin/bash
参考:[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
# 官网提供 (没有下载成功)
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
chmod +x /usr/local/bin/docker-compose
参考:
/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
[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-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
会全部暂停删除
背景: 要是换了一台服务器部署,就需要重新修改配置文件的ip地址,包括nginx的conf和应用的application。有没有更好的办法?
nginx的nginx.conf
还有application.yml
这时我就冒出个疑问:docker 自定义网络后可用容器名
代替配置文件的本机ip:端口
吗?
百度了一圈没有答案,只是在一些大项目的配置文档里看到有相关的,我感觉可以试试,毕竟基础知识告诉我:在docker0或者同个自定义网络中的容器是可以相互ping通的,而且可以用其名称,那么实验继续!
呃这里只是一个模拟,用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
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
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&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
username: root
password: root
还是上面成功登录的界面,这里不再贴图了,代码就非常简单,下面两句话搞定:
[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、网络等整理合集
127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。
冒号之前是宿主机端口,外网直接访问,冒号之后是容器端口
Nginx 配置详解
测试日志用:通过docker run 命令来在容器内运行一个应用程序 输出Hello world
https://blog.csdn.net/LLQ_200/article/details/75645605
https://blog.csdn.net/ztx114/article/details/85096959
也不知道是什么原因
nginx 之 proxy_pass详解
Nginx配置Web服务器
[如何将 Nginx 配置为Web服务器的方法](https://www.jb51.net/article/107975.htm#:~:text=抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求。,和域名的请求。 更具体的来说, Nginx 通过定义一系列 locations 来控制对 URIS 的选择。)
最全Nginx 配置文件详解及安装
JDBC(数据库连接)——url写法
IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了
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管理容器、自定义网络、部署问题及解决)