1 Docker概述
我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出现软件跨环境迁移的问题(也就是 “水土”不服)
针对这种问题如何解决?我们可以将工程及此工程依赖的所有软件打包到一个容器中统一部署
1.1 docker概念
- Docker 是一个开源的应用容器引擎
- 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
1.2 安装Docker
1.2.1 安装Docker(完成)
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于==CentOS7== 安装Docker。官网:www.ndocker.com
#0.清除系统中现在docker yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 1、yum 包更新到最新,更新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 http://mirrors.aliyun.com/docker-ce/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
1.2.2 CentOS 7安装Dockers-compose
- PIP在线安装 - 使用Python的PIP包管理工具在线安装
PIP在线安装
yum -y install epel-release
yum -y install python-pip
pip install --upgrade pip
pip --version pip 19.3.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
安装docker compose,自行更改版本号.
复制
pip install -U docker-compose==1.24.1
检查docker compose版本
复制
docker-compose version
如果使用PIP安装时报以下错误,先升级安装requests库.
ERROR: Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
升级安装requests库
复制
pip install -I requests==2.10.0
再次安装docker compose
复
pip install -U docker-compose==1.24.1
1.3 docker架构
1.3.1 docker结构
\
\
docker使用流程:
- 配置docker进程 启动docker软件
- 从仓库下载镜像到宿主机
- 通过镜像创建容器并启动
1.3.2 配置镜像加速
默认情况下,从docker hub(hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
- USTC:中科大镜像加速器(docker.mirrors.ustc.edu.cn)
- 阿里云
- 网易云
- 腾讯云
(1) 创建文件并配置
在linux中自己创建:/etc/docker/daemon.json文件,并导入镜像地址(二选一)
中科大镜像地址 { "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] } 阿里云镜像地址 { "registry-mirrors": ["https://x1am3gq3.mirror.aliyuncs.com"] }
(2) 重新启动docker
#重启 systemctl restart docker #查看docker信息 docker info
2 Docker的命令(重点)
2.1 进程相关命令
docker 进程:daemon(docker软件(服务))
#启动docker服务: systemctl start docker #停止docker服务: systemctl stop docker #重启docker服务: systemctl restart docker #查看docker服务状态: systemctl status docker #设置开机启动docker服务: systemctl enable docker #设置开机不启动docker服务: systemctl disable docker
2.2 镜像相关命令
镜像:需要的软件(从仓库中下载(docker hub))
: 从仓库中下载镜像到本地(redis)
#查看镜像: 查看本地所有的镜像 docker images docker images –q # 查看所用镜像的id #搜索镜像:从网络中查找需要的镜像 docker search 镜像名称 #拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。 docker pull 镜像名称 #删除镜像: 删除本地镜像 docker rmi 镜像id # 删除指定本地镜像 docker rmi `docker images -q` # 删除所有本地镜像
(1) 查看镜像
docker images
(2) 从仓库下载redis镜像到本地
查询镜像
docker search redis
下载镜像(拉取)
docker pull redis:5.0 (如果没有版本号,默认最新版)
2.3 容器相关命令
容器:通过镜像启动的容器。
#查看容器 docker ps # 查看正在运行的容器 docker ps –a # 查看所有容器 #创建并启动容器 docker run 参数 docker run -it --name=容器名称 镜像名称 /bin/bash(以命令行方式进入容器) #交互式创建容器:创建并启动容器,进入容器内部,通过exit退出容器(关闭容器) docker run -it --name=my_c1 centos:7 /bin/bash #守护式创建容器:创建并后台启动容器,不会进入到容器内部 docker run -id --name=my_c2 centos:7 #交互式 docker run -it --name=my_c1 centos:7 /bin/bash #守护式 docker run -id --name=my_c2 centos:7 #进入容器 docker exec -it 容器名称 /bin/bash # 退出容器,容器不会关闭 docker exec -it mycentos2 /bin/bash #停止容器 docker stop 容器名称 #启动容器 docker start 容器名称 #删除容器 docker rm 容器名称/容器id #查看容器信息 docker inspect 容器名称 参数说明: ● -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。 ● -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。 ● -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。 ● -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器 ● --name:为创建的容器命名。
3 Docker应用部署(重点)
为了后续方便操作:关闭防火墙
#关闭防火墙 systemctl stop firewalld #防火墙和docker有关联,重启下docker systemctl restart docker
3.1 数据卷(了解)
思考
- Docker 容器删除后,在容器中产生的数据也会随之销毁
- Docker 容器和外部机器可以直接交换文件吗?
- 容器之间想要进行数据交互?
3.1.1 概念及作用
什么是数据卷
数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
数据卷作用
容器数据持久化、外部机器和容器间接通信、容器之间数据交换
3.1.2 配置数据卷
创建启动容器时,使用 –v 参数 设置数据卷
#启动容器,挂载数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
#启动容器,挂在数据卷 docker run -id --name=my_c1 -v /root/data/:/usr/data/ centos:7 #进入容器 docker exec -it my_c1 /bin/bash #查看共享文件
3.2 Redis部署
3.2.1 端口映射
3.2.2 redis部署
需求: 在Docker容器中部署Redis,并通过外部机器访问Redis
要求: 宿主机对外提供的端口 6378
操作步骤:
#搜索镜像 docker search redis #拉取镜像 docker pull redis:5.0 #创建容器 docker run -id --name=my_redis -p 6378:6379 redis:5.0
参数解释:
-p: 设置映射端口 ,宿主机端口:容器端口
3.3 tomcat部署
需求: 在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。
#拉取镜像 docker pull tomcat:8.5 #启动容器 docker run -id --name=mytomcat -v /root/data:/usr/local/tomcat/webapps -p 8080:8080 tomcat:8.5 #进入守护式容器 docker exec -it mytomcat /bin/bash
3.4 nginx部署
需求: 在Docker容器中部署Nginx,并通过外部机器访问Nginx。
#拉取镜像 docker pull nginx #启动容器 docker run -id --name=my_nginx -p 80:80 nginx
3.5 mysql部署
需求: 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。
容器中myql:默认存储数据的文件夹位置 /var/lib/mysql
在容器创建的时候:可以指定mysql的密码
-e MYSQL_ROOT_PASSWORD=123456
#拉取镜像 docker pull mysql:5.7 #运行容器 docker run -id --name=my_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
4 Dockerfile(次重点)
程序员自定义镜像(打包镜像)
4.1 Docker 镜像原理
操作系统的组成部分
镜像原理
4.2 镜像制作
4.3 Dockerfile概念及作用
4.4 案例
需求: 定义dockerfile,发布SpringBoot项目
实现步骤:
(1) 上传jar包
alt+p后通过put 文件全路径 将文件上传到服务器/root根目录
(2) 创建文件夹,并创建dockerfile文件
创建dockerfile文件目录 mkdir dockerfile # 创建dockerfile文件 touch hellofile # 将hello.jar移动到dockerfile文件目录 mv hello.jar dockerfile #1.指定层级镜像中当前镜像的父镜像:(SpringBoot项目的父镜像环境) FROM java:8 #2.定义作者信息:(可以忽略) MAINTAINER itheima itheima@itcast.cn #3.将jar包添加到容器:(第一个是名字,后面是自定义的) ADD hello.jar app.jar #4.定义容器启动执行的命令: 当通过此镜像启动容器的时候,执行的命令 CMD java -jar app.jar
(3) 通过dockerfile构建镜像
#通过dockerfile构建镜像:(镜像名称后一定带空格和点) docker build –f dockerfile的文件路径 –t 镜像名称 . 例:docker build -f hellofile -t helloimage .
(4) 启动容器
#创建启动容器 docker run -id --name=my_app -p 8081:8080 helloimage
5 Docker服务编排(了解)
服务编排:批量管理所有容器
5.1 服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
- 要从Dockerfile build image 或者去dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
服务编排: 按照一定的业务规则批量管理容器
5.2 Docker Compose 概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up -d 启动应用
5.3 安装
5.3.1 安装Docker Compose(略)
Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 curl -L github.com/docker/comp… -s-
uname -m` -o /usr/local/bin/docker-compose # 设置文件可执行权限 chmod +x /usr/local/bin/docker-compose # 查看版本信息 docker-compose -version
5.3.2 卸载Docker Compose(略)
二进制包方式安装的,删除二进制文件即可 rm /usr/local/bin/docker-compose
5.4 案例
通过docker-compose 批量创建三个容器(nginx,tomcat,redis)
(1) 创建docker-compose目录
mkdir ~/docker-compose cd ~/docker-compose docker rm docker ps -a -q
(2) 定义docker-compose.yml 文件 (文件名固定)
version: '3' services: nginx: container_name: my_nginx image: nginx ports: - 80:80 tomcat: container_name: my_tomcat image: tomcat:8.5 ports: - 8088:8080 redis: container_name: my_redis image: redis:5.0 ports: - 6379:6379
(3) 启动容器
docker-compose up -d
6 总结
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
docker(容器化)与虚拟机比较
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同:
- 虚拟化是基于操作系统级别的虚拟技术,容器化是基于软件(应用程序)级别虚拟化技术。
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统(linux)
Docker | 虚拟机 | |
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为G |
CPU/内存消耗 | 少 | 多 |
支持数量 | 上百个 | 十几个 |
可视化管理 | 不成熟 | 成熟 |
作业安排:
- 练习应用部署搭建Redis、Tomcat、Nginx、MySQL环境
- 练习Dockerfile : 将Springboot工程制作为镜像,并在容器中启动