Docker概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZjnOFoo-1654088141765)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210128162439879.png)]
Docker安装
-
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装需要的软件包
yum install -y yum-utils
-
设置镜像仓库
# 正确推荐使用国内的 yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
yum makecache fast
-
安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io
-
启动 Docker
systemctl start docker
-
测试命令
docker version docker run hello-world docker images
启动docker服务,开机自动启动mysql、redis等
# 首先开启docker开机自启动
systemctl enable docker
# 开启后我们找到想要自动重启的容器名
###################### docker update 容器名 --restart=always ############################
#例如我想要redis在docker启动时就启动
docker update redis --restart=always
docker update mysql --restart=always
Docker常用命令
帮助命令
docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。
docker --help # 帮助
镜像命令
docker images
# 列出本地主机上的镜像
[root@kuangshen ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 12 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像创建时间
SIZE 镜像大小
# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同 的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
# 可选项
-a: 列出本地所有镜像
-q: 只显示镜像id
--digests: 显示镜像的摘要信息
docker search
# 搜索镜像
[root@kuangshen ~]# docker search mysql
# docker search 某个镜像的名称 对应DockerHub仓库中的镜像
# 可选项
--filter=stars=50 : 列出收藏数不小于指定值的镜像。
docker pull
# 下载镜像
[root@dragon ~]# docker pull mysql
Using default tag: latest # 不写tag,默认是latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 分层下载
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实位置
# 指定版本下载
[root@dragon ~]# docker pull mysql:5.7
docker rmi
# 删除镜像
[root@dragon ~]# docker rmi -f $(docker images -aq) # 删除全部
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
容器命令
mysql redis运行
# mysql 容器运行
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
# conf配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8mb4
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
# reids 容器运行
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
说明:有镜像才能创建容器,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !
docker pull centos
新建容器并启动
# 命令
docker run [可选参数] IMAGE [COMMAND][ARG...]
# 常用参数说明
--name="Name" # 给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
-P # 随机端口映射(大写)
-p # 指定端口映射(小结),一般可以有四种写法
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort (常用)
containerPort
[root@dragon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 6 weeks ago 209MB
# 使用centos进行用交互模式启动容器,在容器内执行/bin/bash命令!
[root@dragon ~]# docker run -it centos /bin/bash
[root@6ef6d82e83ee /]# ls # 显示容器内部目录
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@6ef6d82e83ee /]# exit # 退出容器
exit
# 查看所有正在运行的容器
[root@dragon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常用参数说明
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号。
exit # 容器停止退出
ctrl+P+Q # 容器不停止退出
# 启动停止容器
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill (容器id or 容器名) # 强制停止容器
# 删除容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -a -q) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
常用其他命令
后台启动容器
# 命令
docker run -d 容器名
# 例子
docker run -d centos # 启动centos,使用后台方式启动
# 问题: 使用docker ps 查看,发现容器已经退出了!
# 解释:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命 令,就会自动退出。
# 比如,你运行了nginx服务,但是docker前台没有运行应用,这种情况下,容器启动后,会立即自 杀,因为他觉得没有程序了,所以最好的情况是,将你的应用使用前台进程的方式运行启动。
查看日志
# 命令
docker logs -f -t --tail 容器id
# 例子:我们启动 centos,并编写一段脚本来测试玩玩!最后查看日志
[root@kuangshen ~]# docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
# -t 显示时间戳
# -f 打印最新的日志
# --tail 数字 显示多少条!
[root@kuangshen ~]# docker logs -tf --tail 10 c8530dbbe3b4
查看容器中运行的进程信息,支持 ps 命令参数。
# 命令
docker top 容器id
# 测试
[root@kuangshen ~]# docker top c8530dbbe3b4
UID PID PPID C STIME TTY TIME CMD
root 27437 27421 0 16:43 ? 00:00:00 /bin/sh -c ....
查看容器/镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@kuangshen ~]# docker inspect c8530dbbe3b4
进入正在运行的容器
# 命令1
docker exec -it 容器id bashShell
# exec 是在容器中打开新的终端,并且可以启动新的进程
# 命令2
docker attach 容器id
# attach 直接进入容器,不会启动新的进程
从容器内拷贝文件到主机上
# 命令
docker cp 容器id:容器内路径 目的主机路径
# 测试
[root@dragon ~]# docker attach bfdac335ab04 # 进入容器
# 容器内执行,创建一个文件测试
[root@bfdac335ab04 /]# cd /home
[root@bfdac335ab04 home]# touch test.java
[root@bfdac335ab04 home]# ls
test.java
[root@bfdac335ab04 home]# exit
exit
# linux复制查看,是否复制成功
[root@dragon /]# docker cp bfdac335ab04:/home/test.java /home
[root@dragon /]# cd home
[root@dragon home]# ls
admin test.java www
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Jcglv8V-1654088141768)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210122134035554.png)]
作者:慕_女神
链接:https://www.imooc.com/article/308172
来源:慕课网
安装Tamcat
# 下载tomcat
docker pull tomcat
# 启动运行 -d 后台运行
docker run -d -p 8080:8080 --name tomcat9 tamcat
# 进入tomcat
docker exec -it tomcat9 /bin/bash
# 访问网页发现问题,没有webapps,阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。
# 所以我们需要把webapps.dist中的内容cp到webapps中
cp -r webapps.dist/* webapps
可视化
Portainer(先用这个)
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock -- privileged=true portainer/portainer
Commit镜像
# 命令和git原理类似
docker commit -m="提交的描述" -a="作者" 容器id 目标镜像名:[版本]
实战测试
# 启动一个默认的tomcat
docker run -d -p 8080:8080 tomcat
# 进入容器
docker exec -it 137d29272276 /bin/bash
# 发现这个默认的tomcat没有webapps应用,镜像的原因,官方镜像默认webapps下边是没有文件的
# 把webapps.dist的文件拷贝过去
cp -r webapps.dist/* webapps
# 将我们操作过的容器通过commit提交为一个镜像!我们以后使用这个修改过的即可。
docker commit -a="tycoonbo" -m="add webapps app" 137d29272276 tomcat01:1.0
容器数据卷
是什么是容器数据卷?
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化同步
Mysql的容器删除,删库跑路! 需求:MySql数据可以储存在本地!
容器之前可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地。
这就是卷技术!目录的挂载,将我们容器内的目录挂载到Linux上面。
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令来挂载 -v
# 命令
docker run -it -v 主机目录:容器内目录 centos /bin/bash
# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来时候我们可以通过,docker inspect 容器id 查看对应的挂载信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMlkhdH8-1654088141769)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161503311.png)]
测试文件的同步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMazuemx-1654088141769)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161624281.png)]
再次测试!
- 停止容器
- 宿主机上修改文件
- 启动容器
- 容器内的数据依旧是同步的!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cubzlaml-1654088141771)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161954778.png)]
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
# 查看挂载的路径
[root@kuangshen ~]# docker volume inspect nginxconfig
[
{
"CreatedAt": "2020-05-13T17:23:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
"Name": "nginxconfig",
"Options": null,
"Scope": "local"
}
]
# 怎么判断挂载的是卷名而不是本机目录名?
不是/开始就是卷名,是/开始就是目录名
########################################################################################
# 通过 -v 容器内路径:ro 或 rw 改变读写权限
ro readonly # 只读
rw readwrite # 读写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
所有的docker容器内的卷都在/var/lib/docker/volumes/****/***
安装MySql,同步数据
# 安装镜像
[root@dragon ~]# docker pull mysql:5.7
# 安装启动mysql,需要设置密码的
# 官方测试 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 运行容器,做数据挂载!
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器姓名
[root@dragon ~]# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
# 启动成功后,用本地sqlyog测试连接。
# sqlyog - 连接到服务器的3344 ---- 3344 和容器内的 3306 映射,这时候我们就可以连接上了。
假设将我们的容器删除,发现挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
初识DockerFile
DockerFile:是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本就能生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
# 创建一个dockerfile文件,名字可以随便写,建议是dockerfile
# 文件中的内容 指令大写
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "--------end--------"
CMD /bin/bash
# 这里的每个命令就是一层镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9zKogZY-1654088141772)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195014347.png)]
生成的镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDgK32Rp-1654088141772)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195040569.png)]
启动我们自己的容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lT5iN81U-1654088141773)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195313191.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PvFAN35B-1654088141773)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195428876.png)]
这个卷和外部一定有一个同步目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQqmo7dc-1654088141774)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195856646.png)]
查看卷的挂载目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rxP6Z90B-1654088141775)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195950924.png)]
测试这个文件是否同步出去了,在其中一个上边创建一个文件
这种方式我们使用的是十分多的,因为我们通常会构建自己的镜像。
加是构建镜像时候没有挂载卷,就要手动挂载 -v 卷名:容器内路径!
数据卷容器同步
docker run -it --name docker02 --volumes-from docker01 dragon/centos
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XppNuAQT-1654088141776)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125201410722.png)]
分别启动两个容器,进行挂载,测试。
也可以多个容器挂载其中一个容器,如果删除主容器,那么其他容器的共享内容不会消失。
文件是拷贝过去的,而不是在线共享的,所有当一个容器宕机了,也不影响其他容器的文件。
多个Mysql实现数据同步
[root@dragon ~]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
[root@dragon ~]# docker run -d -p 3344:3306 -e MYSQL_ROOT_PASSWORD=1234 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这样就可以实现两个MySQL数据共享了
DockerFile
DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库!)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdfwaJvH-1654088141777)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203124252.png)]
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建镜像!
DockerFile构建过程
基础知识:
- 每个保留关键之都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rV1lr0GK-1654088141778)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203706609.png)]
DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名 + 邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat 镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发命令
COPY # 类似ADD,将我们文件拷贝到镜像
ENV # 构建的时候设置环境变量!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWgZSD95-1654088141779)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125204206806.png)]
ENTRYPOINT 和 CMD 的区别
构建两个镜像
# ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-entrypoint -t cmdentrypoint .
# 运行
docker run cmdentrypoint
# CMD
FROM centos
CMD ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .
# 运行
docker run cmdtest
两个都是运行后直接ls -a 展示列表
但是cmd在运行时无法追加操作,而ENTRYPOINT可以追加操作。
CMD
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHbikZiZ-1654088141779)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125212123368.png)]
ENTRYPOINT
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1iKtZzP-1654088141780)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125212158560.png)]
实战:自定义镜像 tomcat
1、 mkdir tycoon/build/tomcat
2、在上述目录下 touch readme.txt
3、将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录
4、在 tycoon/build/tomcat 目录下新建一个Dockerfile文件
# vim Dockerfile
FROM centos
MAINTAINER tycoonbo<2390721223@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下
COPY readme.txt /usr/local/readme.txt
#把java与tomcat添加到容器中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
5、构建镜像
[root@dragon tomcat]# docker build -t diytomcat .
.....
Successfully built ffdf6529937d
Successfully tagged diytomcat:latest # 构建完成
[root@dragon tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest c218a398e667 About a minute ago 640MB
dragon/centos latest e854087a8ff8 18 hours ago 209MB
6、运行启动 run
[root@dragon tomcat]# docker run -d -p 8088:8080 --name tycoontomcat -v /home/tycoon/build/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /home/tycoon/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.40/logs diytomcat
9b8362277ba9ee903de0f9d6ac726eab804f2a4f43f4ea8de8851b2d0ff5d913
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukxjsmG2-1654088141781)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126140204527.png)]
7、验证测试访问! 网页访问 39.102.33.216:8088
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYrWc8X9-1654088141782)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126140410958.png)]
8、发布项目(由于做了卷挂载,所以直接在本地test文件下发布就OK!)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello,tycoonbo</title>
</head>
<body>
-----------welcome------------
<%=" my docker tomcat,tycoonbo666 "%>
<br>
<br>
<% System.out.println("-------my docker tomcat-------");%>
</body>
</html>
测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B7M5xKWA-1654088141782)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126142641655.png)]
# 查看日志
[root@dragon tomcat]# cd tomcatlogs/
[root@dragon tomcatlogs]# ls
catalina.2021-01-26.log host-manager.2021-01-26.log localhost_access_log.2021-01-26.txt
catalina.out localhost.2021-01-26.log manager.2021-01-26.log
[root@dragon tomcatlogs]# cat catalina.out
.........
-------my docker tomcat-------
# 搞定
发布自己的镜像
上传DockerHub
1、注册DockerHub
2、在xshell中登录DockerHub
[root@dragon tomcatlogs]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
# 登录成功
[root@dragon tomcatlogs]# docker login -u tycoonbo
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded # 成功提示
3、登录完毕后,push镜像
# push自己的镜像到服务器上!
[root@dragon /]# docker tag diytomcat tycoonbo/diytomcat:1.0
[root@dragon /]# docker push tycoonbo/diytomcat:1.0
上传阿里云镜像
1、登录阿里云,找到容器镜像服务
2、创建命名空间
3、创建容器镜像
4、查看镜像仓库
教你xshell登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCbNOXgj-1654088141783)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126151646226.png)]
# 登录
[root@dragon /]# docker login --username=社会你博哥dragon registry.cn-beijing.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 设置 tag
[root@dragon /]# docker tag c218a398e667 registry.cn-beijing.aliyuncs.com/tycoonbo-images/tycoonbo-test:1.0
# push到阿里云
[root@dragon /]# docker push registry.cn-beijing.aliyuncs.com/tycoonbo-images/tycoonbo-test:1.0
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QJwJxsjs-1654088141784)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126152604246.png)]
Docker 网络
理解docker0
清空所有镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hlt1bGNp-1654088141784)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126153505177.png)]
实战:部署redis集群
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
> do \
> mkdir -p /mydata/redis/node-${port}/conf
> touch /mydata/redis/node-${port}/conf/redis.conf
> cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
> port 6379
> bind 0.0.0.0
> cluster-enabled yes
> cluster-config-file nodes.conf
> cluster-node-timeout 5000
> cluster-announce-ip 172.38.0.1${port}
> cluster-announce-port 6379
> cluster-announce-bus-port 16379
> appendonly yes
> EOF
> done
# 启动6个容器
docker run -p 6378:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 进入一个redis,注意这里是 sh命令
docker exec -it redis-1 /bin/sh
# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 连接集群
redis-cli -c
# 查看集群信息
cluster info
# 查看节点
cluster nodes
# set a b
# 停止到存值的容器
# 然后再次get a,发现依旧可以获取值
# 查看节点,发现高可用完全没问题
SpringBoot微服务打包Docker镜像
- 构建springboot项目
- 打包应用
- 编写Dockerfile
- 构建镜像
- 发布运行!
Docker Compose
简介
定义、运行多个容器。 YAML file 配置文件
三步骤:
- Dockerfile保证我们的项目,可以在任何地方运行。
- service服务,docker-compose.yml 文件
- 启动 docker-compose up
作用:批量容器编排!
Compose 是 docker的开源项目。需要安装!
dockerfile 让程序在任何地方运行。
Compose :概念
- 服务service:容器,应用。
- 项目project:一组相关的容器。
安装
1、下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、授权
sudo chmod +x /usr/local/bin/docker-compose
体验
- 应用 app.py
- Dockerfile 应用打包为镜像
- Docker-compose yaml 文件(定义整个服务,需要的环境。web、redis) 完整上线服务!
- 启动compose 项目 (docker-compose up)
yaml规则
docker-compose.yml核心
# 3层!
version:'' #版本
services: # 服务
服务1: web
# 服务配置
images
build
network
.....
服务2: redis
....
服务3: redis
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:
Docker
Docker概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NvTXZFie-1654088143144)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210128162439879.png)]
Docker安装
-
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装需要的软件包
yum install -y yum-utils
-
设置镜像仓库
# 正确推荐使用国内的 yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
yum makecache fast
-
安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io
-
启动 Docker
systemctl start docker
-
测试命令
docker version docker run hello-world docker images
启动docker服务,开机自动启动mysql、redis等
# 首先开启docker开机自启动
systemctl enable docker
# 开启后我们找到想要自动重启的容器名
###################### docker update 容器名 --restart=always ############################
#例如我想要redis在docker启动时就启动
docker update redis --restart=always
docker update mysql --restart=always
Docker常用命令
帮助命令
docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。
docker --help # 帮助
镜像命令
docker images
# 列出本地主机上的镜像
[root@kuangshen ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 12 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像创建时间
SIZE 镜像大小
# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同 的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
# 可选项
-a: 列出本地所有镜像
-q: 只显示镜像id
--digests: 显示镜像的摘要信息
docker search
# 搜索镜像
[root@kuangshen ~]# docker search mysql
# docker search 某个镜像的名称 对应DockerHub仓库中的镜像
# 可选项
--filter=stars=50 : 列出收藏数不小于指定值的镜像。
docker pull
# 下载镜像
[root@dragon ~]# docker pull mysql
Using default tag: latest # 不写tag,默认是latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 分层下载
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实位置
# 指定版本下载
[root@dragon ~]# docker pull mysql:5.7
docker rmi
# 删除镜像
[root@dragon ~]# docker rmi -f $(docker images -aq) # 删除全部
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
容器命令
mysql redis运行
# mysql 容器运行
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
# conf配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8mb4
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
# reids 容器运行
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
说明:有镜像才能创建容器,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !
docker pull centos
新建容器并启动
# 命令
docker run [可选参数] IMAGE [COMMAND][ARG...]
# 常用参数说明
--name="Name" # 给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
-P # 随机端口映射(大写)
-p # 指定端口映射(小结),一般可以有四种写法
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort (常用)
containerPort
[root@dragon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 6 weeks ago 209MB
# 使用centos进行用交互模式启动容器,在容器内执行/bin/bash命令!
[root@dragon ~]# docker run -it centos /bin/bash
[root@6ef6d82e83ee /]# ls # 显示容器内部目录
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@6ef6d82e83ee /]# exit # 退出容器
exit
# 查看所有正在运行的容器
[root@dragon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常用参数说明
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号。
exit # 容器停止退出
ctrl+P+Q # 容器不停止退出
# 启动停止容器
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill (容器id or 容器名) # 强制停止容器
# 删除容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -a -q) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
常用其他命令
后台启动容器
# 命令
docker run -d 容器名
# 例子
docker run -d centos # 启动centos,使用后台方式启动
# 问题: 使用docker ps 查看,发现容器已经退出了!
# 解释:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命 令,就会自动退出。
# 比如,你运行了nginx服务,但是docker前台没有运行应用,这种情况下,容器启动后,会立即自 杀,因为他觉得没有程序了,所以最好的情况是,将你的应用使用前台进程的方式运行启动。
查看日志
# 命令
docker logs -f -t --tail 容器id
# 例子:我们启动 centos,并编写一段脚本来测试玩玩!最后查看日志
[root@kuangshen ~]# docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
# -t 显示时间戳
# -f 打印最新的日志
# --tail 数字 显示多少条!
[root@kuangshen ~]# docker logs -tf --tail 10 c8530dbbe3b4
查看容器中运行的进程信息,支持 ps 命令参数。
# 命令
docker top 容器id
# 测试
[root@kuangshen ~]# docker top c8530dbbe3b4
UID PID PPID C STIME TTY TIME CMD
root 27437 27421 0 16:43 ? 00:00:00 /bin/sh -c ....
查看容器/镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@kuangshen ~]# docker inspect c8530dbbe3b4
进入正在运行的容器
# 命令1
docker exec -it 容器id bashShell
# exec 是在容器中打开新的终端,并且可以启动新的进程
# 命令2
docker attach 容器id
# attach 直接进入容器,不会启动新的进程
从容器内拷贝文件到主机上
# 命令
docker cp 容器id:容器内路径 目的主机路径
# 测试
[root@dragon ~]# docker attach bfdac335ab04 # 进入容器
# 容器内执行,创建一个文件测试
[root@bfdac335ab04 /]# cd /home
[root@bfdac335ab04 home]# touch test.java
[root@bfdac335ab04 home]# ls
test.java
[root@bfdac335ab04 home]# exit
exit
# linux复制查看,是否复制成功
[root@dragon /]# docker cp bfdac335ab04:/home/test.java /home
[root@dragon /]# cd home
[root@dragon home]# ls
admin test.java www
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9n3KWg2-1654088143146)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210122134035554.png)]
作者:慕_女神
链接:https://www.imooc.com/article/308172
来源:慕课网
安装Tamcat
# 下载tomcat
docker pull tomcat
# 启动运行 -d 后台运行
docker run -d -p 8080:8080 --name tomcat9 tamcat
# 进入tomcat
docker exec -it tomcat9 /bin/bash
# 访问网页发现问题,没有webapps,阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。
# 所以我们需要把webapps.dist中的内容cp到webapps中
cp -r webapps.dist/* webapps
可视化
Portainer(先用这个)
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock -- privileged=true portainer/portainer
Commit镜像
# 命令和git原理类似
docker commit -m="提交的描述" -a="作者" 容器id 目标镜像名:[版本]
实战测试
# 启动一个默认的tomcat
docker run -d -p 8080:8080 tomcat
# 进入容器
docker exec -it 137d29272276 /bin/bash
# 发现这个默认的tomcat没有webapps应用,镜像的原因,官方镜像默认webapps下边是没有文件的
# 把webapps.dist的文件拷贝过去
cp -r webapps.dist/* webapps
# 将我们操作过的容器通过commit提交为一个镜像!我们以后使用这个修改过的即可。
docker commit -a="tycoonbo" -m="add webapps app" 137d29272276 tomcat01:1.0
容器数据卷
是什么是容器数据卷?
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化同步
Mysql的容器删除,删库跑路! 需求:MySql数据可以储存在本地!
容器之前可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地。
这就是卷技术!目录的挂载,将我们容器内的目录挂载到Linux上面。
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令来挂载 -v
# 命令
docker run -it -v 主机目录:容器内目录 centos /bin/bash
# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来时候我们可以通过,docker inspect 容器id 查看对应的挂载信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhkZOwww-1654088143147)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161503311.png)]
测试文件的同步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58JWeaGO-1654088143147)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161624281.png)]
再次测试!
- 停止容器
- 宿主机上修改文件
- 启动容器
- 容器内的数据依旧是同步的!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NXJKpeX-1654088143148)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125161954778.png)]
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
# 查看挂载的路径
[root@kuangshen ~]# docker volume inspect nginxconfig
[
{
"CreatedAt": "2020-05-13T17:23:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
"Name": "nginxconfig",
"Options": null,
"Scope": "local"
}
]
# 怎么判断挂载的是卷名而不是本机目录名?
不是/开始就是卷名,是/开始就是目录名
########################################################################################
# 通过 -v 容器内路径:ro 或 rw 改变读写权限
ro readonly # 只读
rw readwrite # 读写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
所有的docker容器内的卷都在/var/lib/docker/volumes/****/***
安装MySql,同步数据
# 安装镜像
[root@dragon ~]# docker pull mysql:5.7
# 安装启动mysql,需要设置密码的
# 官方测试 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 运行容器,做数据挂载!
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器姓名
[root@dragon ~]# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
# 启动成功后,用本地sqlyog测试连接。
# sqlyog - 连接到服务器的3344 ---- 3344 和容器内的 3306 映射,这时候我们就可以连接上了。
假设将我们的容器删除,发现挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
初识DockerFile
DockerFile:是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本就能生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
# 创建一个dockerfile文件,名字可以随便写,建议是dockerfile
# 文件中的内容 指令大写
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "--------end--------"
CMD /bin/bash
# 这里的每个命令就是一层镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EuaYuw3b-1654088143149)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195014347.png)]
生成的镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXXp0aqC-1654088143150)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195040569.png)]
启动我们自己的容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrnaYCWt-1654088143151)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195313191.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPGT6AMZ-1654088143152)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195428876.png)]
这个卷和外部一定有一个同步目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmRHbx9p-1654088143152)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195856646.png)]
查看卷的挂载目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sx2iN500-1654088143153)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125195950924.png)]
测试这个文件是否同步出去了,在其中一个上边创建一个文件
这种方式我们使用的是十分多的,因为我们通常会构建自己的镜像。
加是构建镜像时候没有挂载卷,就要手动挂载 -v 卷名:容器内路径!
数据卷容器同步
docker run -it --name docker02 --volumes-from docker01 dragon/centos
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0yhYDCq-1654088143154)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125201410722.png)]
分别启动两个容器,进行挂载,测试。
也可以多个容器挂载其中一个容器,如果删除主容器,那么其他容器的共享内容不会消失。
文件是拷贝过去的,而不是在线共享的,所有当一个容器宕机了,也不影响其他容器的文件。
多个Mysql实现数据同步
[root@dragon ~]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
[root@dragon ~]# docker run -d -p 3344:3306 -e MYSQL_ROOT_PASSWORD=1234 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这样就可以实现两个MySQL数据共享了
DockerFile
DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库!)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTCwcGMX-1654088143155)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203124252.png)]
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建镜像!
DockerFile构建过程
基础知识:
- 每个保留关键之都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zc8C7G1-1654088143156)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203706609.png)]
DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名 + 邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat 镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发命令
COPY # 类似ADD,将我们文件拷贝到镜像
ENV # 构建的时候设置环境变量!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iohVdxsg-1654088143156)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125204206806.png)]
ENTRYPOINT 和 CMD 的区别
构建两个镜像
# ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-entrypoint -t cmdentrypoint .
# 运行
docker run cmdentrypoint
# CMD
FROM centos
CMD ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .
# 运行
docker run cmdtest
两个都是运行后直接ls -a 展示列表
但是cmd在运行时无法追加操作,而ENTRYPOINT可以追加操作。
CMD
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFvlCnsB-1654088143157)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125212123368.png)]
ENTRYPOINT
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICWAsbGc-1654088143158)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125212158560.png)]
实战:自定义镜像 tomcat
1、 mkdir tycoon/build/tomcat
2、在上述目录下 touch readme.txt
3、将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录
4、在 tycoon/build/tomcat 目录下新建一个Dockerfile文件
# vim Dockerfile
FROM centos
MAINTAINER tycoonbo<2390721223@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下
COPY readme.txt /usr/local/readme.txt
#把java与tomcat添加到容器中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
5、构建镜像
[root@dragon tomcat]# docker build -t diytomcat .
.....
Successfully built ffdf6529937d
Successfully tagged diytomcat:latest # 构建完成
[root@dragon tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest c218a398e667 About a minute ago 640MB
dragon/centos latest e854087a8ff8 18 hours ago 209MB
6、运行启动 run
[root@dragon tomcat]# docker run -d -p 8088:8080 --name tycoontomcat -v /home/tycoon/build/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /home/tycoon/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.40/logs diytomcat
9b8362277ba9ee903de0f9d6ac726eab804f2a4f43f4ea8de8851b2d0ff5d913
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsgWtH49-1654088143158)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126140204527.png)]
7、验证测试访问! 网页访问 39.102.33.216:8088
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-91Ru5BwG-1654088143159)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126140410958.png)]
8、发布项目(由于做了卷挂载,所以直接在本地test文件下发布就OK!)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello,tycoonbo</title>
</head>
<body>
-----------welcome------------
<%=" my docker tomcat,tycoonbo666 "%>
<br>
<br>
<% System.out.println("-------my docker tomcat-------");%>
</body>
</html>
测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-17F35EnQ-1654088143160)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126142641655.png)]
# 查看日志
[root@dragon tomcat]# cd tomcatlogs/
[root@dragon tomcatlogs]# ls
catalina.2021-01-26.log host-manager.2021-01-26.log localhost_access_log.2021-01-26.txt
catalina.out localhost.2021-01-26.log manager.2021-01-26.log
[root@dragon tomcatlogs]# cat catalina.out
.........
-------my docker tomcat-------
# 搞定
发布自己的镜像
上传DockerHub
1、注册DockerHub
2、在xshell中登录DockerHub
[root@dragon tomcatlogs]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
# 登录成功
[root@dragon tomcatlogs]# docker login -u tycoonbo
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded # 成功提示
3、登录完毕后,push镜像
# push自己的镜像到服务器上!
[root@dragon /]# docker tag diytomcat tycoonbo/diytomcat:1.0
[root@dragon /]# docker push tycoonbo/diytomcat:1.0
上传阿里云镜像
1、登录阿里云,找到容器镜像服务
2、创建命名空间
3、创建容器镜像
4、查看镜像仓库
教你xshell登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8OqFJHMb-1654088143160)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126151646226.png)]
# 登录
[root@dragon /]# docker login --username=社会你博哥dragon registry.cn-beijing.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 设置 tag
[root@dragon /]# docker tag c218a398e667 registry.cn-beijing.aliyuncs.com/tycoonbo-images/tycoonbo-test:1.0
# push到阿里云
[root@dragon /]# docker push registry.cn-beijing.aliyuncs.com/tycoonbo-images/tycoonbo-test:1.0
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPeFITdB-1654088143161)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126152604246.png)]
Docker 网络
理解docker0
清空所有镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGFR9Pqx-1654088143161)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210126153505177.png)]
实战:部署redis集群
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
> do \
> mkdir -p /mydata/redis/node-${port}/conf
> touch /mydata/redis/node-${port}/conf/redis.conf
> cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
> port 6379
> bind 0.0.0.0
> cluster-enabled yes
> cluster-config-file nodes.conf
> cluster-node-timeout 5000
> cluster-announce-ip 172.38.0.1${port}
> cluster-announce-port 6379
> cluster-announce-bus-port 16379
> appendonly yes
> EOF
> done
# 启动6个容器
docker run -p 6378:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 进入一个redis,注意这里是 sh命令
docker exec -it redis-1 /bin/sh
# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 连接集群
redis-cli -c
# 查看集群信息
cluster info
# 查看节点
cluster nodes
# set a b
# 停止到存值的容器
# 然后再次get a,发现依旧可以获取值
# 查看节点,发现高可用完全没问题
SpringBoot微服务打包Docker镜像
- 构建springboot项目
- 打包应用
- 编写Dockerfile
- 构建镜像
- 发布运行!
Docker Compose
简介
定义、运行多个容器。 YAML file 配置文件
三步骤:
- Dockerfile保证我们的项目,可以在任何地方运行。
- service服务,docker-compose.yml 文件
- 启动 docker-compose up
作用:批量容器编排!
Compose 是 docker的开源项目。需要安装!
dockerfile 让程序在任何地方运行。
Compose :概念
- 服务service:容器,应用。
- 项目project:一组相关的容器。
安装
1、下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、授权
sudo chmod +x /usr/local/bin/docker-compose
体验
- 应用 app.py
- Dockerfile 应用打包为镜像
- Docker-compose yaml 文件(定义整个服务,需要的环境。web、redis) 完整上线服务!
- 启动compose 项目 (docker-compose up)
yaml规则
docker-compose.yml核心
# 3层!
version:'' #版本
services: # 服务
服务1: web
# 服务配置
images
build
network
.....
服务2: redis
....
服务3: redis
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs: