docker的安装配置
环境配置
Centos7.6-centos7.94Gib/4vCPU配置主机名: [root@xianchaomaster1 ~]# hostnamectl set-hostname xianchaomaster1 && bash 关闭防火墙 [root@xianchaomaster1 ~]# systemctl stop firewalld && systemctl disable firewalld 关闭 iptables 防火墙 [root@xianchaomaster1 ~]# yum install iptables-services -y #安装 iptables 禁用 iptables root@xianchaomaster1 ~]# service iptables stop && systemctl disable iptables 清空防火墙规则 [root@xianchaomaster1~]# iptables -F关闭 selinux [root@xianchaomaster1 ~]# setenforce 0 [root@xianchaomaster1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 注意:修改 selinux 配置文件之后,重启机器,selinux 才能永久生效 [root@xianchaomaster1 ~]# getenforce 显示 Disabled 表示 selinux 关闭成功#配置时间同步 [root@xianchaomaster1 ~]# yum install -y ntp ntpdate [root@xianchaomaster1 ~]# ntpdate cn.pool.ntp.org #编写计划任务 [root@xianchaomaster1 ~]# crontab -e * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org 重启 crond 服务使配置生效: [root@xianchaomaster1 ~]# systemctl restart crond安装基础软件包 [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 的配置基本上不会有明显效果。