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.2 到 172.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 下面创建的容器
- 查看命名空间
ctr ns ls
- 创建命名空间
ctr ns create my-ns
- 删除命名空间
ctr ns rm my-ns
ctr ns remove my-ns
- 指定命名空间操作
ctr -n test i ls -q
一、镜像相关命令
- 拉取镜像
- docker
docker pull nginx:latest
- containerd
ctr i pull docker.io/library/nginx:latest ctr i pull –all-platforms docker.io/library/nginx:latest
- 列出镜像
- docker
docker images
- containerd
ctr i ls [-q 只显示名称]
- 镜像重新打标签
- 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
- 删除镜像
- docker
docker rmi nginx:latest docker rmi hashID
- containerd
ctr i rm docker.io/library/nginx:alpine
- 推送本地镜像
- docker
- containerd
- 将镜像挂载到主机目录
- docker
不知道,每用过
- containerd
ctr i mount docker.io/library/nginx:alpine /mnt
- 将镜像从主机目录上卸载
- docker
不知道,每用过
- containerd
ctr i unmount /mnt 因为挂在的时候挂在到了 /mnt 所以卸载的时候直接卸载 /mnt
- 将镜像导出为压缩包 在使用export命令是需要添加–platform参数,否则会报错。
- docker
不知道,每用过
- containerd
ctr image export –all-platforms nginx.tar.gz
ctr image export –platform=linux/amd64 nginx.tar.gz
- 从压缩包导入镜像
- 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中从来每用过, 也就不去写对比的命令了, 以后用到再查
- 创建容器, 理解就是只创建不运行, 在docker里从来每这么用过
- docker
- containerd
ctr c create docker.io/library/nginx:alpine nginx
- 列出容器
- docker
docker ps | docker ps -a
- containerd
ctr c ls
- 查看容器详细配置
- docker
- containerd
ctr c info nginx
- 删除容器
- docker
- containerd 除了使用 rm 子命令之外也可以使用 delete 或者 del 删除容器
ctr c rm nginx
- 启动容器
- docker
docker start nginx
- containerd
ctr task start -d nginx
- 暂停容器
- docker
docker stop nginx
- containerd
ctr task pause nginx
- 恢复容器
- docker
docker start nginx
- containerd
ctr t resume nginx #resume 继续,重新开始
- 启动容器
- docker
- containerd
- 进入容器
- docker
docker exec -it nginx sh
- containerd 必须要指定 –exec-id 参数,这个 id 可以随便写,只要唯一就行
ctr task exec –exec-id 0 -t nginx sh
- 查看正在运行的容器
- docker
docker ps containerd ctr task ls [-q]
- 杀掉容器
- docker 没用过
docker kill -s KILL mynginx
- containerd ctr里面没有stop 只能暂停或者杀掉
ctr t kill nginx
- 删除容器
- docker
docker rm nginx
- containerd 要想删除一个正在运行的Task,必须先kill掉这个task,然后才能删除
ctr c rm nginx
- 取容器的内存、CPU 和 PID 的限额与使用量
- docker
docker stats
- containerd
ctr t metrics nginx
- 查看容器中所有进程在宿主机中的 PID
- docker
docker top nginx
- containerd
ctr task ps nginx
- 查看容器的日志
- docker
docker logs nginx
- containerd
ctr task logs nginx