Dockers概念和安装
为什么使用容器?
1.上线流程繁琐
开发->测试->申请资源->审批->部署->测试等环节
2.资源利用率低
普遍服务器利用率低,造成过多浪费
3.扩容/缩容不及时
业务高峰期扩容流程繁琐,上线不及时
4.服务器环境臃肿
服务器越来越臃肿,对维护,迁移带来困难
5.环境不一致
容器与虚拟化的区别
Container | VM | |
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右损耗 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级 | 系统级(更彻底) |
操作系统 | 主要支持linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统 |
容器:
1.容器提供一个基本的独立环境,实现容器隔离,资源限制
2.主要解决应用层面问题,应用快速部署,高效管理
虚拟机:
1.提高服务器资源利用率
2.提供一个完全隔离的环境
Docker是什么
- 使用最广泛的开源容器引擎
- 一种操作系统级的虚拟化技术
- 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
- 一个简单的应用程序打包工具
Docker应用场景
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品
Docker基本组成
Dockers安装
# 安装前建议关团selinux和firewalld
安装依赖包
yum install -y yum-utils
添加Docker软件包源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker CE
yum install -y docker-ce
启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
https://docs.docker.com/engine/install/centos
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置镜像加速器:
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
}
systemctl restart docker #重启docker服务
Docker镜像管理
镜像是什么?
- 一个分层存储的文件,不是一个单一的文件
- 一个软件的环境
- 一个镜像可以创建N个容器
- 一种标准化的交付
- 一个不包含Linux内核而又精简的Linux操作系统
常用管理命令
命令格式:
docker image [COMMAND]
指令 | 描述 |
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到镜像库 |
rm | 移除一个或多个镜像 |
prune | 移除没有被标记或者没有被任何容器引用的镜像 |
tag | 创建一个引用源镜像标记目标镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
命令格式:
docker container [COMMAND]
选项 | 描述 |
exec | 在运行容器中执行命令 |
commit | 创建一个新镜像来自一个容器 |
cp | 拷贝文件或文件夹到一个容器 |
logs | 获取一个容器日志 |
ports | 列出或指定容器端口映射 |
stats | 显示容器资源使用统计 |
stop/start/restart | 停止/启动/重新启动一个或多个容器 |
rm | 删除一个或多个容器 |
docker ps
-a 查看所有容器,包含退出
-q 列出所有的容器ID
删除所有容器
docker rm -f $(docker ps -qa)
创建容器常用选项
命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
选项 | 描述 |
-i, –interactive | 交互式 |
-t,–tty | 分配一个伪终端 |
-d,–detach | 运行容器到后台 |
-e,–env | 设置环境变量 |
-p,–publish list | 发布容器端口到主机 |
-P,–publish-all | 发布容器所有EXPOSE的端口到宿主机随机端口 |
–name | 指定容器名称 |
-h,–hostname | 设置容器主机名 |
–ip | 指定容器IP,只能用于自定义网络 |
–network | 连接容器到一个网络 |
-v,–volume list–mount mount(新方式) | 将文件系统附加到容器 |
–restart | 容器退出时重启策略,默认no,可选值:[ always | on-failure ] |
-m,–memory | 容器可以使用的最大内存量 |
–memory-swap | 允许交换磁盘的内存量 |
–memory-swappiness | 容器使用swap分区交换的百分比(0-100,默认为-1) |
–oom-kill-disable | 禁用OOM Killer |
–cpus | 可以使用的CPU数量 |
–cpuset-cpus | 限制容器使用特定的CPU核心,如(-3,0,1) |
–cpu-shares | CPU共享(相对权重) |
Dokcer容器管理
容器数据持久化
Docker提供2种方式将数据从宿主机挂载到容器中:
- volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。
- bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
volumes示例:
1、创建数据卷
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
2、使用数据卷
docker run -d --name=nginx-test --mount src=nginxvol:/usr/share/nginx/html nginx
bind mounts示例:
1、挂载宿主机目录到容器
docker run -d --name=nginx-test --mount type=bind,src=/app/wwroot,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -V /app/wwwroot:/usr/share/nginx/html nginx
容器网络
- veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出。 用于解决网络命名空间之间隔离。
- docker0:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
Dockerfile构建镜像
Dockerfile概述
Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。
Dockerfile常用指令
指令 | 描述 |
FROM | 构建新镜像是基于哪个镜像 |
LABEL | 标签 |
RUN | 构建镜像时运行的Shell命令 |
COPY | 拷贝文件或目录到镜像中 |
ADD | 解压压缩包并拷贝 |
ENV | 设置环境变量 |
USER | 为RUN,CMD和ENTRYPOINT执行命令指定运行用户 |
EXPOSE | 声明容器运行的服务端口 |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录 |
CMD | 运行容器时默认执行,如果有多个CMD指令,最后一个生效 |
例:nginx
FROM centos:7
RUN yum -y install epel-release &&\
yum -y install nginx
CMD ["nginx","-g","daemon off;"]
构建镜像
docker build
-t,--tag list #镜像名称
-f,--file string #指定Dockerfile文件位置
构建Nginx镜像
FROM centos:7
LABEL maintainer www.ctnrs.com
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel\
iproute net-tools telnet wget curl &&\
yum clean all &&\
rm -rf /var/cache/yum/*
ADD nginx-1.15.5.targz/
RUN cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http ssl module \
--with-http stub status module &&\
make -j4 && make install &&
mkdir /usr/local/nginx/conf/vhost &&
cd/&& rm -rfnginx*&&\
In -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ['nginx". "-g"."daemon off;"]
构建Tomcat镜像
FROM centos:7
MAINTAINER www.ctnrs.com
ENV VERSION=8.5.43
RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all &&\
rm -rf /var/cache/yum/*
ADD apache-tomcat-${VERSlON}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
sed -i'1a JAVA OPTS="-Djava.security.egd=file:/dev/./urandom"'usr/local/tomcat/bin/catalina.sh &&\
ln -sf/usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
Harbor镜像仓库搭建与使用
Harbor概述
Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
Github:https://github.com/goharbor/harbor
Harbor部署
先决条件
服务器硬件配置:
- 最低要求:CPU2核/内存4G/硬盘40GB
- 推荐:CPU4核/内存8G/硬盘160GB
软件:
- Docker CE 17.06版本+
- Docker Compose 1.18版本+
Harbor安装有2种方式:
- 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
- 离线安装:安装包包含部署的相关镜像,因此安装包比较大
Harbor部署
1、先安装Docker和Docker Compose
https://github.com/docker/compose/releases
2、部署Harbor HTTP
tar -zxvf harbor-offline-installer-v2.0.0.tgz
cd harbor
cp harboryml.tmpl harbor.yml
vi harbor.yml
hostname: #本机的fqdn
https: #先注释https相关配置
harbor admin password: admin
./prepare
./install.sh
3.配置http镜像仓库可信任
vi /etc/docker/daemon.json
{
"insecure-registries":["本机的fqdn或IP"]
}
systemctl restart docker
基本使用
打标签
docker tag centos:7 reg.ctnrs.com/library/centos:7
上传
docker push reg.ctnrs.com/library/centos:7
下载
docker pull reg.ctnrs.com/library/centos:7