文章目录
- 1. Docker 简介
- 1.1 什么是虚拟化
- 1.2 什么是 Docker
- 1.3 容器与虚拟化的比较
- 1.4 Docker 组件
- 1.4.1 Docker 服务器与客户端
- 1.4.2 Docker镜像与容器
- 1.4.3 Registry(注册中心)
- 2. Docker 的安装与启动
- 2.2 设置 ustc 的镜像
- 2.3 Docker 的启动与停止
- 3. 常用命令
- 3.1 镜像相关命令
- 3.1.1 查看镜像
- 3.1.2 搜索镜像
- 3.1.3 拉取镜像
- 3.1.4 删除镜像
- 3.2 容器相关命令
- 3.2.1 查看容器
- 3.2.2 创建与启动容器
- 3.2.3 停止和启动容器
- 3.2.4 文件拷贝
- 3.2.5 目录挂载
- 3.2.6 查看容器IP地址
- 3.2.7 删除容器
- 4. 案例基于Docker的2048项目
- 5. 迁移与备份
- 5.1 容器保存为镜像
- 5.2 镜像备份
- 5.3 镜像恢复与迁移
- 6. Dockerfile
- 6.1 什么是Dockerfile
- 6.2 常用命令
- 7. Docker私有仓库
- 7.1 私有仓库搭建和配置
- 7.2 镜像上传至私有仓库
1. Docker 简介
1.1 什么是虚拟化
在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服务器、网络、内存及存储等)予以抽象、转化后呈现出来, 打破实体间不可切割的障碍,使用户可以通过更好的方式来应用这些资源。
- 在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用。
- 虚拟化的种类有很多,例如:
软件虚拟化:Vmware软件、KVM软件、VirtualBox软件等
硬件虚拟化: 磁盘阵列RAID、逻辑卷LVM、
内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等。
1.2 什么是 Docker
Docker 是一个开源的应用容器引擎, 诞生2013年,最初是 dotCloud 公司内部的一个业余项目。它基于Google公司推出的 Go 语言实现。 项目后来加入 Linux 基金会,遵从了Apache2.0协议,源代码托管在 Github 进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotcloud 公司后来都改名为 Docker Inc。Redhat 已经在 RHEL6.5 中集成对 Docker 的支持,Google 也在 PaaS 产品中广泛应用。
- Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在2018年之前是不支持在Windows系统部署Docker的。
- 在LXC的基础上Docker做了进一步的封装,让用户不需要去关心容器的管理,使操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单
Docker的优势:
- 上手快
用户只需要几分钟,就可以把自己的程序"Docker化"。Docker依赖于"写时复制"(copy-onwrite)模型,使修改应用程序也非常迅速,可以说达到"随心所欲,代码即改"的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会
exec系统调用,出于效率考虑,linux中引入了“写时复制”技术,也就是只有进程空间的
各段的内容要发生变化时,才将父进程的内容复制一份给子进程。
- 职责的逻辑分类
使用Docker,开发人员只需要关心容器中优秀的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种"开发时一切正常,肯定时运维的问题(测试环境都是正常的, 上线后出了问题就归结为肯定是运维的问题)"。 - 快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从盒子里一件一件的取)。 - 鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或者进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器。从而使分布式部署应用程序,扩展和调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,一个程序中可以运行多个应用程序)。
1.3 容器与虚拟化的比较
下面的图片比较了Docker和传统的虚拟化方式的不同之处,可见容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟化则是在硬件层面实现。
总结: 与传统的虚拟机相比,Docker的优势体现为启动速度快、占用体积小。每一个虚拟机可以拥有自己的操作系统五底层操作系统无关,而docker公用底层的操作系统。
1.4 Docker 组件
1.4.1 Docker 服务器与客户端
Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
- Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。
- 用户可以在同一台宿主机上运行Docker守护进程和客户端。
1.4.2 Docker镜像与容器
- 仓库:每个仓库存放某一类镜像。
- 镜像:类似虚拟机镜像(eg:xxx.iso)。 eg: MySQL镜像、Redis镜像、2048镜像
- 容器:类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
1.4.3 Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。
- 公有仓库 :所有人可以访问下载镜像的仓库。Docker公司运营公共的Registry叫做Docker Hub。
- 私有仓库: 规定范围内可以访使用的库。用户可以构建私有的Registry。
2. Docker 的安装与启动
如果你有一个阿里云服务器,直接 yum 安装即可
yum install docker -y
如果你在自己的虚拟机 (redhat7.4) 上安装,则需要配置 yum 源
方法一: 直接使用docker镜像源安装docker最新版本
step1:yum 包更新到最新
cd /etc/yum.repos.d/
# 阿里安装软件镜像源下载
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache # 生成缓存
yum update # yum包更新
step2:配置yum仓库安装Docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.
repo
step3:安装 Docker
yum install docker-ce -y
step4:安装后查看 Docker 版本
docker -v
方法二:官网下载软件包,自行安装
# 在下载目录下
yum install * -y
docker -v
2.2 设置 ustc 的镜像
ustc说老牌的linux镜像服务提供者,ustc的docker镜像加速器速度很快。ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务,https://lug.ustc.edu.cn/wiki/
编辑文件
vim /etc/docker/daemon.json
编辑以下内容,保存退出
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
}
2.3 Docker 的启动与停止
# 启动
systemctl start docker
# 停止
systemctl stop docker
# 重启
systemctl restart docker
# 查看Docker状态
systemctl status docker
# 开机启动Docker
systemctl enable docker
# 查看Docker概要信息
docker info
# 查看Docker帮助文档
docker --help
3. 常用命令
3.1 镜像相关命令
3.1.1 查看镜像
docker load -i game2048.tar # 从tar包载入镜像
docker pull tensorflow/tensorflow # 从镜像仓库拉取镜像
docker images # 查看镜像
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。
3.1.2 搜索镜像
如果你需要从网络中查找需要的镜像,可以通过下面命令搜索:
docker search 镜像名称
3.1.3 拉取镜像
docker pull 镜像名称
3.1.4 删除镜像
docker rmi 镜像ID
删除所有镜像(注意:``是反向单引号)
docker rmi `docker images -q`
3.2 容器相关命令
3.2.1 查看容器
docker ps
查看所有容器(无论是否运行中)
docker ps -a
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
3.2.2 创建与启动容器
创建容器常用参数说明: docker run [-options]
-
-i, --interactive
: 表示运行容器 -
-t, --tty
: 表示容器启动后进入其命令行(分配一个伪终端) -
--name
: 指定容器名称 -
-v, --volume list
: 表示一个/多个目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录) -
-d, --detach
: 创建一个守护进程在后台运行 -
-p, --publish list
: 表示一个/多个端口映射,前者是宿主机端口,后者是容器内的映射端口。
- 交互式创建容器
docker load -i ubuntu.tar # 加载 ubuntu 镜像
docker run -it --name=myubuntu ubuntu /bin/bash # 为 ubuntu 创建容器, exit退出当前容器
docker ps -a
- 守护方式创建容器
docker run -di --name=容器名称 镜像名称:标签 # 创建容器
docker exec -it 容器名称/容器ID /bin/bash # 登录守护容器交互环境的方式
3.2.3 停止和启动容器
停止容器
docker stop 容器名称(或者容器ID)
启动容器
docker start 容器名称(或者容器ID)
3.2.4 文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或者目录 容器名称:容器目录
也可以将目录从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或者目录
3.2.5 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。
# 创建容器,添加-v参数 后面为 宿主机目录: 容器目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name myubuntu1 ubuntu
docker exec -it myubuntu1 /bin/bash
root@8e80ee93f4e1:/# cd /usr/local/myhtml/
root@8e80ee93f4e1:/usr/local/myhtml# ls
test
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为Redhat7的安全模块Selinux把权限禁掉了, 我们需要添加参数--privileged=true
来解决挂载的目录没有权限的问题。
3.2.6 查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据,myubuntu1是容器的名称
docker inspect myubuntu1
也可以执行下面的命令直接输出IP地址,myubuntu1是容器的名称。
docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1
3.2.7 删除容器
删除指定的容器,如果删如果删除容器时,容器正在运行中,则先停止容器。
docker stop myubuntu1
docker rm myubuntu1
4. 案例基于Docker的2048项目
step1:从仓库拉取镜像信息
docker images
deocker search 2048
docker pull docker.io/blackiceburd/2048
step2:重启Docker容器
systemctl restart docker
step3:容器操作(云服务器下)
# 创建容器,并把容器的80端口映射到宿主机的(本地:127.0.0.1:80:80)端口
docker run -d --name game2048 -p 0.0.0.0:80:80 docker.io/blackiceburd/2048
# 查看
docker ps -a
netstat -antlpe | grep 80
执行结果:
5. 迁移与备份
5.1 容器保存为镜像
可以通过以下命令将容器保存为镜像
docker commit mysql mysql:remote_login
5.2 镜像备份
docker save -o mysqlRemoteLogin.tar mysql:remote_login
5.3 镜像恢复与迁移
docker load -i mysqlRemoteLogin.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复。
6. Dockerfile
6.1 什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境。
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。
- 对于运维人员: 在部署时,可以实现应用的无缝移植。
6.2 常用命令
命令 | 作用 |
FROM Image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
RUN command | 执行命令,是Dockerfile的核心部分(可以写多条) |
COPY source_dir/file dest_dir/file | 和ADD类似, 如果是压缩文件,不会自动解压 |
ENV key value | 设定环境变量 |
WORKDIR path_dir | 设置工作目录 |
7. Docker私有仓库
7.1 私有仓库搭建和配置
step1:拉取私有仓库镜像
docker pull registry
step2:启动私有仓库容器
docker run -di --name registry -p 5000:5000 registry
# 查看 --> 172.17.0.7 http://172.17.0.7:5000
docker inspect --format='{{.NetworkSettings.IPAddress}}' registry
step3:测试页面访问: http://172.17.0.7:5000/v2/_catalog
, 私有仓库搭建不成功内容为空,否则,返回{"repositories": []}
step4:修改daemon.json
vim /etc/docker/daemon.json
编辑以下内容,保存退出。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["172.17.0.7:5000"]
}
step5:重启docker服务
systemctl restart docker
7.2 镜像上传至私有仓库
step1:标记镜像为私有仓库的镜像
docker tag mysql:remote_login 172.17.0.7:5000/remote_login
step2:上传标记的镜像
docker push 172.17.0.7:5000/remote_login