一、了解Docker
1.1 什么是 Docker
-
是一种轻量级的“虚拟机”
-
在Linux容器里运行应用的开源工具
如果要方便的创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间地点可获取这些资源,这正是 Docker 所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
1.2 Docker使用场景
-
打包应用程序简化部署
-
可脱离底层硬件任意迁移
1.3 Docker的优势
-
Docker 容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;
-
Docker 更加节省的硬件资源提供给用户更多的计算资源;
-
Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个 Docker 容器成为可能;
-
Docker 操作方便,可以通过 Dockerfile 配置文件支持灵活的自动化创建和部署。
1.4 Docker 容器技术与传统虚拟机的特性的区别
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
1.5 Docker的核心概念
-
镜像
一个面向Docker容器引擎的制度模板
-
容器
从镜像创建的运行实例
-
仓库
集中保存镜像的地方
1.6 Docker安装方式
-
方式一:yum安装:
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum -y install docker-ce docker-ce-cli containerd.io # 启动服务 systemctl start docker systemctl enable docker
-
方式二:curl获取官方安装脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 启动服务 systemctl start docker systemctl enable docker
1.7 Docker镜像
-
应用发布的标准格式
-
支撑一个Docker容器的运行
-
镜像的创建来源
-
基于本地模板创建,通过共有仓库或私有仓库,导入操作系统模板文件可以生成镜像
-
基于已有镜像创建,通过已有服务来打包镜像。基于现有镜像创建主要使用 docker commit 命令,即把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像
-
基于dockerfile创建,通过dockerfile来定制化生成镜像。Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。
-
-
镜像的分层
-
Dockerfile中的每个指令都会创建一个新的镜像层
-
镜像层将被缓存和复用
-
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
-
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
-
镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
-
二、Docker容器常用命令
-
搜索镜像
# 语法:docker search [搜索的镜像名] docker search nginx
-
下载镜像
# 语法:docker pull [镜像名:标签] 不加标签默认是 latest 最新的 docker pull nginx
-
查看本地已有镜像
# 语法一: docker images # 语法二: docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 镜像名称 标签 镜像ID 创建时间 镜像大小
-
上传镜像
# 语法:docker push [镜像文件]
-
查看镜像详细信息
# 语法:docker inspect [镜像ID]或者[镜像名:标签] docker inspect ad4c705f24d3 docker inspect nginx:latest
-
更改镜像名字(镜像ID不变)
# 语法:docker tag [原镜像名:原标签]或[镜像ID] [新镜像名:新标签] docker tag nginx:lateste nginx:kgc
-
删除镜像
# 语法:docker rmi [源镜像名:源标签]或[镜像ID] docker rmi nginx:kgc
-
镜像导出
# 语法:docker save -o [导出的镜像文件名] [需要导出的镜像:标签] docker save -o nginx_latest.tar nginx:latest
-
镜像导入
# 语法一:docker load -i [导出的镜像文件] # 语法二:docker load < docker load -i nginx_latest.tar docker load < nginx_latest.tar
-
创建容器
# 语法:docker create -it [选择的镜像:标签] [执行环境] -i 让容器的输入保持打开 -t 让 Docker 分配一个伪终端 --name 指定容器名 docker create -it nginx:latest /bin/bash
-
查看容器(仅启动的容器)
# 语法:docker ps docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器ID 镜像 执行环境 创建时长 启动时长 端口 容器名称
-
查看容器(全部,含未启动的容器)
# 语法:docker ps -a docker ps -a
-
启动容器
# 语法:docker start [容器ID]或者[容器名称] docker start fcdba5ac9ebc
-
关闭容器
# 语法:docker stop [容器ID]或者[容器名称] docker stop compassionate_rosalind
-
删除容器
# 语法:docker rm [容器ID]或者[容器名称] docker rm fcdba5ac9ebc
-
同步创建和启动容器
# 语法:docker run -dit --name [容器名称] [-P] [-p 宿主机端口:容器服务端口] [选择的镜像:标签] [执行环境] ## 当选择的镜像不存在时会先下载镜像 --name 指定容器名 -d 守护进程,后台保持进程 -p 自定义端口映射 -P 随机分配端口 -i 让容器的输入保持打开 -t 让 Docker 分配一个伪终端 docker run -dit --name nginx -p 8080:80 nginx:latest /bin/bash
-
登入容器
# 语法:docker exec -it [容器名]或者[容器ID] [bash] docker exec -it nginx bash
-
shell中执行容器内操作
# 语法:docker exec -it [容器名]或者[容器ID] [执行动作] docker exec -it nginx ls /root
-
将容器生成为镜像
# 语法:docler commit [容器名称]或[容器ID] [生成的镜像名:标签] docker commit kc20_nginx nginx:v1
-
容器内创建目录
# 语法:docker run -dit -v [创建文件目录路径名称] --name [容器名称] [选择的镜像:标签] [执行环境] -v 表示文件目录(一个-v表示一个目录,每加一个目录都需要前面加一个-v) docker run -dit -v /data/ --name nginx_v1 nginx:latest
-
将本地目录与容器目录进行挂载(仅在创建容器时执行)
# 语法:docker run -dit -v [本地文件目录路径]:[容器中的目录路径] --name [容器名称] [选择的镜像:标签] [执行环境] docker run -dit -v /data:/var/log/nginx --name nginx_v1 nginx:latest
-
容器共享(仅在创建容器时执行)
# 语法:docker run -dit --volume-from [共享容器的名字] --name [新容器名称] [选择的镜像:标签][执行环境] ## 创建容器kgc,并共享web容器 docker run -dit -v /data1 -v /data2 --name web nginx:latest docker run -it --volumes-from web --name kgc nginx:latest /bin/bash
-
将本地文件复制上传到容器中
# 语法:docker cp [上传本地文件路径] [容器名称]:[上传到容器内的位置路径]
-
将容器内的文件下载到本地
# 语法:docker cp [容器名称]:[容器内文件路径] [下载到本地位置路径]
三、操作练习
1、下载centos:7.6.1810镜像
docker pull centos:7.6.1810
2、给这个镜像修改名字叫centos7:kgc
docker tag centos:7.6.1810 centos7:kgc
3、基于centos7:kgc启动一个名字叫nginx的容器
docker run -dit --name nginx centos7:kgc
4、进入这个nginx容器,在里面安装nginx服务
# 启动容器 docker exec -it nginx bash # 升级 yum -y update # 安装yum工具 yum -y install yum-utils # 配置nginx的yum源 vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key yum -y install nginx # 启动nginx nginx
5、把这个nginx容器提交为镜像,名字叫nginx:v1、基于nginx:v1镜像启动容器并把宿主机的/data目录挂载到容器的日志目录
# 将容器导出为镜像 docker commit nginx nginx:v1 # 基于nginx:v1镜像启动容器并把宿主机的/data目录挂载到容器的日志目录 docker run -dit -v /data:/var/log/nginx -p 9090:80 --name nginx_server nginx:v1 /bin/bash curl 172.16.10.10:9090 ll /data