网络模型
bridge模式
- 配置: 默认配置,
--network=bridge
- 通过docker0 网卡,相当于自己构建了一个局域网,由docker0统一负责转发,在表中注册容器端口并转发,另类NAT
- 同时host作为网卡的第一个有效ip可以和容器通讯
[!important] 绑定的ip一定要是0.0.0.0,因为host的localhost在这个模式进入docker之后并不是127.0.0.1,而是网卡的第一个有效ip,容易出错
host模式
- 配置:
--network=host
- 直接和host共享端口,一般不用,因为丧失docker环境隔离性,好处是容器localhost直接和host共享
none模式
- 配置:
--network none
- 禁用网络功能,不会在容器创建网卡,只有lo(localhost)
container模式
- 配置:
–network=bridge
- 和其他容器共享一个网卡,如果依赖容器关了,就只剩下lo,好处是容器共享网卡,可以直接localhost访问其他容器
macvlan 模式
- 需要和host主机使用同一个mac地址,那么就需要用这个构建虚拟网络,不过使用极少
- 将一块物理网卡虚拟成多块虚拟网卡
容器相互通信
自定义网络
docker network create custom_network
- 会产生一个新的bridge(该bridge和docker0处于同一级,是另一个网卡)
- 属于同一个网卡下容器可以直接通过ip相互访问,如果需要通过名字访问,需要设置
--name 容器名字
,这样就可以通过名字互相访问 - 网络添加容器
docker network connect 网络名称 容器名称
docker-compose
- 如果没有指定会创建一个上面的自定义网络,会创建一个网卡,并且指定名字,使得容器间可以相互访问,但是其他容器(比如自己起的容器)因为不在同一个网卡,无法直接通信,网桥名称为docker-compose.yml所在目录名称小写形式加上"_default"
- 如果需要compose和其他以及创建好的网卡交互,可以通过加入其网络实现
networks:
persist:
external:
name: bridge2
- 端口可以类似docker0直接映射到host端口
Overlay
- 一种用于跨主机的容器虚拟网络,建立在不同的主机之间容器直接访问
- 太复杂了,一般直接上k8s
底层模型
- 通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作
总体架构
namespace隔离
- 通过namespace实现pid重新分配,以及其他资源的隔离
- 容器实际上就是一个运行中的程序,但是通过dockerd fork生成,对外界环境隔离
- 目录通过linux的/mnt挂载机制实现隔离
QA
docker如何连接host
linux
- 通过网卡(
ifconfig
),获取docker0的ip,例如172.19.0.1,容器中可以直接使用 - 容器启动加上
--add-host=host.docker.internal:host-gateway
- compose加上
extra_hosts:
- "host.docker.internal:host-gateway"
- 类似
version: '3.9'
services:
chatgpt:
image: dockerproxy.com/eryajf/chatgpt-dingtalk:latest
container_name: chatgpt
environment:
- APIKEY=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
- MODEL="gpt-3.5-turbo-0301"
- SESSION_TIMEOUT=600
- HTTP_PROXY=http://host.docker.internal:15777
- DEFAULT_MODE="单聊"
ports:
- "8090:8090"
restart: always
extra_hosts:
- host.docker.internal:host-gateway
mac
- 也可以用
docker.for.mac.localhost
- mac和windows类似,基于虚拟机,没有docker0网卡
docker alpine中遇到 sh: ... not found
- 因为alpine比较奇怪,不建议使用 >mkdir /lib64 >ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
connect: permission denied
newgrp docker
sudo gpasswd -a $USER docker
网段冲突
- vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://{阿里云提供}.mirror.aliyuncs.com"],
"bip":"172.19.0.1/16(需要修改的网段)"
}
- 重启docker网络服务
sudo systemctl daemon-reload
sudo systemctl restart docker
更换docker镜像源
- 创建或修改 /etc/docker/daemon.json 文件
//all
{
"registry-mirrors": [
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
//self
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://自己的.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
//https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 加载重启docker
systemctl restart docker
代理docker pull镜像
因为docker pull是在dockerd守护进程运行的,直接shell的代理不生效
- 运行
sudo mkdir -p /etc/systemd/system/docker.service.d
- 编辑
/etc/systemd/system/docker.service.d/http-proxy.conf
文件
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTP_PROXY=http://127.0.0.1:7890"
- 重启docker,加载配置文件,可以通过
sudo systemctl show --property=Environment docker
检查是否运行成功
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
[!tip] 参考 如何配置docker通过代理服务器拉取镜像 | 自由行 配置docker pull代理_docker pull 代理-CSDN博客
docker安装脚本
微信
sudo docker run -d --name wechat --device /dev/snd --ipc="host" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /D/CACHE/docker/WeChatFiles:/WeChatFiles \
-e DISPLAY=unix$DISPLAY \
-e XMODIFIERS=@im=fcitx \
-e QT_IM_MODULE=fcitx \
-e GTK_IM_MODULE=fcitx \
-e AUDIO_GID=`getent group audio | cut -d: -f3` \
-e GID=`id -g` \
-e UID=`id -u` \
bestwu/wechat
企业微信
sudo docker run -d --name wxwork --device /dev/snd --ipc="host" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/WXWork:/WXWork \
-v $HOME:/HostHome \
-v $HOME/wine-WXWork:/home/wechat/.deepinwine/Deepin-WXWork \
-e DISPLAY=unix$DISPLAY \
-e XMODIFIERS=@im=fcitx \
-e QT_IM_MODULE=fcitx \
-e GTK_IM_MODULE=fcitx \
-e AUDIO_GID=`getent group audio | cut -d: -f3` \
-e GID=`id -g` \
-e UID=`id -u` \
-e DPI=96 \
-e WAIT_FOR_SLEEP=1 \
boringcat/wechat:work
kafka
version: '2.1'
services:
zookeeper:
image: wurstmeister/zookeeper:latest
ports:
- "2181:2181"
kafka:
restart: always
image: 'bitnami/kafka:2.8.1'
ports:
- '9092:9092'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
depends_on:
- zookeeper
vscode
- 权限会被更改要非常注意!
docker run -d \
-p 5200:8443 \
--name=code-server \
-e DEFAULT_WORKSPACE=/config/workspace \
-e PASSWORD=123 \
-e SUDO_PASSWORD=123 \
-v /root/vscode/config:/config \
-v /root/code:/config/workspace \
--restart always \
--privileged=true \
linuxserver/code-server:latest
- 推荐
nohup ./code-server-4.89.0-linux-amd64/bin/code-server /root &
,然后更改~/.config/code-server/config.yaml
为
bind-addr: 0.0.0.0:5201 # 一定是0.0.0.0
auth: password
password: 123
cert: false
user-data-dir: /data/vscode/confi
思源笔记
- 参考笔记方法 > docker部署
trilium
docker run -itd -p 5206:8080 -v ~/trilium/trilium-data:/root/trilium-data zadam/trilium
webdev
docker run --name=webdav -d -e USERNAME=chenxuan -e PASSWORD=123 -v /root/webdev/data:/data --memory="512m" -p 5202:80 --restart=always derkades/webdav
minio
#!/bin/bash
docker run \
-p 5200:5200 \
-p 5201:5201 \
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=chenxuan" \
-e "MINIO_ROOT_PASSWORD=123" \
-v /root/minio/data:/data \
-v /root/.minio:/root/.minio \
--memory="512m" \
minio/minio server \
/data --console-address ":5200" -address ":5201
memos
#!/bin/bash
docker run -d \
--init \
--name memos \
--publish 5203:5230 \
--memory="512m" \
--volume /root/memos/memos:/var/opt/memos \
neosmemo/memos:stable
onlyoffice
sudo docker run -i -t -d -p 5204:80 --memory="512m" onlyoffice/documentserver
searxng
- 搜索引擎
docker run --rm \
-d -p 5209:8080 \
-v "${PWD}/searxng:/etc/searxng" \
-e "BASE_URL=http://117.72.72.46:5209/" \
--memory="512m" \
searxng/searxng
uptime-kuma
- 监控工具
docker run -d --restart=always -p 5205:3001 -v /root/uptime-kuma/uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma
docker create和run的区别
docker create命令则只是创建一个新的容器,但不会自动启动容器。这意味着可以在容器创建后,使用其他命令对容器进行配置或修改,然后再使用docker start命令启动容器。
- docker run命令会自动创建并启动一个新的容器,而docker create只是创建一个新的容器。
- docker run命令可以指定要在容器内运行的命令,而docker create不会运行任何命令。
- docker run命令会返回容器的输出结果,而docker create只返回容器的ID。
docker run/create/start
- dcoker run相当于创建并启动,等于create+start
- docker start可以启动处于create或者stop状态的容器
docker run -it --rm <image_id> 指令
- 立刻运行,运行之后自动删除
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running(docker安装)
- 如果不是wsl
systemctl daemon-reload
systemctl restart docker.service
- 如果是wsl(先把apt安装的docker卸载)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start
ERROR: client version 1.22 is too old. Minimum supported API version is 1.24
- 该dockers-compose第一行的2改成2.1
docker CMD和ENTRYPOINT区别
- ENTRYPOINT相当于自带使用
sh
运行,优先级比CMD高,参考下图
docker如何实现镜像迁移
- 使用
docker save -o image.tar image_name
导出镜像为压缩包 scp
传输过去docker load -i /path/to/image.tar
目标机器加载镜像
docker 查看容器占用内存情况
docker stats
交互式,加上--no-stream 只返回当前的状态- 参考 Docker容器资源的占用情况 - 知乎
目前可用镜像库
- DockerHub容器镜像库|应用容器化
- 国内的 Docker Hub 镜像加速器,由国内教育机构与各大云服务商提供的镜像加速服务 | Dockerized 实践 https://github.com/y0ngb1n/dockerized · GitHub
docker stats
- 监控容器资源使用情况
docker镜像提交流程
1. 镜像打包
docker commit <容器ID> <新镜像名称>:<标签>
tag这里直接数字,不要v开头
2. 上传到服务器
- 阿里云的参考官网就行
docker启动常见参数
-e key=val
:设置环境变量,一个变量一个-e-d
:设置后台运行--memory="512m"
:设置最大使用内存--cpu=2
:设置最多使用的cpu数量
参考
- https://zhuanlan.zhihu.com/p/212772001
- https://juejin.cn/post/7041923410649153543
- https://www.cnblogs.com/BillyLV/articles/12896624.html
- https://www.cnblogs.com/crazymakercircle/p/15400946.html
- https://zhuanlan.zhihu.com/p/363419059 (重要)