![](https://i-blog.csdnimg.cn/blog_migrate/6200671c995e3235c6fbf228184d0cf5.png)
什么是Docker
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。
Docker的主要用途,目前有三大类:
提供一次性的环境,比如:本地测试他人的软件,持续继承的时候提供单元测试和构建的环境。
提供弹性的云服务。因为Docker容器可以随开随关,很适合动态扩容和缩容。
组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker的组成
Docker包括三个基本概念
镜像(image)
容器(Container)
仓库(Repository)
镜像
Docker把应用程序及其依赖,打包在image文件里。只有通过这个文件,才能生成Docker容器。
image文件可以看做是容器的模板,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷,环境变量,用户等。)
Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器
镜像和容器的关系就像面向对象中的类和实例一样。镜像是静态的定义。容器是镜像运行时的实体。
简单来说,容器就是独立运行的一个或者一组应用,以及他们的运行态环境,容器可以被创建,启动,停止,删除,暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,因此容器可以拥有自己的root文件系统,自己的网络配置,自己的进程空间,甚至自己的用户Id空间。
容器内的进程是运行在一个隔离的环境里。使用起来就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
一个Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式指定具体是这个软件的哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
以Ubuntu镜像为例,Ubuntu是仓库的名字,其内包含有不同版本的标签,如:16.04、18.04。我们可以通过Ubuntu:16.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如Ubuntu,那就将视为Ubuntu:latest。
版本
Docker分为CE和EE两大版本。CE即社区版(免费,支持周期7个月),EE即企业版,强调安全,付费使用,支持周期24个月。
Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7满足最低内核的要求。
卸载版本的Docker
yum remove docker \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
更新yum本地软件源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
安装Docker
yum install -y docker-ce
Docker使用中会涉及到各种端口,为了方便使用最好关闭防火墙
systemctl stop firewalld #关闭
systemctl disable firewalld #禁止开机启动防火墙
查看docker版本
docker -v
配置Docker国内镜像加速(可选)
启动Docker
systemctl start docker # 启动docker服务
systemctl stop docker #停止 docker服务
systemctl restart docker # 重启docker服务
镜像操作实例:
访问 DockerHub搜索镜像:https://hub.docker.com/ ,搜索 redis
拉取镜像:docker pull redis:5.0.14
查看本地镜像:docker images
将镜像导出到磁盘:docker save -o 文件名称 镜像名称/ID
删除本地镜像:docker rmi 镜像名称/ID
导入镜像:docker load -i 文件名称
Docker-容器
常用操作命令
docker run —- 新建并启动容器
docker start/stop/pause/unpause —- 启动/停止/暂停/恢复容器
docker exec —- 进入容器执行命令
docker logs —- 查看容器运行日志
docker ps —- 查看容器的状态 docker ps -a 查看所有容器
docker rm —- 删除指定容器
!!Nginx容器实例!!
1.拉取Nginx镜像 docker pull nginx
![](https://i-blog.csdnimg.cn/blog_migrate/c74574b97ad37c395d2378224e366e17.png)
2.创建并启动容器 docker run --name myNginx -d -p 80:80 nginx
![](https://i-blog.csdnimg.cn/blog_migrate/54639884d23dee55b69309dffac66287.png)
tip:
--name :指定容器名称
-p:将宿主机端口与容器端口映射,格式:宿主机端口:容器端口
-d:后台运行容器
!!Redis容器实例
拉取Redis镜像--->docker pull redis
创建并启动容器 docker run --name myredis -d -p 6379:6379 redis
进入容器:docker exec -it myredis bash
-it:给当前进入的容器创建一个标准输入,输出终端。允许我们与容器交互
bash:进入容器后执行的命令
进入容器后执行:redis-cli,使用redis客户端操作redis。
前戏:
一个容器运行了一段时间肯定会产生一些数据,比如:日志,数据库数据,新改的配置文件等等,如果这些数据文件存在容器中,当我们删除容器时,这些数据也会随之删除。那么怎么解决这个问题呢?
---在docker中,提供了一种存储数据的方法,叫做“数据卷”,可以达到数据共享的目的。
![](https://i-blog.csdnimg.cn/blog_migrate/03fd96ea45e986e833f0c161c5201395.png)
我们可以把“数据卷”Data Volumes理解成“宿主机中的目录”,当把某个卷和容器中的某个目录建立映射关系后。就相当于把宿主机中的某个目录和容器的某个目录建立了映射关系。
数据卷的基本概念
数据卷可以在容器之间共享和复用。容器间传递数据将变得高效与方便。
对数据卷内数据的修改会立马生效。无论是容器内操作还是本地操作。
对数据卷的更新不会影响镜像,解耦开应用和数据。
卷会一直存在,直到没有容器使用,可以安全地卸载它。
数据卷操作命令
数据卷操作的基本语法为:docker volume [command],其中command可选值:
create:创建一个volume;
inspect:显示一个或者多个volume的信息
ls:列出所有的volume
prune:删除未使用的volume
rm:删除一个或者多个指定的volume
数据卷操作实例
创建数据卷:docker volume create testA;
查看数据卷:docker volume
查看对应卷的详细信息:docker volume inspect testA
在Linux的docker主机中创建一个卷时,其在宿主机对应的目录(挂载点)路径为/var/lib/docker/volume/卷名/_data
挂载卷
在创建容器时,可以通过--volume或者-v 参数挂载一个数据卷到某个容器目录
docker run --name testAcon -v testA:/data -d redis
上述命令表示创建一个名为testAcon的容器,将testA卷映射到testAcon容器的/data目录中。
注意:如果卷映射的目录在容器中不存在时,会自动在容器中创建对应的目录
一个容器可以使用多个卷,只需要多次使用-v 选项指定即可
docker run --name testBcon -v testA:/data -v testB:/var/log -d redis
当指定的卷不存在时,docker会自动创建对应的卷,上述命令中的testB数据卷会被自动创建
绑定挂载
前面创建的数据卷都存在"/var/lib/docker/volumes"目录中,这个目录是固定的,它们都能被docker volume命令管理。
docker还有一种映射宿主机目录的方法,这种方法被称之为“绑定挂载”,绑定挂载能够将指定的宿主机目录挂载到容器中,只需要将卷名替换成宿主机上的目录路径即可。
docker run -d --name testAcon -v /root/test1:/data1 redis
上述命令将宿主机的/root/test1目录映射到容器的/data1目录中
绑定挂载不会生成任何卷,它直接将指定的宿主机目录映射到容器中,所以,docker volume 命令无法查看或管理到绑定挂载的路径。