网络模型

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 

网段冲突

  1. vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://{阿里云提供}.mirror.aliyuncs.com"],
  "bip":"172.19.0.1/16(需要修改的网段)"
}
  1. 重启docker网络服务
sudo systemctl daemon-reload
sudo systemctl restart docker

更换docker镜像源

  1. 创建或修改 /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
  1. 加载重启docker systemctl restart docker

代理docker pull镜像

因为docker pull是在dockerd守护进程运行的,直接shell的代理不生效

  1. 运行 sudo mkdir -p /etc/systemd/system/docker.service.d
  2. 编辑 /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"
  1. 重启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命令启动容器。

  1. docker run命令会自动创建并启动一个新的容器,而docker create只是创建一个新的容器。
  2. docker run命令可以指定要在容器内运行的命令,而docker create不会运行任何命令。
  3. 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如何实现镜像迁移

  1. 使用docker save -o image.tar image_name导出镜像为压缩包
  2. scp传输过去
  3. docker load -i /path/to/image.tar目标机器加载镜像

docker 查看容器占用内存情况

目前可用镜像库

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 (重要)