资讯详情

docker进阶1

容器数据卷

挂载(双向绑定)

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
4.7 远程访问成功

标签: 007b2ln传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台