极客时间运维进阶训练营第一周作业
namespace 的作用
namespace 用于访问隔离,cgroup 用于资源控制,是 linux 控制容器的两个方面。
目前有 9 种 namespace,分别是:
旧的 6 个 namespace
mnt namespace: 磁盘挂载和文件系统隔离。同样的目录,host 和 container 内不一样。container 内可以挂载 host 的目录。
ipc namespace: 进程间通信隔离。
uts namespace: 主机名隔离。
pid namespace: 进程 pid 隔离,容器内部的 pid 从 1 开始,重新计算。
net namespace: host 和 container 的网络不一样。如果不打开,container 可以用 host 的网络。容器内的端口和 host 的端口不一样,比如每个容器都可以监听 80 端口,映射到主机的不同端口。
user namespace:用户隔离。
新的 3 个 namespace
time namespace: 时间隔离。
syslog namespace: syslog 隔离。
control group namespace: 提供进程所属的控制组的身份隔离。
在 host 通过 lsns 命令,可以看到当前 host 和 container 有哪些 namespace。
cgroup 用于资源限制。比如 cpu,mem,net,io。
cat /boot/config-`uname -r` | grep CGROUP
可以看到支持哪些 cgroup。
使用 apt/yum/二进制安装指定版本的 Docker
如果需要社区版,是 docker-ce。安装方法参考链接https://developer.aliyun.com/mirror/docker-ce
apt 安装
具体命令是:
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
注意使用 apt install docker-io 命令安装的版本会比较老,所以用 docker-ce 比较好。
二进制安装
从这里下载https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/
解压后安装即可。
熟练使用数据卷
Docker 有 lower dir, upper dir,merged dir 和 work dir。
其中 lower dir 存的是镜像本身。
upper dir 存的是改变的内容。
merged dir 是合并后的内容。
work dir 是容器在主机上的路径。
docker 的数据,如果需要持久化,卷一般使用 volume 管理的。
创建数据卷
docker volume create nginx-data
docker volume ls
docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.23.0-alpine
其中-d 表示 detach,让 container 在后台运行。-v 表示 volume,nginx-data:/data 表示把这个数据卷挂载到容器/data 目录下。
其中 run 命令表示 create 和 start 的组合。
到容器创建文件:
docker exec -it $container_id sh
写数据:
echo "nginx web" > /data/index.html
exit
到主机看内容:
cat /var/lib/docker/volumes/nginx-data/_data/index.html
表示数据存到主机了。
挂载数据卷
mkdir /data/testapp –p
echo "testapp web page" > /data/test/index.html
cat /data/test/index.html
删除之前的容器:
docker rm -fv `docker ps -aq`
其中-v 表示删除 volume。
运行容器:
docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 80:80 nginx:1.23.0-alpine
21 docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 81:80 nginx:1.23.0-alpine
多目录挂载
如果用两个-v,就表示可以挂载多个 volume。
docker run -d --name web3 -v /data/testapp:/usr/share/nginx/html/testapp -v
/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 83:80 nginx:1.20.2
加上环境变量
docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.38
进容器执行:
docker exec -it $container_id sh
mysql -uroot -p123456 -hlocalhost
删除数据卷
docker rm -f $container_id
删除后,host 上的数据目录还在。
通过卷的服务器挂载
docker run -d --name volume-server -v /data/testapp:/usr/share/nginx/html/testapp -v
/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro registry.cn-hangzhou.aliyuncs.com/zhangshijie/pause:3.8
docker run -d --name web1 --volumes-from volume-server -p80:80 nginx:1.23.0-alpine
注意哪怕停止卷 server,也不影响该容器。
熟练使用 Docker 的 bridge 和 container 模式网络
配置好 docker 后,就可以看到 docker0 这个 eth interface。
ip a show docker0
docker 的 3 种网络
分别是 bridge,host 和 none。
docker network list
可以通过以上命令看到。
bridge 网络
docker 如果不额外指定,默认是 bridge 模式,容器可以通过 interface 连接到外部。
docker network inspect bridge
可以看到当前 bridge 的配置。
docker run -it -d --name nginx-web1-bridge-test-container -p 80:80 --net=bridge nginx:1.23.0-alpine
docker exec -it $container_id sh
ip a
可以看到有 172.17.0.3,可以连到外部网络。
host 网络
docker run -it -d --name nginx-web1-host-test-container -p 80:80 --net=host nginx:1.23.0-alpine
和主机共享网卡和 IP。
none 网络
docker run -it -d --name nginx-web1-none-test-container -p 80:80 --net=none busybox sleep 10000000
这种方式用的比较少,没有 IP 也没有路由。
container 网络
可以先建一个 container,另一个 container 用--net=container:$prev_container_name,就可以两个容器共享一个网络。
docker run -it -d --name nginx-container -p 80:80 --net=bridge nginx:1.22.0-alpine
docker run -it -d --name php-container --net=container:nginx-container php:7.4.30-fpm-alpine
可以看到,两个容器里的内容,是完全一样的。
这种方式非常有效,可以用在两个 container 关系非常密切的情况。
评论