在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在
上手快:
下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
与传统的虚拟机相比,Docker又是体现为启动速度快、占用体积小。
使用上的区别如下图:
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
添加一个文件、打开一个窗口。也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
所以Docker容器就是:一个镜像格式,一个执行环境。
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。
和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。
Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
由于我服务器环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。
1 sudo yum update
1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1 sudo yum install docker-ce
1 docker -v
1 vim /etc/docker/daemon.json
1 { 2 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 3 }
systemctl
1 systemctl start docker
1 systemctl stop docker
1 systemctl restart docker
1 systemctl status docker
1 systemctl enable docker
1 docker info
1 docker --help
1 docker images
结果列名 | 说明 |
---|---|
REPOSITORY | 镜像名称 |
TAG | 镜像标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像的创建日期(不是获取该镜像的日期) |
SIZE | 镜像大小 |
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索。
1 docker search 镜像名称
结果列名 | 说明 |
---|---|
NAME | 仓库名称 |
DESCRIOTION | 镜像描述 |
STARS | 用户评价,反应一个镜像的受欢迎程度 |
OFFCIAL | 是否官方 |
AUTOMATED | 自动构建,表示该镜像由Docker Hub自动构建流程创建的 |
拉取镜像就是从中央仓库中下载镜像到本地。
1 docker pull 镜像名称
例如,我要下载centos7镜像
1 docker pull centos:7
按镜像ID删除镜像。
1 docker rmi 镜像ID
删除所有镜像。
1 docker rmi `docker images -q`
查看正在运行的容器。
1 docker ps
查看所有容器。
1 docker ps –a
查看最后一次运行的容器。
1 docker ps –l
查看停止的容器
1 docker ps -f status=exited
1 docker run
创建容器常用的参数说明。
参数 | 说明 |
---|---|
-i | 表示运行容器 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 |
--name | 表示给创建的容器命名 |
-v | 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 |
-d | 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器) |
-p | 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 |
1 docker run -it --name=容器名称 镜像名称:标签 /bin/bash
退出当前容器。
1 exit
1 docker run -di --name=容器名称 镜像名称:标签
登录守护式容器。
1 docker exec -it 容器名称 (或者容器ID) /bin/bash
1 docker stop 容器名称或者容器ID
启动容器。
1 docker start 容器名称或者容器ID
1 docker cp 需要拷贝的文件或目录 容器名称:容器目录
将容器内的文件拷贝到宿主机。
1 docker cp 容器名称:容器目录 需要拷贝的文件或目录
创建容器时,添加-v参数,后边为宿主机目录:容器目录。
例如:
1 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数--privileged=true来解决挂载的目录没有权限的问题。
1 docker inspect 容器名称或容器ID
也可以直接执行下面的命令直接输出IP地址。
1 docker inspect --format=‘{{.NetworkSettings.IPAddress}}‘ 容器名称或容器ID
1 docker rm 容器名称或容器ID
1 docker pull mysql:5.7
1 # docker run -di --name=容器名字 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密码 容器名称 2 docker run -di --name=mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
远程登录mysql:连接宿主机的IP ,指定端口为3306。
1 docker pull tomcat:7-jre7
1 # 创建tomcat容器,并挂载了webapps目录 2 # -p表示地址映射 -v 表示目录挂载 3 docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
1 docker pull nginx
1 docker run -di --name=mynginx -p 80:80 nginx
1 docker pull redis
1 docker run -di --name=myredis -p 6379:6379 redis
其中涉及到的命令有:
1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
如:
1 [root@a ~]# docker ps 2 CONTAINER ID IMAGE 3 5d9b684c8c64 nginx:latest 4 [root@a ~]# docker commit 5d9b684c8c64 my-nginx-image 5 sha256:32a0031127bc12826c0bc8e4292b8a38b98c5ab0158fd0189d59dbc27dadceec 6 [root@a ~]# docker images 7 REPOSITORY TAG IMAGE ID CREATED SIZE 8 my-nginx-image latest 32a0031127bc 4 seconds ago 133MB
1 docker save [OPTIONS] IMAGE [IMAGE...] -o, --output string Write to a file, instead of STDOUT
如:
1 [root@a ~]# docker save -o my-nginx-image.tar my-nginx-image:latest 2 [root@a ~]# ll 3 总用量 133708 4 -rw-------. 1 root root 136857088 9月 15 11:13 my-nginx-image.tar
1 docker load [OPTIONS] -i, --input string Read from tar archive file, instead of STDIN
如:
1 docker load -i my-nginx-image-3.tar
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
1 mkdir –p /usr/local/docker-jdk
1 vim /usr/local/docker-jdk/Dockerfile
1 # 指定来源镜像 2 FROM centos:7 3 ? 4 # 指定镜像作者姓名 5 MAINTAINER tankang 6 ? 7 # 指定工作目录:容器工作时相对路径的基准 8 WORKDIR /usr 9 ? 10 # 创建镜像时执行指令创建/usr/local/java目录 11 RUN mkdir /usr/local/java 12 ? 13 # 将压缩文件添加到镜像中,是相对路径jar,会自动解压 14 ADD jdk-8u121-linux-x64.tar.gz /usr/local/java 15 ? 16 # 设置Java环境变量 17 ENV JAVA_HOME=/usr/local/java/jdk1.8.0_121 18 ENV PATH=$JAVA_HOME:$PATH
1 # 格式 2 docker build [OPTIONS] PATH | URL | - 3 # 例如 4 docker build -t=‘jdk1.8‘ . 5 # -t后面指定的是镜像的名字,当然也可以在后面用冒号附加tag。最后的点表示宿主机中的当前目录,让构建程序在当前目录下找到Dockerfile。
1 docker images
1 docker pull registry
1 docker run -di --name=registry -p 5000:5000 registry
1 vim /etc/docker/daemon.json
1 {"insecure-registries":["宿主机IP:5000"]}
1 systemctl restart docker
1 docker tag jdk1.8 宿主机IP:5000/jdk1.8
1 docker start registry
1 docker push 宿主机IP:5000/jdk1.8
大多数情况下,都是某台服务器部署了私有镜像仓库之后,到其它服务器上从私有仓库中拉取镜像,若要拉取私有仓库镜像需要去修改docker的配置文件,设置启动时候的仓库地址。
1 # 打开配置文件 2 vi /usr/lib/systemd/system/docker.service 3 # 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址 4 --add-registry=宿主机IP:5000 --insecure-registry=宿主机IP:5000 5 # 修改完后需要重新加载docker配置文件并重启docker 6 systemctl daemon-reload 7 systemctl restart docker
配置完成之后,需要重启docker服务,重启后就可以从私有仓库拉取镜像。
原文:https://www.cnblogs.com/tankang/p/13674744.html