持续更新,用到哪里更新哪里
参考学习文档
Docker基础学习:https://docs.docker.com/
Docker基础命令学习:https://docs.docker.com/engine/reference/commandline/cli/
部署流程使用的Docker命令
# 打包命令
docker build -t <image-name> .
#导出镜像
docker save -o xxx.tar <image-name>
#导入镜像
docker load-i xxx.tar
#启动命令
docker run
#后台运行
-d
# 绑定数据卷 /var/logs:/var/logs
-v
# 启动名称
--name
# 绑定端口 参数格式 8080:8080
-p
# 网络模式
--net
`docker --net` 是 Docker 命令中的一个选项,用于指定容器的网络模式。
常见的网络模式包括:
- `bridge`(默认模式):Docker 会为容器创建一个新的网络栈,并连接到 Docker 内部的默认网桥。
- 示例:`docker run --net bridge my_image`
- `host`:容器将直接使用主机的网络栈,与主机共享网络。
- 比如:`docker run --net host my_image`
- 这种模式下,容器可以直接访问主机的网络资源,端口也会与主机共用。也可以使用host文件中的内容
- `none`:容器将没有任何网络连接。
- 例如:`docker run --net none my_image`
- 这种模式常用于需要完全自定义网络配置的场景。
选择合适的网络模式取决于您的具体需求和应用场景。
比如,如果您希望容器与主机网络完全融合,方便访问主机的网络资源,就可以选择 `host` 模式;
如果希望容器有独立的网络环境且与其他容器隔离,默认的 `bridge` 模式可能更合适;
而 `none` 模式则适用于对网络有特殊定制需求的情况。
# 指定启动平台
--platform
Docker 支持使用 --platform 选项来指定镜像的目标平台,从而在不同平台上运行容器。
例如,如果你想要在一个x86_64架构的系统上运行一个为ARM64架构构建的容器,你可以使用如下命令:
--platform=linux/arm64
这里的 linux/arm64 是目标平台的标识符,表示容器运行在基于Linux的ARM64架构上。
请确保你的Docker版本至少为19.03,这是添加对多平台构建支持的版本。
如果你的Docker版本较旧,可能需要更新到一个支持多平台构建的版本。
构建不同平台架构用docker 官方提供的构建工具buildx组件,下面有详细的介绍
# 查看镜像支持平台
docker inspect --format='{{.Os}}/{{.Architecture}}' <image-name>
buildx组件
Docker Buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 Buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 arm 架构,而无需手动操作多个构建命令。此外,Buildx 还支持 Dockerfile 的多阶段构建和缓存,这可以大大提高镜像构建的效率和速度。
- 下图显示了涉及 Buildx 和 BuildKit 的示例构建序列。
以下是使用 Docker Buildx 的一般步骤:
启用 Buildx:
Docker 18.06 及之后的版本中,Buildx 插件直接集成到了 Docker 中,但它仍处于实验状态,需要显式开启。有临时激活和配置文件激活两种方式:
- 临时激活:在执行构建命令前添加环境变量
DOCKER_BUILDKIT=1
,例如DOCKER_BUILDKIT=1 docker buildx build -t 镜像:标签 --platform linux/arm64
。 - 配置文件激活:编辑
/etc/docker/daemon.json
文件,添加配置{ "experimental":true }
。
安装 qemu-user-static:
qemu-user-static 用于模拟多平台环境,它依赖于 binfmt-support,所以需要安装这两者。例如在 Ubuntu 系统中,可以使用以下命令安装:sudo apt install -y qemu-user-static binfmt-support
。
通知 Docker 使用 qemu:
执行命令docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
。
创建 buildx 构建容器:
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx inspect --bootstrap
当初始化成功,会拉下来 moby/buildkit:buildx-stable-1 的镜像,并启动构建容器。
调整 Dockerfile 接收平台相关参数:
为确保构建容器能拉取到正确平台的基础镜像,可显式在FROM
后指定平台参数targetplatform
或buildplatform
,由 Buildx 自动传递。例如:FROM --platform=$targetplatform 基础镜像名:tag
。
构建并推送镜像:
可以选择构建并直接推送到指定仓库,或构建并导出到本地 Docker 镜像中。
- 构建并直接推送到指定仓库:
docker buildx build -t 镜像仓库地址/镜像名:标签 --platform linux/amd64,linux/arm64 --push
。 - 构建并导出到本地:
docker buildx build -t 镜像仓库地址/镜像名:标签 --platform linux/arm64 --load
。注意,命令中的点表示构建上下文位置为当前目录。另外,导出到本地只能构建一个镜像,本地不支持同时导出 manifest lists。导出的镜像如果与当前运行环境平台不同,是无法直接启动的,可以导出(docker save
)传输到合适的平台上运行。
Buildx 的应用场景包括但不限于以下几个方面:
- 跨平台开发:可以在一个构建过程中同时构建多个平台的镜像,方便开发人员在不同平台上进行开发和测试。
- 跨平台部署:能够将多个平台的镜像一次性推送到 Docker 仓库,简化了跨平台部署的过程。
- 节省存储空间:避免为每个平台单独创建和推送镜像,节省了存储空间和带宽。
常用命令
命令 | 说明 |
---|---|
docker pull | 拉取镜像 |
docker push | 推送镜像到DockerRegistry |
docker images | 查看本地镜像 |
docker rmi | 删除本地镜像 |
docker rmi -f $(docker image -a -q) | 删除本地全部镜像 |
docker run | 创建并运行容器(不能重复创建) |
docker stop | 停止指定容器 |
docker start | 启动指定容器 |
docker restart | 重新启动容器 |
docker rm | 删除指定容器 |
docker ps | 查看容器 |
docker logs | 查看容器运行日志 |
docker exec | 进入容器 |
docker save | 保存镜像到本地压缩文件 |
docker load | 加载本地压缩文件到镜像 |
docker inspect | 查看容器详细信息 |
用一副图来表示这些命令的关系:
默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
数据卷相关命令
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 清除数据卷 |
网络相关命令
Docker 网络命令相关文档:https://docs.docker.com/engine/reference/commandline/network/
常见命令有:
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
# 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.让db和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall db
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it db 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
总结:
- 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- 在同一个自定义网络中的容器,可以通过别名互相访问