Docker入门与应用实战
一.Docker的概述
等同于Linux系统上的虚拟机
Docker:
- 仅包含应用和应用支撑环境
- 应用直接运行于宿主机的内核
- 大小MB级别,秒级启动
传统虚拟机(如Windows系统上的VMware虚拟机):
- 包含虚拟硬件+完整操作系统
- 再运行应用和应用支撑环境
- 应用运行于虚拟出来的操作系统上
- 大小GB级别,启动一个OS的时间
二.Docker的仓库,镜像,和容器
仓库:是一个集中存储和分发镜像的服务站。
Docker容器分为公有仓库(官方维护地址:https://hub.docker.com/)和私有仓库(一般通过公司局域网建立,存放从公有仓库下载并改进的镜像)
镜像:用于创建Docker容器的模板,可理解为应用的安装包或者面向对象程序设计中的类。
容器:可理解为安装后的应用或者类的实例
一个Docker Registry中可以包含多个仓库;每个仓库可以包含多个标签;每个标签对应一个镜像
registry.aliyuncs.com/some namespace/hello-word:latest
镜像中心域名(公有仓库的下载地) 命名中心(镜像分类) 名称(镜像名称) 版本
三.Docker的安装(centOS)
1.CE版本:免费社区版;分为Edge版本(每个月发布)和Stable版本(每个季度发行)
2.EE版本:收费企业版;Stable版本(每个季度发行,从17.03开始)
安装Docker:
- Docker CE版本支持64位版本CentOS7,使用官方的安装脚本安装 命令:curl -fsSL https://get.docker.com/ | sh
- 备选安装方式:yum -y install docker (Docker软件包和依赖包在默认的CentOS-Extras软件源中,版本较老)
启动Docker服务:
- 命令:systemctl start docker
- 开机自启动命令:systemctl enable docker
- 取消开机自启动:systemctl disable docker
查看验证Docker的安装和启动状态:docker version
- Client
- Server
四.Doceker的用户管理
默认时,docker命令会使用Unix socket与Docker引擎通讯;而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket;其他用户在操作docker命令时会受到权限限制
解决方案一:用root登录(不安全)
解决方案二:将普通用户(要使用docker命令的用户)添加docker用户组(推荐)
1、sudo : 可以让普通用户临时获得root用户的权限,来新建docker用户组
2、普通用户并没有使用sudo的权限
3、先要让root用户把普通用户加入到sudoers的授权文件中
4、sudoers的文件居然是只读的,先解决这个问题
5、用root用户的权限给sudoers文件赋予写权限:chmod u+w /etc/sudoers
6、在sudoers文件中,添加:普通用户名 ALL=(ALL) ALL
7、现在普通用户就可以使用sudo的命令了。
添加docker用户组:sudo groupadd docker
向docker用户组中添加用户:sudo usermod -G docker 普通用户名
8、重新登录linux,以后普通用户操作docker的命令将不再需要添加sudo的命令了
五.镜像的操作
- 镜像加速:Docker获取镜像时,默认使用Docker Hub拉去镜像,国内访问会相对困难。可以更改配置文件去访问国内的镜像站点。
- 添加:/etc/docker/daemon.json文件
- 文件内容:{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
} - 重启服务:systemctl daemon-reload(重新加载daemon文件) systemctl restart docker(重启docker)
- 查找镜像命令:docker search 镜像
- 拉取(下载)镜像命令:docker pull 镜像名(:版本号)
- 列出本机下载的所有镜像:docker images
六.容器的操作
容器运行分两种
(1)交互式运行(通过it参数分配的伪终端,会进入到容器内部)
docker run -it webdevops/php-apache-dev /bin/bash
exit退出容器
(2)守护式运行(在后台运行)
docker run -d webdevops/php-apache-dev
- 运行容器:docker run 镜像名
- 查看容器运行状态:docker ps -a(Up/Exited代表正在运行/停止的容器)
- 重启容器:docker container start 容器ID
docker container restart 容器ID(将一个运行态的容器终止,然后再重新启动它) - 进入已运行的容器内部:docker exec -it 容器ID前四位 /bin/bash
- 删除已停止的容器:docker container rm 容器ID
七.Docker的帮助
命令:docker command --help
八.Doceker的实践案例
- 测试镜像是否已安装成功(Docker的hello-world项目):docker run hello-world
- 如何寻找容器(服务器)的发布目录(站点配置):一般在etc目录下cd进入下载软件,查看conf配置文件,寻找DocumentRoot路径
- 容器端口映射和目录挂载(目录映射和数据卷)
命令:docker run -d -p 8082:80 -v /home/51testing/webtest:/app webdevops/php-apache-dev
· -p 8082:80 将主机中的8082端口映射到容器中的80端口
· -v /home/51testing/webtest:/app
将主机中的/home/51testing/webtest和容器中的/app(发布目录)做对接,实现数据共享(容器中的目录必须为空,否则主机目录中的内容将覆盖容器的目录
数据卷:是一个可供一个或者多个容器容器使用的特色目录
特性:1.可以在容器之间共享和重用;2.对数据卷的修改会立马生效;3.对数据卷的更新,不会影响到镜像;4.被设计用于持久化数据的,它的生命周期独立于容器
创建数据卷:docker volume create 数据卷名
查看数据卷:docker volume inspect 数据卷名 (此命令可以查看到数据卷映射到宿主机的目录)
查看所有的数据卷:docker volume ls
删除数据卷:docker volume rm 数据卷
清理无主的数据卷:docker volume prune
挂载数据卷:docker run -d -p 8083:80 --mount source=lampvol,target=/var/www/html --name mylamp nickistre/centos-lamp
--mount source=myvol 指定要挂载的数据卷是哪一个
,target=/var/www/html 要把数据卷挂到容器的发布目录下
--name 给容器起一个好记忆的名字
容器互联(将多个不同的容器放在同一个网络内)
创建:docker network create 自定义网络名
查看:docker network inspect 自定义网络
互联:docker run -it --network=自定义网络名 镜像名
例子:docker run -it --network=mynet --name box1 busybox sh
--network=mynet 将新建的容器加入到mynet的网络中
—————————————————————————————————————————————————————————————————————————————————
最终目的:使用docker进行服务器的部署