1.docker的安装和配置

1.1 docker安装

apt-get install docker-ce docker-ce-cli containerd.io

1.2 配置镜像加速

打开:vim /etc/docker/daemon.json
    	添加:{"registry-mirrors":["https://××××××××/"]}(阿里获取)
    	重启: systemctl daemon-reload    systemctl restart docker

2.docker 模块认识 docker --help

docker收电子邮件_docker收电子邮件

2.1 image–镜像

2.1.1:认识 -镜像是由多层只读的特殊文件系统构成(docker images 查看系统中的镜像)

docker收电子邮件_docker收电子邮件_02

2.1.2:获取镜像的方式一般有两种方式

一:使用docker pull命令直接从远程镜像仓库获取(docker pull openjdk:11--从仓库拉取一个tag为11的opjdk)
	二:使用docker build命令利用本地Dockerfile文件自己构建一个docker 镜像(后面再细说)
	三:使用docker commit 命令在本地现在容器中生成一个新镜像。

2.1.3:镜像的常用命令

docker  images:查看系统中的所有镜像
	docker rmi 镜像包名/镜像id:删除一个系统中的镜像
	docker rmi $(docker images -q):删除系统中所有的镜像 
	docker rmi -f $(docker images -q):强制删除

2.2 container–容器

2.2.1:容器是镜像一个实例,可以使用docker exec进入容器,发现容器内部就是一个虚拟的linux系统;

使用docker run 一个镜像生成一个容器实例,镜像是多层只读的文件系统,但是容器提供了可操作的空间。

docker收电子邮件_自定义_03

2.2.3:容器的常用指令

docker inspect 容器id/容器名:查看容器的详细信息,如数据挂载情况,网络等
	doceker ps: 列出正在运行的docker 容器
	docker ps -a:列出所有的docker 容器
	docker exec -it 容器名 /bin/bash: 进入一个容器实例
	docker container stop 容器id/容器名:停止一个正在运行的容器
	docker container start 容器id/容器名:启动一个容器
	docker container restart 容器id/容器名:重启一个容器
	docker rm 容器id/容器名:删除一个容器
	docker container prune:删除所有停止运行的容器
	docker rm $(docker ps -aq):删除所有的容器
	docker commit :在当前容器的基础上生成一个新的镜像

2.3 network --网络

2.3.1:docker 网络是docker 在宿主机上虚拟出了一个docker0的网卡,然后容器内的所有网络交互就是通过这个docker0网卡,

可以通过ifconfig可以发现多了一个docker0网卡。

2.3.2:docker 的网络类型(docker network ls)

docker收电子邮件_自定义_04

bridge:桥接模式(启动容器时默认的方式,创建一对veth-pair虚拟接口用于实现容器和容器之间的通信。

docker收电子邮件_bash_05

host:宿主机模式,顾名思义就是直接使用宿主的网络
			none:没有网络,不能通过宿主机访问容器内部
2.3.3 :docker网络的常用命令(docker network --help)

docker收电子邮件_bash_06

disconnect:将容器里面的网路拔掉
	connect:重新给容器创建一个指定类型的网络
	create:创建一个自定义的bridge类型的网络---目的是为了可以使用容器名直接通信(后面细讲)
	inspect:显示网络类型各有哪些容器在使用

2.3.4:docker网络核心-容器之间的通信

1.随便创建两个镜像image_a和image_b

docker收电子邮件_自定义_07

2.启动这两个镜像什么都不干,分别命名为container_a,container_b
			docker run --name container_a -itd images_a:1.0 bash
			docker run --name container_b -itd images_b:1.0 bash

docker收电子邮件_自定义_08

此时通过ifconfig命令发现宿主机中多个两个veth-pair的接口

docker收电子邮件_bash_09

3.查看网络(docker inspect container_a)
			container_a的ip为:172.17.0.3(并网关为docker0的ip)
			container_b的ip为:172.17.0.4(并网关为docker0的ip)

docker收电子邮件_bash_10

4.进入容器container_a(docker exec -it container_a bash)ping container_b的ip

docker收电子邮件_docker收电子邮件_11

5.安装
		ping (apt install inetutils-ping -y)------------------ifconfig  (yum install net-tools -y)  
		ping 一下container_b的ip为:172.17.0.4

docker收电子邮件_自定义_12

6.结论和问题	
			发现可以ping通,证明两个容器之间是可以通过ip互相通讯的。
			问题?container_a和container_b一般是独立的服务,如果要实现互相通信,在启动容器时ip是随机分配的,
				那容器a是否能通过容器名直访问容器呢?
				同理在容器a中ping container_b

docker收电子邮件_docker收电子邮件_13

发现并不能直接通过容器名访问另一个容器,但是docker 提供了两种解决方式
			方式一:通过运行容器时link另外一个容器(a link b只能单向的a通过b的容器名访问b,官方不推荐,不再维护,其原理就是在a容器的/etc/hosts文件中增加b的容器名和ip实现类似localhsot解析为127.0.0.1)
			方式二:通过自定义网络,并把这两个网络加入到同一个自定义网络中
			方式二实现:
				1.创建自定义网络docker network create maobridge

docker收电子邮件_bash_14

2.将容器container_a和container_b加入到自定义的网络中
						docker network connect maobridge container_a
						docker network connect maobridge container_b

docker收电子邮件_bash_15

docker network inspect maobridge查看自定义网络发现两个容器都已经加在这个网络中
	3.重新进入container_a ping container_b(docker exec -it container_a bash)

docker收电子邮件_docker_16

2.4 volume–数据卷

docker收电子邮件_自定义_17

2.4.1 :docker数据卷的出现是为了持久化,不至于随着docker容器的消亡它的数据也随之消亡

可以通过docker inspect containerid查看当前容器的数据的挂在情况

docker收电子邮件_自定义_18

随着docker run 就会在宿主机的/var/lib/docker/volumes/下面生成一个默认类型为volume的随机数据卷
	可以通过docker volume ls查看宿主机所有的volumes情况

docker收电子邮件_docker收电子邮件_19

也可以自己定义一个volume,(docker volume create my_volume)运行镜像的时候指定自己命令的volume

docker收电子邮件_docker收电子邮件_20

2.4.2容器数据持久化分类

1.	volume 数据卷(docker默认的一种数据存储方式)
	2.	 bind	双向绑定宿主机文件
	3.	tmpfs   容器内临时文件,随着停止容器数据会被自动清除	

在启动容器时可以通过-v或者--volume指定挂载类型,官方推荐更加详细的--mount命令来指定启动镜像的配置数据持久方式(后面运行镜像在细说)

3.docker 命令 docker --help

docker收电子邮件_bash_21

3.1 docker build–构建自定义镜像

3.1.1Dockerfile文件

#名字,名字可以随意取,可以叫mydockerfile 或者myfile只是当时用docker build .命令时,
	#默认查找当前目录下名为Dockerfile的文件作为启动文件,如没找到则报错,自定义名称可以用docker build -f myfile . 指定构建
	
FROM image_name:tag  定义使用哪个基本镜像启动构建流程 
MAINTAINER user_name  声明镜像的创建者。版权声明
ENV key value  添加环境变量 这个可以写多个
RUN command  表示要执行的命令 这个是核心内容 可以写多条
ADD source_dir/file dest_dir/file  将宿主机的文件复制到容器中 如果是压缩文件的话 会自己解压
COYP source_dir/file dest_dir/file  同ADD 就是不会解压
WORKDIR path_dir  工作目录 就是这样命令执行的目录 登录容器后也在这个目录	
CMD 容器启动后要处理的命令

docker收电子邮件_docker_22

3.1.2构建一个镜像mrs_test版本为1.0

运行 docker build -t mrs_test:1.0

docker收电子邮件_docker收电子邮件_23


docker收电子邮件_docker收电子邮件_24

3.2 docker run–运行一个镜像并生成一个容器实例(类似于通过一个类生成一个对象)

3.2.1运行一个镜像指定网络,指定容器名,指定数据持久类型

运行刚才创建的mrs_test:1.0镜像生成的容器名为:mrstest1  (--name mrstest1)
		指定使用刚才创建的mgdbridge网路中 				 :--network mgdbridge
		指定数据持久的类型为volume并且使用自己创建的my_volume
		-it:交互式运行
		-d:后台运行
		bash:跟Dockerfile中的CMD命令一样,并且替换Dockerfile中Cmd命令,运行现在写的bash命令
		
		docker run --name mrstest1 --network maobridge --mount type=volume,source=my_volume,destination=/mrs -itd mrs_test:1.0 /bin/bash

docker收电子邮件_docker收电子邮件_25

查看当前容器挂载信息和网络信息

docker收电子邮件_自定义_26

docker收电子邮件_bash_27

3.2.2重新运行这个镜像并将制定挂载类型为bind

指定数据持久的类型为bind,并绑定到宿主机
		docker run --name mrstest2 --network maobridge --mount type=bind,source=/home/maoguidong/tem/temp,destination=/mrs/temp -itd mrs_test:1.0 /bin/bash

docker收电子邮件_自定义_28

进入容器在/mrs/temp下面创建一个文件夹containertest

docker收电子邮件_docker_29

进入宿主机/home/moaguidong/tem/temp,发现了容器创建中创建的文件containertest

docker收电子邮件_自定义_30