Docker
什么是docker
- docker是基于go语言实现的开源容器项目,开源代码:https://github.com/docker
- Build, Ship and Run any app ,Anywhere . 通过对应用的封装、分发、部署、运行生命周期管理,达到应用组件级别的"一次封装,到处运行"
- docker容器,可简单理解为一种轻量级的沙盒。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络相互通信。
核心概念
- 镜像 类似虚拟机镜像(一个只读的模版),比如 一个镜像可以包含一个基本的操作系统环境,里边安装了Apache应用程序,可以把它称之为一个Apache镜像
- 容器 Docker利用容器来运行和隔离应用。容器是从镜像穿件的应用运行实例。可以把容器看作为一个简易版的linux系统环境以及运行在其中的应用程序打包成的盒子
- 仓库 类似与代码仓库,是docker集中存放镜像文件的场所
安装docker
-
mac中安装docker比较简单
brew cask install docker
查看版本:docker --version
-
启动一个nginx容器,检查能正确获取镜像并运行
docker run -d -p 80:80 --name webserver nginx
docker ps 可以查看状态
浏览器 localhost:80 看一看到访问nginx成功的界面
使用docker镜像
docker运行容器前需要本地存在对应的镜像,如果镜像不存在,docker会尝试先从默认镜像库下载,用户也可以配置自定义的镜像库,和maven方式很相似
-
获取镜像 docker[image] pull 命令直接获取 通常一个镜像描述为 “名称+标签(版本)”,例如docker pull ubuntu:18.04 如果不显示制定TAG会默认选择最新标签
-
查看镜像 docker images 或docker image ls 命令可以列出本地主机上已经有镜像的基本信息
-
使用tag命令添加镜像标签
docker tag ubuntu:lastest myubuntu:latest
-
查看镜像的详细信息 docker [image] inspect
docker inspect ubuntu:18.04
-
查看镜像历史 docker history 镜像描述
-
搜索镜像 docker search [option] keyword
-
删除和清理镜像
-
使用标签删除镜像 docker rmi 或者 docker image rm
docker rmi IMAGE[IMAGE…] IMAGE可以为标签或id
同一个镜像有多个标签的时候,docker rmi 只是删除了该镜像多个标签中指定标签而已,不会影响镜像文件
-
使用镜像id删除
例如强行删除, docker rmi -f ${imageId}
通常不推荐强行删除,一般为先删除依赖镜像的所有容器,再删除镜像
-
-
清理镜像 docker image prune
- -a ,-all,删除所有无用镜像
- -filter filter 只清除符合给定过滤器的镜像
- -f 强制删除
-
创建镜像
- 基于已有的容器创建
- 基于本地模版倒入创建
- 基于Dockerfile创建
-
上传、存出和载入镜像
- 上传镜像 docker push
- 存出镜像 docker save 支持-o、-output string 导出镜像到指定文件夹中
- 载入镜像 docker load 支持-i、-input string 从指定文件中读入镜像内容
Docker容器
创建容器
-
新建容器 docker create 这条命令创建的容器处于停止状态,可用docker start命令来启动
-
启动容器 docker start 启动,docker restart 重新启动
-
创建并启动容器 docker run
使用 docker run 创建容器,后台操作:
- 检查本地是否存在指定镜像,不存在从仓库中下载
- 利用镜像创建一个容器,并启动容器
- 分配一个文件系统给容器,并在只读的镜像层外边挂载一层可读可写层
- 从宿主机配置的网桥借口中桥接一个虚拟借口到容器中
- 从网桥的地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
-
守护运行 docker run -d 使用-d参数
-
查看容器输出 docker logs
- -details 打印详细信息
- -f 持续保持输出 follow
- -since string 输出从某个时间开始的日志
- -tail string 输出最近的若干日志
- -until string 输出某个时间之前的日志
-
停止容器
- 暂停容器 docker pause
- 终止容器 docker stop
-
进入容器 使用-d 容器启动后进入后台,这时候要进入容器操作,attach或exec命令
-
删除容器 docker rm
- -f 强制删除
- -l 删除容器的连接,但保留容器 link=false
- -v 删除容器挂载的数据卷 volumes=false
-
导入导出容器
- 导入 docker import
- 导出 docker export
-
查看容器
- 查看容器详情 docker container inspect
- 查看容器内进程 docker top
- 查看统计信息 docker stats 会显示CPU、内存、存储、网络等使用的统计信息
-
复制文件
-
查看变更 docker diff
-
查看端口映射 docker port
-
更新配置 docker update
docker 仓库
-
docker 公共镜像市场 docker hub
- 登陆 docker login 注册和登陆
-
第三方镜像
- 下载镜像 docker pull
-
搭建本地私有仓库
-
使用registry镜像创建私有仓库
docker run -d -p 5000:5000 registry:2
这将自动下载并启动一个registry容器,创建本地的私有仓库服务。
默认仓库会被创建在容器的/var/lib/registry目录下,-v 参数将镜像文件存储在本地指定路径 -
管理私有仓库
-
Docker数据管理
生产环境中使用docker,需要对数据进行持久化,或者需要在多个容器之间进行数据共享,需要容器的数据管理操作
两种方式:
- 数据卷(Data Volumes) 容器内数据直接映射到本地机器环境
- 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷
数据卷容器可迁移数据(备份、恢复)
数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似与Linux中的mount行为
-
特性
- 数据卷可以在容器之间共享和重用,容器之间传递数据高效方便
- 数据卷内的数据修改会马上生效,无论是容器内部操作还是本地操作
- 对数据卷的更新不会影响镜像,解耦应用和数据
- 卷会一直存在,知道没有容器使用,可以安全的卸载
-
创建数据卷
docker volume create -d local test
-
绑定数据卷
docker run 的时候可用使用 -mount选项来使用数据卷
- -volume 普通数据卷,映射到主机/var/docker/volumes路径下
- bind 绑定数据卷,映射到指定路径下
- tmpfs 临时数据卷 只存在于内存中
数据卷容器
数据卷容器专门提供数据卷给其他容器挂载
端口映射与容器关联
实践中,经常需要多个服务组件容器共同协作,这往往需要多个容器之间能够互相访问到对方的服务,docker除了网络访问外,还有两个功能以便服务间访问
- 允许映射容器内应用的服务端口到本地宿主主机
- 互联机制实现多个容器间通过容器名来快速访问
端口映射实现容器访问
-
从外部访问容器应用
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P 或-p参数来制定端口映射。当使用-P标记时,Docker会随机映射一个49000~49900的网络端口
-
映射所有接口地址
使用HostPort:ContainerPort格式,把本地端口映射到容器端口
docker run -d -p 5000:5000 training/webapp python app.py
-
映射到指定地址的指定端口
可以使用IP:HostPort:ContainerPort格式指定映射shying一个特定地址
-
映射到指定地址的任意端口
IP:ContainerPort 绑定localhost的任意端口到容器的5000端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
-
查看映射端口配置
docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
互联机制
容器的互联是一种让多个容器中的应用进行快速交互的方式。在源和接收容器之间创建连接关系,接受容器可以通过容器名快速访问到源容器,而不用指定具体的IP和端口
-
自定义容器命名
创建容器时系统会分配一个名称,但是自定义比较好
使用–name命名
docker run -d -P --name web training/webapp python app.py
-
容器互联
使用–link参数 让容器之间安全地进行交互
docker run -d --namne db training/postgres docker run -d -P --name web --link db:db training/webapp python app.py
此时db容器和web容器建立互联关系。–link参数的格式为 --link name:alias,其中name是容器的名称,alias是别名
docker通过 两种方式为容器公开连接信息
- 更新环境变量
- 更新/etc/hosts文件
可使用env命令来查看容器的环境变量
docker 安装镜像
安装mysql镜像
https://www.runoob.com/docker/docker-install-mysql.html
docker search mysql 命令来查看可用版本
docker pull mysql:latest 获取最新镜像
docker images 查看已经安装的镜像
docker run -itd --name mysql-docker -p 127.0.0.1:9000:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker ps 命令查看是否安装成功
将容器3306端口映射到主机9000端口上
mysql连接测试:
mysql -u root -p -h127.0.0.1 -P9000