目录
将mysql.tar文件上传(可以直接从本机拖到虚拟机)到虚拟机,并加载
自定义构建镜像,基于java:8-alpine镜像,运行java项目
将cloud-demo微服务集群利用DockerCompose部署
将打包好的jar拷贝到提供的cloud-demo文件的每个文件夹里?
使用DockerCompose部署DockerRegistry
Docker是一个快速交付应用、运行应用的技术:
1、可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
2、运行时利用沙箱机制形成隔离容器,各个应用互不干扰
3、启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的差异:
1、docker是一个系统进程;虚拟机是在操作系统中的操作系统.2、docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
镜像:
将应用程序及其依赖、环境、配置打包在一起容器:
镜像运行起来就是容器,一个镜像可以运行多个容器Docker结构:
1、服务端:接收命令或远程请求,操作镜像或容器2、客户端:发送命令或者请求到Docker服务端
DockerHub:
一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry
镜像操作有哪些?
1、docker images
2、docker rmi
3、docker pull
4、docker push
5、docker save
6、docker load
docker run命令的常见参数有哪些?
1、--name:指定容器名称
2、-p∶指定端口映射3、 -d:让容器后台运行
查看容器日志的命令:
1、docker logs
2、添加-f参数可以持续查看日志
查看容器状态:
1、docker ps
2、添加-a参数查看所有状态的容器删除容器:
1、 docker rm
2、不能删除运行中的容器,除非添加-f参数进入容器:
1、命令是docker exec -it [容器名][要执行的命令]
2、 exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的
数据卷的作用:
1、将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
1、docker volume create2、docker volume ls
3、docker volume inspect4、docker volume rm
5、docker volume prune
数据卷挂载方式:
1、-v volumeName: /targetContainerPath
2、如果容器运行时volume不存在,会自动被创建出来
docker run的命令中通过-v参数挂载文件或目录到容器中:
1、-v volume名称:容器内目录2、-v宿主机文件:容器内文件
3、-v宿主机目录:容器内目录
数据卷挂载与目录直接挂载的
1、数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
2、目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
镜像是分层结构,每一层称为一个Layer
1、Baselmage层:包含基本的系统函数库、环境变量、文件系统2、Entrypoint:入口,是镜像中应用启动的命令
3、其它:在Baselmage基础上添加依赖、安装程序、完成整个应用的安装和配置
1、Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
2、Dockerfile的第一行必须是FROM,从一个基础镜像来构建
3、基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如: java:8-alpine
DockerCompose有什么作用?
帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。
1、推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀
2、镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任
3、推送使用docker push命令
4、拉取使用docker pull命令
?
yum install -y yum-utils \
? ? ? ? ? ?device-mapper-persistent-data \
? ? ? ? ? ?lvm2 --skip-broken
yum-config-manager \
? ? --add-repo \
? ? https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
? ??
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast
yum install -y docker-ce
关闭
systemctl stop firewalld
禁止开机启动防火墙
systemctl disable firewalld
查看防火墙状态:显示dead则说明关闭了
systemctl status firewalld
启动docker
systemctl start docke
关闭docker
systemctl stop docker?
重启docker:
systemctl restart docker
查看docker状态:running为运行中
systemctl status docker
阿里云的镜像加速文档
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
选择自己的系统,然后复制命令到虚拟机中
docker pull nginx
docker images
镜像名字、版本(latest是最新版)、镜像id、官方的创建时间、大小?
其中:nginx.tar是要保存成的文件、nginx:latest是要被保存的镜像名称以及版本
docker save -o nginx.tar nginx:latest
docker rmi nginx:latest
docker load -i nginx.tar
docker pull redis?
其中:redis.tar是要保存成的文件、redis:latest是要被保存的镜像名称以及版本
docker save -o redis.tar redis:latest?
docker rmi redis:latest?
docker load -i redis.tar
docker run:创建并运行一个容器
--name:给容器起一个名字,比如叫做mn
-p:宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx
docker run --name mn -p 80:80 -d nginx
docker ps?
在本机访问虚拟机里的ip加容器端口
docker logs mn?
?docker logs -f mn
docker exec:进入容器内部,执行一个命令
-it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn:要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
docker exec -it mn bash?
cd /usr/share/nginx/html?
sed -i 's#需要修改的内容#要修改成的内容#g' 文件名称.后缀名
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
sed -i 's#Welcome to nginx#Hello World#g' index.html
刷新页面:发现成功修改
exit?
docker stop mn?
docker start mn?
docker rm -f mn?
docker run:创建并运行一个容器
--name:给容器起一个名字,比如叫做mr
-p:宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
redis:镜像名称,例如redis
--appendonly:持久化
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes?
docker exec:进入容器内部,执行一个命令
-it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mr:要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
docker exec -it mn bash?
redis-cli?
set num 666?
get num?
exit?
取名字为html
docker volume create html?
docker volume ls?
html为要查看的数据卷名称
docker volume inspect html?
docker volume prune
这里删除html
docker volume rm html
docker run:创建并运行一个容器
--name:给容器起一个名字,比如叫做mr
-p:宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx
-v:冒号前面是文件名称,冒号后面是文件目录
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx?
在文件夹里找到该文件,并修改?
在本机网页中输入虚拟机ip加端口80??
mysql.tar文件https://pan.baidu.com/s/19YPQmM9GRKE2LpEG3cNLIg?pwd=lvx0
?docker load -i mysql.tar
mkdir -p mysql/data
mkdir -p mysql/conf?
hmy.cnf文件https://pan.baidu.com/s/1TKN8xzLZ0HP3l2iLMAeoHw?pwd=z9nr
docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25
使用本地的数据库软件访问虚拟机的数据库
可以访问成功
cd /tmp/
mkdir docker-demo
cd docker-demo/
把三个文件拖进/tmp/docker-demo
三个文件https://pan.baidu.com/s/1JtblpFkgVjUf6H_PA8i0eA?pwd=mqvy
Dockerfile文件内容为:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
-t后面是名称,:后面是版本号,后面空格后有个点:这是路径,因为在当前路径了,所以用点
docker build -t javaweb:1.0 .
docker run --name web -p 8090:8090 -d javaweb:1.0
与基于Ubuntu不同的是,dockerfile文件的内容不同,其他都相同
dockerfile文件内容为:
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
-t后面是名称,:后面是版本号,后面空格后有个点:这是路径,因为在当前路径了,所以用点
docker build -t javaweb:2.0 .
把compose文件拖到/usr/local/bin里
compose文件https://pan.baidu.com/s/1SL7aJ3AAzK-1NXjHZVkrTA?pwd=mbe6
chmod +x /usr/local/bin/docker-compose?
这里的ip不用改
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts?
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose?
该cloud-demo文件已经编写好了docker-compose的文件夹
cloud-demo文件https://pan.baidu.com/s/1f72g9cSKBSU3Gs3PYF5Azg?pwd=nq8t
user-service的bootstrap.yml文件
spring:
application:
name: userservice #服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: nacos:8848 #nacos地址
config:
file-extension: yaml #文件后缀名
user-service的application.yml文件?
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://mysql:3306/cloud_user?useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.jdbc.Driver
# application:
# name: userservice #user的微服务名称
# cloud:
# nacos:
# server-addr: localhost:8848 #nacos服务地址
# discovery:
# cluster-name: SH #集群名称
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
#eureka:
# client:
# service-url: #eureka地址信息
# defaultZone: http://127.0.0.1:10086/eureka
pattern:
name: 本地环境local
order-service的application.yml文件
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice #order的微服务名称
cloud:
nacos:
server-addr: nacos:8848
# discovery:
# cluster-name: HZ #集群名称
## namespace: 8279562b-ce89-420a-b765-f8b2adfdbe49 #命名空间id
# ephemeral: false #是否为临时实例
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
#eureka:
# client:
# service-url: #eureka地址信息1
# defaultZone: http://127.0.0.1:10086/eureka
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则:随机。范围:userservice服务
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: #指定饥饿加载的服务
- userservice
#feign:
# client:
# config:
# default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
# loggerLevel: FULL #日志级别
feign:
httpclient:
enable: true #支持httpClient的开关
max-connections: 200 #最大连接数
max-connections-per-route: 50 #单个路径的最大连接数
gateway的application.yml文件?
server:
port: 10010 #网关端口
spring:
application:
name: gateway #服务名称
cloud :
nacos:
server-addr: nacos:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 #路由的目标地址 http就是固定地址
uri: lb://userservice #路由的目标地址lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合要求
# filters:
# - AddRequestHeader=Truth,Itcast is freaking awesome! #添加请求头
- id: order-service #路由id,自定义,只要唯一即可
uri: lb://orderservice #路由的目标地址lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/order/** #这个是按照路径匹配,只要以/user/开头就符合要求
# - After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] #要求访问时间在这个之后
- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] #要求访问时间在这个之后
default-filters: #默认过滤器,会对所有的路由请求都生效
- AddRequestHeader=Truth,Itcast is freakina awesome! #添加情求头
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
我提供的cloud-demo已经把jar包安好了,但是你还是需要重新把自己的jar包覆盖我的,不然可能报错
拖到/tmp中?
cd /tmp/cloud-demo/
docker-compose up -d
输入docker-compose logs -f,查看日志,会发现报错。这是因为nacos还未启动就启动了其他的微服务,所以这里重启启动这三个微服务?
docker-compose restart gateway userservice orderservice?
访问网页,发现可以成功
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置。
这里的xxx要填虚拟机的ip地址
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://xxx.xxx.xxx.xxx:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker?
cd /tmp/
mkdir registry-ui
cd registry-ui/
touch docker-compose.yml
打开刚刚创建的yml文件,把下面的配置粘贴进去
version: '3.0'
services:
? registry:
? ? image: registry
? ? volumes:
? ? ? - ./registry-data:/var/lib/registry
? ui:
? ? image: joxit/docker-registry-ui:static
? ? ports:
? ? ? - 8080:80
? ? environment:
? ? ? - REGISTRY_TITLE=传智教育私有仓库
? ? ? - REGISTRY_URL=http://registry:5000
? ? depends_on:
? ? ? - registry?
docker-compose up -d
访问网页,发现成功
推送镜像到私有镜像服务必须先tag
1、重新tag本地镜像,名称前缀为私有仓库的ip。
ip前面的是本地镜像名称和版本,ip以及后面是上传的名字和版本。
docker tag nginx:latest xxx.xxx.xxx.xxx:8080/nginx:1.0
2、推送镜像docker push xxx.xxx.xxx.xxx:8080/nginx:1.0
此时查看私有镜像仓库,发现多了一个
3、拉取镜像仓库的镜像
此时复制了该镜像的地址,只要运行该命令就行
代码文件点击下载https://pan.baidu.com/s/1v78HH8Xm5tlThBIDVqgzMw?pwd=1vjo