我正在参加「掘金·启航计划」
我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出现软件跨环境迁移的问题(也就是 “水土”不服)
针对这种问题如何解决?我们可以将工程及此工程依赖的所有软件打包到一个容器中统一部署
- 容器(压缩包) = 应用(jar包) + 应用依赖的环境(jdk)
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低。
0. 安装docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于==CentOS7== 安装Docker。官网:www.docker.com
学习环境要求:centos7,出错(重试)
虚拟机:root/root123
# 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 https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
1 docker架构
2.1 docker结构
docker使用流程:
1.安装配置docker,配置镜像加速
2.从仓库下载镜像 (仓库:使用国外的镜像仓库)
3.通过镜像创建容器并启动
4.自定义镜像
2.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 run hello-world
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 参数
#交互式创建容器:创建并启动容器,进入容器内部,通过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 stop 容器名称
#停止全部容器
docker stop $(docker ps -qa)
#启动指定容器
docker start 容器名称
#删除指定容器
docker rm 容器名称
#删除全部容器
docker rm $(docker ps -qa)
#查看容器信息
docker inspect 容器名称
参数说明:
- -i:保持容器运行。通常与 -t 同时使用。加入
it
这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。 - -t:为容器重新分配一个伪输入终端,通常与
-i
同时使用。 - -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
- -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
- –name:为创建的容器命名。
- -p 宿主机端口:窗口商品:为了映射当前Linux 的端口和容器的端口
3. Docker应用部署
3.0 关闭防火墙
为了后续方便操作:关闭防火墙
#关闭防火墙
systemctl stop firewalld
#防火墙和docker有关联,重启下docker
systemctl restart docker
3.1 数据卷
-
Docker 容器删除后,在容器中产生的数据也会随之销毁
-
Docker 容器和外部机器可以直接交换文件吗?
-
容器之间想要进行数据交互?
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部署
1. 端口映射
#启动容器,挂载数据卷
docker run ... –p 宿主机端口:容器端口...
2. redis部署
需求: 在Docker容器中部署Redis(5.0版本),并通过外部机器访问Redis
要求: 宿主机对外提供的端口 6378
操作步骤:
#搜索镜像
docker search redis
#拉取镜像
docker pull redis
#创建容器
docker run -id --name=my_redis -p 6379:6379 redis:5.0
参数解释:
-p: 设置映射端口 ,宿主机端口:容器端口
3.3 tomcat部署
需求: 在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。
docker run -id --name=my_tomcat -v /data/webapps/:/usr/local/tomcat/webapps -p 8080:8080 tomcat
3.4 nginx部署
需求: 在Docker容器中部署Nginx,并通过外部机器访问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 run -id --name=my_mysql -p 3307:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
4. Dockerfile
4.1 Docker 镜像原理
操作系统的组成部分
镜像原理
4.2 Dockerfile概念及作用
dockerfile: 自定义镜像。通过文件的形式配置应用以及应用所需要的环境。
通过命令执行文件:自动的将应用和环境打包为镜像
4.3 示例
需求: 定义dockerfile
,发布springboot
项目
实现步骤:
(1) 创建文件夹,并创建 dockerfile
文件
#1.定义父镜像:
FROM java:8
#2.定义作者信息:
MAINTAINER itheima <itheima@itcast.cn>
#3.将jar包添加到容器:
ADD app.jar app.jar
#4.定义容器启动执行的命令: 当通过此镜像启动容器的时候,执行的命令
CMD java -jar app.jar
(2) 上传jar包
(3) 通过 dockerfile
构建镜像
#通过dockerfile构建镜像:
docker build –f dockerfile文件路径 –t 镜像名称 .
(4) 启动容器
#创建启动容器
docker run -id --name=自定义名称 -p 端口 镜像名称
5 Docker Compose
服务编排:批量管理所有容器
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
- 要从
Dockerfile build image
或者去dockerhub拉取image
- 要创建多个
container
- 要管理这些
ontainer(启动停止删除)
服务编排: 按照一定的业务规则批量管理容器
5.1 Docker Compose 概述
可以通过
Docker-Compose
编写参数,可以帮助我们批量的管理容器,只需要通过一个docker compose.yml
文件去维护即可
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 使用
docker-compose.yml
定义组成应用的各服务 - 运行
docker-compose up -d
启动应用
5.2 安装Docker Compose
Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
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
# 配置环境变量
# 将docker-compose文件移动到了/usr/local/bin,修改了/etc/profile文件,把/usr/local/bin配置到了PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
export PATH=$JAVA_HOME:/usr/local/bin:$PATH
source /etc/profile
5.3 卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
5.4 示例
通过 docker-compose
批量创建三个容器(nginx
,tomcat
,redis
)
- 文件:
docker-compose.yml
,定义批量管理的容器 - 通过命令批量创建和启动:
docker-componse up -d
(1) 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
(2) 定义docker-compose.yml 文件
yml 文件以key:value 的方式类指定配置信息
多个配置信息以换行 + 缩进的方式来区分
在 docker-compose.ym l文件中不要使用制表符
version: '3'
services:
nginx: # 服务的名称
container_name: my_nginx # 代表只要docker启动,这个容器就跟着一起启动
image: nginx # 指定镜像路径
ports:
- 80:80 # 指定端口号的映射
tomcat:
container_name: my_tomcat
image: tomcat
ports:
- 8080:8080
# docker run -id --name=$container_name -p($port) -v ($volumes) $image
redis:
container_name: my_redis
image: redis:5.0
ports:
- 6379:6379
(3) 启动容器
docker-compose up -d
5.5 docker-compose 命令管理容器
在使用
docker-compose
的命令时,默认会在当前目录下找docker-compose.yml
文件
-
基于
docker-compose.yml
启动管理的容器docker-compose up -d
-
关闭并删除容器
docker-compose down
-
开启或关闭已经存在的有
docker-compose
维护的容器docker-compose start|stop|restart
-
查看有docker-compose管理的容器
docker-compose ps
-
查看日志
docker-compose logs -f
-
重新构建
docker-compose build
6 总结
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
docker与虚拟机比较
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同:
-
容器虚拟化的是文件系统,虚拟机虚拟化的是硬件。
-
传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
Docker 虚拟机 启动速度 秒级 分钟级 硬盘使用 一般为MB 一般为G CPU/内存消耗 少 多 支持数量 上百个 十几个 可视化管理 不成熟 成熟