docker介绍
容器
1.VMware 是一个重量级的虚拟化技术,Docker 则是轻量级
2.Docker 主要是伴随着微服务兴起的。
根据 wikipedia 中的介绍:
Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups ,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一 Linux 实体下运作,避免启动一个虚拟机造成的额外负担。Linux 核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户 ID 与挂载文件系统,而核心的 cgroup 提供资源隔离,包括 CPU 、存储器、block I/O 与网络。从 0.9 版本起,Dockers 在使用抽象虚拟是经由 libvirt 的 LXC 与 systemd - nspawn 提供界面的基础上,开始包括 libcontainer 库做为以自己的方式开始直接使用由 Linux 核心提供的虚拟化的设施。
依据行业分析公司“451研究”:“Dockers 是有能力打包应用程序及其虚拟容器,可以在任何 Linux 服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” 。
这里的介绍有点绕口,让我来介绍下 docker 解决了哪些痛点:
-
简化环境管理
传统的软件开发与发布环境复杂,配置繁琐,我的代码开发环境可以运行,一旦部署到服务器上就运行不了了。这个问题很常见,开发环境、测试环境、生产环境,每个环节都有可能出现这样那样的问题,如果能够在各个环境中实现一键部署,就会方便很多,例如一键安装 linux 、一键安装 mysql、一键安装 nginx 等,docker 彻底解决了这个问题。 -
虚拟化更加轻量级
传统的虚拟机都是先虚拟出一个操作系统,然后在操作系统上完成各种各样的配置,这样并不能充分的利用物理机的性能,docker 则是一种操作系统级别的虚拟技术,它运行在操作系统之上的用户空间,所有的容器都共用一个系统内核甚至公共库,容器引擎提供了进程级别的隔离,让每个容器都像运行在单独的系统之上,但是又能够共享很多底层资源。因此 docker 更为轻量、快速和易于管理。 -
程序可移植
有了前面介绍的两个特点,程序可移植就是顺理成章的事情了。
docker 核心组件
docker 中有三大核心组件:
- 镜像
镜像是一个只读的静态模版,它保存了容器需要的环境和应用的执行代码,可以将镜像看成是容器的代码,当代码运行起来之后,就成了容器,镜像和容器的关系也类似于程序和进程的关系
- 容器
容器是一个运行时环境,是镜像的一个运行状态,它是镜像执行的动态表现
- DockerHub
类似于github
,这是个镜像托管的地方,可以使用很多官方提供的镜像,
库是一个特定的用户存储镜像的目录,一个用户可以建立多个库来保存自己的镜像
docker相关技术
- 隔离性
- 可度量性
- 移植性
- 安全性
docker 安装
查看系统版本: cat /etc/redhat-release
启动Docker: service docker start
查看Docker信息: docker info
设置开机启动: chkconfig docker on
容器分类:
1.交互型容器
2.后台型容器
容器操作:
1.搜索镜像docker search mysql
index 相当于仓库名
name 镜像名
desciption 镜像的描述
stars 镜像的星(赞)
official 是否官方镜像
automated 镜像是否是自动构建的
2.查看正在运行的容器docker ps
container id 容器的ID,这是64位的唯一字符串
image 创建这个容器所依据的镜像
command 容器的启动命令
created 容器的创建时间
status 容器的状态
ports 容器的端口
names 容器的名字,唯一的,可在创建容器时进行配置,不配置也可,会有默认名字
-
查看所有容器
docker ps
可以添加一个参数 -a,表示查看所有的容器,包括正在运行和没有运行的。 -
终止容器
docker stop xxx
终止一个容器,可以重新启动,原本数据还在
docker stop 后面的参数可以是容器名,也可以是容器 id。 -
启动终止的容器
docker start xxx
-
删除容器
docker rm xxx
容器删除后,镜像还在。注意:删除后,容器上的数据会丢失
正在运行的容器无法删除,但可以通过加-f
参数强制删除,但建议还是先停止,再删除 -
查看所有容器的ID
docker ps -a -q
,可以实现容器的批量停止或批量删除
批量停止:docker stop $(docker ps -a -q)
批量删除:docker rm $(docker ps -a -q)
批量删除的另个命令:docker container prune
- 交互型容器的创建
docker run --name ubuntu -it ubuntu /bin/bash
启动一个Ubuntu
容器。
这是个交互型容器,启动完成后会占据当前窗口。可通过exit
命令退出容器,一退出,容器自动停止。
一般使用后台型容器,交互型使用的非常少
- 进入到容器内部
docker exec -it xxx /bin/bash
后台型容器不一定满足需求,所以进入到后台型容器中,去修改配置以满足需求
例如: docker exec -it nginx /bin/bash
进入到nginx容器内部
不同于交互型,即使使用exit
退出容器,容器依然在后台运行
- 资源拷贝
docker cp ./xxx.html xxx:/xxx/xxxx
将宿主机的资源拷贝到容器中
-
共享目录
docker run --name
-
查看容器信息
docker inspect xxx
详细信息包括容器的ID,容器名,环境变量,运行命令,主机丶网络丶数据卷配置等信息
使用-f format
参数可以只查看关心的数据,如:
-
共享目录
docker run --name xxx -p -d -v /usr/share/nginx/html/ nginx
表示将容器的 /usr/share/nginx/html 目录和宿主机中的某一个目录共享。
source 表示在宿主机中共享的目录,Destination 表示目标目录,即容器中共享的目录。 -
网络配置
网络可以手动指定映射,也可以不指定。直接给个-p
,表示使用宿主机中的随机端口映射到容器端口上 -
查看容器进程
docker top xxx
-
查看容器日志
docker logs
使用--tail
参数可以精确控制日志的输出行数,
-t
参数则可以显示日志的输出时间,
-f
会有其他日志持续输出
docker 的一大优势就是可移植性,容器因此 docker 容器可以随意的进行导入导出操作。
镜像操作
- 查看所有镜像
docker images
repository 镜像名称
tag 镜像版本号,latest表示最新
image id 镜像的ID,唯一标识符
created 镜像创建时间
size 镜像大小
-
拉取镜像
docker pull
如:默认情况下,当用户执行docker run –name nginx -d nginx
命令时,docker
首先会去本地查看是否有相应的nginx
镜像,
如果有,则直接根据本地的nginx
镜像创建出来容器,如果没有,则去docker hub
上面查找并下载。
如果觉得这样启动慢,可以先手动执行docker pull,docker pull
可以拉取一个镜像下来。 -
删除镜像
docker rmi xxx
删除的镜像,必须是不存在关联的容器,如果有根据 该镜像创建的容器 存在,则镜像删除失败 -
创建镜像
默认情况下,我们使用的镜像都是不同软件商官方提供的。
如果需要自己制作镜像,整体上来说,有两种方式,
一种是把容器重新定制成镜像;
一种则是使用 Dockerfile 去构建镜像,第二种是目前主流方案。
镜像的构建,必然是基于某一个根镜像
commint 创建本地镜像
-m 简单描述
--author 作者
ce1fe32739402 表示创建镜像所依据的容器ID
sang/nginx 仓库名,sang是名称空间,nginx是镜像名
v1 仓库的tag(标签)
创建完后通过docker images
可查看刚刚创建的镜像
通过 commint 方式创建本地镜像的方式,存在一些问题,比如不够透明化,无法重复,体积较大,为了解决这些问题,可以考虑使用 Dockerfile ,实际上,主流方案也是 Dockerfile。
Dockerfile
Dockerfile 就是一个普通的文本文件,其内包含了一条条的指令,每一条指令都会构建一层。先来看一个简单的例子。
首先在一个空白目录下创建一个名为 Dockerfile 的文件,内容如下
在 Dockerfile 的定义中,文件名是固定的,必须叫 Dockerfile,没有后缀。文件内的大写字母叫做指令。
FROM 表示该镜像所基于的根镜像
MAINTAINER 镜像的作者信息
RUN 表示执行Linux命令,&& 可以连接多个Linux命令,镜像的内部结构像洋葱,每执行个命令,就会在镜像上裹一层
COPY 复制,将宿主机的文件复制到容器中
Dockerfile
文件构建成功后,通过docker build -t namespace/name:tag
来构建个新对象
项目部署
1.wordpress
wordpress 的部署主要运行两个容器,一个是 mysql 另一个则是 wordpress。
docker run --name mysql1 -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker run --name wordpress -p 80:80 -e WORDPRESS_DB_HOST=192.168.230.176:33061 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123456 -d wordpress
2.jpress