1 数据持久化 官网:https://docs.docker.com/storage/
1.1 Volume 1.1.1 初始Volume 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker rm -f $(docker ps -aq) docker volume ls docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=jack123 mysql:5.7 docker volume ls VOLUME /var/lib/mysql docker exec -it test-mysql bashls /var/lib/mysql docker volume inspect volume_namels /var/lib/docker/volumes/e2ca4be02931e3310f6f136eb663e173d314bb3b3f243bacef776936898d4926/_data
1.1.2 自定义Volume 1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker volume create test-mysql-volume docker volume ls docker volume inspect test-mysql-volumels /var/lob/docker/volumes/test-mysql-volume/_data docker run -d --name test-mysql -v test-mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=test123 mysql:5.7ls /var/lib/docker/volumes/test-mysql-volume/_data -v test-mysql-volume:/var/lib/mysql 就等同于在Dockerfile中定义的VOLUME命令
1.1.3 Volume数据修改 (1)修改container目录的数据,观察物理机的数据变化
1 2 3 4 5 6 7 docker exec -it test-mysql bashcd /var/lib/mysqlecho "test volume test." > test-volume.txtexit cd /var/lib/docker/volumes/test-mysql-volume/_datals cat test-volume.txt
(2)修改物理机的数据,观察container目录的数据变化
1 2 3 4 5 echo "test-centos." > test-centos.txt docker exec -it test-mysql bashcd /var/lib/mysqlls cat test-centos.txt
1.1.4 默认Volume 1 2 docker run -d --name test-nginx -p 60:80 nginx docker volume ls
1.1.5 验证持久化效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker run -d --name test-mysql -v test-mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=test123 mysql:5.7 docker exec -it test-mysql bash create database db_test show databases; docker rm -f test-mysql docker volume ls docker run -d --name any-mysql -v test-mysql-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=test123 mysql:5.7 docker exec -it any-mysql bash mysql -uroot -ptest123 show databases;
1.2 Bind Mounting 想把容器中任意的目录和centos的目录做一个绑定,比如centos中的~/shop 与tomcat container中的/usr/local/tomcat/webapps/shop进行绑定
1 2 3 4 5 6 7 8 9 10 11 docker run -d --name my-tomcat -p 8888:8080 -v ~/shop:/usr/local/tomcat/webapps/shop tomcat:8.0 centos: ls ~ tomcat容器: docker exec -it my-tomcat bash ls /usr/local/tomcat/webappsecho "<p style='color:orange; font-size:20pt;'>Bind Mounting.</p>" > index.html centosip:8888/shop/index.html
2 网络 官网:https://docs.docker.com/network/
2.1 网卡 2.1.1 查看linux中的网卡 1 2 3 4 5 6 ip link showls /sys/class/net ip a
2.1.2 分析ip a 1 2 3 4 5 6 7 8 9 10 eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link /ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0 valid_lft 83668sec preferred_lft 83668sec inet6 fe80::5054:ff:fe8a:fee6/64 scope link valid_lft forever preferred_lft forever
2.1.3 网卡对应的配置文件
在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可
具体目录为:/etc/sysconfig/network-scripts/
比如打开ifcfg-eth0
1 2 3 4 5 6 7 8 9 10 DEVICE="eth0" BOOTPROTO="dhcp" ONBOOT="yes" TYPE="Ethernet" HWADDR=00:0c:29:90:89:d9 NETMASK=255.255.255.0 IPADDR=192.168.0.100 GATEWAY=10.0.0.2 USERCTL=no PERSISTENT_DHCLIENT="yes"
2.2 Network Namespace linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的
1 2 3 4 5 6 ip netns list ip netns add ns1 ip netns delete ns1
2.2.1 创建Namespace 1 2 3 4 5 6 7 8 9 ip netns add ns1 ip netns exec ns1 ip a ip netns exec ns1 ifup lo 或 ip netns exec ns1 ip link set lo up ip netns exec ns1 ip a ip netns add ns2
2.2.2 连接Namespace之间的网络 veth pair:virtual ethernet pair,是一个成对的端口,可以实现上述功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ip link ip link add veth-ns1 type veth peer name veth-ns2 ip link ip link set veth-ns1 netns ns1 ip link set veth-ns2 netns ns2 ip link ip netns exec ns1 ip link ip netns exec ns2 ip link ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1 ip netns exec ns1 ip link set veth-ns1 up ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2 ip netns exec ns2 ip link set veth-ns2 up ip netns exec ns1 ip a ip netns exec ns2 ip a ip netns exec ns1 ping 192.168.0.12 ip netns exec ns2 ping 192.168.0.11
2.2.3 容器的Network Namespace 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 docker run -d --name tomcat01 -p 8081:8080 tomcat:8.0 docker run -d --name tomcat02 -p 8082:8080 tomcat:8.0 docker exec -it tomcat01 bash apt update apt install -y iproutes docker exec -it tomcat02 bash apt update apt install -y iproutes docker exec -it tomcat01 ip a docker exec -it tomcat02 ip a docker exec -it tomcat01 ping 172.17.0.3 docker exec -it tomcat02 ping 172.17.0.2 ping 172.17.0.2 ping 172.17.0.3
2.3 Docker常见网络类型 2.3.1 Bridge之docker0 1 2 3 4 5 ip link docker exec -it tomcat01 ip link docker exec -it tomcat02 ip link
1 2 3 4 docker network ls docker network inspect bridge
2.3.2 Bridge网络模式实战 1 2 3 4 5 6 7 8 9 docker network create --subnet=172.18.0.0/24 tomcat-net docker network ls docker network inspect tomcat-net docker run -d --name custom-net-tomcat --network tomcat-net tomcat:8.0 docker exec -it custom-net-tomcat ip link ip link
1 2 3 4 5 6 7 8 9 10 docker exec -it custom-net-tomcat ping 172.17.0.2 docker network connect tomcat-net tomcat01 docker network inspect tomcat-net docker exec -it custom-net-tomcat ping 172.18.0.2 docker exec -it custom-net-tomcat ping tomcat01 docker exec -it custom-net-tomcat ping tomcat02
2.3.3 Host 1 2 3 4 5 6 7 8 docker run -d --name my-tomcat-host --network host tomcat:8.0 docker exec -it my-tomcat-host ip a curl centosip:8080 docker network inspect host
2.3.4 None 1 2 3 4 5 6 docker run -d --name my-tomcat-none --network none tomcat:8.0 docker exec -it my-tomcat-none ip a docker network inspect none