docker
一 Docker介绍
1 Docker初识
一款产品(软件)至少经过:开发和生产(线上)这两套环境
专治
水土不服
.
2 Docker概念
- Docker 是一个开源的应用容器引擎,官网:https://www.docker.com
- 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低。
3 Docker架构
镜像(Image):
容器(Container):
- 镜像和容器的关系,就像是面向对象程序设计中的类和对象一样。
- 容器是从镜像创建的运行实例,它可以被启动、停止、 删除。
- 每个容器都是相互隔离的、保证安全的平台。
- 可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间)和运行在其中的应用程序。
仓库(Repository):
- 仓库是集中存放镜像文件的场所。
- 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
4 导入linux镜像
安装好centos之后,需要关闭防火墙
在资料中提供了linux镜像压缩包的种子, 大家下载后 , 解压到非中文路径
也可以自己安装linux虚拟机,然后再安装docker
进入解压目录,双击
docker.vmx
启动VMware
开启此虚拟机
虚拟机用户名:root、密码:123456
ifconfig
查看ens33网卡的ip地址
通过客户端实现远程连接 (CRT或者MobaXterm)
5 Docker安装【已完成】
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上
本课程基于CentOS 7 安装Docker:
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
# 6、启动docker环境
systemctl start docker
# 7、设置开机自启动
systemctl enable docker
每次使用docker务必保证防火墙是关闭状态
- 查看防火墙状态
systemctl status firewalld
- 若是active(激活状态)就需要关闭防火墙
systemctl stop firewalld
6 配置镜像加速器【已完成】
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
# 中国科技大学镜像地址
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
或者
# 网易云镜像地址
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
或者
使用阿里云镜像,不过需要自己手动生成加速地址 https://cr.console.aliyun.com/
# 重启docker
systemctl restart docker
# 查看是否成功
docker info
二 Docker常用命令【掌握】
1 进程(应用)相关命令
# 启动服务
systemctl start docker
# 停止服务
systemctl stop docker
# 重启服务
systemctl restart docker
# 查看服务的状态
systemctl status docker
# 设置开机自启动
systemctl enable docker
2 镜像相关命令
# 查看本地镜像
docker images
# 搜索镜像仓库,推荐:https://hub.docker.com/
docker search 镜像名称
# 下载(拉取)镜像,镜像名称格式为 名称:版本号
docker pull 镜像名称
# 删除镜像(慎重)
docker rmi 镜像名称
3 容器相关命令
# 查看本地容器
docker ps # 能查看正在运行
docker ps -a # 能查看所有的容器(运行的和停止的)
# 创建一个新的容器并运行(交互式)
docker run -it --name=容器名 镜像名称 /bin/bash
# 启动容器
docker start 容器名称
# 停止容器
docker stop 容器名称
# 删除容器
docker rm 容器名称
# 创建一个新的容器并运行(守护式)
docker run -d --name=容器名 镜像名称
# 进入容器内部
docker exec -it 容器名称 /bin/bash
# 查看容器信息
docker inspect 容器名称
# 退出容器
exit
参数说明:
- -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
- -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
- -it 创建的容器一般称为交互式容器,-d 创建的容器一般称为守护式容器
- –name:为创建的容器命名。
4 小结
应用的命令
- systemctl start|stop|restart|status docker
镜像的命令
容器的命令
- docker ps -a
- 创建
- 交互式: docker run -it --name=容器名字 /bin/bash
- 守护式: docker run -d --name=容器名字
- docker start 名字(id)
- docker stop 名字(id)
- docker rm 名字(id)
- docker ps -qa :查询所有容器id
- 批量进行操作
- docker stop
docker ps -qa
三 Docker应用部署【作业】
1 部署MysqL
外部机器访问宿主机的端口号的时候,就可以访问容器
-p 宿主机端口号:容器端口号
# 搜索MysqL镜像
docker search MysqL
# 拉取MysqL镜像
docker pull MysqL:5.7
# 创建并启动容器
docker run -d -p 3306:3306 --name=MysqL5.7 -e MysqL_ROOT_PASSWORD=root MysqL:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 操作容器中的MysqL 可以不操作
docker exec -it MysqL5.7 /bin/bash
# 退出容器
exit
2 部署Tomcat
# 搜索tomcat镜像
docker search tomcat
# 拉取tomcat镜像
docker pull tomcat:8.5
# 创建并启动容器
docker run -d --name=tomcat8.5 -p 8080:8080 tomcat:8.5
# 操作容器中的tomcat
docker exec -it tomcat8.5 /bin/bash
# 在webapps下创建ROOT目录
cd /usr/local/tomcat/webapps
mkdir ROOT
# 退出容器
exit
# 从宿主机复制文件到容器
# docker cp 宿主机路径 容器名称:容器路径
docker cp /root/index.html tomcat8.5:/usr/local/tomcat/webapps/ROOT
3 部署Redis
# 搜索redis镜像
docker search redis
# 拉取redis镜像
docker pull redis:5.0
# 创建并启动容器
docker run -d --name=redis5.0 -p 6379:6379 redis:5.0
# 操作容器中的redis 可以不操作
docker exec -it redis5.0 /bin/bash
4 部署Nginx
# 搜索Nginx镜像
docker search Nginx
# 拉取tomcat镜像
docker pull Nginx:1.16.1
# 创建并启动容器
docker run -d --name=Nginx -p 80:80 Nginx:1.16.1
# 操作容器中的Nginx 可以不操作
docker exec -it Nginx /bin/bash
四 Docker数据卷【理解】
1 数据卷概念
思考:
数据卷:
2 配置数据卷
# 创建启动容器时,使用 –v 参数 设置数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir -p /root/tomcat/webapps
# 创建容器,设置端口映射、目录映射
docker run -d --name=tomcat1 -p 8081:8080 --privileged=true \
-v /root/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5
docker run -d --name=tomcat2 -p 8082:8080 --privileged=true \
-v /root/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5
五 Docker镜像【了解】
1 镜像原理
思考:
- Docker 镜像本质是什么?
- Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要4个G?
- Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB?
我们现在的docker是运行在linux系统,这边我们就拿linux系统举例
Linux文件系统由bootfs和rootfs两部分组成
- bootfs:包含bootloader(引导加载程序)和 kernel(内核)
- rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
- 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
Docker 镜像原理
- 是一个分层文件系统
- 最底端是 bootfs,并使用宿主机的bootfs
- 第二层是 root文件系统rootfs,称为base image
- 然后再往上可以叠加其他的镜像文件
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
2 镜像制作
容器转为镜像(了解)
# 1、将容器制作镜像
docker commit 容器id 镜像名称:版本号
# 2、将镜像进行压缩 压缩文件使用tar即可
docker save -o 压缩文件名称 镜像名称:版本号
# 3、解压文件获得镜像
docker load –i 压缩文件名称
Dockerfile
- Dockerfile 是一个用于生产docker镜像的文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
copY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
workdir | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
3 Dockerfile案例
自定义centos7镜像
需求:
镜像制作
# 1. 创建并进入docker-files目录下
mkdir /root/docker-files
cd /root/docker-files
# 2. 编辑centos的dockerfile文件
vim centos-dockerfile
# 3. 编写自定义镜像文件内容
FROM centos:7
MAINTAINER itheima <itheima@itcast.cn>
RUN yum install -y vim
workdir /usr
CMD /bin/bash
# 4. 通过dockerfile构建镜像 别漏掉了最后的"."
docker build -f ./centos-dockerfile -t centos-itheima:7 .
# 5. 创建容器并测试
docker run -it centos-itheima:7 /bin/bash
自定义springboot容器
需求:
基于jdk1.8环境运行springboot项目,打包为镜像
镜像制作
# 1. 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux
# 2. 编辑springboot的dockerfile文件
vim springboot-dockerfile
# 3. 编写自定义镜像文件内容
FROM java:8
MAINTAINER itheima <itheima@itcast.cn>
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
# 4. 通过dockerfile构建镜像
docker build -f ./springboot-dockerfile -t app-itheima .
# 5. 创建容器并测试
docker run -id -p 18080:8080 --name=app app-itheima
六 Docker服务编排【了解】
1 什么是服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大:
2 Docker Compose
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用
安装
# 安装docekr compose 工具-- 已完成
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose -version
3 编排运行多个容器
需求
使用docker compose编排Nginx+springboot项目
代码实现
- 创建/root/docker-compose 目录
mkdir /root/docker-compose
cd /root/docker-compose
- 编写 docker-compose.yml 文件
version: '3'
services:
Nginx:
image: Nginx:1.16.1
ports:
- 80:80
links:
- app
volumes:
- /root/Nginx/conf.d:/etc/Nginx/conf.d
privileged: true
app:
image: app-itheima
expose:
- "8080"
- 创建./Nginx/conf.d目录
mkdir -p /root/Nginx/conf.d
cd /root/Nginx/conf.d
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
- 在/root/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
或者以守护进程方式启动
docker-compose up -d
- 测试访问
七 Docker和VM对比【理解】
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同:
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
cpu/内存消耗 | 少 | 多 |
系统支持量 | 单机支持上百个容器 | 一般十几个 |
八 总结
docker命令:
systemctl start|stop|restart|status docker
镜像命令:
查看:
docker images
搜索:
docker search 镜像名称
拉取镜像:
docker pull 镜像名称:版本
删除镜像:
docker rmi 镜像名称:版本
容器命令:
查看:
docker ps [-a]
创建容器且启动(一旦需要挂载数据卷的时候,注意权限问题 --privileged=true)
交互式: docker run -it --name=容器名称 -p 宿主机端口号:容器端口号 -v 宿主目录:容器目录 镜像:版本 /bin/bash
守护式: docker run -d -name=容器名称 -p 宿主机端口号:容器端口号 -v 宿主目录:容器目录 镜像:版本
进入容器:
docker exec -it 容器名称 /bin/bash
容器启动|停止|删除
docker start|stop|rm 容器名称
查看某个容器具体信息 docker inspect 容器名称