安装docker


# yum remove -y docker docker-common docker-selinux docker-engine
# yum install -y yum-utils device-mapper-persistent-data lvm2
# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
# sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# yum makecache fast
# yum install docker-ce -y

Install Docker Engine on Ubuntu


Docker - 原理


  • docker 三大要素
    • cgroup
    • namespace
    • unionFS
  • CGroup
    全称是control group,用来限定一个进程的资源使用。由Linux 内核支持,可以限制和隔离Linux进程组所使用的物理资源。比如cpu、内存、磁盘、网络IO,是Linux container技术的物理基础。
  • NameSpace
    是一个资源隔离技术,主要是用来隔离进程ID,IPC,Network等系统资源
    linux 共有6种 namespace 类型:
    • IPC: IPC(信号量、消息队列、共享内存等)隔离
    • Network: 网络设备、网络栈、端口等隔离
    • Mount: 文件系统挂载点隔离
    • PID: 进程编号隔离
    • User: 用户和用户组隔离
    • UTS: 主机和域名隔离 从linux内核4.6开始提供了第7种namespace: CGroup namespace主要用于cgroup根目录隔离
  • unionFS
    unionFS 可以把文件系统上多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。解决了docker运行后的container挂载宿主机目录问题。
  • docker的网络模式
    DriverDescription
    bridgeThe default network driver.
    hostRemove network isolation between the container and the Docker host.
    noneCompletely isolate a container from the host and other containers.
    overlaySwarm Overlay networks connect multiple Docker daemons together.
    ipvlanConnect containers to external VLANs.
    macvlanContainers appear as devices on the host’s network.

https://docs.docker.com/engine/network/


docker 存储


docker system df  
root@ip-172-20-60-86:~# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          17        10        3.648GB   507.3MB (13%)
Containers      11        11        80.18MB   0B (0%)
Local Volumes   2         1         18.88GB   263.9kB (0%)
Build Cache     22        0         109.9MB   109.9MB
root@ip-172-20-60-86:~#  

安全清理无用的没有再用的 docker images


docker system prune --all --force --volumes > /dev/null

docker 启动参数


--storage-opt dm.basesize=20G # 表示限制单个容器最多占用 20G 空间,将应用于任何新建容器。
sudo dockerd --storage-opt dm.basesize=50G

ubuntu 修改OS源


sed -i 's!archive.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list
sed -i 's!security.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list
root@ip-172-20-60-86:~# docker stats --no-stream image-tools-web
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
5fd1fc573072   image-tools-web   0.00%     7.598MiB / 31.34GiB   0.02%     64.8GB / 44.1GB   4.58GB / 120GB   11
root@ip-172-20-60-86:~#

Docker event state


Docker event state

docker - cp


# docker create --name ae docker.io/anchore/enterprise:latest
# docker cp ae:/docker-compose.yaml ~/aevolume/docker-compose.yaml

docker - history


docker history nginxphp:20191205.3 --no-trunc=true

/etc/sysctl.conf 设置网络转发


# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
fs.file-max= 65535
EOF

# 生效
# sysctl --system

查看本地镜像inspect


docker inspect registry.local:5000/k8s/etcd:3.5.12-0
crictl inspecti registry.local:5000/k8s/etcd:3.5.12-0

/etc/docker/daemon.json


{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://mirror.ccs.tencentyun.com",
    "http://hub-mirror.c.163.com",
    "http://f1361db2.m.daocloud.io"
  ],
  "bip": "172.150.0.1/16",
  "default-address-pools": [
    {
      "base": "172.100.0.0/16",
      "size": 24
    },
    {
      "base": "172.120.0.0/16",
      "size": 24
    }
  ],
  "experimental": true,
  "log-driver":"json-file",
  "log-opts": {
    "max-size":"500m",
    "max-file":"3"
  },
  "data-root": "/data/docker_lib/data",
  "insecure-registries": [
    "10.0.0.10:5000",
    "registry.local:5000"
    ]
}

根据磁盘映射id,找到容器id


通过 d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383,找到容器。也可能是镜像层

[root@RJYF-Harbor-NZM-01 overlay2]# du -sh ./*  | grep G
1.8G    ./c6f249a33479f265cb56d2140e18765a8901cb2f1a8bc8b682510f472a960769
41G     ./d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383
[root@RJYF-Harbor-NZM-01 overlay2]# pwd
/var/lib/docker/overlay2
[root@RJYF-Harbor-NZM-01 overlay2]# docker ps -aq | xargs docker inspect --format '{{.Name}},{{.State.Pid}},{{.Id}},{{.GraphDriver.Data.WorkDir}}' | grep d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383

download-docker-images.sh


#!/bin/bash
set -x
date=`date +%H_%M_%S`
images="
platform-test/device-maintenance:dev-f5ced396
iot-device-maintenance/device-maintenance-front:v180-release
" 

harbor="harbor.test.com"  

tags=" "
for image in $images;do
  docker rmi $harbor/$image
  docker pull --platform=arm64 $harbor/$image
    tags="$harbor/$image $tags"
done

docker save $tags > tags_${date}.tar

Run Postgres


#!/bin/bash
docker stop sonar-db
docker rm sonar-db
docker run -d \
    --name sonar-db \
    -e POSTGRES_USER=sonar-dbuser \
    -e POSTGRES_DB=sonar \
    -e POSTGRES_PASSWORD=password \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /data/pgsql:/var/lib/postgresql/data \
    -p 5432:5432 \
    --restart always \
    registry.local:5000/postgres/postgres:10

Run MySQL


#!/bin/bash
docker stop con-db
docker rm con-db
docker run -d \
  --name con-db \
  -v /data/mysql:/var/lib/mysql \
  -p 3306:3306 \
  --restart always \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=root \
  -e MYSQL_DATABASE=con \
  registry.local:5000/mysql/mysql:5.7.30


dnsmasq 创建自定义dns server


https://hub.docker.com/r/dockurr/dnsmasq

常用命令


强制删除容器
# docker rm -f leslie

# 查看镜像ID和镜像地址
docker images --format "table {{.ID}}\t{{.Repository}}:{{.Tag}}"

# 查看镜像地址
docker images --format "table {{.Repository}}:{{.Tag}}"

# 查看容器的name和镜像地址
docker ps -a --format="{{.Names}}\t{{.Image}}"

# 查看exited状态容器
docker ps -a -f "status=exited" --format={{.Names}}

# 查看running状态容器
docker ps -a -f "status=running" --format={{.Names}}

# 给用户添加docker权限
usermod -a -G docker ec2-user

ubuntu:/etc/default/docker
centos: /etc/sysconfig/docker

# 查看正在运行容器
docker ps

# 查看所有的容器,包括正在运行和停止的。
docker ps -a

# 查看最后两个进程
docker ps -n 2

# 获取所有容器ID
docker ps -a -q

# 查看端口映射
docker ps -l

# 只查看所有docker的name
docker ps -a --format={{.Names}}

# docker inspect
# 获取容器的运行状态
docker inspect -f='{{.State.Running}}' deamon_dave

# 获取运行中容器的PID
docker inspect -f='{{.State.Pid}}' daemon_dave

# ubuntu 后面可以加多个容器标识符
docker inspect -f='{{.State.Running}}' daemon_dave

# redis 查看redis容器的IP地址
docker inspect -f='{{.NetworkSettings.IPAddress}}' redis

# docker rm
# 删除webserver这个容器。前提是这个容器处于停止状态。
docker rm webserver

# 启动
docker start webserver

# 停止
# stop 是向容器发送SIGKILL信号
docker stop webserver

# docker attach
# 只有在容器运行,并且有可用shell的时候。才可以再次附着到已经运行的容器。

docker attach ubuntu
docker attach f1694d43a1b6
 
# docker logs
# 查看容器运行日志

docker logs deamon_dave

# 类似于tail -f实时监控deamon_dave的日志。-t为每条日志加上时间戳。
docker logs -ft deamon_dave

# 获取最后10行日志
docker logs --tail 10 deamon_dave

# 从最后一行日志开始监控
docker logs --tail 0 -f deamon_dave

# docker top
# 查看容器资源占用。

docker top deamon_dave

# docker exec
# 在容器内部运行进程
docker exec -d ubuntu touch /etc/new_file
docker exec -t -i ubuntu /bin/bash

# docker rm
# 删除不在运行的容器
docker port

# 查看容器的端口映射
# 容器内部的80/tcp端口映射到宿主机的32768随机端口上了。
docker port static_web
80/tcp -> 0.0.0.0:32768

# 获取docker的pid
qikang@LeslieTest:~$ docker inspect --format "{{ .State.Pid }}" NginxWebServer
30300
qikang@LeslieTest:~$ sudo nsenter --target 30717 --mount --uts --ipc --net --pid
root@e064c3b163c5:/#

# 查看所有容器的CONTAINER ID
qikang@LeslieTest:~$ docker ps -a -q

# 查看所有容器的名字
docker ps -a --format={{.Names}}

# 删除exited状态的容器
docker rm $(docker ps -f "status=exited" --format={{.Names}})

# docker images 加速
# vim /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]}

# 镜像的导入导出
# 导出镜像
docker save php:5.6.25-apache | gzip > docker_php5.6.25_apache.tar.gz

# 导入镜像
docker load -i docker_php5.6.25_apache.tar.gz