一.docker介绍
1什么是docker
◆使用最广泛的开源容器引擎
◆一种操作系统级的虚拟化技术
◆依赖于Linux内核特性:Namespace和Cgroups
◆一个简单的应用程序打包工具
2.docker的设计
◆提供简单的应用程序打包工具
◆开发人员和运维人员职责逻辑分离
◆多发环境保持一致
3.docker的基本组成
◆Docker Client:客户端
◆Docker Daemon:守护进程
◆Docker Images:镜像
◆Dcoker Container:容器
◆Docker Registry:镜像仓库
4.容器 VS 虚拟机
Container | VM | |
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级(更彻底) |
操作系统 | 只支持Linux | 几乎所有 |
封装程序 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统 |
5.docker应用场景
◆应用程序打包和发布
◆应用程序隔离
◆持续集成
◆部署微服务
◆快速搭建测试环境
◆提供PaaS产品(平台即服务)
6.支持平台
◆Linux(centos,Debian,Oracle Linux,RHEL,SUSE和Ubuntu)
◆MAC
◆Windows
二.Linux下安装docker
1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld //设置禁止开机自启动
2.修改/etc/selinux/config
将为SELINUX=disabled //重启后生效
3.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4.设置存储库
yum install -y yum-utils
5.配置docker源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
6.安装docker
yum install -y docker-ce
7.将docker加入开机自启动
systemctl start docker
systemctl enable docker
8.通过运行hello world映像来验证Docker引擎安装是否正确。
docker run hello-world
9.查看已安装docker版本
docker -v
10.查看docker详细信息
docker info
三.docker的简单操作
1.启动一台容器并查看
docker run -it nginx
解析 :docker run 使用
-i 交互式的
-t 分配终端
-d 把容器放在后台运行
2.查看容器状态
docker ps
3.查看正在运行容器的ip
docker inspect 6901c8bf4e2a
解析:docker inspect 虚拟机ID(使用docker ps查看的CONTAINER ID 列)
4.连接docker的容器
docker exec -it 6901c8bf4e2a bash
解析:docker exec -it 虚拟机的ID bash
四.镜像的管理
镜像是什么?
◆一个分层存储的文件
◆一个软件的环境
◆一个镜像可以创建N个容器
◆一种标椎化的交付
◆一个不包含linux内核而又精简的linux操作系统
镜像不是单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>查看镜像中各层内容及大小,每层对应着dockerfile中的一条指令。docker镜像默认存储在/var/lib/docker/<strorage-driver>中。
镜像从哪里来?
Docker Hub是有Docker公司负责维护的公告注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com/search?q=&type=image
配置镜像加速器:https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
1.配置国内docker源
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。
重启docker服务
systemctl restart docker
2.拉取镜像
解析:pull拉取一个nginx镜像
docker pull nginx:1.12
解析:冒号后面加上版本号,不加默认下最新版本
3.查看docker现有镜像
docker images
查看docker分层信息
如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。
无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
Docker镜像默认存储在/var/lib/docker/overlay2中。
Docker使用存储驱动管理镜像每层内容及可读写层的容器层
docker history nginx:1.14
解析:nginx:1,12 指定查看的镜像加具体的版本信息(只能查看本地已缓存的镜像文件)
5.docker支持的驱动
五.镜像管理命令
管理镜像的常用命令
命令 | 描述 |
使用方法 | docker + image + 命令 |
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像信息 |
inspect | 显示一个或多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到镜像仓库 |
rm | 移除一个或多个镜像 |
prune | 移除未使用的镜像。没有被标记或者没有被任何容器引用的。 |
tag | 创建一个引用源镜像标记到目标镜像 |
export | 导出容器文件系统到tar归档文件 |
import | 导出容器文件系统tar归档文件创建镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
1:拉取镜像
docker image pull nginx:1.15
解析:冒号后面加上版本号,不加默认下最新版本
2:查看现有镜像
docker images
3:删除镜像
docker image rm nginx:1.14
4:镜像标签
docker image tag nginx:1.15 nginx:a12
5:保存镜像
docker save nginx:1.15 > nginx1.15.tar
6:导入镜像
docker image load < centos.tar
7:运行容器(运行的虚拟机)
docker run -itd centos
8:导出容器
docker export 容器id > centos.tar
解析:查看容器id:docker ps
9:导入容器(保存为镜像仓库)
docker import centos.tar centos:1.1
解析:centos1:1 是创建的一个镜像标签(如果没有则镜像名称显示为none)
6.容器的管理
选项 | 描述 |
-i , -interactive | 交互式 |
-t , -tty | 分配一个伪终端 |
-d, -detach | 运行容器到后台 |
-e, env | 设置环境变量 |
-p , -publish list | 发布容器端口到主机 |
-P ,-publish-all | 发布容器所有EXPOSE的端口到宿主机随机端口 |
-name string | 指定容器名称 |
-h,-hostname | 设置容器主机名 |
-ip string | 指定容器IP,只能由于自定义网络 |
-network | 连接容器到一个网络 |
-mount mount | 将文件系统附加到容器 |
-v, -volume list | 绑定挂载一个卷 |
-restart string | 容器退出重启策略,默认no,可选值;[always |
扩展创建容器命令
docker container run -d --name web -e test=123456 -p 88:80 nginx -h nginx
命令解析
--name 为容器起一个名字
-e 创建容器是指定变量
-p 将宿主机的88端口映射到容器的80端口
-h 修改容器的主机名默认名字随机
docker run -d --name web2 -P nginx
这条命令的意思是创建一个名为web2的容器,并在主机创建一个随机端口。
7.容器的资源限制
1.内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用OOM kiler:
docker run -d --name nginx01 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx
2.cpu限额:
允许容器最多使用一个半CPU:
docker run -d --name nginx02 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx03 --cpus".5" nginx
3.扩展管理容器常用命令
选项 | 描述 |
ls | 列出容器 |
inspect | 查看一个或多个容器详细信息 |
exec | 在运行容器中执行命令 |
commit | 创建一个新镜像来自一个容器 |
cp | 拷贝文件/文件夹到一个容器 |
logs | 获取一个容器日志 |
port | 列出或指定容器端口映射 |
top | 显示一个容器运行的进程 |
stats | 显示容器资源使用统计 |
stop/start | 停止/启动一个或多个容器 |
rm | 删除一个或多个容器 |
这条命令在容器外面执行ls
docker exec web6 ls /
演示commit命令
可以在操作下面命令之前,连接web6容器之后,在容器里创建文件夹。
执行过下面的命令之后,可以连接web8容器,在里面就可以看见之前在容器里创建
的文件。
docker commit web6 nginx6-1 /将容器web6变成一个新的镜像
docker run -d --name web8 nginx6-1 /使用nginx6-1镜像创建一个名为web8的容器
演示cp命令
[root@localhost ~]# docker cp centos.tar web5:/
[root@localhost ~]# docker exec -it web5 ls /
1 4 boot docker-entrypoint.d home media proc sbin tmp
2 5 centos.tar docker-entrypoint.sh lib mnt root srv usr
3 bin dev etc lib64 opt run sys var
其他命令都很简单就不演示了。
8.管理应用程序数据
1.将数据从宿主机挂载到容器的三种模式
Docker提供三种方式将数据从宿主机挂载到容器中:
◆ volumes: Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
◆ bind mounts: 将宿主机上的任意位置的文件或者目录挂载到容器中
◆ tmpf: 挂载存储在主机系统中的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
2.Volume
管理卷
1.创建一个数据卷
docker volume create nginx-vol
命令解析:docker volume create 数据卷名称
2.查看现有的数据卷
docker volume ls
3.查看数据卷的详细信息
docker volume inspect nginx-vol
用卷创建一个容器
docker run -d --name web --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
命令解析:src=使用哪个卷
dst=将
查看结果
ls /var/lib/docker/volumes/nginx-vol/_data
清理数据卷
docker stop nginx-vol 停止数据卷
docker rm nginx-vol 删除数据卷
docker volume rm nginx-vol 也是删除数据卷的一种方法
注意:
1.如果没有指定卷,自动创建
2.建议使用–mount,更通用。
扩展Bind Mounts
用卷创建一个容器,名称为nginx2,并放到后台,将宿主机的89端口映射到容器的80端口,将宿主机中的目录/文件挂载带容器中的目录。
docker run -d --name nginx02 -p 89:80 --mount type=bind,src=/mnt/,dst=/usr/share/nginx/html nginx
命令解析:src=属主机的目录或文件
dst=容器中的目录或文件
注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
Volumete特点:
◆ 多个运行容器之间共享数据。
◆ 当容器停止或被移除时,该卷依然存在。
◆ 多个容器可以同时挂载相同的卷。
◆ 当明确删除卷时,卷才会被删除。
◆ 将容器的数据存储在远程主机或其他存储上。
◆ 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts特点:
◆ 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
◆ 在Docker主机的开发环境和容器之间共享代码。列如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包
◆ 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
9.容器网络
1.网络模式
◆ bridge
-net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
◆ host
-net=host
容器不会获得一个独立的network namespace,而是与宿主机共用一个。这意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
◆ none
-net=none
获取独立的network namespace,但不为容器进行任何网络配置需要我们手动配置。
◆ container
-net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的配置信息,两个容器除了网络,其他都还是隔离的
◆ 自定义网络
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
2 .下载这个镜像用于测试
docker pull busybox 这是一个很小的镜像
3.使用busybox镜像创建一个容器
docker run -it busybox
4.使用busybox镜像创建一个容器并指定网络模式为host
docker run -it --net=host busybox --net=host指定网络模式
5.使用busybox镜像创建一个容器并指定网络模式为none
docker run -it --name shiyan --net=none busybox 指定网络模式为none
6.使用busybox镜像创建一个容器并加入其它容器的网络模式
docker run -itd --name bs -p99:80 busybox
docker run -itd --name nginx001 --net container:bs nginx 让新创建的容器加入bs的网络模式
7.使用busybox镜像创建容器并使用自定义网络模式
10.Dockerfile
1.Dockerfile格式
2.Dockerfile指令
指令 | 描述 |
FROM | 构建新镜像是基于那个镜像 |
MAINTAINER | 镜像维护者姓名或邮箱地址 |
RUN | 构建镜像时运行的shell命令 |
COPY | 拷贝文件或目录到镜像中 |
ENV | 设置环境变量 |
USER | 为RUN,CMD,和ENTRYPOINT执行命令指定用户 |
EXPOSE | 声明容器运行的服务端口 |
HEALTHCHECK | 容器中服务健康检查 |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录 |
ENTRYPOINT | 运行容器是执行,如果有多个ENTRYPOINT指令,最后一个生效 |
CMD | 运行容器是执行,如果有多个CMD指令,最后一个生效 |
3.Build镜像
Usage:docker build [OPTIONS] PATH |URL| - [flags]
Options:
-t, - -tag list #镜像名称**
-f, - - file string #指定Dockerfile位置
#docker bulid .
#docker bulid -t shykes/myapp .
#docker bulid -t shykes/myapp -f /path/Dockerfile /path
#docker bulid -t shykes/myapp http://www.example.com/Dockerfile
4.