Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
概述
优点
- 一致的运行环境
- 更快的启动时间
- 隔离性
- 弹性伸缩,快速扩展
- 迁移方便
- 持续交付和部署
应用场景
- Web应用的自动化打包和发布
- 自动化测试和持续集成、发布
- 在服务型环境中部署和调整数据库或者其他的后台应用。
组成部分
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
| 名称 | 说明 |
|---|---|
| 镜像(images) | 镜像是用于创建Docker容器的模板,镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。 |
| 容器(Container) | 容器是独立运行的一个或者一组应用。镜像相当于类,容器相当于类的实例 |
| 客户端(Client) | 客户端通过命令行或者其他工具使用Docker API和Docker的手误进程通信 |
| 主机(Host) | 一个物理或者虚拟的机器用于执行Docker守护进程和容器 |
| 守护进程 | 是Docker服务器端进程,负责支持Docker容器的运行以及镜像的管理 |
| 仓库Docker Hub(Registry)· | 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用,用户也可以将自己本地的镜像推送到Docker仓库供其他人下载。 |
Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
安装和使用
安装
安装手册:docs.docker.com/install/lin…
yum安装gcc相关
-
CentOS7能上外网
-
检查gcc和g++是否安装好,如果没有安装好,则需要安装。
-
安装gcc和g++
- yum -y install gcc
- yum -y install gcc-c++
-
安装需要的软件包
-
yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置阿里云服务器作为仓库
yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
-
更新yum软件包索引
yum makecache fast
-
安装DOCKER CE(社区版)(DOCKER EE企业版收费)
yum -y install docker-ce
-
启动docker
-
手动启动:systemctl start docker
-
自动启动:systemctl enable docker
-
配置镜像加速CentOS7版本
mkdir -p /etc/docker
vim /etc/docker/daemon.json
-
· 阿里云(推荐)
{ "registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"] }
-
如何卸载
- systemctl stop docker
- yum -y remove docker-ce
- rm -rf /var/lib/docker
命令
| 命令 | 指令 |
|---|---|
| 停止docker: | systemctl stop docker |
| 启动docker: | systemctl start docker |
| 重启docker: | systemctl restart docker |
| 查看docker状态: | systemctl status docker |
| 开机启动: | systemctl enable docker |
| 查看docker概要信息: | docker info |
| 查看docker帮助文档: | docker --help |
| 查看镜像 | docker images |
| 从网络查找镜像 | docker search 镜像名称 |
| 拉取镜像 | docker pull 镜像名称 |
| 删除镜像 | docker rmi 镜像ID |
| 删除单个镜像(-f 强制删除) | docker rmi -f 镜像ID |
| 删除多个镜像 | docker rmi -f 镜像名1:TAG 镜像名2:TAG |
| 删除所有镜像 | docker rmi -f $(docker images -qa) |
| 正在运行的容器 | docker ps |
| 查看所有容器 | docker ps -a |
| 查看最后一次运行的容器 | docker ps -l |
| 查看停止的容器 | docker ps -f status=exited |
| 创建容器 | docker run |
| 交互式创建容器 | docker run -it --name=容器名称 镜像名称:标签 /bin/bash |
| 创建后台容器 | docker run -id --name=mycentos2 centos:7 |
| 守护式方式创建容器 | docker run -di --name=容器名称 镜像名称:标签 |
| 停止容器 | docker stop 容器名称(或者容器ID) |
| 启动容器 | docker start 容器名称(或者容器ID) |
| 文件拷贝 | docker cp 需要拷贝的文件或目录 容器名称:容器目录 |
| 目录挂载(可以通过修改宿主机某个目录的文件从而去影响容器) | 创建容器 添加-v参数 后边为 宿主机目录:容器目录 |
| 查看容器IP地址 | docker inspect 容器名称(容器ID) |
| 删除容器(需要先停止容器) | docker rm 容器名称(容器ID) |
指令介绍
| 指令 | 含义 |
|---|---|
| cp | 本地文件系统(OS操作系统|宿主机)和容器之间进行文件或者文件夹拷贝 |
| exec | 登录一个容器,使用命令行操作正在运行的容器。 |
| images | 镜像的集合查询。 |
| ps | 容器列表 |
| pull | 下载镜像 |
| restart | 重启一个或多个容器 |
| rm | 删除一个或多个容器 |
| rmi | 删除一个或多个镜像 |
| run | 创建一个容器,并运行起来 |
| save | 导出镜像到一个文件(tar)中 |
| search | 搜索镜像(从Docker Hub) |
| start | 启动一个或多个已经停止的容器 |
| stop | 停止一个或多个正在运行的容器 |
迁移和备份
| 命令 | 含义 |
|---|---|
| docker commit 容器名称 镜像名称 | 将容器保存为镜像 |
| docker save –o tar文件名 镜像名 | 将镜像备份为tar文件 |
| docker load -i tar文件名 | 根据tar文件恢复为镜像 |
Dockerfile
Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
| 命令 | 作用 |
|---|---|
| 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 | 设置工作目录 |
使用脚本创建镜像
步骤
-
创建目录
mkdir –p /usr/local/dockerjdk8 -
下载jdk-8u144-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
-
移动目录刚刚上传的 jdk 到 /usr/local/dockerjdk8 目录下面
-
创建文件Dockerfile 并vi Dockerfile
# Dockerfile 名字不要改 vi Dockerfile设置环境变量 ,设置完成之后 先按下esc , 然后在 :wq 保存退出
#依赖镜像名称和ID FROM centos:7 #指定镜像创建者信息 MAINTAINER atguigu #切换工作目录 WORKDIR /usr #RUN yum install -y glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把java添加到容器中 ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_144 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH -
执行命令构建镜像
docker build -t='jdk1.8' .注意后边的空格和点,不要省略
-
查看镜像是否完成
docker images -
运行容器测试,如果出错,可能是因为缺少依赖插件,安装即可
yum install glibc.i686
私有仓库
私有仓库搭建与配置
-
拉取私有仓库镜像
docker pull registry -
启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry创建私有仓库容器
通过 docker ps 查看容器是否创建成功
-
打开浏览器 输入地址 http://虚拟机IP地址:5000/v2/_catalog 看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
-
修改daemon.json
vi /etc/docker/daemon.json添加以下内容,保存退出。目的是让容器信任这个地址
"insecure-registries":["IP地址:5000"] -
重启docker服务
systemctl restart docker
镜像上传到私有仓库
-
标记此镜像为私有仓库的镜像
# 标记镜像为私有仓库的镜像 # docker tag jdk1.8 宿主机IP:5000/jdk1.8 docker tag jdk1.8 虚拟机IP:5000/jdk1.8 -
再次启动私服容器
# 再次启动私有仓库容器 docker start registry -
上传标记的镜像
# 上传标记的镜像 # docker push 宿主机IP:5000/jdk1.8 docker push 虚拟机IP:5000/jdk1.8
从私有仓库拉取镜像
# 执行拉取镜像命令并查看
docker pull 虚拟机IP:5000/jdk1.8
docker images