提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Docker基础学习笔记
数据卷
数据卷是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器内产生的数据。
1. 数据卷挂载
- 如何挂载数据卷?
- 在创建容器时,利用 -v 数据卷名:容器内目录 完成挂载
- 容器创建时,如果发现挂载的数据卷不存在时,会自动创建
- 数据卷的常见命令有哪些?
- docker volume ls : 查看数据卷
- docker volume rm : 删除数据卷
- docker volume inspect : 查看数据卷详情
- docker volume prune : 删除未使用的数据卷
2. 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/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
mysql
自定义镜像
之前我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?
1. 镜像的结构
- 镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。
- 因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。
2. Dockerfile语法
- 由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。
- 而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档
- Dockerfile就是利用固定的质量来描述镜像的结构和构建过程,这样Docker才可以依次来构建镜像。
- 构建镜像的命令:docker build -t 镜像名 Dockerfile 目录
网络
- 我们创建了一个Java项目的容器,而Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。
- 但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
- 所以,我们必须借助于docker的网络功能来解决这个问题。
# 1.首先通过命令创建一个网络
docker network create hmall
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 hmall bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了hmall以外,其它都是默认的网络
# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms