第1章 Docker的安装卸载与启动
1.1 Docker的安装
Docker要求CentOS系统的内核版本高于3.10查看系统的内核版本命令
uname -r
先卸载之前的Docker(需要root权限)
sudo yum remove docker docker-common docker-selinux docker-engine
安装Docker(需要root权限)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置Docker的国内镜像仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新版本的Docker CE, 一路输入y回车确定即可安装完成
yum install docker-ce
查看当前安装的Docker版本
docker version
1.2 Docker的卸载
卸载 Docker 软件包
yum remove docker-ce
删除Docker中的镜像和容器
rm -rf /var/lib/docker
1.3 Docker的启动和停止
上面安装只是安装好, 但是没有启动Docker服务
启动Docker服务
systemctl start docker
停止Docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker状态
systemctl status docker
开机自动启动docker
systemctl enable docker
第2章 Docker镜像操作
2.1 配置国内阿里云镜像仓库加速
进入阿里云“管理控制台”后
搜索容器镜像服务— >镜像中心— >镜像加速器— >操作文档—>CentOS找到这句话
"registry-mirrors": ["https://4xfyd51k.mirror.aliyuncs.com"]
在daemon配置文件/etc/docker/daemon.json中加入加速仓库地址
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://4xfyd51k.mirror.aliyuncs.com"]
}
重新加载配置文件, 重启docker服务,如果重启docker后无法加速,可以重新启动CentOS
systemctl daemon-reload
systemctl restart docker
2.2 镜像操作
拉取镜像
docker pull 镜像名:标签名
例如: docker pull mysql:5.6
查看已安装的所有镜像
docker images
删除镜像
docker rmi 镜像ID
删除所有镜像
(是 `` 反单引号) [其中docker images -q命令是获取所有镜像ID]
docker rmi `docker images -q`
第3章 Docker容器操作
3.1 容器操作
查看所有容器(包括启动和未启动的)
docker ps -a
查看正在运行的容器
docker ps
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
创建容器(必须先有镜像才能创建容器)
docker run [OPTIONS] 镜像名:标签名
[OPTIONS]可选参数说明
[OPTIONS]可选参数说明
-i 表示创建交互式运行容器(就是创建容器后,会马上启动容器,并进入容器)通常与 -t 同时使用
-t 启动后会进入其容器命令行,通常与 -i 同时使用
--name 为创建的容器指定一个名称
-d 创建一个后台运行的守护式容器, 单独使用该命令创建容器后不会自动运行容器,如果加 -i 参数,创建后就会运行容器
-v 表示目录映射,格式为 -v 宿主机目录:容器目录 注意: 最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p 表示端口映射,格式为 -p 宿主机端口:容器端口
-e 指定环境变量容器中可以使用该环境变量
删除容器
注意: 只能删除已经停止了的容器
删除已停止的指定容器
docker rm 容器名称或容器ID
删除所有已停止的容器
docker rm `docker ps -a -q`
MySQL默认端口为3306(我本地电脑windows已经安装了MySQL占用了3306端口了, 所以不能再映射主机的3306端口, 这里替换成2206端口)
删除created状态的容器(上述命令无法删除这种容器,只能使用如下命令)
docker container rm 容器名称或容器ID
3.2 创建交互式容器
(交互式容器即容器创建好后,会马上启动容器,并进入的容器)
创建一个交互式容器并取名mycentos (/bin/bash是linux中的命令解析器,会进入到容器里面命令行)
docker run -it --name=mycentos centos:7 /bin/bash
上图显示,已经进入容器中(上面主机名变成了容器实例编号 )
可以通过docker ps查看创建的容器状态
3.3 创建守护式容器
如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器(后台运行的容器)
docker run -id --name=mycentos2 centos:7
登录并进入已经启动的容器
docker exec -it 容器名称或容器id /bin/bash
例如:
docker exec -it mycentos2 /bin/bash
退出并停止当前容器
(*注意:要在容器内部的命令行中执行)
exit
退出后使用docker ps -a可以看到容器状态变为Exited了
退出当前容器命令行
按键盘 Ctrl+P+Q 按一次一行,则多按几次,一般是连两次即可
启动容器
启动已运行过的容器
docker start 容器名称或容器id
启动所有运行过的容器(注意:反单引号
)
docker start `docker ps -a -q`
停止容器
停止正在运行的容器
docker stop 容器名称或容器id
停止所有正在运行的容器
docker stop `docker ps -a -q`
第4章 宿主机与容器之间的操作
4.1 将宿主机文件拷贝到容器内
注意:拷贝时容器必须处于UP启动状态
docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目录
1.在宿主机上创建一个mengxuegu文件并写入内容
2.将mengxuegu文件拷贝进 mycentos2 容器中的/opt目录下
3.登录 mycentos2 容器,查看/opt目录下是否有 mengxuegu 文件
4.2 将容器内文件拷贝到宿主机
注意:拷贝时容器必须处于UP启动状态
docker cp 容器名称:要拷贝的容器文件或目录 宿主机文件或目录
1.向mycentos2容器中的mengxuegu文件进行追加内容abc (要登录进容器中)
2.需要使用exit先退出docker容器命令行,回到宿主机
3.从容器拷贝mengxuegu文件到宿主机的/opt目录下(在宿主机中操作)
4.3 数据目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。使用 -v 选项
docker run -id -v /宿主机绝对路径目录:/容器内目录 --name=容器名 镜像名
需求
将宿主机的/opt目录与容器内的/opt目录进行映射,当在宿主机 /opt 目录下创建一个文件test.txt 这个test.txt会自动同步到容器映射目录/opt
实现
1.创建容器并挂载映射目录(使用 -v 宿主机目录:容器目录)
创建容器时,将宿主机目录/opt挂载容器目录/opt
docker run -id -v /opt:/opt --name=mycentos3 centos:7
2.在宿主机/opt目录下创建一个文件test.txt,这个test.txt会自动同步到容器映射目录/opt目录下
echo 1>/opt/test.txt
docker exec -it mycentos3 /bin/bash
cat /opt/test.txt
1111
实现挂载的目录只有只读权限(可选操作)
docker run -id -v /宿主机绝对路径目录:/容器内目录:ro --name=容器名 镜像名:标签名
例如: docker run -id -v /dataHost:/dataContainer:ro --name=mycentos4 centos:7
4.4 查看容器内部细节
查看容器IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2
第5章 MySQL部署
拉取MySQL镜像
docker pull mysql:版本号
创建MySQL容器
docker run -id --name=mymsql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
进入MySQL容器
docker exec -it mymsql /bin/bash
登录MySQL
mysql -u root -p
查看MySQL中有哪些默认的数据库
show databases;
使用SQLyog远程登录MySQL
第6章 Redis部署
拉取Redis镜像
docker pull redis:7.0.0
创建redis容器
docker run -d --name=myredis1 -p 6379:6379 \
-v /usr/local/redis-7.0.0/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-7.0.0/data:/data --privileged=true redis:7.0.0 \
redis-server /etc/redis/redis.conf
查看创建好的Redis容器
docker ps
进入Redis容器内部
docker exec -it myredis1 /bin/bash
使用redis命令行客户端连接上Redis
redis-cli -a qincloudshaw-redis-pw -p 6379
或
redis-cli -a qincloudshaw-redis-pw -p 6380
第7章 Tomcat部署
拉取tomcat镜像
docker pull tomcat:8
创建tomcat容器
挂载目录的情况
docker run -id --name=mytomcat -p 8080:8080 -v /usr/local/project:/usr/local/tomcat/webapps --privileged=true tomcat:8
不挂载目录的情况
docker run -id --name=mytomcat -p 8080:8080 tomcat:8
进入tomcat容器
docker exec -it mytomcat /bin/bash
部署web应用进行测试
因为已经做了数据目录挂载,所以将Web应用文件,放到宿主机的 /usr/local/project目录下
它就会将自动同步到tomcat容器中的webapp目录下
例如: 在宿主机的/usr/local/project目录下创建一个parkour文件夹,在文件夹下创建一个hello.html文件,文件内容如下
<html>
<body>hello docker tomcat</body>
</html>
进入/usr/local/project目录下
[root@localhost ~]# cd /usr/local/project
[root@localhost project]# mkdir parkour
[root@localhost project]# cd parkour
创建hello.html并添加上内容后保存退出(Ctrl+C :wq )
[root@localhost parkour]# vim hello.html
查看tomcat容器中挂载目录下是否已经生成了hello.html文件
[root@localhost /]# docker exec -it mytomcat /bin/bash
root@f36672150239:/usr/local/tomcat# cat webapps/parkour/hello.html
<html>
<body>hello docker tomcat</body>
</html>
测试,在地址栏输入
http://192.168.10.11:8080/parkour/hello.html
第8章 RabbitMQ部署
拉取RabbitMQ镜像(management带管理界面的)
docker pull rabbitmq:management
创建RabbitMQ容器
(远程连接端口5672管理界面访问端口15672 默认用户名密码都是gust)
docker run -id --name=myrabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
访问RabbitMQ管理界面
http://192.168.10.11:15672 默认 guest 用户,密码也是 guest
第9章 备份与迁移
9.1 将容器保存为镜像 [可选配置]
将容器保存为镜像
docker commit [-m=”提交的描述信息”] [-a=”创建者”] 容器名称或容器ID 生成的镜像名[:标签名]
查看容器是否有目录挂载
docker inspect --format=’{{.Mounts}}’ 容器名
[root@localhost ~]# docker inspect --format='{{.Mounts}}' mytomcat
[{bind /usr/local/project /usr/local/tomcat/webapps true rprivate}] #有目录挂载
[root@localhost ~]# docker inspect --format='{{.Mounts}}' myredis
[{volume f1526b7cc6b33a26354db3ceec79d7c0dbdcc6da6535458dbb460e3acc982365 /var/lib/docker/volumes/f1526b7cc6b33a26354db3ceec79d7c0dbdcc6da6535458dbb460e3acc982365/_data /data local true }] #无目录挂载
[root@localhost ~]#
9.1.1 将无目录挂载的容器保存为镜像
docker commit myredis myredismirror:1.0
使用自己创建的镜像创建容器并启动容器
docker run -id --name=customredis -p 66379:6379 myredismirror:1.0
[root@localhost ~]# docker run -id --name=customrabbitmq -p 5672:5672 -p 15672:15672 myrabbitmqmirror:1.0
832acad5412b20103fb4e7b3abded5ecd7d5e540bcb8dbfae42f2f290c446f2e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
832acad5412b myrabbitmqmirror:1.0 "docker-entrypoint.s…" 8 seconds ago Up 8 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp customrabbitmq
[root@localhost ~]#
可以成功访问RabbitMQ管理界面
http://192.168.10.11:15672 默认 guest 用户,密码也是 guest
9.1.2将有目录挂载的容器保存为镜像
问题:如果Docker对容器挂载了数据目录, 在将容器保存为镜像时,数据不会被保存到镜像中
原因:因为宿主机与容器做了路径映射,再commit一个新的镜像时,该路径下的所有数据都会被抛弃,不会被保存到新镜像中.
解决办法:
步骤1.目录挂载方法
先把在宿主机的数据备份在某个目录下,在 docker run 的时候使用-v参数将宿主机上的目录映射到容器里的目标路径中
(tomcat是 /usr/local/tomcat/webapps ,mysql是var/lib/mysql)
步骤2.拷贝方法
先把在宿主机的数据备份在某个目录下,通过拷贝的方法 docker cp 将备份的数据复制进容器里的目标路径中
(tomcat是 /usr/local/tomcat/webapps, mysql是var/lib/mysql)
9.1.2.1 将有目录挂载的Tomcat保存成镜像
查看数据保存的位置
docker inspect --format='{{.Mounts}}' mytomcat [{bind /usr/local/project /usr/local/tomcat/webapps true rprivate}]
将宿主机/usr/local/project目录下的数据备份一份到baseproject目录下
cp -rf /usr/local/project/ /usr/local/baseproject
将有目录挂载的tomcat容器保存为镜像
docker commit mytomcat mytomcatmirror:1.0
用自己创建好的镜像创建带有目录挂载的容器,创建容器时,目录挂载的路径指定为备份目录
docker run -id --name=customtomcat -p 8081:8080 -v \
/usr/local/baseproject:/usr/local/tomcat/webapps --privileged=true mytomcatmirror:1.0
登录customtomcat查看webapps下有parkour目录,parkour目录下有hello.html文件
[root@localhost /]# docker exec -it customtomcat /bin/bash
root@f6c9d4227f2b:/usr/local/tomcat# cd webapps
root@f6c9d4227f2b:/usr/local/tomcat/webapps# ls
parkour
测试访问 http://192.168.10.11:8081/parkour/hello.html 出现下面页面,说明目录挂载成功
9.1.2.2 将有目录挂载的MySQL保存成镜像
查看数据保存的位置
[{volume a37ef452bd82327059ac92dc8912f201e45ae991e9661b1b1522e3e8a0add059 /var/lib/docker/volumes/a37ef452bd82327059ac92dc8912f201e45ae991e9661b1b1522e3e8a0add059/_data /var/lib/mysql local true }]
在宿主机目录下创建一个文件a.txt内容为parkour
cd var/lib/docker/volumes/a37ef452bd82327059ac92dc8912f201e45ae991e9661b1b1522e3e8a0add059/_data
vim a.txt
a.txt文件中添加内容parkour后保存退出
将宿主机目录下的数据备份一份到/usr/local/mysqldata目录下
cp /var/lib/docker/volumes/a37ef452bd82327059ac92dc8912f201e45ae991e9661b1b1522e3e8a0add059/_data /usr/local/mysqldata
将有目录挂载的mysql容器保存为镜像
[root@localhost /]# docker commit mymysql mymysqlmirror:1.0
用自己创建好的镜像创建带有目录挂载的容器,创建容器时,目录挂载的路径指定为备份目录
docker run -id --name=custommysql -p 3307:3306 -v /usr/local/mysqldata:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root mymysqlmirror:1.0
登录custommysql查看/var/lib/mysql下有a.txt文件文件的内容为parkour
[root@localhost /]# docker exec -it custommysql /bin/bash
root@b22998bf271d:/# cd var/lib/mysql
root@b22998bf271d:/var/lib/mysql# cat a.txt
parkour
使用SQLyog远程登录MySQL出现下面页面,说明目录挂载成功
9.2 备份镜像
[root@localhost /]# docker save -o customtomcat.tar mytomcatmirror:1.0
[root@localhost /]# ls
bin boot customtomcat.tar dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
9.3 恢复镜像与迁移镜像
首先我们需要先删除掉mytomcatmirror:1.0镜像(注意先停止并删除所有引用了的容器)
执行加载命令使用tar压缩文件恢复镜像
docker load -i customtomcat.tar
再次查看所有镜像,发现镜像已恢复, 接着就又可以使用此镜像进行创建容器了
第10章 Dockerfile语法与实战
10.1使用Dockerfile构建docker镜像的步骤
是由一系列命令和参数组成的用于构建Docker镜像的脚本文件
使用Dockerfile构建docker镜像的步骤
- 编写dockerfile文件
- 通过docker build命令生成新的镜像
- 通过docker run命令运行
10.2 Dockerfile文件内容示例
FROM scratch #基础镜像, scratch相当于java中的object
ADD centos-7-x86_64-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \ #标签说明
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20190305"
CMD ["/bin/bash"] # 默认执行的命令,创建运行容器时最后会加上 /bin/bash,
# 所以创建容器时,可不加 /bin/bash ,即如下:
# docker run -it --name=mycentos0 centos:7
# 如果加了,则在后面采用我们自己加的命令执行/bin/bash
10.3 Dockerfile语法规则
- 每条指令的保留字都必须为大写字母且后面至少要有一个参数
- 执行顺序按从上往下执行。
- # 用于注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
10.4 Dockerfile的执行流程
- Docker 从基础镜像运行一个容器
- 执行每一条指定并对容器作出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个新容器
- 执行 Dockerfile 中的下一条指令直到所有指令都执行完成
10.5 Dockerfile常用指令及其作用
指令(大写的是保留字) | 作用 |
---|---|
FROM image_name:tag | 基础镜像,基于哪个基础镜像启动构建流程 |
MAINTAINER user_name | 镜像的创建者的姓名和邮箱地址等 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件, 将会在复制后自动解压 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条),运行到当前行要执行的其他命令(可想象成sout(“aaa”) ) |
WORKDIR path_dir | 设置工作目录,当创建容器后,命令终端默认登录进来后所在的目录。未指定则为根目录 / |
EXPOSE port | 当前对外暴露的端口号,使容器内的应用可以通过端口和外界交互 |
CMD argument | Dockerfile中可以有多个CMD,但是只有最后一个会生效。在构建容器时,会被 docker run 后面指定的参数覆盖 |
ENTRYPOINT argument | 和CMD相似,但是并不会被docker run指定的参数覆盖,而是追加参数 |
VOLUME | 将宿主机文件夹挂载到容器中 |
10.6 Dockerfile构建镜像实战
需求: 构建一个JDK镜像
步骤:
1.在宿主机上创建目录,并切换到新创建的目录中
mkdir -p /usr/local/mydocker
cd /usr/local/mydocker
2.下载jdk-8u111-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/mydocker目录(可以使用ftp上传)
3.创建一个Dockerfile文件vim Dockerfile然后按字母i插入状态,粘贴以下内容
#来自基础镜像
FROM centos:7
#指定镜像创建者信息
MAINTAINER parkour
#切换工作目录 /usr/local
WORKDIR /usr/local
#创建一个存放jdk的路径
RUN mkdir /usr/local/java
#将jdk压缩包复制并解压到容器中/usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
CMD ["/bin/bash"]
4.构建镜像语法
docker build [-f 指定Dockerfile所在路径与文件名] -t 生成的镜像名:标签名 .
注意:后面的空格和点不能省略,点表示当前目录
[可选参数] 如果未指定-f的值,则找当前目录下名为Dockerfile的文件
示例: 生成镜像名为jdk,标签为1.8
docker build -t jdk:1.8 .
5.查看镜像是否构建完成
6.使用构建好的镜像创建容器
docker run -it –name=myjdk8 jdk:1.8 /bin/bash
大功告成,工作目录是 /usr/local
第11章 本地镜像发布到阿里云仓库
11.1 阿里云镜像仓库配置
1.登录阿里云控制台上找到容器镜像服务,创建镜像仓库,(选择本地仓库,创建镜像仓库)
2.点击仓库右边的管理进行查看推送镜像到Registry的操作指南
3.推送镜像到Registry指南
11.2 本地镜像发布到阿里云镜像仓库
需求: 将本地镜像tomcat:8推送到阿里云镜像仓库(每个人的registry地址不一样)
1.登录阿里云Docker Registry
2.标记此镜像为阿里云仓库的镜像
docker tag 894b39cf2fa1 registry.cn-beijing.aliyuncs.com/parkour/docker:8
3.将镜像推送到阿里云仓库
docker push registry.cn-beijing.aliyuncs.com/parkour/docker:8
4.去阿里云镜像仓库中查看推送成功的镜像
5.从阿里云仓库中拉取自己上传的镜像并创建容器
894b39cf2fa19836108efcaef41875c446c65a7f2f8a8b4284a013d84838774e
1.复制仓库中的镜像地址,用于拉取Registry中的tomcat:8镜像 (注意docker:8 后面有个空格)
docker pull registry.cn-beijing.aliyuncs.com/parkour/docker:8
2.使用从阿里云仓库中拉取的镜像创建容器
第12章 微服务Docker容器化自动部署
12.1 微服务部署方法
1.传统手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚 拟机并拷贝至JDK容器。
2.通过Maven插件自动部署:对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。
所以我们这 里学习如何自动部署,这也是企业实际开发中经常使用的方法。
以下采用 Maven 插件自动部署
12.2 配置Maven 环境变量
1.因为我们后面要在cmd命令行窗口使用 mvn 指令,所以要在本地配置Maven环境变量(如已配置请忽略)
然后在Path中追加 ;%MAVEN_HOME%\bin
2.cmd命令窗口测试(后面也会在IDEA上操作,所以需要重启计算机才可以使用)
12.3 修改Docker配置
如果不知道docker.service文件在哪个目录下,可以通过使用下面两个命令进行查看
systemctl disable docker
systemctl enable docker
1.修改宿主机的docker配置,让其docker服务可以远程访问, 暴露的docker服务端口号 2375
vim /bin/systemed/system/docker.service
在 ExecStart= 后面添加如下配置
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
0.0.0.0代表所有 ip ,也可指定 ip
修改后如下:
2.刷新配置,重启服务
systemctl daemon-reload
systemctl restart docker
3.验证是否生效,访问:http://192.168.10.11:2375/version , 响应如下内容则成功:
如果访问不到,则查看防火墙是否关闭
systemctl status firewalld # 查看状态
systemctl stop firewalld # 关闭
systemctl disable firewalld # 开机禁用
12.4 自动部署 Config 服务端
使用Maven插件自动部署 Config 配置中心:microservice-cloud-11-config-server-5001
1.在Maven的安装目录下的setting.xml文件中添加阿里云用户名和密码
2.在 microservice-cloud-11-config-server-5001 工程 pom.xml 增加插件配置
位于:Docker\Docker配套资源文件\docker-maven自动部署pom.xml
<build>
<finalName>app</finalName>
<plugins>
<!-- 此插件一定要在其他构建插件之上,否则打包文件会有问题。 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:
https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--生成镜像相关配置-->
<configuration>
<!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像 -->
<forceTags>true</forceTags>
<!-- 远程 docker 宿主机地址, 端口号是/lib/systemd/system/docker.service所暴露的端口号, 生成镜像到docker中 -->
<dockerHost>http://192.168.10.11:2375</dockerHost>
<!--内容是之前修改的maven的settings.xml配置文件中,server节点的id-->
<serverId>docker-aliyun</serverId>
<!-- 镜像名:阿里云镜像仓库地址
${project.artifactId}引用当前工程名,
${project.version}引用当前工程版本号
registry.cn-hangzhou.aliyuncs.com/mengxuegu/demo:0.0.1-SNAPSHOT -->
<imageName>registry.cn-beijing.aliyuncs.com/parkour/${project.artifactId}:${project.version}</imageName>
<!--基础镜像-->
<!--<baseImage>jdk1.8</baseImage>-->
<baseImage>java</baseImage>
<!--类似于Dockerfile的ENTRYPOINT指令-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource> <!-- 指定打包的资源文件 -->
<targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
<directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 -->
<include>${project.build.finalName}.jar</include> <!-- 这里指定最后生成的jar包 -->
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
3.在阿里云创建一个microservice-cloud-11-config-server-5001仓库
4.在CMD的命令提示符下,进入microservice-cloud-11-config-server-5001工程所在的目录,输入以下 命令, 进行打包和上传镜像
(mvn clean package 打包成jar ,然后docker:build构建成镜像,-DpushImage推送到仓库):
如果报mvn不是内部命令,则maven配置环境变量,然后重启电脑
mvn clean package docker:build -DpushImage
如果报连接超时Timeout:
Exception caught: Timeout: GET http://192.168.10.11:2375/version: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.ConnectTimeoutException: Connect to 192.168.10.11:2375
[/192.168.10.12] failed: connect timed out -> [Help 1]
解决:查看宿主机防火墙有没关闭或者是上面暴露端口号配置是否正确
5.宿主机查看docker上就有microservice-cloud-11-config-server-5001镜像
6.去阿里云仓库查看, 镜像ID为 d555ca0ba449
7.启动容器,其中 d555ca0ba449 是镜像ID
docker run -it --name=config_server -p 5001:5001 d555ca0ba449 /bin/bash
上面查看日志启动正常,你可以再采用守护容器方式创建容器在后台进行运行。
如果存在 config_server 容器,则把它先停止再删除
docker stop config_server
docker rm config_server
创建守护容器
docker run -id --name=config_server -p 5001:5001 d555ca0ba449
8.测试,项目启动需要一定时间,所以过一会访问配置内容:
http://192.168.10.11:5001/microservice-config-product-dev.yml
12.5 自动部署 Eureka 注册中心
保证 Config 服务端容器是启动状态 ,因为 Eureka 需要连接它
在阿里云创建一个microservice-cloud-13-eureka-config-6001仓库
修改 GitHub 上面的 microservice-config-eureka.yml 文件中的
eureka.instance.hostname 和 eureka.client.serviceUrl.defaultZone
完整配置位于:Docker配套资源文件\microservice-config-eureka.yml
eureka:
instance:
hostname: 192.168.10.11 #修改此处
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:6001/eureka/ # 修改此处
server:
enable-self-preservation: true # 开启自我保护机制*****************
修改microservice-cloud-13-eureka-config-6001工程中bootstrap.yml 的Config服务端地址:
uri: http://192.168.10.11:5001
注意一定要修改,不然启动会报错在microservice-cloud-13-eureka-config-6001工程pom.xml中增加插件配置
<build> <finalName>app</finalName> <plugins> <!-- 此插件一定要在其他构建插件之上,否则打包文件会有问题。 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!--生成镜像相关配置--> <configuration> <!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像 --> <forceTags>true</forceTags> <!-- 远程 docker 宿主机地址, 端口号是/lib/systemd/system/docker.service所暴露的端口号, 生成镜像到docker中 --> <dockerHost>http://192.168.10.11:2375</dockerHost> <!--内容是之前修改的maven的settings.xml配置文件中,server节点的id--> <serverId>docker-aliyun</serverId> <!-- 镜像名:阿里云镜像仓库地址 ${project.artifactId}引用当前工程名, ${project.version}引用当前工程版本号 registry.cn-hangzhou.aliyuncs.com/mengxuegu/demo:0.0.1-SNAPSHOT --> <imageName>registry.cn-beijing.aliyuncs.com/parkour/${project.artifactId}:${project.version}</imageName> <!--基础镜像--> <!--<baseImage>jdk1.8</baseImage>--> <baseImage>java</baseImage> <!--类似于Dockerfile的ENTRYPOINT指令--> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <!-- 指定打包的资源文件 --> <targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 --> <directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 --> <include>${project.build.finalName}.jar</include> <!-- 这里指定最后生成的jar包 --> </resource> </resources> </configuration> </plugin> </plugins> </build>
在CMD的命令提示符下,进入microservice-cloud-13-eureka-config-6001工程所在的目录,输入以下命令进 行打包和上传镜像
(mvn clean package 打包成jar ,然后docker:build构建成镜像,-DpushImage推送到仓库):
mvn clean package docker:build -DpushImage
效果同 config 服务端一样
宿主机查看 docker 镜像 , 镜像ID为 3b6efaf22549
去阿里云仓库查看, 镜像ID为 3b6efaf22549
启动容器,其中 3b6efaf22549 是镜像ID
docker run -it --name=eureka_server -p 6001:6001 3b6efaf22549 /bin/bash
上面查看日志启动正常,你可以再采用守护容器方式创建容器在后台进行运行# 如果存在 eureka_server 容器,则把它先停止再删除 docker stop eureka_server docker rm eureka_server \# 创建守护容器 docker run -id --name=eureka_server -p 6001:6001 3b6efaf22549
如果报错 Cannot execute request on any known server,说明 bootstrap.yml 的IP没有更改
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
测试,访问Eureka注册中心:
12.6 自动部署 Product 商品提供者
在阿里云创建一个microservice-cloud-14-product-config-8001仓库
保证 config_server 和 eureka_server 都是Up启动状态
启动 MySQL5.7 和 RabbitMQ 容器,因为需要使用
docker start mxg_mysql docker start mxg_rabbitmq
导入商品提供者数据到端口号是 33306 的 MySql 容器中 直接将以下脚本导入即可
脚本位于: Docker配套资源文件\springcloud_db01.sql 和 springcloud_db02.sql
- 修改 GitHub上面的 microservice-config-product.yml 文件,修改数据库地址和密码、eureka地址
spring.datasource.url 、spring.datasource.password 和 eureka.client.serviceUrl.defaultZone
注意数据库端口:33306
完整配置位于: Docker配套资源文件\microservice-config-product.yml
spring:
profiles: dev # 开发环境
application:
name: microservice-product-config #服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.10.11:33306/springcloud_db02?serverTimezone=GMT%2B8
username: root
password: root
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://192.168.10.11:6001/eureka
- 修改 microservice-cloud-14-product-config-8001 工程中的 bootstrap.yml 配置:
config服务端与rabbitmq地址
spring:
cloud:
config:
name: microservice-config-product #github上的配置名称,注意没有yml后缀名
profile: prod # 本次访问的环境配置项
label: master # 远程库的分支名
# uri: http://localhost:5001 #Config配置中心地址,通过它获取microservice- config-product.yml配置信息
uri: http://192.168.10.11:5001
rabbitmq:
host: 192.168.10.11
port: 5672
username: guest
password: guest
\# 暴露触发消息总线的地址
management:
endpoints:
web:
exposure:
include: bus-refresh
- 在microservice-cloud-14-product-config-8001工程 pom.xml 增加插件配置
<build> <finalName>app</finalName> <plugins> <!-- 此插件一定要在其他构建插件之上,否则打包文件会有问题。 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!--生成镜像相关配置--> <configuration> <!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像 --> <forceTags>true</forceTags> <!-- 远程 docker 宿主机地址, 端口号是/lib/systemd/system/docker.service所暴露的端口号, 生成镜像到docker中 --> <dockerHost>http://192.168.10.11:2375</dockerHost> <!--内容是之前修改的maven的settings.xml配置文件中,server节点的id--> <serverId>docker-aliyun</serverId> <!-- 镜像名:阿里云镜像仓库地址 ${project.artifactId}引用当前工程名, ${project.version}引用当前工程版本号 registry.cn-hangzhou.aliyuncs.com/mengxuegu/demo:0.0.1-SNAPSHOT --> <imageName>registry.cn-beijing.aliyuncs.com/parkour/${project.artifactId}:${project.version}</imageName> <!--基础镜像--> <!--<baseImage>jdk1.8</baseImage>--> <baseImage>java</baseImage> <!--类似于Dockerfile的ENTRYPOINT指令--> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <!-- 指定打包的资源文件 --> <targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 --> <directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 --> <include>${project.build.finalName}.jar</include> <!-- 这里指定最后生成的jar包 --> </resource> </resources> </configuration> </plugin> </plugins> </build>
- 在CMD的命令提示符下,进入microservice-cloud-14-product-config-8001工程所在的目录,
输入以下命令进行打包和上传镜像(mvn clean package 打包成jar ,然后docker:build构建成镜像,-DpushImage推送到仓库):
mvn clean package docker:build -DpushImage
效果同 Config 一样
宿主机查看 docker 镜像 , 镜像ID为 628722467a73
去阿里云仓库查看,镜像ID为 628722467a73
启动容器,其中 628722467a73是镜像ID
docker run -it --name=product_config -p 8001:8001 628722467a73 /bin/bash
上面查看日志启动正常,你可以再采用守护容器方式创建容器在后台进行运行。
# 如果存在 product_config 容器,则把它先停止再删除
docker stop product_config
docker rm product_config
# 创建守护容器
docker run -id --name=product_config -p 8001:8001 3b6efaf22549
如果报如下错误,说明 bootstrap.yml 的IP没有更改
com.netflix.discovery.shared.transport.TransportException: Cannot execute request
on any known server
如果报如下错误,可能数据库密码是错的。
java.sql.SQLException: Access denied for user 'root'@'172.17.0.1' (using password: YES)
- 测试
再次访问Eureka注册中心,发现Product 成功注册Eureka中
再请求端口提供者查询数据 :http://192.168.10.11:8001/product/get/1
第13章 Docker报错
13.1启动docker web服务时,虚拟机端口转发,外部无法访问
WARNING IPv4 forwarding is disabled. Networking will not work