docker 简单操作

docker 

1、什么是容器,什么是docker?
容器的本质是进程
docker是一款容器软件。

2、docker中的三大概念?
docker镜像
docker容器
镜像仓库

3、docker镜像
docker镜像是启动容器模板。
	docker pull
	docker push 
	docker images
	docker inspect 
	docker rmi 
	docker histroy 
	docker tag

4、docker容器
是镜像启动的,一个对外提供服务的实例。
	docker run 
		-d
		--name	: 
			1、指定容器名称
			2、将容器的名称加入docker DNS 可以访问时候直接写容器名
		--rm
		-e
		-h
		-i
		-t
		-p
		-P
		-v
	docker exec 
	docker ps 
		-a 
		-q
	docker rm 
		-f 
	
	docker start 	: 启动一个容器
	docker stop 	:停止一个容器
	docker create   :创建一个容器
	
    docker run  和 docker create 之间有两个区别
    1、docker run创建容器并立即启动,而docker create 只是创建
    2、docker run创建的容器时up状态,而docker create创建的容器是create

	打包镜像
        1、将容器打包成本地镜像
		
			docker commit
			
        2、将容器打包成镜像压缩包

			docker export 
			docker import 

        3、将镜像打包成镜像压缩包

			docker save 
			docker load 

5、镜像仓库
    存放镜像的地方。
    官方仓库:hub.docker.com
    第三方:阿里云、华为云
    docker login [URL]
    docker login registry.cn-hangzhou.aliyuncs.com
 

 

1、Linux网络原理

docker网络严重依赖于linux网络

容器之间相互隔离

为了支持网络协议栈的多实例,linux提供了一个网络名称空间(Network Namespace)。不同的网络名称完全隔离。

容器之间的网络互通问题?

实现两个不同的网络名称空间互联的方式
1、veth设备对
	veth设备必须是成对出现。

	1、创建名称空间
	 	[root@localhost ~]# ip netns add test01
	
	2、创建veth设备对
		[root@localhost ~]# ip link add veth type veth peer name veth001
		
	3、绑定名称空间
		[root@localhost ~]# ip link set veth001 netns test01
        3.1进入名称空间
		[root@localhost ~]#	ip netns exec test01 bash
        
	4、分配IP
		[root@localhost ~]# ip netns exec test01 ip addr add 10.0.0.111/20 dev veth001
		[root@localhost ~]# ip addr add 10.0.0.112/20 dev veth

	5、重启
		[root@localhost ~]# ip netns exec test01 ip link set dev veth001 down
		[root@localhost ~]# ip netns exec test01 ip link set dev veth001 up
		
		[root@localhost ~]# ip link set dev veth down
		[root@localhost ~]# ip link set dev veth up

	6、测试
		[root@localhost ~]# ping 10.0.0.111
2、网桥
    Linux可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决定报文的转发目标网口。
    网桥设备br0绑定了eth0、eth1。对于网络协议的上层来说,只看得到br0。因为桥接是在数据链路层实现的,上层不需要关心桥接的细节,于是协议上层需要发送的报文被送到br0,网桥设备的处理代码判断报文该被转发到eth0还是eth1,或者两者皆转发。反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。而有时eth1也可能会作为报文的源地址或目的地址直接参与报文的发送与接收,从而绕过网桥。
3、iptables
    我们知道,Linux络协议非常高效,同时比较复杂如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢?Linux提供了一套机制来为用户实现自定义的数据包处理过程。
    在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络棋处理数据包的过程中对数据包进行些操作,例如过滤、修改、丢弃等整个挂接点技术叫作Netfilterlptables
    Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中:而lptables是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表通过者的配合来实现整个Linux网络协议战中灵活的数据包处理机制。

总结

在这里插入图片描述

2、docker网络模式

就是为了实现容器互联的。

1、host模式
	#将容器网络绑定到宿主主机上。也就是说宿主主机上的网络直接绑定到容器内。,容器里面的网卡和宿主主机的网卡一致
    如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
    使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost上已经使用的端口就不能再用了,网络的隔离性不好。
	[root@localhost ~]# docker run -d --network host nginx 

2、container模式
    这个模式指定新创建的容器和已经存在的一个容器共享一个NetworkNamespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
	#共享一个容器的网络。
	[root@localhost ~]# docker run -d --network "container:admiring_gauss" nginx

3、网桥模式 #同一个网桥的容器可以互相访问(用id 如果想要用名字访问创建时候指定--name)

	1、创建网桥
	[root@localhost ~]# docker network create zhang

	2、使用网桥
	[root@localhost ~]# docker run -d --name gailun --network zhang nginx
    				docker run  -it --name nuoke --network zhang centos

4、none模式
	使用none模式,Docker容器拥有自己的NetworkNamespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
    这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
	#这种模式只提供一个回环网络
	[root@localhost ~]# docker run -it --network none centos

5--link
	链接一个容器,类似于container模式
    									连接容器名字:连接过程的别名(通常一样)
	[root@localhost ~]# docker run -it --link "nginxv1:nginxv1" centos

3.docker网桥相关命令(docker network)

1、创建网桥
--subnet	:指定网络的CIDR
--gateway	:网关
[root@localhost ~]# docker network create zhang1 --subnet "10.0.0.0/24" --gateway "10.0.0.2"

2、查看网桥
[root@localhost ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
网桥的ID      网桥的名称    网桥类型   网桥的来源

3、查看网桥的详细信息
docker network inspect [网桥的名称]

4、链接网桥
docker network connect 网桥名  容器名
[root@localhost ~]# docker network connect zhang1 nginxv2

5、断开链接
docker network disconnect 网桥名  容器名
[root@localhost ~]# docker network disconnect zhang1 nginxv2

6、删除网桥
docker network rm [网桥名称]
[root@localhost ~]# docker network rm chenyang3

7、清理网桥
[root@localhost ~]# docker network prune 

3、多个容器互联项目(nginx代理django)

1、分析

Nginx ---> Django

	1、创建网桥
	docker network create zhang
	
	2、部署Django
	[root@localhost ~]# docker run -d -it python:3.6 bash
    2d2d77726f5fadd22472527116300a7ab5bb43c660c7663d7843b2fa0f0afffb
    [root@localhost ~]# docker ps
 CONTAINER ID   IMAGE           COMMAND   CREATED          STATUS          PORTS     NAMES
987213ba242e   python:latest   "bash"    43 seconds ago   Up 42 seconds             loving_jones
    [root@localhost ~]# docker exec -it loving_jones bash
    root@2d2d77726f5f:/# pip install django
    root@2d2d77726f5f:/# exit

	[root@localhost ~]# docker commit -a 'dijia' -m 'aotem' -p loving_jones python:django
	[root@localhost ~]# docker run -d --name django -w /opt -v /root/linux/:/opt --network zhang python:django python manage.py runserver 0.0.0.0:8000 

	3、nginx

vim django.conf 
server {
	server_name _;
	listen 80;
	location / {
		proxy_pass http://django:8000;
	}
}

[root@localhost ~]# docker run -d --name nginx --network zhang -p 8080:80 -v /root/django.conf:/etc/nginx/conf.d/default.conf nginx 

posted @ 2021-12-28 22:01  迪迦张  阅读(30)  评论(0编辑  收藏  举报