1、Docker的namespace和cgroup作用
在Linux内核层实现,对运行在同一个docker主进程的各个容器进行资源限制,使其隔离运行互不影响。包括:
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
MNT Namespace | 磁盘挂载点和文件系统的隔离 | CLONE_NEWNS | Linux2.4.19 |
IPC Namespace | 进程间通信的隔离 | CLONE_NEWIPC | Linux2.6.19 |
UTS Namespace | 主机名的隔离 | CLONE_NEWUTS | Linux2.4.19 |
PID Namespace | 进程的隔离 | CLONE_NEWPID | Linux2.4.24 |
NET Namespace | 网络的隔离 | CLONE_NEWNET | Linux2.4.29 |
USER Namespace | 用户的隔离 | CLONE_NEWUSER | Linux3.8 |
限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。此外还能对进程进行优先级设置,以及将进程挂起和恢复等操作。
2、编排工具及依赖技术总结
对运行在多个主机的多个容器进行统一管理,实现动态伸缩、故障自愈、批量执行等功能就是容器编排引擎。比如某一台主机宕机了,那么运行在该主机上的容器就会自动迁移到其他适合的主机,从而实现高可用。容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
工具 | 简介 |
---|---|
Docker Swarm | docker开发的容器编排引擎 |
Kubernets | google开发的编排引擎,同时支持docker和CoreOS |
Mesos+Marathon | 通用的集群组员调度平台,mesos(资源分配)和marathon(容器编排平台)一起提供容器编排引擎功能 |
-
容器网络
docker自带的网络仅支持管理单机上的容器网络,当多主机运行容器时需要使用第三方开源网络,如calico、flannel等。
-
服务发现
容器的动态扩容特性决定了容器IP会随时变化,因此需要一种机制可以自动识别并将用户的请求动态转发到新创建的容器上,kubernetts自带的服务发现功能需要结合kube-dns服务解析内部域名。
-
容器监控
可以使用原生命令
docker ps/top/stats
查看容器运行状态,另外也能使用heapster、Prometheus等第三方工具监控容器的运行状态。 -
数据管理
容器的动态迁移涉及到在不同主机间的迁移,可以使用逻辑卷或者存储卷来保证与容器相关的数据也能随之迁移或者随时能够访问。
-
日志收集
docker原生日志查看工具是
docker logs
,但是容器内部的日志需要通过ELK等专门日志收集分析和展示工具来处理。
3、基于dockerfile制作一个nginx镜像
-
下载镜像并初始化系统
root@docker-server:~# docker pull centos:7.6.1810 #下载镜像 root@docker-server:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7.6.1810 f1cb7c7d58b7 3 years ago 202MB root@docker-server:~# cd /opt/ root@docker-server:/opt# mkdir dockerfile/web/nginx -pv mkdir: created directory 'dockerfile' mkdir: created directory 'dockerfile/web' mkdir: created directory 'dockerfile/web/nginx' root@docker-server:/opt# cd dockerfile/web/nginx/ root@docker-server:/opt/dockerfile/web/nginx# pwd /opt/dockerfile/web/nginx
-
编写dockerfile
vim Dockerfile
FROM centos:7.6.1810 ENV NGINX_VERSION 1.22.1 RUN yum install -y epel-release vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl RUN useradd nginx -s /sbin/nologin ADD nginx-1.22.1.tar.gz /usr/local/src/ RUN cd /usr/local/src/nginx-1.22.1 && ./configure --prefix=/apps/nginx --with-http_sub_module && make && make install RUN ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"]
-
上传源码包到对应目录
root@docker-server:/opt/dockerfile/web/nginx# pwd /opt/dockerfile/web/nginx root@docker-server:/opt/dockerfile/web/nginx# ll total 1064 drwxr-xr-x 2 root root 4096 Oct 26 21:37 ./ drwxr-xr-x 3 root root 4096 Oct 26 20:27 ../ -rw-r--r-- 1 root root 455 Oct 26 21:29 Dockerfile -rw-r--r-- 1 root root 1073948 Oct 26 21:12 nginx-1.22.1.tar.gz
-
创建镜像
root@docker-server:/opt/dockerfile/web/nginx# docker build -t nginx:1.22.1
-
查看是否生成镜像
root@docker-server:/opt/dockerfile/web/nginx# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.22.1 cf94b269979a 8 minutes ago 571MB centos 7.6.1810 f1cb7c7d58b7 3 years ago 202MB
-
从镜像启动容器
root@docker-server:/opt/dockerfile/web/nginx# docker run -it -d -p 80:80 nginx:1.22.1 root@docker-server:/opt/dockerfile/web/nginx# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5af995c9404d nginx:1.22.1 "nginx -g 'daemon of…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp nice_sutherland root@docker-server:/opt/dockerfile/web/nginx# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 127.0.0.1:6011 0.0.0.0:* LISTEN 0 128 [::]:80 [::]:*
-
访问web页面
4、镜像构建总结
- 首先选择一个基础镜像,一般使用官方的镜像。
- 将一些基础的命令,不常变动的部分打包成基础镜像。
- 要注意Dockerfile里面用到的目录、文件等,宿主机是否准备妥当。比如上文用到的nginx源码包就需要提前上传到宿主机对应目录里。
- 可以使用
docker build
命令边构建镜像边进行测试。