docker的安装配置

环境配置

  1. Centos7.6-centos7.9
  2. 4Gib/4vCPU
  3. 配置主机名:
  4. [root@xianchaomaster1 ~]# hostnamectl set-hostname xianchaomaster1 && bash
  5. 关闭防火墙
  6. [root@xianchaomaster1 ~]# systemctl stop firewalld && systemctl disable firewalld
  7. 关闭 iptables 防火墙
  8. [root@xianchaomaster1 ~]# yum install iptables-services -y #安装 iptables
  9. 禁用 iptables
  10. root@xianchaomaster1 ~]# service iptables stop && systemctl disable iptables
  11. 清空防火墙规则
  12. [root@xianchaomaster1~]# iptables -F
  13. 关闭 selinux
  14. [root@xianchaomaster1 ~]# setenforce 0
  15. [root@xianchaomaster1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  16. 注意:修改 selinux 配置文件之后,重启机器,selinux 才能永久生效
  17. [root@xianchaomaster1 ~]# getenforce
  18. 显示 Disabled 表示 selinux 关闭成功
  19. #配置时间同步
  20. [root@xianchaomaster1 ~]# yum install -y ntp ntpdate
  21. [root@xianchaomaster1 ~]# ntpdate cn.pool.ntp.org
  22. #编写计划任务
  23. [root@xianchaomaster1 ~]# crontab -e
  24. * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
  25. 重启 crond 服务使配置生效:
  26. [root@xianchaomaster1 ~]# systemctl restart crond
  27. 安装基础软件包
  28. [root@xianchaomaster1 ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack

安装 docker-ce

安装 docker 依赖包 
[root@xianchaomaster1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

配置 docker-ce 国内 yum 源(阿里云) 
[root@xianchaomaster1 ~]# yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

列出docker所有版本
yum list docker-ce --showduplicates | sort -r

安装 docker-ce 
[root@xianchaomaster1 ~]# yum install docker-ce -y

#启动 docker 服务 
[root@xianchaomaster1 ~]# systemctl start docker && systemctl enable docker 
[root@xianchaomaster1 ~]# systemctl status docker

#查看 Docker 版本信息 
[root@xianchaomaster1 ~]# docker version

开启包转发功能和修改内核参数

内核参数修改:br_netfilter 模块用于将桥接流量转发至 iptables 链,br_netfilter 内核参数需要开
启转发。 
[root@xianchaomaster1 ~]# modprobe br_netfilter 
[root@xianchaomaster1 ~]# cat > /etc/sysctl.d/docker.conf <<EOF 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1 
EOF

#使参数生效 
[root@xianchaomaster1 ~]# sysctl -p /etc/sysctl.d/docker.conf

重启后模块失效,下面是开机自动加载模块的脚本 在/etc/新建 rc.sysinit 文件 
cat > /etc/rc.sysinit << EOF
#!/bin/bash 
for file in /etc/sysconfig/modules/*.modules ; do 
[ -x $file ] && $file 
done
EOF

在/etc/sysconfig/modules/目录下新建文件如下 
cat /etc/sysconfig/modules/br_netfilter.modules 
modprobe br_netfilter

增加权限 
[root@xianchaomaster1 ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

重启机器模块也会自动加载 
[root@localhost ~]# lsmod |grep br_netfilter

docker安装报错修改

注: 
Docker 安装后出现:WARNING: bridge-nf-call-iptables is disabled 的解决办法: 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1: 将 Linux 系统作为路由或者 VPN 服务就必须要开启 IP 转发功能。当 linux 主机有多个网卡时一个网卡收
到的信息是否能够传递给其他的网卡 ,如果设置成 1 的话 可以进行数据包转发,可以实现 VxLAN 等功
能。不开启会导致 docker 部署应用无法访问。
#重启 docker 
[root@xianchaomaster1 ~]# systemctl restart docker

配置 docker 镜像加速器
登陆阿里云镜像仓库 
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 
如果没有开通,可开通阿里云的镜像服务
找到镜像加速器,然后按照箭头方向操作 
修改/etc/docker/daemon.json,变成如下
{ 
"registry-mirrors":["https://y8y6vosv.mirror.aliyuncs.com","https://registry.dockercn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hubmirror.c.163.com"]
}

让配置文件生效 
sudo systemctl daemon-reload 
sudo systemctl restart docker

docker命令解析

#从 dockerhub 查找镜像 
[root@xianchaomaster1 ~]# docker search centos
解释说明: 
NAME: 镜像仓库源的名称 
DESCRIPTION: 镜像的描述 
OFFICIAL: 是否 docker 官方发布 
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。 
AUTOMATED: 自动构建。

#下载镜像 
[root@xianchaomaster1 ~]# docker pull centos
#查看本地镜像 
[root@xianchaomaster1 ~]# docker images
#把镜像做成离线压缩包 
[root@xianchaomaster1 ~]# docker save -o centos.tar.gz centos 
#解压离线镜像包 
[root@xianchaomaster1 ~]# docker load -i centos.tar.gz 
#删除镜像 
[root@xianchaomaster1 ~]# docker rmi -f centos:latest

容器相关操作
以交互式方式启动并进入容器 
[root@xianchaomaster1 ~]# docker run --name=hello -it centos /bin/bash 
[root@09c4933b5cd7 /]# 
输入 exit,退出容器,退出之后容器也会停止,不会再前台运行 

#docker run 运行并创建容器 
--name 容器的名字 
-i 交互式 
-t 分配伪终端 
centos: 启动 docker 需要的镜像 
/bin/bash 说明你的 shell 类型为 bash,bash shell 是最常用的一种 shell, 是大多数 Linux 发行版默认的 shell。 此外还有 C shell 等其它 shell。

以守护进程方式启动容器 
[root@xianchaomaster1 ~]# docker run --name=hello1 -td centos 
[root@xianchaomaster1 ~]# docker ps |grep hello1 
1a2b73ba0ac2 centos "/bin/bash" hello1 -d 
在后台运行 docker 
[root@xianchaomaster1 ~]# docker exec -it hello1 /bin/bash


docker ps #查看正在运行的容器 

docker ps -a #查看所有容器,包括运行和退出的容器

 停止容器 
docker stop hello1 
启动已经停止的容器 
docker start hello1 
进入容器 
docker exec -it hello1 /bin/bash 
#删除容器 
docker rm -f hello1 
#查看 docker 帮助命令
docker --help

dockerfile

(1)FROM 
基础镜像,必须是可以下载下来的,定制的镜像都是基于 FROM 的镜像,这里的 centos 就是定制需要的
基础镜像。后续的操作都是基于 centos 镜像。 

(2)MAINTAINER 
指定镜像的作者信息

(3)RUN:指定在当前镜像构建过程中要运行的命令 
包含两种模式
    1、Shell
    RUN <command> (shell 模式,这个是最常用的,需要记住) 
    RUN echo hello

    2、exec 模式
    RUN [“executable”,“param1”,“param2”](exec 模式) 
    RUN [“/bin/bash”,”-c”,”echo hello”] 
    等价于/bin/bash -c echo hello

(4)EXPOSE 指令
仅仅只是声明端口。 
作用: 
1、帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。 
2、在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。 
3、可以是一个或者多个端口,也可以指定多个 EXPOSE 
格式:EXPOSE <端口 1> [<端口 2>...]

(5)CMD 
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同: 1、CMD 在 docker run 时运行。 2、RUN 是在 docker build 构建镜像时运行的 
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被
docker run 命令行参数中指定要运行的程序所覆盖。

(6)ENTERYPOINT 
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被
当作参数送给 ENTRYPOINT 指令指定的程序。 
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 entrypoint 指令指定的程序。 
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

(7)COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

(8)ADD 
ADD <src>...<dest> 
ADD [“<src>”...“<dest>”]
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下: 
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,
会自动复制并解压到 <目标路径>。 
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像
构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

(9)VOLUME 
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 
作用:
1、避免重要的数据,因容器重启而丢失,这是非常致命的。 
2、避免容器不断变大。

(10)WORKDIR 
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作
目录,必须是提前创建好的)。 
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才
会一直存在。 
格式: 
WORKDIR <工作目录路径>

(11 )ENV 
设置环境变量 
ENV <key> <value> 
ENV <key>=<value>...

(12)USER 
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已
经存在)。 
格式: 
USER <用户名>[:<用户组>]

(13)ONBUILD 
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜
像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM 
test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 
ONBUILD 指定的命令。

为镜像添加触发器 
当一个镜像被其他镜像作为基础镜像时需要写上 OBNBUILD 
会在构建时插入触发器指令

(14)LABEL 
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="xianchao

(15)HEALTHCHECK 
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法

(16)ARG 
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就
是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

容器网络模式
docker run 创建 docker 容器时,可以用--net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:
bridge 模式:使--net =bridge 指定,默认设置; 
host 模式:使--net =host 指定; 
none 模式:使--net =none 指定; 
container 模式:使用--net =container:NAME orID 指定。

none 模式 
Docker 网络 none 模式是指创建的容器没有网络地址,只有 lo 网卡

container 模式 
Docker 网络 container 模式是指,创建新容器的时候,通过--net container 参数,指定其和已经存在的某个容器共享一个 Network Namespac,两个容器的进程通过 lo 网卡设备通信.

bridge 模式
默认选择 bridge 的情况下,容器启动后会通过 DHCP 获取一个地址

host 模式 
Docker 网络 host 模式是指共享宿主机的网络

docker 资源配额
指定 docker 容器可以使用的 cpu 份额 #查看配置份额的帮助命令: 
[root@xianchaomaster1 ~]# docker run --help | grep cpu-shares 
cpu 配额参数:-c, --cpu-shares int
cgroups 只在多个容器同时争抢同一个 cpu 资源时,cpu 配额才会生效。因此,无法单纯根据某个容器的 cpu 份额来确定有多少 cpu 资源分配给它,资源分配结果取决于同时运行的其他容器的 cpu 分配和容器中进程运行情况。
通过-c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。通过 cpu share 可以设置容器使用 CPU 的优先级。


CPU core 核心控制 
参数:--cpuset 可以绑定 CPU 
对多核 CPU 的服务器,docker 还可以控制容器运行限定使用哪些 cpu 内核和内存节点,即使用--cpuset-cpus 和--cpuset-mems 参数。对具有 NUMA 拓扑(具有多 CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则--cpuset-mems 的配置基本上不会有明显效果。