Docker版本说明:
(1)Moby: 是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。
(2)Docker -ce : docker公司维护的开源项目,是一个基于moby项目的免费的容器产品。
(3)Docker-ee: docker公司维护的闭源产品,是docker公司的商业产品。
Docker结构:
(1)Docker镜像(Image):Docker镜像就是一个只读的模板。比如,一个镜像可以包含一个完整的centos操作系统环境,里面仅安装了apache或用户需要的其他应用程序。镜像可以用来创建Docker容器。另外Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人哪里下载一个已经做好的镜像来直接使用。
(2)Docker容器(Container):Docker利用容器来运行应用。容器是从镜像创建的运行实例,它可以被启动、开始、停止、 删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。(可写层的数据会保存到储存服务器上)
(3)Docker仓库(repository):仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈, 并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
Docker安装:
(1)首先备份 CentOS-Base.repo:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
(2)将以下内容写入/etc/yum.repos.d/CentOS-Base.repo:

https://mirrors.tuna.tsinghua.edu.cn/help/centos/
(3)更新软件包缓存:
sudo yum makecache
(4)下载docker-ce.repo:
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
(5)修改docker-ce.repo
vim docker-ce.repo
:%s%https://download.docker.com](https://download.docker.com%https://mirrors.tuna.tsinghua.edu.cn/docker-ce/https://mirrors.tuna.tsinghua.edu.cn/docker-ce/%
(6)安装:
yum -y install docker-ce
(7)定义镜像加速器:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["加速器地址"]
}
EOF
systemctl daemon-reload
systemctl restart docker
Docker常用命令:
docker version
#显示douker信息
docker info
#显示 Docker 系统信息,包括镜像和容器数
docker search
#查看仓库
docker ps
#列出使用容器
docker logs
#查看容器日志
docker login
#登录仓库(默认登录docker hub)
docker logout
#退出仓库(默认docker hub)
docker image pull [仓库名:标签]
#下载镜像(不写标签默认下载最新版本)
docker image push[仓库名:标签]
#推送镜像到仓库(如果不是docker hub要加服务器地址)
docker create
#创建容器
docker image rm
#删除镜像
docker image ls
#查看镜像
docker run
#创建容器并启动容器
docker start/stop/restar
#启动/关闭/重启容器
docker pause/unpause
#停止/回复容器
docker exec
#在运行中的容器中执行命令(-it 交互模式)
docker commit
#从运行中的容器保存成新的镜像
#-a :提交的镜像作者;
#-c :使用Dockerfile指令来创建镜像;
#-m :提交时的说明文字;
#-p :在commit时,将容器暂停。
#例子:docker commit -a ‘[作者] [作者邮箱]’ -c ‘CMD[“/bin/httpd” “-f” “-h /data/html”] ’ -p [容器名称] [仓库名/标签]
docker tag [容器名或ID号] [仓库名:标签]
#重命名
docker save [仓库名:标签] -o data.tar
#打包镜像成压缩文件
docker import data.tar [仓库名:标签]
#从归档文件中创建镜像
Docker网络设置:
docker有四种网络模式nome,bridge,host,container:
(1)Nome模式:使用--net=nome指定,该模式关闭了容器的网络功能。
(2)Host模式:使用--net=host 指定,该模式将不会虚拟自己出的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
(3)Bridge模式:使用--net=bridge 指定,默认设置,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker网桥以及Iptables nat表配置与宿主机通信。
(4)Container模式:使用--net=container:[容器名称]指定,创建容器不会创建自己的网卡,配置自己的IP,而是和一个指定容器共享IP,端口范围。
Docker端口映射:
docker run -P -it centos /bin/bash
#将容器的全部端口映射到宿主机的动态端口(-p指定的容器端口映射至宿主机一个动态端口)
docker run -p 192.168.1.1::80 -it centos /bin/bash
#将容器指定端口映射到宿主机的指定IP的动态端口
docker run -p 80:80 -it centos /bin/bash
#将指定容器端口映射到宿主机的指定端口
docker run -p 192.168.1.1:8080:80 -it centos /bin/bash
#将容器指定端口映射到宿主机指定IP的端口
自定义docker0桥的网络属性信息:
配置/etc/docker/daemon.json文件
{
“bip”: “192.168.1.1/24”, #IP段
“dns”: [“223.5.5.5”,”223.6.6.6”] #DNS服务器
“hosts”: [“tcp://0.0.0.0:2375”,”unix://var/run/docker.sock”]
#开启docker远程(让docker监听tcp的2375端口;可以用docker -H远程管理docker)
"insecure-registries": [“仓库地址:端口号(不加端口号默认80)”]
#允许HTTP通讯的仓库地址
}
Docker创建桥:
docker network creare -d [网络模式;默认bridge] --subnet “[网桥网段]” -- gateway”[网关]” [桥名称]
Docker的分层文件系统:
docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在只读层顶部添加一个读写层。
如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件版本仍然存在只是已经被读写层中该文件的副本所隐藏,此即“写时复制”机制。

描述:如果以个文件在最底层是可见的,如果在Layer1上标记为删除,最高层用户看到的Layer2的层会被隐藏,在Layer2上可以删除,但是只是标记删除,并没有真正的删除;用户只能真正删除在Layer2上自己创建的文件。
为什么我们需要volume呢?
因为对于修改删除等操作,一般效率很低,如果对I/O要求比较高的应用,如:mysql;如果容器死掉了,数据也会跟着容器丢失。
Docker volume(存储卷):
“卷”是容器上的一个或多个“目录”,与宿主机上的某个目录“关联”;类似于挂载一样,宿主机的/data/web目录与容器中 /container/data/web目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写到宿主机的目录上,绕过了容器文件系统,使得可以在宿主机和容器数据共享。在宿主机上能够被共享的目录就被称为volume。
例子:
多个容器的卷使用一个主机目录
docker run -it --name b1 -v [宿主机目录路径]:[容器目录路径] busybox
docker run -it --name b2 -v [宿主机目录路径]:[容器目录路径] busybox
#注:不指定宿主机目录路径会保存到/var/lib/docker/volumes下使用其他容器的卷
docker run --name b1 -v /docker/volumes/v1:/data busybox
docker run --name b2 --volumes-from b1 bosybox
Dockerfile:
docker build -t [仓库:标签] [dockerfile路径]
注:dockerfile能用一行写完的命令尽量用一行完成;因为每执行一句命令,容器就会多建一层;减少容器性能。命令要换行可以在最后加\实现。
例子:
RUN yum -y install httpd &&\
Yum -y install mariadb
在dockerfile常用的命令:
FROM centos:latest
#指定基础镜像,一般dockerfile的第一个命令一定是FROM,如果没有指定tag,latest将会指定为要使用的基础镜像版本
LABEL maintainer=”wl <wl@zyr.com>”
#指定镜像作者的信息
COPY [宿主机文件路径] [容器路径]
#把宿主机的文件或目录移动到容器中(文件或目录必须放在dockerfile文件同级目录或子目录)
ADD [宿主机文件路径或url] [容器路径]
#和COPY功能类似,但他可以直接远程文件(URL)移动到容器中,如果是本地的打包文件,会自动解压
WORKDIR [路径]
#切换工作路径
VOLUME [容器路径]
#创建一个容器挂载点,一般用于存储需要保持的数据
EXPOSE [端口号]/[TCP/UDP]
#容器端口映射到宿主机上的动态IP上的动态端口
ENV [变量名]=/data/tmp
#创建环境变量,在容器中也可以使用
RUN [shell命令] #例子:RUN yum install httpd
#执行shell命令;只能执行容器上有的命令;在docker build时运行
CMD [shell命令] #例子:CMD /bin/httpd -f -h /data/html
#类似于RUN指令,容器启动时默认启动命令(进程号为1),但CMD是在docker run时运行一个dockerfile可以有多个CMD但只有最后一个才生效
ENTRYPOINT [shell 命令] #例子:ENTRYPOINT /bin/httpd -f -h /data/html
#类似CMD指令,不能在docker run时直接给替代,需要使用docker --entrypoint,如果在dockerfile中有CMD和ENTRYPOINT,CMD的命令会追加到ENTRYPOINT后,当ENTRYPOINT的参数
USER [用户名]
#切换用户
SHELL [shell名称]
#指定默认shell
ARG [变量名]=nginx
#类似RUN指令,但是他是在build时使用的环境变量(build-arg)
#例子:docker build --build-arg [变量名]=”httpd”
ONBUILD [dockerfile指令]
#当别人用你做好的镜像做基础镜像时会运行该指令
Docker 私有仓库
(1)Docker-registry安装:
yum install -y docker-registry
(2) Docker-registry配置:
主配置文件:/etc/docker-distribution/registry/config.yml
注:默认开的是HTTP,5000端口
如果要HTTP通讯的话要在客户端/etc/docker/daemon.json添加如下字段:
"insecure-registries": [“仓库地址:端口号(不加端口号默认80)”]
—————————————————————————————————————————————Harbor安装:
(1)下载docker-compose:
yum install -y docker-compose
(2)下载Harbor:
wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0.tgz
(3)解压文件:
tar -xf harbor-offline-installer-v1.9.0.tgz harbor
(4) Harbor的配置文件:
/harbor/harbor.cfg
e) 安装Harbor:
sh install.sh
Docker资源管理:
对于容器如果CPU资源不足只会处理效率下降,而如果内存资源部足的话,很可能此容器会挂掉。
(1)CPU资源管理:
--cpus
#容器可以使用的CPU个数
--cpuset-cpus
#限制容器使用特定的CPU核心,如(0-3, 0,1)
(2)内存资源管理:
--m
#容器可以使用的内存大小
--oom-kill-disable
#注:如果不想容器资源消耗太大给系统杀掉可以用
例子:
docker run -m 500m --cpus 1.5 --oom-kill-disable nginx
#允许容器使用500m内存和1.5核心,并禁用OOM Killer