2. Docker的安装及用法

docker 架构


1641025805989

docker 是C/S架构的软件,无论是client端还是Server端都是由 docker 一个程序提供,这个程序有很多子程序。
docker daemon 就是其中一个子程序,当运行 docker daemon 时,主机就运行成一个守护进程服务器,它可以监听在某个套接字上。为了安全,默认只提供 Unix sock 文件的套接字。


docker支持三种类型套接字:

  • ipv4 套接字

  • ipv6 套接字

  • Unix sock 套接字


    docker_hosts 是真正运行容器的主机,container:容器,images:镜像。

  • client -> docker_host 默认使用 https 协议;

  • docker_host -> registry 默认使用 https 协议。

安装 docker


docker官方提供了2个版本,一个是 docker 企业版docker-ee,另一个则是社区版 docker-ce,通常安装docker 都是指 docker-ce。

Docker 引擎具有下面 3 个更新渠道: stabletestnightly

  • Stable 渠道提供给你最新可用的稳定版本。
  • Test 渠道提供了在发布之前的预览,被用于 general availability (GA) 之前的测试。
  • Nightly 渠道在针对下一个主要发行版本的每天晚间自动构建包。

稳定版

年-月(Year-month) 的分支将会发布到 master 分支中。这个分支将会使用下面的格式 . 来创建,例如 19.03

年-月的命名由 GA 版本的最早确定的日历数据来进行确定。所有随后的特性补丁将会通过在版本号的序列来进行发布。例如,一旦 v19.03.0 版本发布后,所有的后续发布的版本将会在基于 19.03 这个分支下来发布。


测试版

在计划进行新的 year-month 的发布之前,一个分支将会从 master 分支进行创建,并被命名为 YY.mm。这个表明的是基于 Docker 里程碑的开放已经完成了。

一个预发布的测试版本的发布版本进行发布。发布的补丁和相关预发布的发布内容将会发布到发布的分支中。


晚间构建

晚间构建将会给个你一个基于下一个主要发布版本的最新构建,这个最新的构建有最新的特性和版本的修复。

0.0.0-YYYYmmddHHMMSS-abcdefabcdef

版本提交的 UTC 时间戳将会添加到发布版本的名称中,同时还会添加一个提交版本的哈希代码。如下:0.0.0-20180720214833-f61e0f7

这个构建将会允许你使用最新的 master 分支来进行测试和构建。我们不能保证所有晚间构建能够正常的工作并且符合所有的安全性要求。

本次安装全部基于 centos 7 版本进行安装。

安装docker 有三种方式:

  • yum 安装
  • rpm 软件安装
  • 二进制安装

系统环境:

#uname -a
Linux localhost.localdomain 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

#cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

yum 方式安装

curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y 

RPM 方式安装

类似于 yum 的方式,将所有 rpm 包打包在一起,通过 rpm -ivh *.rpm 进行安装。

tar xf docker-ce-18.06.tar.gz
cd docker-ce-18.06
rpm -ivh *.rpm 或者 yum localinstall *.rpm -y

二进制安装

#wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.8.tgz
#tar xf docker-20.10.8.tgz
#cp -a docker/* /usr/bin/
--- 创建 启动服务 ---
#cat << 'EOF' > /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

--- 启动服务 ---
# systemctl enable docker; systemctl start docker

镜像加速

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。

#cat << EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF

#systemctl restart docker

使用镜像

[root@localhost(192.168.1.13) ~]#docker pull nginx:alpine
alpine: Pulling from library/nginx
97518928ae5f: Downloading 
a4e156412037: Download complete 
e0bae2ade5ec: Download complete 
3f3577460f48: Download complete 
e362c27513c3: Download complete 
a2402c2da473: Download complete 
alpine: Pulling from library/nginx
97518928ae5f: Pull complete 
a4e156412037: Pull complete 
e0bae2ade5ec: Pull complete 
3f3577460f48: Pull complete 
e362c27513c3: Pull complete 
a2402c2da473: Pull complete 
Digest: sha256:12aa12ec4a8ca049537dd486044b966b0ba6cd8890c4c900ccb5e7e630e03df0
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。


docker命令的使用

docker 是基于C/S 架构的程序,这里所说的 docker 是指客户端程序。

1641027875282

docker 是 nat 桥接模式。 一个容器只是为了运行一个程序,在容器中的程序不能跑在后台,否则一启动容器就终止了,因为docker 容器仅在它的进程(pid 为 1)时运行,会保持运行状态。如果 1 号进程退出了,docker 容器也就退出了。

安装完 docker 以后执行

docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice

通过浏览器访问 http://ip:4000/ 离线学习 《docker - 从入门到实践》

docker 配置

docker 安装后,默认是没有 daemon.json 这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json

一般情况,配置文件 daemon.json中配置的项目参数,在启动参数中同样适用,有些可能不一样(具体可以查看官方文档),但需要注意的一点,配置文件中如果已经有某个配置项,则无法在启动参数中增加,会出现冲突的错误。

如果在daemon.json文件中进行配置,需要docker版本高于1.12.6(在这个版本上不生效,1.13.1以上是生效的)

daemon.json 详细配置参数如下:

{
    "authorization-plugins": [],//访问授权插件
    "data-root": "",//docker数据持久化存储的根目录
    "dns": [],//DNS服务器
    "dns-opts": [],//DNS配置选项,如端口等
    "dns-search": [],//DNS搜索域名
    "exec-opts": [],//执行选项
    "exec-root": "",//执行状态的文件的根目录
    "experimental": false,//是否开启试验性特性
    "storage-driver": "",//存储驱动器
    "storage-opts": [],//存储选项
    "labels": [],//键值对式标记docker元数据
    "live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
    "log-driver": "",//容器日志的驱动器
    "log-opts": {},//容器日志的选项
    "mtu": 0,//设置容器网络MTU(最大传输单元)
    "pidfile": "",//daemon PID文件的位置
    "cluster-store": "",//集群存储系统的URL
    "cluster-store-opts": {},//配置集群存储
    "cluster-advertise": "",//对外的地址名称
    "max-concurrent-downloads": 3,//设置每个pull进程的最大并发
    "max-concurrent-uploads": 5,//设置每个push进程的最大并发
    "default-shm-size": "64M",//设置默认共享内存的大小
    "shutdown-timeout": 15,//设置关闭的超时时限(who?)
    "debug": true,//开启调试模式
    "hosts": [],//监听地址(?)
    "log-level": "",//日志级别
    "tls": true,//开启传输层安全协议TLS
    "tlsverify": true,//开启输层安全协议并验证远程地址
    "tlscacert": "",//CA签名文件路径
    "tlscert": "",//TLS证书文件路径
    "tlskey": "",//TLS密钥文件路径
    "swarm-default-advertise-addr": "",//swarm对外地址
    "api-cors-header": "",//设置CORS(跨域资源共享-Cross-origin resource sharing)头
    "selinux-enabled": false,//开启selinux(用户、进程、应用、文件的强制访问控制)
    "userns-remap": "",//给用户命名空间设置 用户/组
    "group": "",//docker所在组
    "cgroup-parent": "",//设置所有容器的cgroup的父类(?)
    "default-ulimits": {},//设置所有容器的ulimit
    "init": false,//容器执行初始化,来转发信号或控制(reap)进程
    "init-path": "/usr/libexec/docker-init",//docker-init文件的路径
    "ipv6": false,//开启IPV6网络
    "iptables": false,//开启防火墙规则
    "ip-forward": false,//开启net.ipv4.ip_forward
    "ip-masq": false,//开启ip掩蔽(IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术)
    "userland-proxy": false,//用户空间代理
    "userland-proxy-path": "/usr/libexec/docker-proxy",//用户空间代理路径
    "ip": "0.0.0.0",//默认IP
    "bridge": "",//将容器依附(attach)到桥接网络上的桥标识
    "bip": "",//指定桥接ip
    "fixed-cidr": "",//(ipv4)子网划分,即限制ip地址分配范围,用以控制容器所属网段实现容器间(同一主机或不同主机间)的网络访问
    "fixed-cidr-v6": "",//(ipv6)子网划分
    "default-gateway": "",//默认网关
    "default-gateway-v6": "",//默认ipv6网关
    "icc": false,//容器间通信
    "raw-logs": false,//原始日志(无颜色、全时间戳)
    "allow-nondistributable-artifacts": [],//不对外分发的产品提交的registry仓库
    "registry-mirrors": [],//registry仓库镜像
    "seccomp-profile": "",//seccomp配置文件
    "insecure-registries": [],//非https的registry地址
    "no-new-privileges": false,//禁止新优先级(??)
    "default-runtime": "runc",//OCI联盟(The Open Container Initiative)默认运行时环境
    "oom-score-adjust": -500,//内存溢出被杀死的优先级(-1000~1000)
    "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//对外公布的资源节点
    "runtimes": {//运行时
        "cc-runtime": {
            "path": "/usr/bin/cc-runtime"
        },
        "custom": {
            "path": "/usr/local/bin/my-runc-replacement",
            "runtimeArgs": [
                "--debug"
            ]
        }
    }
}

常用 daemon.json 文件配置如下:

cat > /etc/docker/daemon.json << EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
  "data-root": "/data/docker"
}
EOF
posted @ 2020-11-29 17:12  hukey  阅读(216)  评论(0编辑  收藏  举报