1、Docker概述
1.1Docker为什么会出现
一款产品,开发和上线两套环境,应用环境配置费时费力,而且容易出问题,尤其对于机器学习和深度学习的库更是如此,很可能存在版本问题、底层依赖冲突问题
所以发布项目时,不只是一套代码过去,而是代码+环境整体打包过去
所谓开发即运维,保证系统稳定性,提高部署效率
使用Docker后的流程:
开发:建立模型–环境–打包带上环境,即镜像–放到Docker仓库
部署:下载Docker中的镜像,直接运行即可
Docker的思想来自于集装箱,集装箱,对环境进行隔离
Docker通过隔离机制,可以将服务器利用到极致。
1.2 Docker概念
- Docker 是一个开源的应用容器引擎
- 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离 容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
总结:docker是一种容器技术,他解决容器环境迁移问题
2、Docker安装
# 1、yum 包更新到新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
镜像加速器
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中 镜像加速器就可以看到你的专属地址了:
在/etc/docker/daemon.json,文件末尾增加如下内容
//每个人都不同,要自行申请再复制
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
3、Docker架构
3.1 基本组成
-
镜像(image):docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似Java中的Class
-
容器(container):类似Java中通过Class创建的实例,Object;容器可以理解为一个简易的系统
-
仓库(repository):存放镜像的地方,分为共有仓库和私有仓库
- Docker Hub:国外的
- 阿里云:配置镜像加速
4、Docker命令
4.1 进程相关的命令
启动docker服务:
systemctl start docker
停止docker服务:
systemctl stop docker
重启docker服务:
systemctl restart docker
查看docker服务状态:
systemctl status docker
设置开机启动docker服务:
systemctl enable docker
4.2 镜像相关命令
镜像命令包括如下内容:查看镜像、搜索镜像 、拉取镜像 、删除镜像
查看镜像:查看本地所有的镜像
docker images
docker images -q #查看所有镜像的id
搜索镜像:从网络中查找需要的镜像
docker search 镜像名称#例:查找redis镜像
docker search redis
拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是新的版本 lastest。
如果不知道镜像版本,可以去docker hub 搜索对应镜像查看
docker pull 镜像名称
docker pull redis #下载最新版本redis
docker pull redis:5.0 #下载5.0版本redis
删除镜像:删除本地镜像
docker rmi 镜像id/名称 #删除指定本地镜像
docker images -q #查看所有的镜像列表
docker rmi $(docker images -q) #删除全部镜像
4.3 容器相关命令
查看容器、创建容器、进入容器、启动容器、停止容器、删除容器、查看容器信息
查看容器
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
创建并启动容器
docker run 参数
docker run -it --name=c1 centos:7 /bin/bash #创建交互式容器
docker run -id --name=c2 centos:7 #创建守护式容器
参数说明:
- i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
- t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
- d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容 器不会关闭。
- it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
- –name:为创建的容器命名
- -p 指定容器的端口 如-p 8080::8080
-p 主机端口:容器端口
-p 容器端口 - -P 随机指定端口
进入容器
docker exec -it 容器名/容器id /bin/bash
停止容器
docker stop 容器名
启动容器
docker start 容器名
删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名/容器id
docker rm -f $(docker ps -aq) #删除所有容器
查看容器信息
docker inspect 容器名
把容器中文件拷贝到宿主机
docker cp 容器id:目录
5、Docker容器的数据卷
5.1 数据卷概念及作用
问题:Docker 容器删除后,在容器中产生的数据何去何从?
问题:Docker 容器和外部机器可以直接交换文件吗?
容器之间想要进行数据交互?
数据卷概念
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
5.2数据卷配置
创建启动容器时,使用 –v 参数 设置数据卷
docker run … –v 宿主机目录(文件):容器内目录(文件) …
注意:
- 容器目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
挂在一个容器卷
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
一个容器挂载多个数据卷
docker run -it --name=c2 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7
注:在linux中可使用 \ 使得命令行换行
两个容器挂载同一个数据卷
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
docker run -it --name=c2 -v /root/data:/root/data_container centos:7 /bin/bash
注:在一个容器中修改文件,看到另一个容器也跟着
5.3数据卷容器配置
多容器进行数据交换,多个容器挂载同一个数据卷容器,完成数据交互。即是创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。
- 创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run –it --name=c3 –v /volume centos:7 /bin/bash
注意:这里没有指定宿主机目录,默认生成一个宿主机目录
- 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
6、Docker镜像的原理
思考:
- Docker 镜像本质是什么?
- Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
- Docker中一个tomcat镜像为什么有600MB,而一个tomcat安装包只有70多MB?
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
- bootfs:包含bootloader(引导加载程序)和 kernel(内核)
- rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
- 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成
- 底端是 bootfs,并使用宿主机的bootfs
- 第二层是 root文件系统rootfs,称为base image(基础镜像)
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在顶层加载一个读写文件系统作为容器
回答问题
-
Docker 镜像本质是什么?
答:是一个分层文件系统 -
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
答:Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层 -
Docker 中一个tomcat镜像为什么有600MB,而一个tomcat安装包只有70多MB?
答:由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小600多MB