写点什么

极客时间运维进阶训练营第一周作业

作者:好吃不贵
  • 2022-10-18
    浙江
  • 本文字数:2568 字

    阅读完需:约 1 分钟

极客时间运维进阶训练营第一周作业

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 关系非常密切的情况。

用户头像

好吃不贵

关注

还未添加个人签名 2018-11-20 加入

还未添加个人简介

评论

发布
暂无评论
极客时间运维进阶训练营第一周作业_好吃不贵_InfoQ写作社区