day102

  • 一.昨日回顾
  • 二.今日内容
  • (1)容器命令
  • 查看容器
  • 复制命令
  • (2)docker网络
  • 1.docker网络基础
  • ①网络名称空间:
  • 创建一个名称空间
  • ②veth:
  • veth设备操作
  • ③网桥:
  • ④Iptables
  • 2.docker网络模式
  • 1.host模式
  • 2.container模式


一.昨日回顾

# 一.进入容器

##(1)attach

1、没有提供可执行命令的地方
2、当attach结束时,容器也跟着结束了

##(2)exec : 在宿主主机上通过exec的方式在容器内执行某个命令

docker exec [参数][容器id | 容器名称] [命令]

docker exec -i -t  pedantic_murdock bash
-i : 打开标准输出
-t : 创建一个伪终端
## (3)nsenter
## (4)ssh

## 二.定时清理日志
# log : /root/djang.log

00 05 * * * docker exec pedantic_murdock >/root/django.log



# 三.提交镜像

docker commit [参数][容器ID|容器名称]

参数:
-a : 作者
-m : 描述
-p : 当保存镜像时,暂停容器运行

# 四.启动容器

docker run [参数][镜像名称|镜像ID] [命令(默认执行镜像指定的命令)]

-d : 以守护进程的方式运行一个容器
	docker run -d nginx:1.19.2
-p :映射固定端口(格式:宿主主机的端口 : 容器内的端口)
	docker run -d -p 8070:80 nginx:1.19.2
-P : 映射随机端口
	docker run -d -P nginx:1.19.2
--name : 给容器指定一个名称
		 将名称解析到docker DNS 上
	docker run -d --name nginx nginx:1.19.2
--rm : 当容器生命周期结束了,立即删除
	docker run -d --rm nginx:1.19.2
-v : 挂载目录到容器(当使用docker commit 的时候,挂载目录无法保存到镜像)
	docker run -d --rm -v /root/django:/data python:3.7
-i : 打开标准输出
-t : 创建一个伪终端
	docker run -d -it busybox bash
-e : 设置一个环境变量
	docekr run -d -e MYSQL_ROOT_PASSWORD=123456 mysql

# 五.查看容器日志

docker logs [容器ID|容器名称]

# 六.保存镜像

export 保存的镜像只能由import导入
save 保存的镜像只能由load导入

1、export和import
用export保存,针对的是容器

docker export [容器ID|容器名称] > [压缩包名称]
	docker export 4dd53be4ab57 > nginx_priceless_allen.tar

docker import [压缩包名称][自定义镜像名称]
	docker import nginx_priceless_allen.tar test/nginx:v6

1、可以自定义镜像名称
	
2、save和load
用save保存,针对的是镜像
docker save [镜像ID|镜像名称] > [压缩包名称]
	docker save nginx:1.19.2 > nginx_1.19.2.tar
	docker save -o [压缩包名称][镜像名称...]

1、save可以同时保存多个镜像
2、save保存的体积大于export保存的体积(save保存的数据更全面)

docker load < [压缩包名称]
	docker load < all.tar

二.今日内容

(1)容器命令

查看容器

docker container inspect [OPTIONS] CONTAINER [CONTAINER . … ]子命令。

centos7 docker 复制 docker容器复制文件_centos7 docker 复制

复制命令

1、由宿主主机复制到容器内部
docker cp [宿主主机文件路径] [容器ID]:[容器内部路径]

2、由容器内部复制到宿主主机
docker cp [容器ID]:[容器内部路径] [宿主主机文件路径]

centos7 docker 复制 docker容器复制文件_docker_02

centos7 docker 复制 docker容器复制文件_IP_03

(2)docker网络

Docker 本身的技术依赖于 Linux 内核虚拟化技术的发展。所以 Docker 对 Linux 内核的特性有很强的依赖。
Linux网络技术:网络名称空间,Veth、Iptables、网桥、路由

1.docker网络基础

Docker 使用到的与 Linux 网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。

①网络名称空间:

在 Linux 中,网络名称空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名称空间经常用来隔离网络设备和服务,只有拥有同样网络名称空间的设备,才能看到彼此。

centos7 docker 复制 docker容器复制文件_centos7 docker 复制_04

创建一个名称空间
[root@alvin-test-os ~]# ip netns add test01
[root@alvin-test-os ~]# ip netns add test02
[root@alvin-test-os ~]# ip netns list
test02
test01

②veth:

Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。
veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。

centos7 docker 复制 docker容器复制文件_IP_05

veth设备操作

创建veth设备对

[root@alvin-test-os ~]# ip link add veth type veth peer name veth001
[root@alvin-test-os ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT
group default qlen 1000
link/ether 00:0c:29:e2:5b:2d brd ff:ff:ff:ff:ff:ff
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode
DEFAULT group default
link/ether 02:42:ad:75:28:7e brd ff:ff:ff:ff:ff:ff
7: veth4cb1ab3@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master
docker0 state UP mode DEFAULT group default
link/ether ce:90:13:71:7f:8f brd ff:ff:ff:ff:ff:ff link-netnsid 0
9: vethbbf7148@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master
docker0 state UP mode DEFAULT group default
link/ether 7e:6c:9f:d5:5b:26 brd ff:ff:ff:ff:ff:ff link-netnsid 1
14: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode
DEFAULT group default qlen 1000
link/ether 96:f1:a2:1d:1d:10 brd ff:ff:ff:ff:ff:ff
15: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode
DEFAULT group default qlen 1000
link/ether 66:af:ad:f0:5f:6d brd ff:ff:ff:ff:ff:ff

生成了两个 veth 设备, 互为对方的 peer。
绑定命名空间

[root@alvin-test-os ~]# ip link set veth001 netns test01
[root@alvin-test-os ~]# ip link show | grep veth
7: veth4cb1ab3@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master
docker0 state UP mode DEFAULT group default
9: vethbbf7148@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master
docker0 state UP mode DEFAULT group default
15: veth@if14: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group
default qlen 1000

已经查看不到 veth001,当我们进入 test01 命名空间之后,就可以查看到

[root@alvin-test-os ~]# ip netns exec test01 bash
[root@alvin-test-os ~]# ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen
1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
14: veth001@if15: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
group default qlen 1000
link/ether 96:f1:a2:1d:1d:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0

将 Veth 分配 IP

# 设置 IP
[root@alvin-test-os ~]# ip netns exec test01 ip addr add 172.16.0.111/20 dev veth001
# 绑定
[root@alvin-test-os ~]# ip netns exec test01 ip link set dev veth001 up
# 查看
[root@alvin-test-os ~]# ip netns exec test01 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
14: veth001@if15: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state
LOWERLAYERDOWN group default qlen 1000
link/ether 96:f1:a2:1d:1d:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.0.111/20 scope global veth001
valid_lft forever preferred_lft forever

这个时候双方就通了。

查看对端 Veth 设备

[root@alvin-test-os ~]# ip netns exec test01 ethtool -S veth001
NIC statistics:
peer_ifindex: 15
[root@alvin-test-os ~]# ip a | grep 15
14: veth001@if15: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state
LOWERLAYERDOWN group default qlen 1000

为对端 Veth 设备设置 IP

[root@alvin-test-os ~]# ip addr add 172.16.0.112/20 dev veth
[root@alvin-test-os ~]# ip link set dev veth down
[root@alvin-test-os ~]# ip link set dev veth up
[root@alvin-test-os ~]# ping 172.16.0.111
PING 172.16.0.111 (172.16.0.111) 56(84) bytes of data.
64 bytes from 172.16.0.111: icmp_seq=1 ttl=64 time=0.126 ms
64 bytes from 172.16.0.111: icmp_seq=2 ttl=64 time=0.081 ms
^C
--- 172.16.0.111 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.081/0.103/0.126/0.024 ms

③网桥:

网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port

centos7 docker 复制 docker容器复制文件_nginx_06

④Iptables

iptables是用于监控进/出服务器流量的一个工具,iptables使用一个叫做table的结构,而这些tables包含了一系列规则(set of rules),我们称这些规则为chain,chain会过滤进/出服务器的数据包(data packets)。

centos7 docker 复制 docker容器复制文件_nginx_07

2.docker网络模式

Docker 使用 Linux 桥接的方式,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据Docker 网桥的网段分配给容器一个 IP 地址,称为 Container-IP,同时 Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机 IP]:[容器端口]访问容器。

Docker 网络模型

配置

说明

host 模式

–-network=host

容器和宿主机共享 Network namespace。

containe 模式

–network=container:ID

容器和另外一个容器共享 Network namespace。 kubernetes中的 pod 就是多个容器共享一个 Network namespace。

none 模式

–network=none

容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等。

bridge 模式

–network=bridge

当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。(默认为该模式)

1.host模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的
端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再
用了,网络的隔离性不好。

centos7 docker 复制 docker容器复制文件_nginx_08

[root@instance-gvpb80ao ~]# docker run -d --name my-web --network host nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
06941559a3f7e0c53cf228302dedc2040c10f2eb0b6e3d0f962c065b0e0419ce
[root@instance-gvpb80ao ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
06941559a3f7 nginx "/docker-entrypoint.…" 6 minutes ago
Up 6 minutes my-web
[root@instance-gvpb80ao ~]# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2.container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。

新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

centos7 docker 复制 docker容器复制文件_nginx_09

[root@instance-gvpb80ao ~]# docker run -itd --name test01 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
df8698476c65: Pull complete
Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a
Status: Downloaded newer image for busybox:latest
dd99687d303d61d649364084ad353ec38b4e07149b0328301ec9691f18669951
[root@instance-gvpb80ao ~]# docker run -itd --name test02 --network
"container:test01" busybox
72adb0dcdb93b6adc7a62e1ad1ac274f64b8cec941d5f89da43fcd0757f99fa3
[root@instance-gvpb80ao ~]# docker exec -it test02 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2423 (2.3 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # exit
[root@instance-gvpb80ao ~]# docker exec -it test01 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2493 (2.4 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

–network:指定使用哪个网络
–link:链接到另一个容器

1、host
将容器网络跟根命名空间网络互联,这个时候可以在根命名空间用回环网络访问容器
docker run -d --network host nginx:1.19.2


2、container
将一个容器的网络共享给另一个容器
# 目标容器
docker run -d --name test01 nginx:1.19.2

# 链接容器
docker run -d --network "container:test01" nginx:1.19.2


## 目标容器

docker run [参数] [镜像ID|镜像名称] [命令(默认执行镜像指定的命令)]

docker run -d -it --name test02 busybox sh

## 链接容器
docker run -d -it --name test03 --network "container:test02" busybox:latest sh


# 查看正在运行的容器
docker ps

参数:
-a : 查看所有的容器(包括已经结束生命周期的容器)
-q : 只显示容器ID


# 进入容器
exec

docker exec [参数] [容器ID|容器名称] [命令]
docker exec -it test03 sh
docker exec -it test02 sh