Docker
阿里云公有镜像仓库:dev.aliyun.com
什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。 在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用 虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化 (vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
什么是 Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护。
解决问题:环境的移植
优势:
上手快
职责逻辑分类
快速高效的开发生命周期
鼓励使用面向服务的架构
镜像 、 容器 (我们操作的就是容器)
镜像是只读的,容器才是可写,容器是基于镜像构建的东西,将来所有操作都是在容器上,win10 就相当于一个容器。容器装好之后也可以打好包成镜像发给别人。
注册中心 Registy (DockerHub) 有公共或私有,类似仓库,注册中心储存的是镜像。
https://hub.docker.com
Docker 本地 centos7
查看 ip: ip add
安装 Docker
Docker 官方建议在 Ubuntu 中安装,因为 Docker 是基于 Ubuntu 发布的,而且一般 Docker 出现的问题 Ubuntu 是最先更新或者打补丁的。在很多版本的 CentOS 中是不支持更新最新的一些补丁包的。 由于我们学习的环境都使用的是 CentOS,因此这里我们将 Docker 安装到 CentOS 上。注意:这里建议安装在 CentOS7.x 以上的版本,在 CentOS6.x 的版本中,安装前需要安装其他很多的环境而且 Docker 很多补丁不支持更新。 请直接挂载课程配套的 Centos7.x 镜像
(1)yum 包更新到最新
sudo yum update
(2)安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)设置 yum 源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安装 docker
sudo yum install docker-ce
(5)安装后查看 docker 版本
docker -v
设置镜像加速器
ustc 是老牌的 linux 镜像服务提供者了,还在遥远的 ubuntu 5.04 版本的时候就在用。ustc 的 docker 镜像加速器速度很快。ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
编辑该文件:
vi /etc/docker/daemon.json
在该文件中输入如下内容:
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
配置案例云同理
{ "registry-mirrors": ["https://i8tth4vo.mirror.aliyuncs.com"] }
或者 docer-cn
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
重启服务:
sudo service docker restart
另一种拉取方式如下示例
docker pull registry.docker-cn.com/myname/myrepo:mytag docker pull registry.docker-cn.com/library/ubuntu:16.04
Docker 的启动与停止
systemctl 命令是系统服务管理器指令
启动 docker:
systemctl start docker
停止 docker:
systemctl stop docker
重启 docker:
systemctl restart docker
查看 docker 状态:
systemctl status docker
开机启动:
systemctl enable docker
查看 docker 概要信息
docker info
查看 docker 帮助文档
docker --help
镜像相关命令
查看镜像
docker images
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像 ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下
3.1.2 搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的
3.1.3 拉取镜像
拉取镜像就是从中央仓库中下载镜像到本地
docker pull 镜像名称
例如,我要下载 centos7 镜像
docker pull centos:7
3.1.4 删除镜像
按镜像 ID 删除镜像
docker rmi 镜像 ID
删除所有镜像
docker rmi `docker images -q`
pull 可以名称 +TAG 或者是 ID,CREATE 是在容器中创建时间,latest 是注册中心的最新版本
容器相关命令
3.2.1 查看容器
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
3.2.2 创建与启动容器
创建容器常用的参数说明:
创建容器命令:docker run -i:表示运行容器 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 --name : 为创建的容器命名。 -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d:在 run 后面加上 - d 参数, 则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i - t 两个参数,创建后就会自动进去容器)。 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 - p 做多个端口映射
(1)交互式方式创建容器
docker run -it --name= 容器名称 镜像名称: 标签 /bin/bash
这时我们通过 ps 命令查看,发现可以看到启动的容器,状态为启动状态
退出当前容器
exit
(2)守护式方式创建容器:
docker run -di --name= 容器名称 镜像名称: 标签
创建 mongo 示例:
docker run -di --name=mymongo -p 27017:27017 mongo
镜像名称: 标签也可以省略
守护方式创建后不会自动进入命令行,需要以下命令进入,退出仍然会运行,di 前后顺序没要求。
创建守护式不用先拉取创建镜像方式
登录守护式容器方式:
docker exec -it 容器名称 (或者容器 ID) /bin/bash
高亮处为容器名称。
3.2.3 停止与启动容器
停止容器:
docker stop 容器名称(或者容器 ID)
启动容器:
docker start 容器名称(或者容器 ID)
3.2.4 文件拷贝
如果我们需要将文件拷贝到容器内可以使用 cp 命令
docker cp 需要拷贝的文件或目录 容器名称: 容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称: 容器目录 需要拷贝的文件或目录
无论容器是否启动都是可以拷贝的
3.2.5 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 创建容器 添加 - v 参数 后边为 宿主机目录: 容器目录,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为 CentOS7 中的安全模块 selinux 把权限禁掉了,我们需要添加参数 --privileged=true
来解决挂载的目录没有权限的问题
3.2.6 查看容器 IP 地址
我们可以通过以下命令查看 容器运行的各种数据
docker inspect 容器名称(容器 ID)
也可以直接执行下面的命令直接输出 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器 ID)
3.2.7 删除容器
删除指定的容器:
docker rm 容器名称(容器 ID) docker rm -f 容器名称(容器 ID) // 强制删除
应用部署
4.1 MySQL 部署
(1)拉取 mysql 镜像
docker pull centos/mysql-57-centos7
(2)创建容器
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
最后一个 mysql 是镜像名或者镜像 ID
-p 代表端口映射,格式为 宿主机映射端口: 容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登陆密码
(3)远程登录 mysql
连接宿主机的 IP , 指定端口为 33306
tomcat 部署
(1)拉取镜像
docker pull tomcat:7-jre7
(2)创建容器
创建容器 - p 表示地址映射
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
: 后面的文件位置是固定的
Nginx 部署
(1)拉取镜像
docker pull nginx
(2)创建 Nginx 容器
docker run -di --name=mynginx -p 80:80 nginx
注意 docker 中用 cp 复制文件
Redis 部署
(1)拉取镜像
docker pull redis
(2)创建容器
docker run -di --name=myredis -p 6379:6379 redis
迁移与备份
5.1 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
docker commit mynginx mynginx_i 容器名 镜像名
5.2 镜像备份
我们可以通过以下命令将镜像保存为 tar 文件
docker save -o mynginx.tar mynginx_i 备份名 镜像
o:output
5.3 镜像恢复与迁移
首先我们先删除掉 mynginx_img 镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
Dockerfile
6.1 什么是 Dockerfile
Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终 创建一个新的镜像 。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 2、对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植。
6.2 常用命令
命令 | 作用 |
---|---|
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 | 设置工作目录(一般就是安装软件的目录) |
使用脚本创建镜像
步骤:
(1)创建目录
mkdir –p /usr/local/dockerjdk8
(2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
(3)创建文件 Dockerfile vi Dockerfile
# 依赖镜像名称和 ID FROM centos:7 #指定镜像创建者信息 MAINTAINER ITCAST #切换工作目录 WORKDIR /usr RUN mkdir /usr/local/java #ADD 是相对路径 jar, 把 java 添加到容器中 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ #配置 java 环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 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
(4)执行命令构建镜像
docker build -t='jdk1.8' .
注意后边的空格和点,不要省略
(5)查看镜像是否建立完成
docker images
或者直接拖拽上也可以上传
私有仓库搭建与配置
作用:存放企业内部的容器,方便人员安装使用
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://192.168.184.141:5000/v2/_catalog 看到 {"repositories":[]}
表示私有仓库搭建成功并且内容为空
(4)修改 daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出。
{"insecure-registries":["192.168.184.141:5000"]}
此步用于让 docker 信任私有仓库地址
(5)重启 docker 服务
systemctl restart docker
7.2 镜像上传至私有仓库
(1)标记此镜像为私有仓库的镜像
docker tag jdk1.8 192.168.184.141:5000/jdk1.8
打标签,指定私服的地址
(2)再次启动私服容器
docker start registry
(3)上传标记的镜像
docker push 192.168.184.141:5000/jdk1.8
docker run -id -p 9999:9000 --privileged=true -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker
aliyun 改端口策略
保存容器到镜像:
- 什么是虚拟化
- 什么是 Docker
- 优势:
- Docker 本地 centos7
- 安装 Docker
- 设置镜像加速器
- Docker 的启动与停止
- 镜像相关命令
- 查看镜像
- 3.1.2 搜索镜像
- 3.1.3 拉取镜像
- 3.1.4 删除镜像
- 容器相关命令
- 3.2.1 查看容器
- 3.2.2 创建与启动容器
- 3.2.3 停止与启动容器
- 3.2.4 文件拷贝
- 3.2.5 目录挂载
- 3.2.6 查看容器 IP 地址
- 3.2.7 删除容器
- 4.1 MySQL 部署
- tomcat 部署
- Nginx 部署
- Redis 部署
- 5.1 容器保存为镜像
- 5.2 镜像备份
- 5.3 镜像恢复与迁移
- 6.1 什么是 Dockerfile
- 6.2 常用命令
- 使用脚本创建镜像
- 私有仓库搭建与配置
- 7.2 镜像上传至私有仓库