1 - docker-compose

docker-compose.yml中添加自定义网络

1. 如果是3.5以下版本(3.4及以下)
网络配置如下定义
networks:
  自定义网络名1:#此名称在当前docker-compose文件中作为id出现,当前文件使用网络写 "自定义网络名1"即可
    driver: "bridge"
运行后使用 docker network list
会创建一个名为: "目录名_自定义网络名1" 的docker网络

2. 在3.5版本的docker-compose.yml文件中可以定义网络
networks:
  自定义网络2:
    name: 自定义网络2-custom
    driver: "bridge"
此时添加了name属性,在运行 docker network list 命令则创建的docker网络名即为 "自定义网络2-custom"

在docker-compose.yml中使用已有的网络

此以3.4  3.5版本文件为例
此时另一个目录中的docker-compose.yml文件的容器启动也要使用 "目录名_自定义网络名1" 的docker网络
可以如下写法
networks:
    自定义网络3:#"自定义网络3" 作为当前文件中的一个ID标记使用
        external:
            name: 自定义网络2-custom || 目录名_自定义网络名1 
            #(也就是在运行docker network list 命令能打印出来的网络名称)

覆盖镜像中启动的默认命令

command: [“bundle”, “exec”, “thin”, “-p”, “3000”]

2 - DockerNetword

Docker 网络与容器互联

简单整理一下 Docker 中 network 子命令,以及 docker 中相关 network 方面的内容。

在安装完 Docker 后,使用 ifconfig -a 查看可以看到多出一个虚拟的 docker0 接口,这个接口是 Docker 默认的网关地址。

不同 Network driver 介绍

Docker 容器默认有三种连接方式:

  • bridge
  • host
  • none

bridge 模式

Docker 默认会生成一个 docker0 网桥,如果不指定,默认创建的容器都会默认走此网桥,使用 bridge 模式联网。默认 bridge 会产生 docker0 的虚拟接口,在宿主机上可以使用 ifconfig -a 来查看,一般的网关地址是 172.17.0.1,所有的容器都会使用这个地址作为网关,容器的 IP 地址会从 172.17.0.2172.17.0.254 这个范围 IP 段划分。

此模式下,容器可以单向连接外网,外网或宿主要访问容器则需要容器映射端口。

host 模式

host 模式等同于容器直接使用物理机的网络,宿主机的 IP 就是容器的 IP,端口也可以直接调用。

此模式的缺点是容易造成宿主机和容器端口冲突,而且降低了安全性,在有多个容器的情况下使用也不方便。

none

none 模式,也就是容器默认不联网的模式。通常会合自定义网络的容器一起使用。non 在 swarm 服务中不可用。

macvlan

还有两种更高级的网络模式,overlay 和 macvlan,分别用于跨宿主机的容器通信和给每个容器分配一个 mac 地址。

macvlan 网络允许给容器分配一个 MAC 地址,这样在网络中就可以以物理设备存在。Docker daemon 会通过 Mac 地址将流量导给容器。在处理一些历史遗留应用,期望直接使用物理网络的场景非常适合使用 macvlan.

overlay

Overlay 网络会连接多个 Docker daemon,开启 swarm 服务来相互通信。也可以通过 overlay 网络来帮助 swarm 服务和独立容器之间的通信,或者帮助两个独立的容器,或者帮助不同的 Docker daemons。通过 overlay 就不需要系统级别在不同容器中的路由了。

Docker 本身也有一个 link 指令,可以用于连接两个容器,但这命令的缺点是只能单向连接,也就是 A 和 B 两个容器,只能 A 访问 B 或者 B 访问 A,做不到 AB 之间直接同时互访。

使用

创建新网络

docker network create network-name

docker network create -d bridge network-name

使用 ls 查看:

docker network ls

审查 network 信息:

docker network inspect network-id

删除网络:

docker network rm name
docker network rm network-id

创建时指定 IP 段:

docker network create --subnet=192.168.1.0/24 net-name

创建名为 net-name 的网络,默认 bridge,IP 段是: 192.168.1.0 ~ 192.168.1.255

3 - 拉取并推送到阿里云docker仓库的shell脚本

#!/bin/bash

#使用脚本前 需要登录到阿里云仓库 命令
#docker login --username=#{你的用户名} registry.cn-beijing.aliyuncs.com
#输入密码 

image_name=$1
image_tag=$2
# 检查 image_name 是否为空
if [ -z "$image_name" ];then
  echo "请输入镜像名称"
  exit 1
fi

# 检查 image_tag 是否为空
if [ -z "$image_tag" ]; then
    echo "image_tag 为空,赋值为 latest"
    image_tag="latest"
fi

# 在本地拉去镜像
image_all="$image_name":"$image_tag"
sudo docker pull "$image_all"
# 获取镜像id
image_id=`sudo docker images --filter=reference=$image_all -q`

# 获取镜像名称
image_last_part=$(echo "$image_name" | awk -F'/' '{print $NF}')


aliyun_image_path=registry.cn-beijing.aliyuncs.com/#{这里填你的命名空间}$/"$image_last_part":"$image_tag"

sudo docker tag $image_id $aliyun_image_path
sudo docker push $aliyun_image_path
sudo docker rmi $aliyun_image_path
echo $aliyun_image_path
sudo docker images
#sudo docker $image_all

4 - 容器相关命令解析

一、命名空间相关

貌似在docker里面没有命名空间
容器启动的时候,默认会在默认的命名空间中启动 即 default
可以通过-n 指定命名空间
Docker 使用的 containerd 下面的命名空间默认是 moby,而不是 default
所以假如我们有用 docker 启动容器,那么我们也可以通过 ctr -n moby
同样 Kubernetes 下使用的 containerd 默认命名空间是 k8s.io,所以我们可以使用 ctr -n k8s.io 来查看 Kubernetes 下面创建的容器

  1. 查看命名空间

ctr ns ls

  1. 创建命名空间

ctr ns create my-ns

  1. 删除命名空间

ctr ns rm my-ns
ctr ns remove my-ns

  1. 指定命名空间操作

ctr -n test i ls -q

一、镜像相关命令

  1. 拉取镜像
  • docker

docker pull nginx:latest

  • containerd

ctr i pull docker.io/library/nginx:latest ctr i pull –all-platforms docker.io/library/nginx:latest

  1. 列出镜像
  • docker

docker images

  • containerd

ctr i ls [-q 只显示名称]

  1. 镜像重新打标签
  • docker

docker tag nginx:latest harbor.k8s.local/course/nginx:latest

  • containerd

ctr i tag docker.io/library/nginx:alpine harbor.k8s.local/course/nginx:alpine

  1. 删除镜像
  • docker

docker rmi nginx:latest docker rmi hashID

  • containerd

ctr i rm docker.io/library/nginx:alpine

  1. 推送本地镜像
  • docker
  • containerd
  1. 将镜像挂载到主机目录
  • docker

不知道,每用过

  • containerd

ctr i mount docker.io/library/nginx:alpine /mnt

  1. 将镜像从主机目录上卸载
  • docker

不知道,每用过

  • containerd

ctr i unmount /mnt 因为挂在的时候挂在到了 /mnt 所以卸载的时候直接卸载 /mnt

  1. 将镜像导出为压缩包 在使用export命令是需要添加–platform参数,否则会报错。
  • docker

不知道,每用过

  • containerd

ctr image export –all-platforms nginx.tar.gz
ctr image export –platform=linux/amd64 nginx.tar.gz

  1. 从压缩包导入镜像
  • docker

不知道,每用过

  • containerd

ctr i import nginx.tar.gz

如果 直接导入可能会出现类似于 ctr: content digest sha256:xxxxxx not found 的错误,要解决这个办法需要 pull 所有平台镜像:

➜  ~ ctr i pull --all-platforms docker.io/library/nginx:alpine
➜  ~ ctr i export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine
➜  ~ ctr i rm docker.io/library/nginx:alpine
➜  ~ ctr i import nginx.tar.gz

二、容器相关

容器相关的很多操作在docker中从来每用过, 也就不去写对比的命令了, 以后用到再查

  1. 创建容器, 理解就是只创建不运行, 在docker里从来每这么用过
  • docker
  • containerd

ctr c create docker.io/library/nginx:alpine nginx

  1. 列出容器
  • docker

docker ps | docker ps -a

  • containerd

ctr c ls

  1. 查看容器详细配置
  • docker
  • containerd

ctr c info nginx

  1. 删除容器
  • docker
  • containerd 除了使用 rm 子命令之外也可以使用 delete 或者 del 删除容器

ctr c rm nginx

  1. 启动容器
  • docker

docker start nginx

  • containerd

ctr task start -d nginx

  1. 暂停容器
  • docker

docker stop nginx

  • containerd

ctr task pause nginx

  1. 恢复容器
  • docker

docker start nginx

  • containerd

ctr t resume nginx #resume 继续,重新开始

  1. 启动容器
  • docker
  • containerd
  1. 进入容器
  • docker

docker exec -it nginx sh

  • containerd 必须要指定 –exec-id 参数,这个 id 可以随便写,只要唯一就行

ctr task exec –exec-id 0 -t nginx sh

  1. 查看正在运行的容器
  • docker

docker ps containerd ctr task ls [-q]

  1. 杀掉容器
  • docker 没用过

docker kill -s KILL mynginx

  • containerd ctr里面没有stop 只能暂停或者杀掉

ctr t kill nginx

  1. 删除容器
  • docker

docker rm nginx

  • containerd 要想删除一个正在运行的Task,必须先kill掉这个task,然后才能删除

ctr c rm nginx

  1. 取容器的内存、CPU 和 PID 的限额与使用量
  • docker

docker stats

  • containerd

ctr t metrics nginx

  1. 查看容器中所有进程在宿主机中的 PID
  • docker

docker top nginx

  • containerd

ctr task ps nginx

  1. 查看容器的日志
  • docker

docker logs nginx

  • containerd

ctr task logs nginx