目录
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
案例2
案例3
5.6.把本地镜像上传阿里远程镜像仓库
6.Idea关联Docker
6.1.Docker开启远程访问
6.2.Idea安装docker插件
7.Docker服务编排
7.1.概述
7.2.Docker Compose 安装使用
8.需要图形化界面
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文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝跨平台移植
5.4 Dockerfile关键字
5.5 Dockerfile案例
案例1
创建编辑dockerfile文件
构件镜像
docker build -f centos_dockerfile -t aaa_centos:v1.0
- -f:表示dockerfile文件
- -t: 镜像名称版本号
- .: 必须加上
创建容器
docker run -it --name=c1 aaa_centos:v1.0 /bin/bash
案例2
准备好springboot jar包并传至宿主机的根目录
创建springboot_dockerfile文件并编辑
FROM openjdk:8 MAINTAINER wqg ADD springboot-docker01-0.0.1-SNAPSHOT.jar docker01.jar EXPOSE 8080 CMD java -jar docker01.jar
根据springboot_dockerfile制作镜像
docker build -f ./springboot_dockerfile -t springboot:v1.0 .
启动并做端口映射
docker run -id --name=s2 -p 8080:8080 springboot:v1.0
成功访问
镜像变成压缩文件
docker save -o springboot.tar springboot:v1.0
案例3
需求: Centos7镜像具备vim+ifconfig+jdk8
jdk_centos编辑
FROM centos:7 MAINTAINER wqg WORKDIR /usr/local #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #创建目录 RUN mkdir -p /usr/local/java #ADD 把宿主机中的压缩文件放入到/usr/local/java 并会自动解压 ADD jdk-8u161-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_161 ENV PATH $JAVA_HOME/bin:$PATH CMD echo "success--------------ok" CMD /bin/bash
5.6.把本地镜像上传阿里远程镜像仓库
阿里云:
- 作为开发: 我们需要把自己的项目----通过dockerfile 变成一个镜像----上传到远程仓库【hub.docker或者阿里云镜像仓库】
- 作为运维: 从远程仓库下载镜像---通过镜像运行容器。部署项目。
- 采用:阿里云镜像仓库
从Registry中拉取镜像
拉取后运行
docker run -id --name=ccc -p 8089:8080 [镜像版本id]
6.Idea关联Docker
6.1.Docker开启远程访问
#修改该Docker服务文件 vi /lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
6.2.Idea安装docker插件
7.Docker服务编排
7.1.概述
- docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?
- 如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具.
- Compose允许用户通过一个单独的docker-compose.yml模板文件[你写](YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
- 可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
7.2.Docker Compose 安装使用
一、安装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 【根据需要选择】
# 二进制包方式安装的,删除二进制文件即可 rm /usr/local/bin/docker-compose
三、 使用docker compose编排springboot+redis+mysql项目
docker compose步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
1.创建docker-compose目录(本文这里没有创建依然放在/root/dockerfile目录)
mkdir ~/docker-compose cd ~/docker-compose
2.打包springboot工程
3.编写dockerfile文件
# 基础镜像使用java FROM openjdk:8 # 作者 MAINTAINER qy165 # 将jar包添加到容器中并更名为zzyy_docker.jar ADD springboot-redis-cache-0.0.1-SNAPSHOT.jar qy165.jar EXPOSE 8080 CMD java -jar qy165.jar
4.构建镜像
docker build -f Dockerfile -t qy165:v1.0
服务编排:
编写 docker-compose.yml 文件
version: "3" services: microService: image: qy165:v1.0 #镜像名 container_name: qy165 #容器名 ports: #端口映射 - "8080:8080" volumes: #数据卷 - /app/microService:/data networks: #网络(network=aaa_net) - aaa_net depends_on: #依赖服务名 - redis - mysql redis: image: redis:6.0.20 ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data networks: - aaa_net command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'qy165' ports: - "3306:3306" volumes: - /app/mysql/db:/var/lib/mysql - /app/mysql/conf/my.cnf:/etc/my.cnf - /app/mysql/init:/docker-entrypoint-initdb.d networks: - aaa_net command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 networks: #等价于 docker network create aaa_net aaa_net:
docker rm -f $(docker ps -aq)
在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
8.需要图形化界面
执行
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
访问
http://192.168.223.147:9000/