参考文献

Docker基础概念与操作

  • Docker核心概念: 镜像,容器,仓库.
    • 镜像是Docker容器启动的先决条件.
    • 容器是镜像的运行实体,镜像是静态的只读文件,容器带有运行时需要的可写文件层,并且容器中的进程存于运行状态.即容器运行着真正的应用程序.
    • 仓库用来存储和分发Docker镜像.镜像仓库分为公共镜像仓库和私有镜像仓库.
  • 镜像,容器,仓库三者之间的关系
    • 镜像是容器的基石,容器是由镜像创建的.
    • 一个镜像可以创建多个容器,容器是镜像运行的实体.
    • 仓库用来存放和分发镜像的.

安装Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyun
sudo usermod -aG docker $USER
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

常用组件启动命令

  • Redis

    1
    docker run -itd --name redis -p 6379:6379 redis
  • Elasticsearch

    1
    2
    3
    4
    5
    docker run --name elasticsearch 
    -p 9200:9200 -p 9300:9300
    -e "discovery.type=single-node"
    -e ES_JAVA_OPTS="-Xms64m -Xmx128m"
    elasticsearch:7.14.0
  • Portainer

    1
    docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name portainer portainer/portainer
  • Kafka

    1
    2
    docker pull wurstmeister/kafka
    docker pull wurstmeister/zookeeper
  • 启动zk

    1
    docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
  • 启动kafka

    1
    2
    3
    4
    5
    6
    7
    docker run --name kafka \
    -p 9092:9092 \
    -e KAFKA_BROKER_ID=0 \
    -e KAFKA_ZOOKEEPER_CONNECT=192.168.40.78:2181 \
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.40.78:9092 \
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
    -d wurstmeister/kafka
  • consul

    1
    docker run --name consul -d -p 8500:8500  -v /Users/holelin/data/consul/config:/consul/config -v /Users/holelin/data/consul/data:/consul/data  consul agent -server -data-dir=/consul/data -config-dir=/consul/config -bind=0.0.0.0 -client=0.0.0.0 -node=consul -bootstrap-expect=1 -ui
  • RabbitMQ

    1
    docker run -dit --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

遇到的问题

Docker日志文件导致磁盘满了,清理方法

  • Docker容器在启动/重启的时候会往/var/lib/docker中写东西,若在启动docker容器遇到No space left on device 的问题,可使用以下步骤来解决

  • /var/lib/docker/containers下的文件夹进行排序,看看哪个容器杂用太多的磁盘空间

    1
    $ du -d1 -h /var/lib/docker/containers | sort -h
  • 选择需要清理的容器进行清理

    1
    $ cat /dev/null > /var/lib/docker/containers/container_id/container_log_name
  • 限制日志文件的大小

    1
    docker run -it --log-opt max-size=10m --log-opt max-file=33 alpine ash

安装docker使用默认安装路径/var/lib/docker,导致磁盘满了

迁移docker数据目录
  • 备份数据: 在修改之前,请务必备份/var/lib/docker目录中的所有数据.这涉及到容器、镜像、网络和数据卷等重要信息.以防修改过程中发生意外或出现问题,可以通过备份恢复数据.

  • 停止Docker服务: 在修改路径之前,确保停止Docker服务.可以使用以下命令停止Docker服务:

    1
    sudo systemctl stop docker
  • 修改配置文件: 打开Docker的配置文件,通常位于/etc/docker/daemon.json.如果该文件不存在,则需要创建一个新文件.在该文件中添加以下内容

    1
    2
    3
    {
    "data-root": "/new/path/to/docker"
    }
  • 迁移数据: 将旧的/var/lib/docker目录中的所有数据迁移到新的路径.可以使用以下命令进行迁移

    1
    2
    3
    sudo rsync -aP /var/lib/docker/ /new/path/to/docker/
    # 或者
    sudo rsync -r -avz /var/lib/docker /new/path/to/docker/
    • -r 选项表示递归复制目录及其子目录。
    • -a 选项表示归档模式,它将尽力保留文件的所有特性,包括权限、所有者、时间戳等。
    • -v 选项表示详细模式,它会显示文件传输的详细信息。
    • -z 选项表示启用压缩传输,在传输过程中对数据进行压缩,以减少网络带宽的使用。
    • -a 选项同样表示归档模式。
    • -P 选项是 --progress--partial 的缩写。
  • 启动Docker服务: 完成数据迁移后,重新启动Docker服务

    1
    sudo systemctl start docker
  • 确认验证: 验证Docker是否以新的路径进行操作.可以使用以下命令来检查Docker的数据路径:

    1
    docker info | grep "Docker Root Dir"

启动容器报错cannot execute binary file

  • 完整报错信息
1
2
root@xx-PowerEdge-R740:/home/xxx/data/code# docker run  --name temp -p 20016:30016  xxx:0.0.0.2
/bin/sh: /bin/sh: cannot execute binary file
  • Dockerfile文件
1
2
3
4
FROM base:0.0.0.1
WORKDIR /usr/local/base
ADD . /usr/local/base
CMD /usr/local/python start.py
  • 修改后的
1
2
3
4
5
FROM base:0.0.0.1
WORKDIR /usr/local/base
ADD . /usr/local/base
ENTRYPOINT ["/bin/bash"]
CMD ["-c","sh deploy.sh"]
  • deploy.sh内容

    1
    2
    # /bin/bash
    /usr/local/python start.py

删除tag<none>的镜像

1
2
3
4
5
6
7
8
9
10
$ docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')   //停止容器  

$ docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器

$ docker rmi $(docker images | grep "none" | awk '{print $3}') //删除镜像

$ docker rmi $(docker images | grep "none" | awk '{print $1":"$2}') //通过tag删除镜像

$ docker system prune --all
$ docker image prune -a

docker使用mongodb容器时报错[main] permissions on /data/keyFile/mongodb.key are too open

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '2.0'
services:
mongo:
image: mongo:4.0.1
container_name: mongodb
ports:
- "27017:27017"
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: holelin
volumes:
- /home/data/data/mongodb:/data/db
- /home/data/mongodb_docker_files/mongodb.log:/var/log/mongodb.log
- /home/data/mongodb_docker_files/config:/data/configdb
- /home/data/mongodb_docker_files/keyFile:/data/keyFile
command:
--keyFile /data/keyFile/mongodb.key --replSet pro
  • mongodb配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
security:
clusterAuthMode: keyFile
keyFile: /data/keyFile/mongodb.key
authorization: disabled
storage:
dbPath: /data/db
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 20
processManagement:
fork: true
net:
bindIp: 0.0.0.0
systemLog:
destination: file
path: /var/log/mongodb/mongodb.log
logAppend: true
replication:
replSetName: pro
setParameter:
internalQueryExecMaxBlockingSortBytes: 335544320
  • 解决办法

    1
    chmod 400 /data/keyFile/mongodb.key

Docker 开启远程访问

  • 编辑/usr/lib/systemd/system/docker.service文件

    1
    vim /usr/lib/systemd/system/docker.service
  • ExecStart添加-H tcp://0.0.0.0:2375

    1
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
  • 重新加载Docker配置生效

    1
    2
    systemctl daemon-reload 
    systemctl restart docker

Docker 后台进程参数清单如下表

参数 解释
–add-runtime runtime 选择容器运行时引擎,默认 containerd
–allow-nondistributable-artifacts list 因为类如 window base image 包含版权限制,所以配置指定的私有镜像仓库,可以帮助应用正常发布
–api-cors-header string 提供跨站 API 请求自定义包头信息
–authorization-plugin list 认证插件配置
–bip string 配置网桥地址
-b, –bridge string 连接网桥
–cgroup-parent string 配置容器的父 cgroup 信息
–cluster-advertise string 集群广播网络地址
–cluster-store string 集群存储支持
–cluster-store-opt map 集群存储参数配置
–config-file string 后台引擎参数配置文件
–containerd string 容器引擎实例网络套接字路径
–cpu-rt-period int 限制 CPU 间隔频率(微秒级别)
–cpu-rt-runtime int 限制 CPU 运行时频率(微秒级别)
–data-root string 容器引擎数据根目录地址
-D, –debug 调试信息
–default-gateway ip 容器默认 IPv4 网络网关
–default-gateway-v6 ip 容器默认 IPv6 网络网关
–default-runtime string 容器运行时,默认 runc
–default-ulimit ulimit 配置容器默认最大文件限制数,改善运行性能
–disable-legacy-registry 废弃老版本镜像仓库
–dns list DNS 服务地址
–dns-opt list DNS 服务参数
–dns-search list DNS服务查询域名配置
–exec-opt list 运行时执行参数
–exec-root string 运行时执行根目录地址
–experimental 启用实验性特性
–fixed-cidr string 固定 IPv4 网段
–fixed-cidr-v6 string 固定 IPv6 网段
-G, –group string 网络套接字所属组
–help 帮助信息
-H, –host list 后台进程连接地址
–icc 启用容器间的网络互联,默认启用
–init 在容器运行时启动一个 init 程序,来统一管理进程
–init-path string docker init 的路径地址
–insecure-registry list 非安全镜像仓库地址列表
–ip ip 默认容器绑定 IP 地址,默认 0.0.0.0
–ip-forward 启动 net.ipv4.ip_forward
–ip-masq 启动IP混淆
–iptables 启动默认的iptable规则
–ipv6 启动 IPv6 网络
–label list 配置键值对参数到引擎后台
–live-restore 启用容器热迁移特性
–log-driver string 日志驱动配置,默认 json-file
-l, –log-level string 日志级别
–log-opt map 日志驱动参数
–max-concurrent-downloads int 每次 pull 的最大下载线程数
–max-concurrent-uploads int 每次 push 最大上传线程数
–metrics-addr string 监控地址
–mtu int 网络数据包 MTU 配置
–no-new-privileges 去掉 no*new*privs 权限
–oom-score-adjust int OOM 阈值配置
-p, –pidfile string 引擎后台进程文件地址
–raw-logs 无 ANSI 颜色的日志
–registry-mirror list 镜像仓库同步镜像地址
–seccomp-profile string seccomp 文件地址
–selinux-enabled 启用 selinux
–shutdown-timeout int 默认停机超时时间,默认15 秒
-s, –storage-driver string 容器存储驱动
–storage-opt list 容器存储驱动参数
–swarm-default-advertise-addr string swarm 集群广播地址
–tls 使用 TLS 认证
–tlscacert string CA 文件地址
–tlscert string TLS 认证文件地址
–tlskey string TLS 私钥地址
–tlsverify 使用 TLS 认证
–userland-proxy 使用用户态 proxy 来路由 loopback 流量
–userland-proxy-path string 用户态 proxy 地址
–userns-remap string 用户命令空间的用户、用户组配置
-v, –version 版本

Ubuntu离线安装nvidia-container-runtime

  • 下载libnvidia-container 安装包(在Ubuntu下是deb文件)

  • 下载nvidia-container-toolkitnvidia-container-runtime

  • 配置/etc/docker/daemon.json

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "runtimes": {
    "nvidia": {
    "path": "nvidia-container-runtime",
    "runtimeArgs": []
    }
    }
    }
    • 一般nvidia-container-runtime路径在/usr/bin/nvidia-container-runtime

      1
      2
      3
      4
      # ls -al  /usr/bin/ | grep nvidia-container-runtime
      -rwxr-xr-x 1 root root 4079040 9月 6 2022 nvidia-container-runtime
      -rwxr-xr-x 1 root root 2142088 9月 6 2022 nvidia-container-runtime-hook
      lrwxrwxrwx 1 root root 38 12月 15 2022 nvidia-container-toolkit -> /usr/bin/nvidia-container-runtime-hook

在线安装(APT)

  • Configure the production repository:

    1
    2
    3
    4
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  • Update the packages list from the repository:

    1
    sudo apt-get update
  • Install the NVIDIA Container Toolkit packages:

    1
    sudo apt-get install -y nvidia-container-toolkit

Ubuntu 18.04离线安装Docker

  • 下载deb

    1
    2
    3
    4
    5
    6
    7
    8
    -rwx------  1 holelin  staff    26M  1 23 09:46 containerd.io_1.6.9-1_amd64.deb
    -rwx------ 1 holelin staff 25M 1 23 09:46 docker-buildx-plugin_0.10.5-1~ubuntu.18.04~bionic_amd64.deb
    -rwx------ 1 holelin staff 13M 1 23 09:46 docker-ce-cli_24.0.2-1~ubuntu.18.04~bionic_amd64.deb
    -rwx------ 1 holelin staff 8.6M 1 23 09:46 docker-ce-rootless-extras_24.0.2-1~ubuntu.18.04~bionic_amd64.deb
    -rwx------ 1 holelin staff 22M 1 23 09:46 docker-ce_24.0.2-1~ubuntu.18.04~bionic_amd64.deb
    -rwx------ 1 holelin staff 10M 1 23 09:46 docker-compose-plugin_2.18.1-1~ubuntu.18.04~bionic_amd64.deb
    -rwx------ 1 holelin staff 3.5M 1 23 09:46 docker-scan-plugin_0.23.0~ubuntu-bionic_amd64.deb
    -rwx------ 1 holelin staff 42K 1 23 10:03 libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
  • 先安装libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb,然后安装containerd.io_1.6.9-1_amd64.deb,最后安装docker*.deb

    1
    2
    3
    dpkg -i libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
    dpkg -i containerd.io_1.6.9-1_amd64.deb
    dpkg -i docker*
  • 验证

    1
    2
    3
    systemctl status docker

    docker info