安装docker步骤:https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d
1.docker
Docker 是一种容器化平台,用于帮助开发者打包、发布和管理应用程序及其依赖关系。通过 Docker,开发者可以将应用程序及其所有依赖项打包到一个称为容器的可移植单元中。这些容器可以在几乎任何环境中快速、一致地运行,无论是开发、测试、还是生产环境。 Docker 的主要优势之一是它提供了轻量级、独立的运行环境,同时保证了应用程序在不同环境中的一致性和可移植性
2.镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。
docker deamon守护进程会在后台运行和监听事假,当客户端发送命令,该命令会被守护进程监听并且解析,比如客户端的命令是启动mysql服务的话,守护进程解析完会去镜像仓库寻找应用镜像。第二次运行的时候就不需要再次下载。
总结:
- Docker是做什么的? Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用
- 什么是镜像? 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像
- 什么是容器? 为每个镜像的应用进程创建的隔离运行环境就是容器
- 什么是镜像仓库? 存储和管理镜像的服务就是镜像仓库, DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像
3.docker命令
3.1 docker run 参数说明
参数说明:
docker run :创建并运行一个容器,-d 是让容器在后台运行
--name mysql :给容器起个名字,必须唯一
-p 3306:3306 :设置端口映射
-e KEY=VALUE :是设置环境变量
mysql :指定运行的镜像的名字
为什么需要端口映射?
在 Docker 中运行容器时进行端口映射是因为 Docker 容器本质上是在宿主机上运行的进程,每个容器都有自己的网络命名空间和 IP 地址。外部机器通过容器的ip地址访问容器是访问不到的,但是端口映射允许容器中运行的应用程序能够通过宿主机的 IP 地址和端口与外部通信。
-p 3306:3306 :设置端口映射,一般改的话,只会改宿主机的端口号,也就是第一个参数,可以通过不同的端口号,开启多个mysql服务。
3.2 镜像名字规范
镜像名称一般分两部分组成:[repository]:[tag]。
其中repository就是镜像名 tag是镜像的版本 在没有指定tag时,默认是latest,代表最新版本的镜像
如果镜像名字只是mysql的话,那么版本号默认最新版。
如果我想要mysql的5.7版本的话,就应该是这样 mysql:5.7
4.docker基础
常见命令:
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/
注意事项:
docker run 相当于一条龙服务,它会帮你需要的镜像从镜像仓库拉取到本地仓库,
并且创建和运行容器,需要注意的是,docker run一个镜像只需要进行一次,后续无论是虚拟机重
启,你也只需要启动或者停止相应的容器,因为容器本来就存在,不需要重复的创建。
容器有独立的网络,有独立的内存等等
案例实践:
查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
需求:
- 在DockerHub中搜索Nginx镜像,查看镜像的名称
- 拉取Nginx镜像
docker pull nginx
- 查看本地镜像列表
docker images
- 保存镜像
#可以通过下面指令,看看需要什么参数
docker save --help
#最后的指令(-o 是参数)
docker save -o nginx.tar nginx:latest
- 删除镜像
docker rmi nginx:latest
- 加载镜像(将上面的save的.tar压缩文件加载下来)
#先通过帮助文档看看需要什么参数
docker load --help
#最后的指令
docker load -i nginx.tar
- 创建并运行Nginx容器
docker run -d --name nignx -p 80:80 nginx
- 删除Nginx容器
docker rm nginx
- 查看容器
#查看正在运行的容器
docker ps
#查看所用的容器
docker ps -a
- 停止容器
docker stop nginx
- 再次启动容器
docker start nginx
- 进入Nginx容器
#通过命令行的方式进入容器
docker exec -it nginx sh
#这样可以直接进去mysql命令行
docker exec -it mysql sh
mysql -uroot -p123
- 查看nginx日志
#正常
docker logs nginx
#如何想要看到实况
docker logs -f nginx
5.数据卷
5.1 数据卷的定义
数据卷的存在解决了容器文件不能通过vi 来修改文件的信息。
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。两者会进行双向绑定,也就是如果你修改宿主机的数据卷关联的文件,容器对应的文件也会被同步,反过来也一样,这就完成了绑定的效果。
5.2 数据卷的相关命令
5.3 数据卷的创建
在执行docker run命令时,使用 -v 数据卷:容器内目录
可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
案例1-利用Nginx容器部署静态资源
需求: 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化将静态资源部署到nginx的html目录。
首先需要去官方文档看一下nginx的html的目录在哪个位置。
我在宿主机放了一张图片,可以通过网络访问
可以看到nginx容器的html的目录已经通过实现了数据的同步
案例2-mysql容器的数据挂载
需求: 查看mysql容器,判断是否有数据卷挂载 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
- 挂载/root/mysql/data到容器内的/var/lib/mysql目录
- 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
执行 docker inspect mysql 查看mysql容器详情
可以看到数据同步过来了
可以看到mysql会有自动挂载的数据卷,名字是系统给的,该数据卷称为“匿名数据卷”。
如果mysql容器被删除,重新下载其他版本的mysql,会生成另外一个匿名数据卷,这就导致之前的数据卷的mysql数据,二进制文件等丢失,但是如果你参考镜像mysql的存储位置(data,init,conf),自己实现目录挂载,下次就不会存在上述问题。
注意事项:
在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载
本地目录必须以“/”或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
-v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录
5.4 数据卷挂载有两种方式
- 数据卷名:容器目录
- 本地目录:容器目录
6.自定义镜像
6.1 镜像的结构
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
6.2 Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
因此有了Dockerfile,我们只需要告诉docker镜像包含的一些列东西,然后它会帮我们执行相关的操作。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
基于Ubuntu基础镜像,利用Dockerfile描述镜像结构
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构,也可以直接基于JDK为基础镜像,省略前面的步骤:
当编写好了Dockerfile,可以利用下面命令来构建镜像
-t :是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
. :是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
而且可以访问,说明自定义的镜像已经部署完成
6.3 总结
镜像的结构是怎样的?
- 镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包而成。
Dockerfile是做什么的?
- Dockerfile就是利用固定的指令来描述镜像的结构和构建过程,这样Docker才可以依次来构建镜像
构建镜像的命令是什么?
- docker build -t 镜像名 Dockerfile目录
7.网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
只有在同一个网桥上的容器才能相互访问,如果在不同网桥上的容器,你发现会ping不通
如何让不同网桥实现互通呢?
解决方案:
加入自定义网络(实质就是创建自定义的网桥,让容器加入进来)的容器可以实现容器名互相访问,Docker网络命令如下:
执行
docker inspect mysql
执行
docker inspect nginx
两者处于同一个网桥,可以ping成功
如果两个网桥不同步,可以这样
docker network create xiaolin
然后让mysql容器加进来(其他容器加进来,实现同一个网桥,可以实现互通)
docker network connect xiaolin mysql
发现多了一个
如果想要避免默认分配容器ip,也可以这样
docker run -d --name demo -p 8080:8080 --network xiaolin docker-demo
8.部署Java应用
首先把相应的java父项目打包,打包完会生成对应的jar包
然后再进行dockerfile文件的编写
然后把这两个放在同一个目录下
执行
docker build -t hm-service .docker run -d --name hm -p 8080:8080 hm-servicedocker logs -f hm
这样就完成部署和启动项目了
9.部署前端代码
需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network xiaolin \
nginx
然后可以进行前后端联调
10.DockerCompose
10.1 DockerCompose定义
Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
其实DockerCompose就是可以进行多个容器同时进行docker run ,只不过是它有自己的语法,
如果我们把前端、后端以及mysql的相关信息写到DockerCompose就可以实现一键开启,一键结束,这样避免我们一个一个容器开启的过程中遇到的错误。
10.2 相关命令
docker compose [OPTIONS] [COMMAND]
10.3 DockerCompose内容
写一个yml文件
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall
然后可以通过
docker compose up
启动文件配置的所有容器,这个行为都是自动化的,你只需要执行相关指令