Docker是一种快速构建、运行、管理应用的工具。
官网:www.docker.com
官方文档:docs.docker.com
1 镜像与容器常用命令
当利用Docker安装应用时,Docker会自动搜索井下载应用镜像(Image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(Container)。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库——Docker Hub。
镜像仓库命令:
# 从镜像仓库下载镜像到本地
docker pull
# 将本地镜像推送到镜像仓库
docker push
容器命令:
# 创建并运行一个容器
docker run
-d # 让容器在后台运行
--name YOURNAME # 给容器起名,必须唯一
-p 3306:3306 # 设置端口映射,**宿主机**端口映射到容器内端口
-e KEY=VALUE # 设置环境变量
repository:[tag] # repository为镜像名,tag为镜像版本(可省略,默认为latest)
# 停止容器内的镜像(进程)
docker stop
# 启动容器内停止的镜像
docker start
# 查看当前容器中的运行状态
docker ps
# 删除容器
docker rm
# 查看容器运行日志
docker logs
# 在容器内部执行命令
docker exec
# 查看容器详情
docker inspect
本地镜像命令:
# 查看所有本地镜像
docker images
# 删除本地镜像
docker rmi
# 自定义定义本地镜像
docker build
# 将本地镜像打包成压缩文件
docker save
# 加载打包成压缩文件后的本地镜像
docker load
2 数据卷挂载
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
常用命令:
# 创建数据卷
docker volume create
# 查看所有数据卷
docker volume ls
# 删除指定数据卷
docker volume rm
# 查看某个数据卷的详情
docker volume inspect
# 清除数据卷
docker volumme prune
在执行docker run
时,可使用-v 数据卷:容器内目录
完成数据卷挂载。
当创建容器时,若挂载了数据卷且数据卷不存在,则会自动创建数据卷。
3 本地目录挂载
在执行docker run
时,可使用-v 本地目录:容器内目录
完成本地目录挂载。
本地目录必须以“/
”或“./
”开头,若直接以名称开头,会被识别为数据卷而非本地目录
4 Dockerfile构建镜像
镜像是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程即为将上述文件打包的过程。
镜像结构:
- 入口 (EntryPoint):镜像运行入口,一般是程序启动的脚本和参数
- 层(Layer):添加安装包、依赖、配置等每次操作都形成新的一层
- 基础镜像(Baselmage):应用依赖的系统函数库、环境、配置、文件等
Dockerfile是一个包含一系列指令(Instruction)的文本文件,用于说明要执行什么操作来构建镜像。将来Docker可以根据Dockeifile帮助构建镜像。
官方文档:docs.docker.com/engine/reference/builder
常见指令如下:
FROM
:指定基础镜像。- 【例】
FROM centos:6
- 【例】
ENV
:设置环境变量,可在后面指令使用。- 【例】
ENV key value
- 【例】
COPY
:拷贝本地文件到镜像的指定目录。- 【例】
COPY ./jrell.tar.gz /tmp
- 【例】
RUN
:执行Linux的shel1命令,一般是安装过程的命令。- 【例】
RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path
- 【例】
EXPOSE
:指定容器运行时监听的端口,是给镜像使用者看的。- 【例】
EXPOSE 8080
- 【例】
ENTRYPOINT
:镜像中应用的启动命令,容器运行时调用。- 【例】
ENTRYPOINT java -jar xx.jar
- 【例】
可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
亦可直接基于JDK为基础镜像,省略前面的步骤:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 拷贝jar包
COPY docker-demo.jar /app.jar
#入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
编写好dockerfile后,可利用如下命令来构建镜像:
docker build -t myImage:1.0 .
-t
:给镜像起名,格式依然同docker run
.
:指定在当前目录构建(与dockerfile同目录)
5 容器网络互联
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
docker network create
:创建一个网络docker network ls
:查看所有网络docker network rm
:删除指定网络docker network prune
:清除未使用的网络docker network connect
:使指定容器连接加入某网络docker network disconnect
:使指定容器连接离开某网络docker network inspect
:查看网络详细信息
6 Docker Compose
Docker Compose通过一个单独的docker-compose.yml
模板文件(YAML格式)来定义一组相关联的应用容器,帮助实现多个相互关联的Docker容器的快速部署。
【例】如下所示,一个项目(Project)分为若干服务(Service)
version: "3.8"
services:
containerA:
image: A
container_name: A
ports:
- "11:11"
containerB:
image: B
container_name: B
ports:
- "22:22"
containerC:
image: C
container_name: C
ports:
- "33:33"
docker compose的命令格式如下:
docker compose [Options] [Commands]
Options
:-f
:指定compose文件的路径和名称-p
:指定project名称
Commands
:up
:创建并启动所有service容器down
:停止并移除所有容器、网络ps
:列出所有启动的容器logs
:查看指定容器的日志stop
:停止容器start
:启动容器restart
:重启容器top
:查看运行的进程exec
:在指定的运行中容器中执行命令