容器网络实验

安装工具: apt install bridge-utils net-tools 创建一个新的网络命名空间 $ ip netns add net1 # net1为该网络空间的名称 查看命名空间的iptable, 路由表,设备 $ ip netns exec net1 route # 查看路由表 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface $ ip netns exec net1 iptables -L # 查看iptable Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination $ ip netns exec net1 ip link list # 查看设备 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 # 目前只有本地回环设备, 并且状态为DOWN(未启动) 创建一对veth,并将veth的一头添加到net1中...

November 26, 2023 · 4 min · 李昌

Install Docker on Arch

官方给出的教程是使用docker desktop, 但内存占用太大。 1. 安装docker二进制文件 从这里下载平台对应的二进制文件:https://download.docker.com/linux/static/stable/ 然后解压安装: $ tar xzvf /path/to/<FILE>.tar.gz $ sudo cp docker/* /usr/bin/ 这时可以手动执行sudo dockerd &以启动守护进程,但我们不这样做 配置守护进程 从https://github.com/moby/moby/tree/master/contrib/init/systemd拷贝docker.service, docker.socket两个文件到/etc/systemd/system/docker.service, /etc/systemd/system/docker.socket 然后运行: $ sudo systemctl daemon-reload # 重新加载配置 $ sudo systemctl start docker #启动dockerd $ sudo systemctl enable docker # 设置开机启动 其实也可以直接yay -S docker :-) docker-compose $ yay -S docker-compose References https://docs.docker.com/desktop/install/archlinux/ https://docs.docker.com/engine/install/binaries/#install-daemon-and-client-binaries-on-linux https://docs.docker.com/config/daemon/systemd/ https://wiki.archlinux.org/title/docker https://wiki.archlinux.org/title/Systemd#Drop-in_files

February 21, 2023 · 1 min · 李昌

概览容器篇二:容器网络

容器具有自己的Network Namespace. eht0是这个Network Namespace里的网络接口。而宿主机上也有自己的 eth0,宿主机上的 eth0 对应着真正的物理网卡,可以和外面通讯 要让容器 Network Namespace 中的数据包最终发送到物理网卡上,需要以下两步: 将数据包从容器的 Network Namespace 发送到 Host Network Namespace 上 数据包从宿主机的eth0发送出去 要想让容器从自己的Network Namespace连接到Host Namespace,一般来说就只有两类设备接口,一是veth,另外是macvlan/ipvlan. veth是一个虚拟的网络设备,一般是成对建立,而且这对设备是相互连接的。当每个设备在不同的 Network Namespaces 的时候,Namespace 之间就可以用这对 veth 设备来进行网络通讯了。 到这里,解决了第一步,下一步需要将数据包从宿主机的eth0发送出去。 Docker 程序在节点上安装完之后,就会自动建立了一个 docker0 的 bridge interface。所以我们只需要把第一步中建立的 veth_host 这个设备,接入到 docker0 这个 bridge 上。 容器和docker0组成了一个子网,docker0上的IP就是这个子网的网关IP。 然后docekr0通过nat或route的方式,经过eth0将数据包向外发送。 Reference https://time.geekbang.org/column/article/323325 http://icyfenix.cn/immutable-infrastructure/network/linux-vnet.html https://morven.life/posts/networking-4-docker-sigle-host/ https://network.51cto.com/article/708901.html

August 7, 2022 · 1 min · 李昌

概览容器篇一:镜像

1. 分层的镜像 在我们启动一个容器之前,通常需要下载这个容器对应的镜像,以这个镜像为基础启动容器。镜像中包含了对应的程序的二进制文件与其所依赖的文件,程序在启动后看到的rootfs只是这个镜像中存在的文件。这样,我们就可以为容器中的进程提供一个干净的文件系统。 创建一个镜像(image)的最简单方法是使用Dockerfile。 FROMscratchCOPY hello /CMD ["/hello"]scratch是docker为我们提供的一个空镜像,我们可以在此基础上构建任何我们想要的镜像。 在书写Dockerfile时,想必你听说过这么一句话,不要在Dockerfile中创建太多层. 在Dockerfile中,每一个指令都会创建一个新的“层”,这里的层,指的是UnionFS中的一个文件目录。当我们创建了过多的层,会导致镜像体积变大,除此之外,Union FS 也会有最大层数限制。 因此对于如下的Dockerfile文件写法,应尽量避免: FROMdebian:stretchRUN apt-get updateRUN apt-get install -y gcc libc6-dev make wgetRUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"RUN mkdir -p /usr/src/redisRUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1RUN make -C /usr/src/redisRUN make -C /usr/src/redis install可优化为如下写法 FROMdebian:stretchRUN set -x; buildDeps='gcc libc6-dev make wget' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis....

July 10, 2022 · 4 min · 李昌

WSL2-不输Mac的开发体验(三):WSL2中使用docker&k8s

1. docker for wsl2 在wsl2中使用docker的最佳实践不是在wsl2中安装docker,而是安装docker desktop: 从docker官网下载并安装完成后,打开docker desktop,选择setting->General,确保Use the WSL 2 based engine选项被勾选,然后选择右下角Apply&Restart。 重启docker desktop后,再次打开设置,确保setting->Resources->WSL INTEGRATION选项页中你的WSL发行版被勾选。 完成以上步骤之后,打开你的wsl, 输入docker: 出现这一堆说明安装成功。 使用docker run helloworld验证你的docker可以正常启动容器。 如果输入docker命令后无法启动,可以尝试sudo docker 2. k8s for wsl2 安装了docker desktop后,可以通过setting->Kubernetes,勾选Enable Kubernetes来为你的wsl提供k8s服务,但由于网络问题,通常不可能成功。 所以我们要"换源"。 打开setting->Docker Engine,将右侧配置文件改为: { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ], "insecure-registries": [], "debug": false, "experimental": false, "features": { "buildkit": true } } Apply&Restart,重启docker desktop。 现在我们还需要一些额外的镜像。 clone AliyunContainerService/k8s-for-docker-desktop 这个项目。 git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git 查看自己的docker desktop上Kubernetes的版本。 可以看到我们这里是v1.21.2。相应的,我们进入刚才clone的文件夹下,切换到v1.21.2分支 git checkout v1.21.2 切换分支后,在当前目录下执行:...

August 12, 2021 · 1 min · 李昌

docker常用操作

docker常用操作 启动docker服务 sudo systemctl start docker 查看本地镜像 sudo docker images 查看正在运行的镜像 sudo docker ps 查看所有镜像 sudo docker ps -a 停止正在运行的镜像 sudo docker stop container_name 开始运行某个镜像 sudo docker start container_name 删除某个镜像 sudo docker rmi container_name 进入某个正在运行的镜像 sudo docker attach container_name 导出容器 sudo docker export container_id > name.tar 导入容器 cat name.tar | sudo docker import -test/buntu:v1.0 从网络导入 sudo docker import http://example.com/exampleimage.tgz example/imagerepo 非sudo运行 sudo usermod -aG docker $USER && newgrp docker # 将当前用户添加到docker用户组 退出重新登陆即可

February 25, 2021 · 1 min · 李昌

docker的安装(Ubuntu)

1、docker的安装(Ubuntu) 1.1、 设置存储库 若是已安装旧版本的docker, 请卸载:sudo apt-get remove docker docker-engine docker.io containerd runc 1.1.1、更新apt索引 sudo apt-get update 1.1.2、安装依赖 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common 1.1.3、添加docker官方的GPG秘钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 在进行此步时,出现了sudo: unable to resolve host iZ2ze4512bfzoapfvch6btZ,这是因为机器不能反向解析 打开主机上的 /etc/hosts 添加: 127.0.0.1 【hostname】# 【hostname】用主机名替代 可在/etc/hostname中修改主机名,sudo shutdown -r now重启过后完成主机名修改 验证添加成功: sudo apt-key fingerprint 0EBFCD88 1.1.4、 设置存储库 sudo add-apt-repository "deb [arch=amd64] https://download....

February 25, 2021 · 2 min · 李昌

在docker中构建django项目

在docker中构建django项目 (需安装docker-compose, 安装教程) 1. 定义项目组件 对于此项目,您需要创建Dockerfile,Python依赖项文件和docker-compose.yml文件。(您可以使用此文件的扩展名.yml或.yaml扩展名。) 1.1. 创建一个空目录 该目录应仅包含构建该映像的资源。 1.2 创建Dockerfile 内容如下: FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/ 对于DockerFile的解释 1.3 创建requirements.txt 内容如下: django django-ckeditor pillow numpy 1.4 创建docker-compose.yml 该docker-compose.yml文件描述了构成应用程序的服务。在此示例中,这些服务是Web服务器和数据库。撰写文件还描述了这些服务使用哪些Docker映像,它们如何链接在一起,以及它们可能需要安装在容器内的任何卷。最后,该docker-compose.yml文件描述了这些服务公开的端口。有关此文件如何工作的更多信息,请参阅docker-compose.yml参考。 内容如下: version: '3' services: db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db 2 创建django项目 切换到项目跟目录】 通过运行docker-compose run 命令创建django项目 sudo docker-compose run web django-admin startproject mysite ....

February 25, 2021 · 1 min · 李昌