从零开始学docker(一)

  1. docker架构
  2. namespace
  3. cgroup 控制组
  4. 安装
  5. DOCKER DAEMON
  6. GC回收
  7. 配置
  8. 修改Docker默认启动参数
  9. 运行容器常用命令
  10. 格式化输出

docker架构

docker架构 , api

architecture.png


namespace

底层通过6大命名空间进行隔离

namespae 系统参数 隔离内容
UTS CLONE_NEWUTS 主机名域名
IPC CLONE_NEWIPC 进程间通信 信号量 消息队列 共享内存
PID CLONE_NEWPID 进程编号
NETWORK CLONE_NEWNET 网络
MOUNT CLONE_NEWNS 文件系统
USER CLONE_NEWUSER 用户和用户组

cgroup 控制组

cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务集合到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的结果

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
  • 任务控制:cgroup可以对任务执行挂起、恢复等操作

安装

手动安装许按照以下依赖进行
docker_install.jpg


#删除本地的docker
yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine \
           docker-engine-selinux \
           docker-selinux 

#安装yum-utils
yum install -y yum-utils
#添加下载源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

#安装指定docker版本

yum list docker-ce --showduplicates | sort -r

yum install docker-ce-19.03.9-3.el7  docker-ce-cli-19.03.9-3.el7  containerd.io docker-compose-plugin

# 开机自启/关闭自启
systemctl enable/disable docker
#启动/停止docker服务
systemctl start/stop docker
#如果daemon.json有改动记得重新加载dockerdaemon
systemctl daemon-reload
#查看docker服务状态
systemctl status docker
#添加用户到docker组
usermod -aG docker username

DOCKER DAEMON

dockerdaemon是用于监听dockerapi请求,与其他dockerdaemon交互,管理docker对象服务 docker对象包括镜像 容器 网络 存储卷等 默认配置在/etc/docker/daemon.json文件 没有可以自行创建。 dockerdaemin的默认数据存放在/var/lib/docker目录 可通过在daemon.json配置data-root属性进行修改。 重新加载daemon.json的修改 systemctl daemon-reload 配合重启docker进程一起

  • daemon.json示例
{
  ......
  //配置镜像源
  //http
  "insecure-registries":["ip:port","p:port","......"],
    //https  
  "registry-mirrors": ["http://harbor.test.com","......"],
  //非SSL源管理镜像,这里加上
  "max-concurrent-downloads": 10,
  //数据存储位置
  "data-root": "/home/data",
  //网络配置
  "bip" : "192.168.2.1/24",
  "fixed-cidr" : "10.20.0.0/16",
  "fixed-cidr-v6" : "2001:db8::/64",
  "mtu" : "1500",
  "default-getway" : "192.168.2.1",
  "default-getway-v6" : "2001:db8:abcd::89",
  "dns" : ["8.8.8.8","1.1.1.1"]
  ......
}

指定docker连接的服务器 默认本机”unix:///var/run/docker.sock”
Unix Socket 这是类unix系统进程间通讯的一种方式
指定tcp连接后可通过 docker -H xxx.xxx.xx.xxx:2375 连接到指定的docker服务端

{
    "hosts":[
              //tcp默认端口2375
              "tcp:00.00.00.00:2375",
              //tcp_tls 默认端口 2376
              "tcp_tls:00.00.00.00:2376",
              "unix:///var/run/docker.sock"]
}

 详细配置查看Daemon_Doc 可通过dockerd指令进行操作

GC回收

GC运行在构建进程,主要用于清理构建镜像的过大的缓存文件以及过期的缓存

# 清除构建镜像的缓存
$ docker builder prune
$ docker buildx prune 

配置

{
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "10GB",
      "policy": [
          {"keepStorage": "10GB", "filter": ["unused-for=2200h"]},
          {"keepStorage": "50GB", "filter": ["unused-for=3300h"]},
          {"keepStorage": "100GB", "all": true}
      ]
    }
  }
}

修改Docker默认启动参数

找到启动脚本/usr/lib/systemd/system/docker.service 添加如下配置信息以及文件


EnvironmentFile=-/etc/default/docker #添加配置文件(-代表ignore error)
#基本配置
EnvironmentFile=-/etc/sysconfig/docker
#存储
EnvironmentFile=-/etc/sysconfig/docker-storage
#网络
EnvironmentFile=-/etc/sysconfig/docker-network

ExecStart=/usr/bin/dockerd -H fd:// \
-H unix:///var/run/docker.sock \
-H tcp://172.21.114.51 \
-H tcp://127.0.0.1 \
--containerd=/run/containerd/containerd.sock \
--config-file /etc/docker/daemon.json \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
$DOCKER_OPTS

运行容器常用命令

#启动一个容器
docker container run imagename:tag
#启动一个容器 名称为 cname
docker container run  --name cname imagename:tag
#启动一个容器 名称为 cname 在容器停止后删除容器
docker container run  --rm --name cname imagename:tag
#后台启动一个容器 名称为 cname 在容器停止后删除容器
docker container run -d --rm --name cname imagename:tag
#后台启动一个容器 名称为 cname 在容器停止后删除容器 并替换掉原镜像启动的命令
docker container run -d --rm --name cname imagename:tag /bin/bash
#后台启动一个容器 名称为 cname 容器总是自动重启 
#no默认策略,在容器退出时不重启容器 
#on-failure,在容器非正常退出时(退出状态非0)
#always,在容器退出时总是重启容器
#unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
docker container run -d  --name cname  --restart always imagename:tag /bin/bash
#后台启动一个容器 名称为 cname 在容器停止后删除容器 并添加环境变量 (-e可以多次)
docker container run -d --rm --name cname  -e JAVA_HONE=/home/jdk8 -e MAVEN_HOME=/home/maven imagename:tag 
#启动一个容器 名称为 cname 在容器停止后删除容器 并替换掉原镜像启动的命令 与容器交互
docker container run -it --rm --name cname imagename:tag /bin/bash

#容器执行指定命令
docker container exec -it 容器名/容器id  命令
#停止一个容器
docker container stop 容器名/容器id
#删除一个容器
docker container rm 容器名/容器id
#重启一个容器
docker container restart 容器名/容器id
#查看容器日志
docker container logs 容器名/容器id
#查看容器暴露端口
docker container port 容器名/容器id
#查看容器进程信息
docker container top 容器名/容器id

格式化输出

  • 使list转为字符串 使用指定的字符进行连接
docker inspect --format '{{join .HostConfig.MaskedPaths ";"}}' 5eff2b7c0866
/proc/asound;/proc/acpi;/proc/kcore;/proc/keys;/proc/latency_stats;/proc/timer_list;/proc/timer_stats;/proc/sched_debug;/proc/scsi;/sys/firmware
  • 根据指定字符进行字符串的拆分
[docker@iZ8vbdl6m2aje7b2bl04soZ myweb]$ docker inspect --format '{{split .HostConfig.NetworkMode ":"}}' 5eff2b7c0866
[container 95132de6a0783684dd208328247f96194609d7ebec58465271f7b36906f786d0]
  • 表格输出
docker inspect --format 'table {{.Id}} $ {{split .HostConfig.NetworkMode ":"}}' 5eff2b7c0866
table 5eff2b7c0866749c28eeba80453fe163fdc9de6b3702084cd5b561346fdf606d $ [container 95132de6a0783684dd208328247f96194609d7ebec58465271f7b36906f786d0]
  • json 格式输出字符串
docker inspect --format '{{json .HostConfig.LogConfig }}' 5eff2b7c0866
{"Type":"json-file","Config":{}}