docker使用手册
安装
docker 指令
常用
# 从官方仓库中拉取镜像示例
docker pull nginx:tag
# 登录到私有仓库
docker login ip:port
# 登录到私有仓库(https)
docker login -u myuser -p mypassword ip:port
# 从私有仓库中拉取/推送镜像示例;推送时推荐用docker tag打一个比较有辨识度的标签
docker pull/push ip:port/some_url/myImage:tag
# 添加标签,实际没有创建镜像,相当于在源镜像上创建了一个软连接
docker tag nginx:latest zjx/mynginx:0.0.1
# 显示所有镜像,包括运行中和已停止的
docker images -a
# 显示所有容器
docker ps -a
# 以交互的方式进入指定容器,其中bash是/bin/bash的简写
docker exec -it 容器ID bash
# 删除虚悬镜像
docker image prune
# 暂停/恢复容器
docker pause/unpause nginx:latest
# 停止所有正在运行的容器
docker stop $(docker ps -q)
# 启动所有容器( -q 选项只返回容器ID)
docker start $(docker ps -a -q)
# 删除所有镜像( -q 选项只返回容器ID)
docker rmi $(docker images -q)
# 删除所有容器(-f 强制删除;-v 删除挂载的数据卷)
docker rm -fv $(docker ps -aq)
# 使用Dockerfile构建镜像,-t指设置标签
docker build -t myapp:v1.0 /path/to/Dockerfile
# 查看各个容器内存使用情况
docker stats
# 搜索镜像
docker search --filter=is-official=true --limit 10 nginx
# 存出镜像(-output 指定目录;如果使用 -o 则为当前目录)
docker save -output /usr/local my_image_0.0.1.tar nginx:latest
# 载入镜像(-input 指定目录;如果使用 -i 则为当前目录)
docker load -input /usr/local/my_image_0.0.1.tar
# 导出容器(-output 指定目录;如果使用 -o 则为当前目录)
docker export -o my_container_0.0.1.tar 容器ID
# 导入容器
docker import my_container_0.0.1.tar my_container:v0.0.1
# 查看容器运行日志,持续输出最近的50条
docker logs nginx:latest -tail 50 -f
# 删掉无用的网络
docker network prune
# 查看容器详细信息
docker inspect 容器ID
# 拷贝文件,容器->宿主机或宿主机->容器,交换顺序即可
docker cp 容器ID:容器文件路径 宿主机目的路径
# 提交一个镜像到本机仓库
docker commit -m="我是信息" -a="我是作者" 容器ID 新镜像名:[版本]可视化面板
portainer是一个轻量级 Docker 管理 UI,可让您轻松管理 Docker 主机或 Swarm 集群。
docker-compose.yml
version: "3"
services:
portainer:
image: portainer/portainer:latest
container_name: portainer
ports:
- "9000:9000"
volumes:
- /usr/local/docker/portainer/data:/data
- /var/run/docker.sock:/var/run/docker.sock数据卷
挂载数据卷可实现宿主机和容器之间共享数据,并且数据修改是双向同步的。
挂载发生时,容器路径原有内容会被本地路径中的内容覆盖,如果想保留容器中初始内容,可以先运行一个临时容器再用 docker cp 把容器的文件复制出来,合并到本地目录;
示例
# 使用 -v 挂载数据卷 docker run -d -v /usr/local/docker/nginx:/etc/nginx nginx # 查看所有数据卷 docker volume ls分类
-v 容器内路径 # 匿名挂载,默认挂载路径在宿主机的 /var/lib/docker/volumes/XXX/_data 中 -v 卷名:容器内路径 # 具名挂载,挂载路径对应宿主机的 /var/lib/docker/volumes/卷名/_data -v 宿主机路径:容器内路径 # 指定路径挂载 -v 容器内路径:rw # 设置权限,rw容器可读可写;ro容器中只读,无法修改;
dockerfile
docker commit 可以创建一个镜像,但是不够优雅,dockerfile 可以非常方便的使用脚本构建镜像。使用 Dockerfile 构建 Java 应用镜像示例
Dockerfile 指令
指令 说明 FROM 指定基础镜像,每个 Dockerfile 以这个指令开始 MAINTAINER 作者简介 ENV 环境变量,它可以用来接收传递进容器里的参数 RUN 执行命令,每执行一次会生成一个新的镜像层,通常用于安装软件包、更新系统、设置环境变量等。 CMD 执行命令,容器启动后默认执行的命令,多个 CMD 指令只有最后一个生效。例如 CMD ["ls","-a"]会在容器启动后列出所有目录 ENTRYPOINT 执行命令,和 CMD 非常类似,唯一不同就是可以追加命令。例如 ENTRYPOINT ["ls","-a"],运行构建后的镜像,并追加一个"-l"指令: docker run 镜像 ID -l ,启动成功后就会执行 ls -a -l。 ADD 复制文件到容器,并自动解压 COPY 复制文件到容器 WORKDIR 设置容器工作目录,默认为根目录 VOLUME 指定数据卷 EXPOSE 暴露端口 一个简单的示例
environment/ ├── Dockerfile └── hello.text docker-compose.ymlFROM ubuntu:20.04 # 指定基础镜像,Dockerfile 以这个指令开始 MAINTAINER Zjx <986379932@qq.com> VOLUME ["test1","/var/test2",""] ENV MY_APP_VERSION v0.0.1 RUN mkdir -p /usr/local/test-$MY_APP_VERSION WORKDIR /usr/local/test-$MY_APP_VERSION # 设置工作目录,如不指定,默认为根目录 COPY ./hello.text . # 复制DockerFile所在目录中的hello.text到工作目录 RUN echo "Hello Dockerfile!" > hello.txt CMD echo Container started! && cat hello.text # 设置容器启动时的默认命令,只能有一个 CMD 指令,若存在多个只执行最后一个运行
shelldocker build -t my-test-app:v0.0.1 . docker run my-test-app:v0.0.1docker composeversion: "3.8" services: my-test-app: # 根据environment目录中的 Dockerfile 来启动所构建的镜像 build: ./environment restart: unless-stopped container_name: my-app
Docker 网络
每启动一个容器,就会发现系统中会多出一个网卡,它就相当于宿主机和容器之间的桥梁,可以使宿主机和容器之间建立网络连接!
安装 docker 后会默认创建 docker 0 网卡,他是容器启动默认使用的网卡,也是容器间能互相通信的桥梁。
自定义网络
使用 docker 可以非常方便管理容器间的网络通信,使用自定义网络,不同的集群使用不同的网络,可以保证集群的安全性和隔离性。
docker 中的几种网络模式:
网络模式 描述 bridge(docker 默认) 桥接,类似于局域网,各个容器有自己的网络 IP host 容器和宿主机使用同一 IP none 不配置网络 overlay 跨主机的容器网络互连 命令行示例
# 新建一个自定义网络 docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 my_net # 查看网络信息 docker network inspect my_net # 使用指定网络运行容器;-P表示绑定任意端口 docker run -d -P --name nginx01 --net my_net nginx docker run -d -P --name nginx02 --net my_net nginx # 也可以指定容器运行的IP docker run -d -P --name nginx04 --net my_net --ip 192.168.0.10 nginx # 查看所有网络 docker network ls # 测试容器间是否能互相通信;如果容器使用的是同一个网络,不管是使用容器名还是容器IP都能相互ping通 docker exec -it nginx01 ping nginx02提示
使用--link 指令也能实现容器之间的网络互通,但是只能单向通信,实际使用很少,推荐使用自定义网络;
docker run -d -P --name nginx03 --link nginx02 nginx docker exec -it nginx03 ping nginx02 # 可以ping通 docker exec -it nginx02 ping nginx03 # 不能ping通!docker compose 示例
services: xxx-1: image: xxx container_name: xxx networks: my_net: ipv4_address: 192.168.0.11 xxx-2: image: xxx container_name: xxx networks: my_net: ipv4_address: 192.168.0.12 networks: my_net: driver: bridge ipam: config: - subnet: 192.168.0.0/24
网络连通
若容器使用不同网络,默认他们之间是无法通信的,但是某些特殊情况下,我们想让不同网络中的容器互相通信,可使用 connect 指令实现。
# 假如有一个Java容器使用my_net01网络(192.168.0.0/24),一个MySQL容器使用my_net02网络(172.16.0.0/12)
# 运行下面指令,Java容器能通过IP或者容器名访问MySQL容器,但是只能单向访问
docker network connect my_net02 Java容器ID
# 再运行下面指令,这样两个不同网络的容器就能相互通信
docker network connect my_net01 MySQL容器ID在 docker 容器中安装 docker
在 Docker 容器中直接安装 Docker 通常不被推荐,这样做可能会引起一些问题和限制。 如果需要在容器内执行 Docker 命令,可以考虑使用 Docker 的远程 API 或者与宿主机共享 Docker 套接字的方式,而不是在容器内部安装 Docker 引擎。
- 与宿主机共享 Docker 套接字
挂载主机 Docker 守护程序的套接字文件docker.sock,这样容器内的 Docker 客户端就能够通过这个套接字与宿主机上的 Docker 守护程序进行通信,如容器内使用docker ps可显示主机镜像,容器内使用docker build构建镜像主机中也直接可见。
挂载套接字文件
在启动容器时挂载 Docker 守护程序的套接字文件:
docker run -v /var/run/docker.sock:/var/run/docker.sock [其他选项] [镜像名称]容器内安装 docker 客户端(docker-ce-cli)
推荐使用安装文件安装下载地址
提示
先确认 docker 容器内核配置,以便为容器安装对应版本的 docker 客户端
# 随意进入一个容器,查看内核信息 # 主要查看内核、版本名、cpu架构 docker exec -it [容器id] bash # 查看容器系统内核及版本名 cat /etc/os-release # 查看cpu架构 lscpu# 下载docker客户端(以debian内核、bullseye版本名、x86_64cpu架构为例) curl -O https://download.docker.com/linux/debian/dists/bullseye/pool/stable/amd64/docker-ce-cli_24.0.6-1~debian.11~bullseye_amd64.deb # 安装 dpkg -i ./docker-ce-cli_24.0.6-1~debian.11~bullseye_amd64.deb

