目录
1.初识Docker
1.1 为什么使用docker
1.2 Docker技术
1.3.安装Docker
1.4.Docker架构
1.5.配置Docker镜像加速器
2.Docker常用命令
2.1.Docker服务相关的命令
2.2.Docker镜像相关的命令
2.3.Docker容器相关的命令
3. 容器的数据卷
3.1.数据卷的概念和作用
3.2.配置数据卷
4.Docker应用部署
4.1.Docker部署mysql
4.2.Docker部署Redis
4.3.Docker部署tomcat
4.4.Docker部署nginx
4.5.Docker部署RabbitMQ
5.自定义镜像
5.1.Docker镜像的原理
5.2 镜像制作
5.3 dockerfile的概念[重]
5.4 Dockerfile关键字
5.5 Dockerfile案例
1.初识Docker
1.1 为什么使用docker
我就可以把项目以及项目依赖的配置和软件一起打包---【镜像】---直接在测试环境下运行该镜像。无需担心环境的不同导致无法运行的问题。
1.2 Docker技术
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker的应用
1.3.安装Docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,
演示:CentOS7安装Docker
官网: Docker: Accelerated, Containerized Application Development
虚拟机中执行步骤:
# 1、yum包更新到最新
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定你下载docker软件的网址
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y---下载并安装docker-ce[社区版] docker-ee[企业版]
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
1.4.Docker架构
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
仓库(Repository)是集中存放镜像文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
1.5.配置Docker镜像加速器
默认情况下,将来从docker hub (https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
阿里云--网易云--腾讯云
演示:阿里云中配置镜像加速器
进入阿里云官网
搜索
2.Docker常用命令
2.1.Docker服务相关的命令
- 停止docker服务: systemctl stop docker
- 启动docker服务: systemctl start docker
- 重启docker服务: systemctl restart docker
- 开机启动docker服务: systemctl enable docker
2.2.Docker镜像相关的命令
1.从仓库中搜索相关的镜像
docker search 镜像名 例如: docker search mysql
2. 拉取镜像到本地
docker pull 镜像名:版本号 ===如果没有跟版本号,那么它会拉取最新的latest
3.查看本地有哪些镜像
docker images
4.删除本地指定的镜像
docker rmi 镜像名:版本号 或镜像编号
5.删除所有的镜像
docker rmi $(docker images -q) [慎用]
6.帮助命令
docker --help [找到所有的docker命令]docker 命令 --help [命令的语法]
2.3.Docker容器相关的命令
运行centos容器:并进入到容器内
docker run -it --name=c1 centos:7 /bin/bash
- -i:进入容器内部
- -t:交互平台 ===它几乎和-i一起使用。
- --name: 为容器起个名称--如果没有使用--name那么docker为自动分配一个名字
- centos:7===镜像名:版本号
- /bin/bash===提供一个shell命令窗口
退出容器
exit: ---会关闭容器 ctrl+q+p:--退出不会关闭容器
查看当前的容器
docker ps: 查看所有正在运行的容器 docker ps -a:查看所有的容器。 docker ps -aq: 查看所有容器的id
创建一个容器不进入到该容器内部
docker run -id --name=容器的名称 centos:7 /bin/bash
进入指定的容器内部:---使用exit不会关闭容器
docker exec 容器的id或者容器的名称 /bin/bash
关闭|启动|删除容器
docker stop 容器名|容器id docker start 容器名|容器id docker rm 容器名|容器id [只能删除停止的容器] docker rm -f 容器名|容器id [强制删除容器] docker rm -f $(docker ps -aq): 删除所有容器
查看容器的日志
docker logs 容器id
3. 容器的数据卷
3.1.数据卷的概念和作用
思考: dockers容器删除后,容器中的产生的数据还在吗?
思考: Docker容器和外部机器可以直接交换文件吗?
思考: 容器之间想要进行数据交互
为了保证容器数据的可靠性,----需要把容器内部的某个目录--挂载到宿主机中的某个目录中。
宿主机中的这个目录就是数据卷
概念:
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
作用:
- 解决数据持久化问题
- 解决外部机器和容器的间接通讯问题
- 解决容器之间的数据交换
3.2.配置数据卷
- 创建启动容器时,使用-v参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
例子:
docker run -id --name=c2 -v /usr/app:/usr/ykq -v /usr/app2:/usr/ykq2 centos:7 /bin/bash
4.Docker应用部署
4.1.Docker部署mysql
搜索mysql镜像
docker search mysql
拉取mysql镜像
docker pull mysql:5.7
创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysql
mysql完整版容器
docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7
参数说明:
- -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
-v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
4.2.Docker部署Redis
(1)拉取redis镜像
docker pull redis:6.0.20
(2)运行redis镜像
docker run -id --name=redis6 -p 6380:6379 redis:6.0.20 -p: 端口映射 容器内部的端口和宿主机之间的映射。
(3)使用外部机器连接redis
如果把redis容器删除了---里面的数据还有吗?---如果我想修改redis的配置内容。
持久化
1.启动redis容器时指定配置文件
- 创建一个目录/app/redis,并把redis.conf放入该目录
- 创建一个目录/app/redis/data---存放redis持久化数据
mkdir -p /app/redis/data
- 运行redis容器
docker run -id --name=redis6 -v /app/redis/redis.conf:/usr/redis/redis.conf -v /app/redis/data:/usr/redis/data -p 6379:6379 redis:6.0.20 redis-server /usr/redis/redis.conf
每个容器相当于一个虚拟机
4.3.Docker部署tomcat
搜索tomcat镜像
docker search tomcat
拉取tomcat镜像
docker pull tomcat
创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息 mkdir ~/tomcat cd ~/tomcat
运行tomcat容器
docker run -id --name=tomcat -p 8080:8080 镜像名
进入tomcat 并修改
访问端口--成功
4.4.Docker部署nginx
搜索nginx镜像
docker search nginx
拉取nginx镜像
docker pull nginx
创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf # 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容 vim nginx.conf
user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf; }
docker run -id --name=c_nginx \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx
参数说明:
-p 80:80:将容器的 80端口映射到宿主机的 80 端口。
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
-v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
4.5.Docker部署RabbitMQ
搜素rabbitmq的镜像
docker search rabbitmq
拉取rabbitmq镜像
docker pull rabbitmq
运行rabbitmq:
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5673:5672 rabbitmq
通过
docker ps -a
查看部署的mq容器id,在通过docker exec -it 容器id /bin/bash
进入容器内部在
运行:rabbitmq-plugins enable rabbitmq_management
现在可以通过访问http://linuxip:15672,访问web界面,这里的用户名和密码默认都是guest
输入命令:exit退出容器目录.
5.自定义镜像
上面讲解的内容需要的镜像 都是从远程仓库拉取,我们能否把自己写的工程也变成一个镜像。可以的。 需要自定义镜像
5.1.Docker镜像的原理
思考:
Docker镜像本质是什么?---它就是一个文件Dockerfile[ 写着一条一条得到命令]
Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB?
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: 基础镜像
然后再往上可以叠加其他的镜像文件
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
总结:
5.2 镜像制作
自定义镜像:提供了两种方式:
- 第一种:基于容器来制作
- 第二种: 通过dockerfile文件来制作
第一种 容器转为镜像:只能在已有的镜像的容器上进行制作新镜像-----了解
步骤: 把现有的镜像--运行成一个容器---修改容器中的内容--->变成镜像---把镜像压缩文件--->交给其他人---变成本地镜像
演示:
- docker commit 容器id 镜像名:版本号 [把指定的容器变成镜像]
- docker save -o 压缩文件名 镜像名:版本号 [把指定的镜像压缩为一个压缩文件]
- docker load -i 压缩文件名 【把压缩文件变成本地镜像】
5.3 dockerfile的概念[重]
Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作
文件包含了一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝跨平台移植