Docker

Docker概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZjnOFoo-1654088141765)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210128162439879.png)]

Docker安装

  1. 卸载旧版本

    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    
  2. 安装需要的软件包

    yum install -y yum-utils
    
  3. 设置镜像仓库

    # 正确推荐使用国内的 
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
    
  4. 更新yum软件包索引

    yum makecache fast
    
  5. 安装 Docker CE

    yum install docker-ce docker-ce-cli containerd.io
    
  6. 启动 Docker

    systemctl start docker
    
  7. 测试命令

    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)]

再次测试!

  1. 停止容器
  2. 宿主机上修改文件
  3. 启动容器
  4. 容器内的数据依旧是同步的!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库!)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdfwaJvH-1654088141777)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203124252.png)]

很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建镜像!

DockerFile构建过程

基础知识:

  1. 每个保留关键之都必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像

  1. 构建springboot项目
  2. 打包应用
  3. 编写Dockerfile
  4. 构建镜像
  5. 发布运行!

Docker Compose

简介

定义、运行多个容器。 YAML file 配置文件

三步骤:

  1. Dockerfile保证我们的项目,可以在任何地方运行。
  2. service服务,docker-compose.yml 文件
  3. 启动 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

体验

  1. 应用 app.py
  2. Dockerfile 应用打包为镜像
  3. Docker-compose yaml 文件(定义整个服务,需要的环境。web、redis) 完整上线服务!
  4. 启动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安装

  1. 卸载旧版本

    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    
  2. 安装需要的软件包

    yum install -y yum-utils
    
  3. 设置镜像仓库

    # 正确推荐使用国内的 
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
    
  4. 更新yum软件包索引

    yum makecache fast
    
  5. 安装 Docker CE

    yum install docker-ce docker-ce-cli containerd.io
    
  6. 启动 Docker

    systemctl start docker
    
  7. 测试命令

    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)]

再次测试!

  1. 停止容器
  2. 宿主机上修改文件
  3. 启动容器
  4. 容器内的数据依旧是同步的!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库!)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTCwcGMX-1654088143155)(C:/Users/hasee/AppData/Roaming/Typora/typora-user-images/image-20210125203124252.png)]

很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建镜像!

DockerFile构建过程

基础知识:

  1. 每个保留关键之都必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像

  1. 构建springboot项目
  2. 打包应用
  3. 编写Dockerfile
  4. 构建镜像
  5. 发布运行!

Docker Compose

简介

定义、运行多个容器。 YAML file 配置文件

三步骤:

  1. Dockerfile保证我们的项目,可以在任何地方运行。
  2. service服务,docker-compose.yml 文件
  3. 启动 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

体验

  1. 应用 app.py
  2. Dockerfile 应用打包为镜像
  3. Docker-compose yaml 文件(定义整个服务,需要的环境。web、redis) 完整上线服务!
  4. 启动compose 项目 (docker-compose up)

yaml规则

docker-compose.yml核心

# 3层!

version:'' #版本
services: # 服务
	服务1: web
		# 服务配置
		images
		build 
		network
		.....
	服务2: redis 
		.... 
	服务3: redis
# 其他配置 网络/卷、全局规则
volumes: 
networks: 
configs:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值