本周作业
- 梳理各 Namespace 的作用。
- 使用 apt/yum/ 二进制安装指定版本的 Docker 。
- 熟练使用 Docker 数据卷。
- 熟练使用 Docker 的 bridge 和 container 模式网络。
Namespace的作用
MNT Namespace
提供挂载点和文件系统隔离
每个容器具有独立的文件系统,修改容器内的文件不会影响到宿主机及其他容器
IPC Namespace
提供进程键通信隔离,隔离不同容器之间的进程通信
UTS Namespace
提供主机名隔离,每个容器具有专属的主机名,独立存在不与宿主机和其他容器相同
PID Namespace
提供进程隔离,每个容器都具有PID=1的主进程及其他子进程,pid编号可以与其他容器相同且互不影响
Net Namespace
提供网络隔离 每个容器都有自己的独立网卡通过vethx接口连接到宿主机docker0网卡获取桥接地址,docker0类似一个虚拟交换机通过MAC地址划分容器内部网络
User Namespace
提供用户隔离 运行用户在不同的容器创建相同用户名和组,用户权限仅限于本容器内,不具有其他容器文件系统的权限
Docker安装
apt/在线安装docker
安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
查看docker版本
docker version
查看docker详细信息
docker info
配置镜像加速
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"graph": "/var/lib/docker", #容器数据目录
"registry-mirrors": ["https://73aepdip.mirror.aliyuncs.com"], #镜像加速网站
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"live-restore":false,
"log-opts": {
"max-file":"5",
"max-size": "100m"
},
"storage-driver": "overlay2" #默认存储引擎
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker数据卷
创建数据卷
docker volume create nginx-volume
查看现有数据卷
docker volume ls
DRIVER VOLUME NAME
local nginx-volume
启动容器,挂载已创建数据卷到容器data目录
docker run -itd -p 80:80 -v nginx-volume:/data nginx
4f7798ba91157d0eeee946154ab5f8f3f845c2308d545e9c8f5ca2c4a38c9863
查看容器ID
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f7798ba9115 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp brave_aryabhata
进入容器内部
docker exec -it 4f7798ba9115 /bin/bash
root@4f7798ba9115:/# ls
bin data docker-entrypoint.d etc lib media opt root sbin sys usr
boot dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
在挂载目录写入文件
echo "welconme to jike" > /data/index.html
在宿主机docker数据卷目录看到相关信息
ls /var/lib/docker/volumes/nginx-volume/_data/
index.html
cat /var/lib/docker/volumes/nginx-volume/_data/index.html
welconme to jike
容器删除后该数据依然存在
docker rm -f 4f7798ba9115
4f7798ba9115
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ls /var/lib/docker/volumes/nginx-volume/_data/
index.html
数据目录挂载
宿主机创建挂载目录
mkdir -p /data/webapps
在该目录写入文件
echo "datavolume is mounting" > /data/webapps/index.html
启动容器,指定将宿主机目录挂载到容器中,同一目录可以挂载到多个无状态服务
docker run -itd --name web1 -v /data/webapps/:/usr/share/nginx/html -p 80:80 nginx
docker run -itd --name web2 -v /data/webapps/:/usr/share/nginx/html -p 81:80 nginx
Docker 的 bridge 和 container 模式网络
默认是bridge模式,通过虚拟网桥vethx桥接到docker0
docker run -itd --name web1-bridge -p 80:80 --net=bridge nginx
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02427894db85 no vethf5849c3
container模式 共享一个已存在容器的网络
创建一个容器
docker run -itd --name nginx-container -p 80:80 --net=bridge nginx:1.22.0-alpine、
创建另一个容器,指定网络模式container
docker run -itd --name php-container --net=container:nginx-container php:7.4.30-fpm-alpine
两个容器公用同一个ip
root@ubuntu2004:~# docker exec -it cc48c3d54588 /bin/sh
/var/www/html # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@ubuntu2004:~# docker exec -it 375babd7b795 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@ubuntu2004:~# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02427894db85 no vetha79dc13