上午
SQL案例
第一步 创建docker虚拟网络
第二步 运行mysql服务并设置
第三步 新建或查看本机(window的)数据库
安装
cd ~/docker-install
# 安装
rpm -ivh *.rpm
# 启动 docker 系统服务
systemctl start docker
# 启用 docker 系统服务
systemctl enable docker
容器命令
# -d 后台运行
docker run -d redis
# 进入 redis 容器,在容器中运行 redis-cli
docker exec -it a48 redis-cli
# 容器列表
# 列出正在运行的容器
docker ps
# 列出所有容器,包括已经关闭的容器
docker ps -a
# 删除容器
# 删除已停止的容器
docker rm xxx
# 强制删除运行的容器
docker rm -f xxx
# 清空所有已停止的容器
docker container prune
# 启动redis容器
# -d 后台 --name 起名字 --rm 容器停止时自动删除
docker run \
-d \
--name redis1 \
--rm \
redis
# 进入容器,在容器中执行命令
docker exec -it redis1 ls
docker exec -it redis1 pwd
docker exec -it redis1 touch f1.txt
docker exec -it redis1 ls
# 在容器中启动命令行
docker exec -it redis1 bash
# 停止容器内运行的 redis 服务
# 容器中没有任何应用运行时,会自动退出
docker exec -it redis1 redis-cli shutdown
# 容器启动时,默认运行的命令
docker history redis
# 启动容器时,手动指定命令,替代默认命令
docker run -it --name redis1 --rm redis \
ls
docker run -it --name redis1 --rm redis \
pwd
docker run -it --name redis1 --rm redis \
bash
# docker stop
# docker start
# docker restart
docker run \
-d \
--name redis1 \
redis
docker exec -it redis1 redis-cli
> set a b
> exit
docker stop redis1
docker restart redis1
docker exec -it redis1 redis-cli
> get a
"b"
数据挂载
# 新建文件夹 /opt/data
mkdir /opt/data
# 启动redis容器,挂载目录 -v 宿主机路径:容器挂载路径
docker rm -f redis1
docker run \
-d --name redis1 \
-v /opt/data:/data \
redis
# 访问redis添加数据
docker exec -it redis1 redis-cli
> set a b
> save
> exit
# 查看宿主机 /opt/data 下有没有快照文件
cd /opt/data
ls
# 删除后,重启容器
docker rm -f redis1
docker run \
-d --name redis1 \
-v /opt/data:/data \
redis
docker exec -it redis1 redis-cli
> get a
"b"
# 新建数据卷
docker volume create redis-data
# 查看数据卷
docker volume ls
# 查看对应的路径
# /var/lib/docker/volumes/redis-data/_data
docker inspect redis-data
# 启动redis容器,将 redis-data 数据卷挂载到容器
docker run -d --name redis2 \
-v redis-data:/data \
redis
# 访问 reids 添加数据
docker exec -it redis2 redis-cli
> set a b
> save
> exit
# 查看宿主机存储的redis快照文件
cd /var/lib/docker/volumes/redis-data/_data
ls
端口映射
# 启动 tomcat 容器,8080端口映射到宿主机的 8001 端口
# -p 8001:8080
# --restart=always 总是自动重新启动这个容器
docker run -d --name tomcat1 \
-p 8001:8080 \
--restart=always \
tomcat
docker ps
# 用浏览器访问宿主机 150 的8001端口
http://192.168.64.150:8001
容器互联
# 创建虚拟网络
docker network create my-net
# 查看网络
docker network ls
docker inspect my-net
# 查看宿主机的虚拟网卡
ifconfig
# 启动centos:7容器: app1 和 app2
docker run -dit --name app1 --rm \
--net my-net \
centos:7
docker run -dit --name app2 --rm \
--net my-net \
centos:7
# 描述两个容器,查看ip地址
docker inspect app1
docker inspect app2
# 从宿主机 ping 两个容器
ping 172.18.0.2
ping 172.18.0.3
# 进入 app1,ping 宿主机和 app2
docker exec -it app1 ping 172.18.0.1
docker exec -it app1 ping 172.18.0.3
docker exec -it app1 ping app2
Dockerfile 构建镜像
# 准备文件
# 把要使用的文件,单独放到一个文件夹下
cd ~/
mkdir tomcat7
cd tomcat7
# 生成 Dockerfile 文件
cat <<EOF >Dockerfile
FROM centos:7
ADD jdk-8u212-linux-x64.tar.gz /opt/
ADD apache-tomcat-7.0.96.tar.gz /usr/
RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
ENV JAVA_HOME=/opt/jdk1.8.0_212 \
CATALINA_HOME=/usr/tomcat \
PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
EXPOSE 8080
ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
EOF
# 课前资料\docker\tomcat7\
# 上传 jdk 和 tomcat7 的压缩文件到 /root/tomcat7/
docker build -t tomcat:7 .
# 准备文件
mkdir -p /opt/webapps/ROOT/
# 创建 index.html
cat <<EOF >/opt/webapps/ROOT/index.html
<h1>Hello Docker!</h1>
EOF
# 启动容器
docker run -d --name tomcat80 \
--restart=always \
-v /opt/webapps:/usr/tomcat/webapps \
-p 80:8080 \
tomcat:7
# 用浏览器访问
http://192.168.64.150
redis
docker run -d --name redis7000 \
-p 7000:6379 redis
docker run -d --name redis7001 \
-p 7001:6379 redis
docker run -d --name redis7002 \
-p 7002:6379 redis
docker exec -it redis7000 redis-cli
> keys *
数据库和web应用
# 删除 my-net 网络
docker network rm my-net
# 创建虚拟网络 dockernet
docker network create dockernet --subnet=172.18.0.0/24
docker network ls
# 创建 mysql-data 数据卷
docker volume create mysql-data
docker volume ls
# 启动 mysql 容器
docker run -d --name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
--restart=always \
mariadb
先删再建
第四步 挂载web web应用
web就是tomcat服务
如下图 启动服务的时候 先创建文件夹 挂载映射 再启动服务
如上图 可以映射访问了
docker部署eureka
自我实现 构建镜像成功
10.33晚上 构建规范 为什么是-t tedu/jdk:8u212 .
后面接着写自己指定的文件夹
正式部署eureka
写错了 删除 并重新构建
# 准备文件
cd ~/
mkdir eureka
cd eureka
cat <<EOF >Dockerfile
FROM tedu/jdk:8u212
COPY sp05-eureka-0.0.1-SNAPSHOT.jar /opt/
ENTRYPOINT ["java", "-jar", "/opt/sp05-eureka-0.0.1-SNAPSHOT.jar"]
CMD ["--spring.profiles.active=eureka1", "--server.port=2001"]
EOF
# 上传 erueka 的 jar 文件到 /root/eureka/
# DevOps课前资料\kubernetes\k8s案例\v2\eureka\sp05-eureka-0.0.1-SNAPSHOT.jar
docker rmi tedu/eureka:v1
docker build -t tedu/eureka:v1 .
镜像也有了 启动eureka注册中心 启动eureka容器
eureka完全独立的
自我实现
http://192.168.64.150:2001/
得连接到同一个虚拟网络
自我实现
如下图 eureka2
docker rm -f eureka1 eureka2
docker run -d --name eureka1 \
-p 2001:2001 \
--net dockernet \
tedu/eureka:v1
# 查看容器日志
docker logs eureka1
docker run -d --name eureka2 \
-p 2002:2002 \
--net dockernet \
tedu/eureka:v1 \
java -jar /opt/sp05-eureka-0.0.1-SNAPSHOT.jar \
--spring.profiles.active=eureka2 --server.port=2002
docker logs eureka2
访问网页
http://192.168.64.150:2001/
k8s Kubernetes
之前需要自己构建镜像 还得自己部署 那就死掉了 这么多服务器
Kubernetes是自动部署 复活程序员
安装kubernetes集群 容器化部署
kubernetes的安装过程极其复杂,对Linux运维不熟悉的情况下安装kubernetes极为困难,再加上国内无法访问google服务器,我们安装k8s就更加困难
kubeasz项目(https://github.com/easzlab/kubeasz)极大的简化了k8s集群的安装过程,使我们可以离线一键安装k8s集群
下午
cd ~/
# 下载 kubeasz 的自动化安装脚本文件: easzup,如果已经上传过此文件,则不必执行这一步
export release=2.2.0
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup
# 对easzup文件设置执行权限
chmod +x ./easzup
# 下载离线安装文件,并安装配置docker,
# 如果离线文件已经存在则不会重复下载,
# 离线安装文件存放路径: /etc/ansible
./easzup -D
# 启动kubeasz工具使用的临时容器
./easzup -S
# 进入该容器
docker exec -it kubeasz sh
# 下面命令在容器内执行
# 配置离线安装
cd /etc/ansible
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/chrony/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/ex-lb/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/kube-node/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' roles/prepare/defaults/main.yml
exit
# 安装 python,已安装则忽略这一步
yum install python -y
配置好master主机之后
克隆
自我实现
继续
配置集群的IP
主控 工作机全开 # 检查集群主机状态
一键安装k8s集群
继续
自我实现 查看集群的核心服务
初步尝试k8s
使用 ReplicationController 和 pod 部署应用
Pod是用来封装Docker容器的对象,它具有自己的虚拟环境(端口, 环境变量等),一个Pod可以封装多个Docker容器.
RC是用来自动控制Pod部署的工具,它可以自动启停Pod,对Pod进行自动伸缩.
下面我们用命令部署一个RC
从镜像启动容器
测试k8s
kubectl run 几个参数的含义
--image=luksa/kubia
镜像名称
--port=8080
pod 对外暴露的端口
--generator=run/v1 kubia
创建一个ReplicationController
控制器自动分配
内部打印的 查看一下
k expose \
rc kubia \
--type=NodePort \
--name kubia-http
k get svc
------------------------------------------------------------------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubia-http NodePort 10.68.194.195 <none> 8080:20916/TCP 4s
这里创建了一个 service 组件,用来对外暴露pod访问,在所有节点服务器上,暴露了20916端口,通过此端口,可以访问指定pod的8080端口
访问以下节点服务器的20916端口,都可以访问该应用
pod自动伸缩
k8s对应用部署节点的自动伸缩能力非常强,只需要指定需要运行多少个pod,k8s就可以完成pod的自动伸缩
3个轮询
pod 使用部署文件手动部署pod
一个pod一个独立的服务器 以pod为单位
切换到193
pod端口转发
使用 kubectl port-forward 命令设置端口转发,对外暴露pod.
使用服务器的 8888 端口,映射到 pod 的 8080 端口