目录
docker原理
docker基础概念
docker镜像
构建镜像
Dockerfile
docker四种基础网络
docker原理
docker :容器技术,其原理基于Linux内核的namespace和Cgroup,实现资源的隔离,访问的控制。
docker架构图:
namespace(名称空间):其作用为实现访问隔离,将内核的全局资源进行封装,这样每一个namspace都具有独立的资源,因此不同的进程在各自的namespace当中运行不会互相的干扰。linux内核提供了6类namespace实现访问隔离:
- UTS(主机和域名)
- network(网络
- user(用户)
- IPC(进程间通信)
- PID(进程号)
- Mount(文件系统挂载点)
Croup:实现各类资源的控制与分配,其功能由各类的Cgroup子系统实现:
- CPU子系统:限制CPU的占比
- CPUacct子系统:统计各类Cgroup 对CPU的使用情况
- memory子系统:限制所能使用的内存上限
- device子系统:控制进程对设备的访问
- bilio子系统:限制进程对block I/O的带宽
- cpuset子系统:为一组进程指定CPU和内存节点
容器=namesapce+Cgroup+rootfs+docker_engine
docker基础概念
- docker镜像:创建容器的基础
- docker仓库:镜像的管理与存储
- docker容器:基于镜像运行应用服务
docker采用的是C/S架构,docker客户端与docker-deamon,docker-deamon 与docker-regsitry之间通信采用的是HTTPS/HTTP。默认条件下docker采用的方式https协议。
docker hub:https://hub.docker.com:官方提供个社区用户的镜像仓库,用户注册账号,可以管理自己制作的镜像,dockerhub主要的功能是提供各类镜像的个社区的用户。当然用户也可以自己搭建自己的镜像仓库,harbor为最受欢迎的开源私有镜像仓库,后面的docker-registry当中会详细介绍。
安装与配置docker:
测试系统为centos7,内核版本为:3.10.0-957.el7.x86_64
yum仓库提供的docker的版本为: 1.13.1,
1,移除centos7 所带的docker以及其组件
yum remove docker*
2,安装不同版本的docke-ce,这里不选择最新版的docker,选择的版本的是:19.03.4
#添加清华大学的docker-ce的yum源,使用yum直接安装
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
#清除yum缓存
yum cleanall
#生成仓库信息
yum repolist
#查看提供的docker-ce的版本信息
yum info docker-ce
#显示信息如下:
[root@localhost yum.repos.d]# yum info docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: hk.mirrors.thegigabit.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Available Packages
Name : docker-ce
Arch : x86_64
Epoch : 3
Version : 19.03.4
Release : 3.el7
Size : 24 M
Repo : docker-ce-stable/x86_64
Summary : The open-source application container engine
URL : https://www.docker.com
License : ASL 2.0
Description : Docker is a product for you to build, ship and run any application as a
: lightweight container.
:
: Docker containers are both hardware-agnostic and platform-agnostic. This means
: they can run anywhere, from your laptop to the largest cloud compute instance and
: everything in between - and they don't require you to use a particular
: language, framework or packaging system. That makes them great building blocks
: for deploying and scaling web apps, databases, and backend services without
: depending on a particular stack or provider.
#通过yum源直接安装docker-ce
yum install docker-ce
3,dockerhub服务器器位于美国,访问速度慢,不过国内很多服务商提供了免费的加速,比如,网易,阿里。
配置加速:
配置文件:/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
几个常用的docker命令,后面经常会用到这里介绍一下用法:
#从镜像仓库当中拉去镜像
docker pull REGISTRY/IMAGE_NAME:TAG
#上传镜像至镜像仓库
docker push REGISTRY/IMAGE_NAME:TAG
#在dockerhub当中查找镜像
docker search IMAGES
#基于镜像运行为容器
docker run [OPTIONS] REGISTRY/IMAGE_NAME:TAG
#options:
-i/--interactive:交互式,及时没有连接都保持STDIN状态,使用时通常与-i参数一起使用
-t:启动一个为终端,使用时通常与-t参数一起使用
--name:指定容器的名称
docker镜像
docke镜像原理:
1,union filesystem(联合文件系统):是指不同的文件系统统一组织,统一挂载,其外部表现则为一个文件系统,docker image采用了这种方式实现。docker文件系统为overlay2,文件系统分层构建,统一挂载。
2,COW(写时复制),镜像构建完成之后在没有使用时,不会占用系统任何的资源,只有当使用镜像时才会对其分配系统资源。与linux
fork创建进程相似,通过父进程创建子进程,初始化时系统化不会分配多余的资源给子进程,子进程与父进程公用系统资源,当子进程进行作业时,才会分配器自己的资源。
底层为系统内核,与联合文件系统,往上为各个应用的分层只读构建,最外层为可写,重新构建镜像只需在操作最外层可写层。当然这样的缺点是多次重复的构建会导致镜像的体积变大,运行效率低下。
3,镜像表示方式:
remote_dockerhub.com/namespace/registry/image_name:tag
- remote_dockerhub.com:是指远程docker仓库的域名,这里也可以是ip:port
- namespace :用户空间
- registry:仓库名称
- image_name:镜像名称
- tag:镜像的版本
实践:
#从dockerhub当中查询nginx基础镜像
docker search nginx
#部分结果显示
[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12189 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con?? 1687 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of?? 745 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS?? 81
bitnami/nginx Bitnami nginx Docker Image 72 [OK]
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp?? 59 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co?? 31 [OK]
构建镜像
构建镜像的方式分为:镜像通过已存在容器构建,通过dockerfile构建镜像
1,通过已有容器构建镜像,
#运行一个容器
docker run --name nginx_web -it -p 8080:80 nginx
#保存为镜像文件
docker commit -m "nginx_test" -a "zhang" nginx_web learn_test/nginx_test:v0.0.1
#显示结果:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
learn_test/nginx_test v0.0.1 476f3e86d175 16 seconds ago 126MB
nginx latest 540a289bab6c 3 weeks ago 126MB
tomcat latest 882487b8be1d 3 weeks ago 507MB
nginx latest 5a9061639d0a 4 weeks ago 126MB
httpd latest 66a97eeec7b8 4 weeks ago 154MB
busybox latest 19485c79a9bb 2 months ago 1.22MB
registry latest f32a97de94e1 8 months ago 25.8MB
lorel/docker-stress-ng latest 1ae56ccafe55 3 years ago 8.1MB
#使用docker login 登录dockerhub,可以将本镜像推送到docker hub 当中
docker login -u user_name
#推送:
docker push learn_test/nginx_test:v0.0.1
2,使用Dockerfile制作镜像:Dockerfile可分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,Dockerfile规定除注释信息之外的第一个指令必须是FROM指定基础进项镜像信息
Dockerfile
- FROM:指定构建镜像的基础镜像
FROM <IMAGE>
#FROM nginx
- LABLE:一般用户指定作者有限
LABEL key="value"
#LABEL miantainer="liu@163.com"
- ADD:复制指定目录的文件到容器当中的指定目录,文件是tar压缩文件时,会自动解压,同时支持URL,但是URL是tar压缩的文件时,不会解压
ADD <src> <dest>
#ADD /home/test.tar /usr/local/src/
#ADD https://downloads.mariadb.org/interstitial/mariadb-5.5.66/source/mariadb-5.5.66.tar.gz /home/test/mariadb/
COPY:复制文件到容器的指定目录,与ADD不同的是,不支持tar压缩文件的自动解压
COPY <src> <dest>
#COPY /home/test /usr/local/src/
- TAG:ARG指令定义了用户可以在编译时或者运行时传递的变量,如使用如下命令:
--build-arg <varname>=<value>,也就是Dockfile的环境变量,
ARG <name>[=<default value>]
#ARG nginx_version=1.1.14
- ENV:.ENV指令是在dockerfile里面设置环境变量,不能在编译时或运行时传递。可以理解为容器的环境变量。
ENV <key>=<value>
#ENV NGINX_WEB_PATH=/data/web/
- RUN:在容器当中运行指令。
RUN <command>
RUN ["executable", "param1", "param2"] (exec form)
#run运行有两种格式,一种格式run <command> 采用的是shell运行的方式,默认是/bin/sh -c 运行命令
第二种格式是以docker exec 的方式运行。
RUN yum install vim -y \
yum install mariadb
RUN ["yum","install","vim","-y"]
- CMD :容器的默认执行体,以entrypiont相似,但是主要的区别在默认上面,当容器没有entrypoint的时候,那么执行的就是CMD,当然docker run 指定的entrypoint时,那么CMD会被指定的entrypoint覆盖。指定的就是指定的让entrypoint
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD
命令。如果指定了多条命令,只有最后一条会被执行。
- ENTRYPOINT:容器启动之后真正的执行体
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行
ENTRYPOINT :每一个dockfile当中只有一条会执行,当存在多条时,只会执行最后一条
- EXPOSE:指定容器暴露给系统的端口,但是这个端口信息在容器运行之前和系统之间是不存在端口映射的关系,只有在容器运行时使用-p或-P指定端口才会有端口映射。
EXPOSE <port>
- VOLUM :指定容器的挂载卷目录
VOLUM <path>
- WORKDIR:指定指定工作的目录,RUN ,CMD等指令当中可以进行调用
WORKDIR /path/
- ONBUILD:指定当前Dockfile构建的镜像为基础镜像,ONBUILD在此镜像的基础之上再次经常操作,当用此镜像作为基础镜像构建镜像时,ONBUILD相当在构建镜像的Dockerfile后加入了额外的指令。
ONBUILD <command>
一个实例:
#nginx_test
FORM nginx
LABEL maintainer="zhang <**163.com>"
ARG nginx_test_version=0.0.1
ENV NGINX_WEB_DIR=/data/nginx/web_test/
RUN yum install epel-release && \
bash nginx.sh && \
yum install vim -y
EXPOSE 80
CMD ["/bin/sbin/nginx”,"-g","deamon off"]
nginx.sh
#!/bin/bash
echo "www.lili.com 192.168.10.10" >> /etc/hosts
echo > /etc/nginx/conf.d/test.conf< <EOF
server{
server_name www.lili.com;
listen 80;
index test.html
root $(NGINX_WEB_DIR)
}
EOF
docker四种基础网络
docker默认的情况下容器与容器之间进行通信是采用bridge,当然除此之外,docker还支持none,host,container,overlay等通通信模型。其原理是基于kernel的network space进行网络空间的隔离,虚拟网络设备实现容器与容器,容器与主机之间的通信。以及跨主机的通行。
- bridge:桥接,这是容器与容器间通信默认采用的方式,通过虚拟的网桥docker0实现容器与容器之间的通行。网络模型如:下:
容器的IP与主机的IP属于不同网段,容器与主机之间进行通信需要通过防火墙进行路由转发,而主机上容器与容器之间进行通信,则需要通过docker0 这个虚拟网桥。veth*表示虚拟的网络物理接口。
- host:容器与主机共用主机共享网络设备eth0,主机与容器处于同一网段,这样就没有netwo namespace的网络隔离作用,容器也没有自己的网络协议栈。
none:主机与容器之间,容器与容器之间没有任何的通信,容器的网络完全与外界隔离
container:容器通信使用的是其他容器的network namespace。容器与容器之间不存在网络隔离,当时容器与主机之间却处于不同网段,他们之间的网络又相互隔离。
docker 原生的的网络解决方案还overlay。第三方的网络解决方案如:flannel等