容器数据卷
挂载(双向绑定)
1、下载centos镜像
docker pull centos
2、启动,绑定路径
# -v 宿主机目录:容器内的目录 docker run -it -v /home/linux_yzw:/home/docker_yzw centos
容器内:
[root@iZx1c8ur3cbwpvZ ~]# docker run -it -v /home/linux_yzw:/home/docker_yzw centos [root@9e79280a94a3 /]# ls bin etc lib lost found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@9e79280a94a3 /]# cd /home/docker_yzw [root@9e79280a94a3 docker_yzw]# ls [root@9e79280a94a3 docker_yzw]#
宿主机内:
[root@iZx1c8ur3cbwpvZ /]# ls bin dev home lib64 media opt proc run srv tmp var boot etc lib lost found mnt patch root sbin sys usr www [root@iZx1c8ur3cbwpvZ /]# cd /home/linux_yzw [root@iZx1c8ur3cbwpvZ linux_yzw]# ls [root@iZx1c8ur3cbwpvZ linux_yzw]#
3.检查是否双向绑定。
方法1:创建宿主机,查看容器
在宿主机内创建文件a.txt,查看docker容器内是否对应生成了文件 在容器中生成
方法2:创建容器,查看宿主机
在容器中创建文件b.txt,检查宿主机是否生成文件 生成了宿主机
方法3:关闭容器,创建宿主机,启动容器检查是否有文件
关闭容器
创建宿主机c.txt
启动容器检查是否有文件
结论:即使容器关闭,宿主机仍然会同步文件
Mysql部署安装
1、拉取镜像
2.挂载目录,运行
-d 后台运行 -p 端口映射 -v 目录挂载 -e 设置数据库登录密码(帐号)root) docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql_01 mysql
3、windows用navicat连接远程docker里面的Mysql
新增两个数据库 demo1、demo2.相应的绑定目录相应变化
新增前:
新增后:
结论:docker内部的数据变化将对应宿主机
具名挂载和匿名挂载(不懂,以后再说)
初步理解: 是将容器中的目录文件持续到宿主机的一种方式
匿名挂载:
命令
docker run -d -name 名字 -v /docker/yzw 镜像
在容器中/volume1目录
宿主机对应位置:
(1)退出容器:ctrl P Q
(2)在宿主机执行 docker inspect 容器名或容器id
(3)在相应的宿主机上找到映射位置/var/lib/docker/volumes/ac69fd04c47ac2dd6ac8b36d82a8520dcfc470e91c4274ac469442816b410ce0/_data
(4)进入对应容器/volume目录和宿主机/var/lib/docker/volumes/ac69fd04c47ac2dd6ac8b36d82a8520dcfc470e91c4274ac469442816b410ce0/_data目录,检查是否双向绑定
具名挂载:
命令
docker run -d -name 名字 -v dir_name:/docker/yzw 镜像
在容器中/volume1目录
宿主机对应位置:
(1)退出容器:ctrl P Q
(2)在宿主机执行 docker inspect 容器名或容器id
(3)在相应的宿主机上找到映射位置/var/lib/docker/volumes/volume_name/_data
- 这里的volume_name与上面的
docker run -d -name tomcat_02 -v volume_name:/volume1 tomcat
中的volume_name是对应的
结论:无论匿名挂载还是具名挂载,宿主机对应的最终挂载目录都是
/var/lib/docker/volumes/xxxxxe/_data目录, 其中xxxxxx
- 若匿名,则xxxxxx是一长串随机数字
- 若具名,则xxxxxx定义名称
指定路径挂载:(与具名挂载的区别在于前面少了一个/斜杠)
总结了三种吊载方式
---- 如何确定是具名还是匿名还是指定路径? 1、-v 容器内路径-------------------------------- # 匿名挂载 2、-v 卷名:容器内路径----------------------- # 具名挂载 3、-v /宿主机路径::容器内路径--------------- # 指定路径挂载
DockerFile—— 用来生成镜像的脚本文件
1.第一个自己写的镜像
(1)写dockile
创建一个/dockfile_dir/mydockfile
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "------end------"
CMD /bin/bash
(2)生成镜像
# -f dockfile文件
# -t 想自定的镜像名及版本
# . 这个点一定不能丢
docker build -f mydockfile -t centos_yzw:01 .
(3)测试——启动一个容器
可以看到 容器内的目录 宿主机内的挂载目录
(4)成功
2、CMD与ENTRYPOINT
多个CMD最后一条会覆盖掉之前的 多个ENTRYPOINT是会追加的
3、创建tomcat镜像
(1)宿主机上,创建一个目录,上传压缩包
(2)编写dockerfile文件,官方命名 , buld会自动寻找这个文件,就不需要 -f 指定了Dockerfile
FROM centos
MAINTAINER yzw<1793942071.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u131-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.47.tar.gz /usr/local
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.47
ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-7.0.47 /bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.47/bin/logs/catalina.out
(3)创建镜像
# 注意后面的 . 一定不能忘记
docker build -t yzw/tomcat_image_yzw .
(4)启动tomcat
docker run -d
-p 8080:8080
--name tomcat_yzw
-v /yzw/tomcat/test:/usr/local/apache-tomcat-7.0.47/webapps/test
-v /yzw/tomcat/test/logs/:/usr/local/apache-tomcat-7.0.47/logs
tomcat_image_yzw
(5)创建web.xml和index.jsp
在宿主机的/yzw/tomcat/test目录下(也可以在dokcer容器里面的/usr/local/apache-tomcat-7.0.47/webapps/test 目录下)创建WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
在宿主机的/yzw/tomcat/test目录下(也可以在dokcer容器里面的/usr/local/apache-tomcat-7.0.47/webapps/test 目录下)创建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>第一个自己的镜像发布了,恭喜你</title>
</head>
<body>
第一个自己的镜像发布了,恭喜你<br/>
</body>
</html>
(6)用windows下的浏览器远程访问服务器,进行测试
4、推送镜像到DockerHub上
(1)登录
docker login -u 账号
按照提示输入密码
(2)推送
# docker push 镜像名
# 注意镜像名前面一部分必须是dockerHub的登录账号
# 比如下面的1793942071 就是我的登录账号
docker push 1793942071/tomcat_image_yzw:01 #推送 注意镜像名必须是以用户名开始的
# 改镜像名和版本
# 如果镜像名不符合要求,可以自己复制一个进行更改
# docker tag 源镜像 重命名镜像
docker tag yzw/tomcat_image_yzw 1793942071/tomcat_image_yzw:01
5、推送镜像到阿里云上(待补充)
Docker网络
1、理解Docker0
(1)清空镜像、容器
#清空容器
docker rm -f $(docker ps -aq)
#清空镜像
docker rmi -f $(docker images -aq)
清空容器 检验
(2)查看宿主机上的ip信息——3个网络
ip addr
localhost
私网ip地址
docker0
注意上面的私网地址,就是阿里云服务器购买时配置的默认私网地址,与下图对应
(3)docker在工作时使用哪个网络
(3.1)探究实验一
(3.1.1)拉取tomcat
docker pul tomcat
(3.1.2)启动一个tomcat容器——tomcat_01(172.17.0.2)
(3.1.3)进入容器查看ip信息
# 等效于 docker exec -it tomcat_01 /bin/bash, 再执行ip addr
docker exec -it tomcat_01 ip addr
:docker安装的tomcat是精简版,可能会没有ip、ifconfig、ping等命令,需要执行下面的安装命令 容器内安装 ping、 ip 、 ifconfig
第一、更换apt的源 进入容器内的/etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
第二、修改证书
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
否则一直报错更新的源没有证书 如下图所示 第三、更新apt,安装ip、ping、ifconfig等命令
#更新apt
apt update
# ip
apt install -y iproute2
# ping
apt install -y iputils-ping
# ifconfig
apt install -y net-tools
apt install -y net-tools iproute2 iputils-ping
继续查看ip地址信息
- 可以看到此时容器内的ip地址是(16: eth0@if17)
- 172.17.0.2——172.17.0.3这一对绑定关系,注意宿主机的docker0是172.17.0.1
- 退出容器看宿主机的ip地址 是17-16,是绑定的
(3.1.4)互相之间ping
-
宿主机(172.17.0.1)ping容器tomcat_01(172.17.0.2)——能通
-
容器tomcat_01(172.17.0.2) ping 宿主机(172.17.0.1)——能通
(3.1.5)启动一个tomcat容器——tomcat_02(172.17.0.3)
进入容器后查看ip
容器内安装 ping、 ip 、 ifconfig
第一、更换apt的源 进入容器内的/etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
第二、修改证书
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
否则一直报错更新的源没有证书 如下图所示 第三、更新apt,安装ip、ping、ifconfig等命令
#更新apt
apt update
# ip
apt install -y iproute2
# ping
apt install -y iputils-ping
# ifconfig
apt install -y net-tools
apt install -y net-tools iproute2 iputils-ping
第四、查看ip信息 生成了24-25一对绑定关系的ip tomcat_02:172.17.0.3/16
(3.1.6)启动一个tomcat容器——tomcat_03(172.17.0.4)
进入容器后查看ip
容器内安装 ping、 ip 、 ifconfig
第一、更换apt的源 进入容器内/etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
第二、修改证书
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
否则一直报错更新的源没有证书 如下图所示 第三、更新apt,安装ip、ping、ifconfig等命令
#更新apt
apt update
# ip
apt install -y iproute2
# ping
apt install -y iputils-ping
# ifconfig
apt install -y net-tools
apt update
apt install -y net-tools iproute2 iputils-ping
第四、查看ip信息 生成了22-23一对绑定关系的ip tomcat_03:172.17.0.4/16
(3.1.7)查看宿主机的ip情况
启动了3个容器,就生成了3对新的ip配对,如图所示
(3.1.8)互相之间连通情况(通过ip互相ping)
宿主机ping容器——全都能通 容器ping其他容器——以tomcat_01为例
(3.1.9)移除容器,对应的ip对就会在宿主机的ip信息中移除
移除tomcat_03 宿主机的ip移除了tomcat_03的配对 22-23
(3.1.10)结论
如果启动容器,不指定自定义网络,就会利用Docker0网卡生成一个ip对,分配给容器与宿主机进行连通。
2、网络互连
2.1 link互联
--link 容器名(目标)
2.1.1 启动一个新的容器,tomcat_04
# --link tomcat_02 意思是tomcat_04可以在容器内直接通过名字ping通tomcat_02(注意这个只能是单向的,tomcat_04可以通过ping tomcat_02,而反过来tomcat_02不能根据名字来ping通tomcat_04)
docker run -d -
-name tomcat_04
--link tomcat_02
tomcat
注意:tomcat_04需要修改apt的源、证书,才能安装ping、ip等,参照前面的 进入容器,安装好后, ping tomcat_02能够ping通
2.1.2 原理分析:
退出容器,在宿主机运行
docker inspect tomcat_04,可以看到
进入容器tomcat_04可以看到它的host文件在将tomcat_02与其ip做了绑定,所以能够ping通 tomcat_02
2.2 自定义网络
2.2.1 查看所有的网络
2.2.2 清空所有容器,保证网络干净的
2.2.3 默认的网络
docker run -d --name tomcat_01 tomcat
等效于下面的,而bridge其实就是Docker0
docker run -d --name tomcat_01 --net bridge tomcat
2.2.4 创建自定义网络mynet,查看细节
创建网络
# -d bridge表示桥接
# --subnet表示子网 192.168.0.2 - 192.168.255.255 能提供255*255个
#--gateway表示网关 192.168.0.1
docker network create
-d bridge
--subnet 192.168.0.0/16
--gateway 192.168.0.1
mynet
查看 docker network ls
查看细节 docker network inspect mynet
此时并没有绑定其他容器信息
2.2.5 创建容器tomcat_01和tomcat_02并绑定到mynet自定义网络上——#关键点在于 --net mynet 将容器绑定到自定义的网络上
#关键点在于 --net mynet 将容器绑定到自定义的网络上
docker run -d --name tomcat_01 --net mynet tomcat
docker run -d --name tomcat_01 --net mynet tomcat
2.2.6 再次查看自定义网络 mynet,可以看到绑定的容器的tomcat_01与tomcat_02的信息
2.2.7 根据ip连通情况
tomcat_01为例子,ping容器tomcat_02的ip地址——连通
2.2.8 根据容器名ping通情况
tomcat_01为例子,ping容器tomcat_02的名字——连通
2.2.9 结论
自定义一个网络就可以达到–link将容器名与hosts绑定的效果,且更加方便
2.3 子网连通
将Docker0(Bridge与自定义网络连通) Docker与mynet其实可以看成两张网卡,所以不能直接连接,可以用tomcat01连接到mynet上,那么mynet上将会绑定tomcat01的信息且分配一个192.168.0.*字段的ip给他,与他自身的172.18.0.2区分开,相当于他有了两个ip地址
创建tomcat01、tomcat02 结合前面连接到mynet的tomcat_01、tomcat_02 可以看到bridge网络
mynet网络
实验结果:不同网络之间的容器无法互通
tomcat01 ping不通 mynet里的容器
同理tomcat02也ping不通mynet里的 同理mynet里的也ping不通bridge里的
如何解决这个问题:将一个网络里的容器与另一个网络连接
# docker network connect 网络1 网络2的容器
docker network connect mynet tomcat01
查看mynet的细节,可以看到mynet新增了tomcat01的信息,相当于将它绑定进来了
再次测试结果
将容器tomcat01与网络mynet连通后,tomcat01能够ping通mynet里面的容器 容器tomcat02没有连接mynet,还是不能ping通mynet里面的容器
3、搭建redis集群
3.1 创建好子网络 (网卡)redis-net
docker network create redis_net --subnet 192.168.0.0/16
3.2 通过脚本在宿主机上创建好6个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 192.168.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
3.3 通过脚本在宿主机上创建好6个redis容器
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 192.168.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf;
done
查看容器: 查看网络:
3.4 进入redis-1容器并配置集群信息
[root@iZwz9fp23rp007b9fdw0k5Z /]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf
/data # redis-cli --cluster create 192.168.0.11:6379 192.168.0.12:6379 192.168.0.13:6379 192.168.0.14:6379 192.168.0.15:6379 19
1
3.5 进入redis-1配置好的集群,设置两个值a和c
3.6 关闭redis-2,看看它的从 redis-6是否能升级为主
关闭主redis-2之后,仍然能够查到c的值,是因为redis-2的从redis-6升级为了主
3.7 重启redis-2,看看它的角色
# 登录进容器
[root@iZwz9fp23rp007b9fdw0k5Z /]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof dump.rdb nodes.conf
/data # redis-cli -c
127.0.0.1:6379> cluster nodes
a6852adc98bf083ea81c4f374948b4892a587230 192.168.0.16:6379@16379 master - 0 1653237714547 7 connected 5461-10922
7ea8c0e4fddaca0444d5f27b0bed654f800c46ed 192.168.0.14:6379@16379 slave 8074a982c968b0caa0b021f50750c0f7e40bacd0 0 1653237715549 4 connected
5f78918ebd8ecad4c1ffb6ccf3053229ba8ba982 192.168.0.15:6379@16379 slave 3fd32cb34d39499f40c8cac3f7239b149fccdb94 0 1653237716051 5 connected
e922ff3fe671e4b44df367b8f4902c3521ec2102 192.168.0.12:6379@16379 slave a6852adc98bf083ea81c4f374948b4892a587230 0 1653237715049 7 connected
8074a982c968b0caa0b021f50750c0f7e40bacd0 192.168.0.13:6379@16379 master - 0 1653237715000 3 connected 10923-16383
3fd32cb34d39499f40c8cac3f7239b149fccdb94 192.168.0.11:6379@16379 myself,master - 0 1653237715000 1 connected 0-5460
4、SpringBoot微服务打包Docker镜像
4.1 创建springboot项目并打包
4.2 创建Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
4.3 上传jar包和Dockerfile
4.4 打包成镜像
docker build -t springboot_docker_demo_image .
4.5 查看镜像
4.6 运行容器
docker run -d
-p 8080:8080
--name springboot_docker_demo
springboot_docker_demo_image