Docker 使用手册
什么是 Docker?
docker 是世界领先的软件容器平台。
什么是容器?
容器就是将软件打包成标准化单元,以便于开发、交付和部署。
Docker 的三个基本概念
- 镜像:包含容器运行时所需的所有环境信息
- 容器:镜像运行时的实体
- 仓库:集中存放镜像的地方。Docker 官方仓库:https://hub.docker.com/
Docker 镜像加速
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://你的ID.mirror.aliyuncs.com
进入阿里云控制台->产品与服务->容器服务->容器镜像服务->镜像工具->镜像加速器页面,获取镜像加速地址
- 七牛云加速器:https://reg-mirror.qiniu.com
"registry-mirrors": [
"https://xxx.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com"
]$ docker info
Registry Mirrors:
https://xxx.mirror.aliyuncs.com/
https://docker.mirrors.ustc.edu.cn/
https://hub-mirror.c.163.com/
https://reg-mirror.qiniu.com/Docker 常用命令
系统命令
docker version查看 docker 版本docker info查看 docker 信息docker stats实时显示各个容器的资源利用率
镜像命令
docker images或docker image ls查看所有已下载的镜像docker image prune清理临时的、没有被使用的镜像文件docker search mysql搜索镜像docker pull mysql:5.7从仓库下载镜像docker rmi mysql:5.7/镜像id删除镜像docker tag 镜像id/镜像名:标签 新镜像名:新标签为镜像添加新标签
从镜像中启动一个容器
docker run [option] 镜像名:标签/镜像id command
-d:后台模式启动容器-i:允许你对容器内的标准输入进行交互,进入交互模式-t:在新容器内指定一个伪终端或终端。在终端输入exit退出容器返回宿主。-p 8080:8080:对宿主机端口与容器内端口进行映射。第一个端口为宿主机端口,第二个端口为容器内端口。默认绑定 TCP 端口。如果要绑定 UDP,在端口后加
/udp,如:-p 8080:8080/udp-P:容器内部端口随机映射到宿主机端口--name 自定义名称:设置容器的名称-v 宿主目录路径或数据卷别名:容器目录路径:创建一个数据卷,实现宿主与容器间的文件共享。如果不提供别名,则为匿名数据卷,匿名数据卷,默认挂载在宿主机的/var/lib/docker/volumes/容器local值/_data目录下。使用数据卷时,数据卷的宿主位置如下:
- linux 版:/var/lib/docker/volumes
- windows 版:\\wsl$\docker-desktop-data\data\docker\volumes
comand:在启动的容器里执的命令--rm:容器退出时自动删除容器-h hostname:定义容器主机名-dns=IP_ADDRESS:添加容器的 DNS 服务器到容器的/etc/resole.conf 中-dns-search=DOMAIN:添加容器的 DNS 搜索域到容器的/etc/resole.conf 中--newwork 网络名称:将容器连接到指定网络-e key=value:设置环境变量--restart=value:用于指定自动重启 docker 的策略。包含 4 个选项:no:默认值,表示不自动重启。on-failure[:times]:若容器退出状态为 0 即失败,则重启。times 表示重启次数,若超过次数则放弃重启。always:容器退出时总是重启。unless-stopped:容器退出时总是重启,但不考虑 docker 守护程序启动时已经停止的容器。
容器命令
docker ps -a查看所有容器docker ps查看所有正在运行的容器docker rm 容器id/容器名删除容器
docker start 容器id/容器名启动容器docker stop 容器id/容器名停止容器docker restart 容器id/容器名重启容器docker kill 容器id/容器名直接杀死指定的容器
docker logs 容器id/容器名查看容器内的标准输出docker top 容器id/容器名查看容器内运行的程序docker inspect 容器id/容器名查看容器的详细信息docker cp 容器id:源地址 目标地址从 docker 中复制文件到宿主,也可以反过来
创建镜像
构建镜像得两种方式
- 在现有容器中更新镜像,将容器提交为镜像。
- 通过 Dockerfile 文件构建一个新镜像。
1. 更新现有镜像
docker exec -it 容器id/容器名 /bin/bash进入容器内部,修改容器的内容。docker commit -m "描述信息" -a "镜像作者" 容器id/容器名 镜像名:标签将容器打包成一个镜像docker save 镜像名:镜像标签 -o 文件名.tar将镜像导出为一个.tar格式的文件docker load -i 文件名.tar向 docker 导入一个.tar格式的镜像文件
2. 构建新镜像
- 编辑 Dockerfile 文件,指定基础镜像,指定维护信息,添加指令。
- 根据 DockerFile 文件构建镜像,执行命令:
docker build -t 镜像名:镜像标签 DockerFile文件的绝对路径-t:指定要创建的目标镜像名和镜像标签DockerFile文件的绝对路径:上下文路径。在构建镜像时,整个目录会被打包发送 docker 引擎。
Dockerfile 指令详解
FROM:指定定制镜像的基础镜像。RUN:用于执行命令行命令或运行可执行文件,在docker build时运行。COPY:从上下文路径复制文件或目录到容器内,第一个参数是你想复制的文件,第二各参数指示复制到的路径。ADD:从上下文路径复制 tar 压缩文件到容器内并自动解压。主要用于复制压缩文件。CMD:用于执行命令行命令或运行可执行文件,在docker run时运行。程序运行结束,容器也会终止。若 Dockerfile 中存在多个CMD指令,则只有最后一个生效。CMD 指令可被docker run命令行的command参数覆盖。ENTRYPOINT:声明命令行要执行的命令和执行命令所需要的形参,相当是于声明了一个函数。在docker run时,通过command将实参传入到形参。ENV:定义环境变量,后续的指令可以使用这个环境变量。以键值对形式定义。ARG:定义构建参数,在docker build的过程中有效。以键值对形式定义。VOLUME:定义匿名数据卷EXPOSE:声明端口。在docker run -P时会随机将宿主端口映射到EXPOSE声明的端口。WORKDIR:指定工作目录,如果目录不存在,则为自动创建。之后构建工作的每一层的当前目录都是指定的目录。USER:指定执行后续指令使用的用户和用户组。用户和用户组必须提前创建好。HEALTHCHECK:指定某个程序或指令,用于监控容器服务的运行状态。ONBUILD:ONBUILD指令在本次构建镜像时不会被执行。当用新 Dockerfile 使用之前构建好的镜像为基础镜像时,才会被执行。LABEL:用来给镜像添加一些元数据,以键值对形式定义。
容器互联
Docker Network
除了可以使用端口映射的方式实现容器间的网络互联,还可以使用 docker network 系统将多个容器连接在一起,共享连接信息。
创建网络
创建一个 docker networkdocker network create -d bridge 网络名
-d:指定 Docker 网络类型,有 bridge、overlay。
容器连接到网络
运行一个容器并连接到指定 networkdocker run -itd --network 网络名 容器名
将一个容器连接到网络docker network connect 网络名 容器名
断开容器网络
将容器从网络断开docker network disconnect 网络名 容器名
容器仓库
Docker 官方维护了一个公共仓库 Docker Hub,上面提供了很多公共镜像。也可在https://hub.docker.com/上注册账号,免费申请个人仓库,个人仓库可以定义公共仓库和私人仓库。docker login登录远程仓库,按提示输入账号密码docker logout退出远程仓库docker pull 镜像名:镜像标签从远程仓库下载镜像docker push 镜像名:镜像标签推送镜像到远程仓库
Docker Secrets
用于存储需要加密的信息。加密信息默认放在容器的/run/secrets/目录下。
Docker Compose
Docker Compose 是用于定义和运行多个容器的工具。通过 yml 文件配置应用程序所需要的服务。使用命令从 yml 文件中创建并启动所有服务。
比如一个应用程序需要用 web 服务和 redis 服务,将提供 web 服务的镜像和提供 redis 服务的镜像配置到 yml 文件中,再添加服务端口、数据卷等其他信息,通过命令从 yml 文件中创建并启动所有服务。
Docker Compose 自动为每个项目目录创建默认网络,并将其命名为<project_name>_default,其中 <project_name> 是你当前的项目名称。如果你没有指定项目名称,则默认为当前文件夹的名称。例如,如果你的项目名称为 myapp,则默认的网络名称为 myapp_default。如果您手动指定自定义网络,则可以为网络指定任何名称。
Docker Machine
Docker Machine 用于集中管理多台 Docker 主机,通过管理节点在大量主机上安装 Docker 引擎和 Docker 客户端。
Docker Swarm 集群管理
Docker Swarm 是 Docker 的集群管理工具,将 Docker 主机池虚拟为一个 Docker 主机,通过管理节点对 Docker 集群进行管理。
更新容器内的时间方法
首先要明白读取时间的原理,jdk 读取 linux 系统时间步骤:
- 先找“TZ”变量,没有,到 2
- 读
/etc/timezone,没有到 3 - 比较
/etc/localtime文件与/usr/share/zoneinfo目录下所有时区文件,如果有一致的,就为该时区,如果没有,到 4 - 默认为标准 GMT
容器生成前
在 dockerfile 中设置环境变量 TZ
ENV TZ=Asia/Shanghai容器生成后
#修改时区配置
docker cp /etc/timezone 【容器id或name】:/etc/timezone
#修改时间配置
docker cp /etc/localtime 【容器id或name】:/etc/localtime