Docker 笔记
Docker 介绍
Docker 的主要特点包括:
容器化(Containerization):Docker 使用 Linux 容器(LXC)技术,将软件运行环境封装在轻量级、可移植的容器中,与系统其他部分隔离。
可移植性(Portability):Docker 容器可以在任何安装了 Docker 引擎的机器上运行,无论是物理机还是虚拟机。
自动化部署(Automated Deployment):Docker 可以通过
docker run
命令快速启动一个容器,实现应用的自动化部署。版本控制和组件重用(Version Control and Component Reuse):Docker Hub 和其他注册中心允许用户存储和共享容器镜像,实现应用组件的版本控制和重用。
微服务架构(Microservices Architecture):Docker 适合微服务架构,可以将应用分解为一组小的服务,每个服务运行在独立的容器中。
安全性(Security):容器提供了额外的隔离层,有助于提高系统的安全性。
开发、测试和生产的一致性(Consistency Across Development, Testing, and Production):Docker 容器确保了开发环境与生产环境的一致性,减少了“在我的机器上可以运行”的问题。
多租户架构(Multi-tenancy):Docker 可以在单个物理服务器上运行多个应用实例,每个实例都运行在自己的容器中,实现资源的高效利用。
Docker 的核心组件包括:
Docker 客户端和服务器(Docker Client and Server):客户端通过命令行与 Docker 守护进程进行交互。
镜像(Images):只读模板,包含运行容器所需的所有内容。
容器(Containers):镜像的运行实例,可以启动、停止、移动和删除。 ( 容器之间是相互独立的 )
Dockerfile:一种脚本,包含一系列的指令,用于自动化构建 Docker 镜像。
Docker Hub:一个服务,用于分享和管理 Docker 镜像。
Docker Compose:一个工具,用于定义和运行多容器 Docker 应用。
Docker 提供了一种快速、一致且高效的工作流,用于开发、分发和部署应用。
Docker基础
Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用
镜像是将应用所需的函数库、依赖、配置等与应用一起打包得到的
容器为每个镜像的应用进程创建的隔离运行环境 ( 容器就是运行起来一个个镜像 )
镜像仓库是存储和管理镜像的服务,DockerHub是最大的镜像仓库
部署MySQL
先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:
命令解读
docker run
: 创建并运行一个容器-d
: 让容器在后台运行--name mysql
: 给容器起个名字-p 3306:3306
: 设置端口映射-e KEY=VALUE
: 设置环境变量mysql
: 指定运行的镜像的名字
docker run -d \ # -d 后台运行
--name mysql \ # 容器名
-p 3306:3306 \ # 端口映射 宿主机端口:镜像端口
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \ # 环境变量
mysql # 镜像
镜像命名规范
镜像名称一般分两部分组成:[repository]:[tag]
。
repository
: 镜像名tag
: 镜像的版本
docker run命令中的常见参数:
-d
: 让容器后台运行--name
: 给容器命名-e
: 设置环境变量-p
: 宿主机端口映射到容器内端口
Docker基础命令
Docker最常见的命令是操作镜像、容器的命令,详见官方文档。
docker push
/docker pull
: 镜像仓库操作docker logs
/docker exec
: 容器日志与执行命令docker build
: 构建镜像docker run
/docker stop
/docker start
: 容器操作docker save
/docker load
: 镜像保存与加载docker images
/docker rmi
/docker ps
/docker rm
: 镜像与容器列表与删除常用指令:
经常使用:
docker ps -a # 列出所有的容器
docker images # 列出所有的镜像
docker run --name 容器名 -p 宿主机端口:镜像端口 -d 镜像 # 创建新的容器并且运行
docker start 容器名或者id # 运行容器
docker stop 容器名或者id # 停止容器
docker restart 容器名或者id # 重新运行容器
docker rm 容器名或者id # 删除容器
docker rmi 镜像名或者id # 删除镜像
docker ps 命令介绍:
数据卷
数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 ( 将宿主机目录和容器的目录关联起来,双向绑定 )
数据卷命令
docker volume create
: 创建数据卷docker volume ls
: 查看所有数据卷docker volume rm
: 删除指定数据卷docker volume inspect
: 查看某个数据卷的详情docker volume prune
: 清除未使用的数据卷
例子:nginx 来设置数据卷
docker run --name nginx -p 80:80 -v html:/usr/share/nginx/html -d nginx
解释:创建并且运行 nginx 容器,将 容器中的 /usr/share/nginx/html 关联到 html 数据卷中
使用 docker volume 来查看 html 数据卷和数据哪个文件关联起来
docker volume inspect html
# 结果:
[
{
"CreatedAt": "2024-06-23T18:42:19-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": null,
"Scope": "local"
}
]
docker 中所有的数据卷都是挂载到 宿主机上的 /var/lib/docker/volumes/
目录中
本地目录挂载
例子:mysql 来设置本地目录
docker run -d \
--name mysql \ # 镜像名
-p 3306:3306 \ # 端口映射
-e TZ=Asia/Shanghai \ # 环境变量
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/conf:/etc/mysql/conf.d \ #本地目录:镜像目录 (注意:本地目录必须要 / 或者 ./ 开头,否者会识别为数据卷)
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
mysql
解释:创建并且运行mysql 容器 , 将mysql 中conf.d 和 /root/mysql/conf 关联起来 .....
使用 docker inspect 容器
来查看容器详细信
docker inspect mysql
# 挂载情况
"Mounts": [
{
"Type": "bind",
"Source": "/root/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/mysql/init",
"Destination": "/docker-entrypoint-initdb.d",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/mysql/conf",
"Destination": "/etc/mysql/conf.d",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
将本地目录和镜像的目录关联起来来实现数据持久化保存。
自定义镜像
自定义镜像是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。
镜像分层构建(每一层都是一个镜像)的原因是:可以将复用构建好的镜像 , 在 docker 拉取镜像的时候如果发现拉取的镜像中某一层镜像在本地中已经存在就会复用这个镜像。
a2abf6c4d29d: Already exists # Already exists 镜像已存在不会再次下载
Dockerfile
Dockerfile是一个文本文件,包含指令来说明构建镜像的操作。
构建Java镜像实例
实现步骤:
上传 openjdk 镜像包到宿主机环境中
使用
docker load -i 镜像压缩
将镜像加载到docker中 (生成一个镜像)上传 Dockerfile 和 jar 到宿主机中
执行
docker build -t docker-demo:1.0 .
来构建一个镜像-t :镜像名:版本号, 可以不写默认是 latest
. : 代表 Dockerfile 文件的位置
在 openjdk 是一个基础镜像,是别人帮我们构建的运行 Java 程序的基础镜像,这个镜像中包含了 运行Java 需要的函数库和对应的环境。
网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上。
网络命令
docker network create
/docker network ls
/docker network rm
: 网络操作docker network prune
: 清除未使用的网络docker network connect
/docker network disconnect
: 容器网络连接与断开docker network inspect
: 查看网络详细信息
注意点:
默认启动的容器都会加入 一个网络中
172.17.0.1
中,但是这个网络中容器之间值不能通过 容器名来进行访问的。在创建容器的的时候就可以设置 容器进入哪个网络中,如果是自己创建出来的网络,那么容器同个网络内的容器之间是可以同容器名来进行访问的。
docker run --name dd -p 8080:8080 -d --network heima docker-demo:1.0
,创建并且运行容器,容器加入 heima 这个网络中
项目部署
部署Java应用
需求:将课前资料提供的hmall项目打包为镜像并部署,镜像名hmall。
部署前端
需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载。
DockerCompose
Docker Compose通过一个docker-compose.yml
模板文件定义一组相关联的应用容器,实现多个容器的快速部署。
version: "3.8" # 文件版本标识
services: #服务列表
mysql:
image: mysql # 镜像
container_name: mysql # 创建出来的容器名
ports: # 设置端口映射
- "3306:3306"
environment: # 设置环境变量
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes: # 数据卷映射
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks: # 加入的网络
- hm-net
hmall:
build: # 构建镜像 , 根据 Dockerflie 文件构建
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on: # 设置依赖关系 ( 控制容器创建顺序 ,被依赖的先创建 )
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks: # 设置创建出来的网络
hm-net:
name: hmall # 创建出来的网络名
docker compose命令
-f
: 指定compose文件的路径和名称-p
: 指定project名称up
: 创建并启动所有service容器down
: 停止并移除所有容器、网络ps
: 列出所有启动的容器logs
: 查看指定容器的日志stop
: 停止容器start
: 启动容器restart
: 重启容器top
: 查看运行的进程exec
: 在指定的运行中容器中执行命令
宿主机更换 ip 后容器无法访问解决方法
添加自定义网络
docker network create 网络名
解除容器的绑定的旧网络
docker network disconnect 网络名 容器名
为容器指定新的网络
d
重启容器
docker restart 容器名
查看信息(检查网络是否添加成功了)
docker inspect 容器名