1. Docker和虚拟机的差异
Docker是一个系统进程,虚拟机是在操作系统中的操作系统。
Docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。
Docker的镜像默认存放目录为 /var/lib/docker
2. Docker的常用命令
2.1 镜像操作
- 从远端拉取镜像:
docker pull 镜像名<:tags>
- 查看本地所有镜像:
docker images
- 根据id删除镜像:
docker image rm <-f> 镜像id
- 根据镜像名删除镜像:
docker image rm <-f> 镜像名<:tags>
- 删除镜像简写:
docker rmi <-f> 镜像名<:tags>
2.2 容器操作
- 创建并启动容器:
docker run <-d> <-p> 镜像名<:tags>
,当镜像不存在时,会首先拉取镜像
- 端口映射(-p 参数):
docker run -p 宿主机端口:镜像内部端 镜像名<:tags>
- 后台运行(-d 参数):
docker run -d 镜像名<:tags>
- 查看当前运行的镜像:
docker ps
- 停止容器:
docker stop 容器id
- 删除容器:
docker rm <-f> 容器id/容器names
- 批量删除容器:
docker rm -f $(docker ps -qf status=exited)
当使用镜像名进行操作时,如果不指定镜像tags默认为
latest
版本
镜像操作可以添加多个镜像,如docker rmi -f tomcat nginx
3. 拉取并运行tomact容器
docker pull tomcat
docker run tomcat
-
docker run -d -p 8000:8080 tomcat
因为启动后的容器无法在宿主机上直接访问,需要进行端口映射,将宿主机的8000端口映射到容器的8080端口
4. 在容器中执行命令
docker exec [-it] 容器id 命令
-
-it
采用交互式的方式执行命令 -
/bin/bash
会开启一个接受命令的终端,一定要配合-it
参数
例:
docker exec bc87e71f2542 ls
docker exec -it bc87e71f2542 /bin/bash
5. Dockerfile构建镜像
5.1 Dockerfile
Dockerfile 是一个用于组合镜像命令的文本文档,Docker通过读取Dockerfile文档中的步骤命令,自动生成镜像。
docker build -t 机构/镜像名<:tags> Dockerfile目录
-
FROM tomcat:latest
指定基准镜像 -
MAINTAINER yang
说明当前自定义镜像的拥有者 -
WORKDIR /usr/local/tomcat/webapps
切换工作目录,不存在则创建 -
ADD docker-web ./docker-web
将宿主机Dockerfile同级目录下的docker-web下的所有内容复制到容器的目录下,容器中目录不存在则创建
5.2 镜像分层
镜像创建后为只读,Dockerfile中的每一行命令都会生成对应的步骤,每一步都会生成一个临时容器,直到最后一步完成,构建成功;
系统快照,以临时容器体现,加快镜像构建速度,节省资源;
容器创建后,容器内部可读可写;
6. Dockerfile基本命令
6.1 FROM
FROM指定基准镜像,尽量使用官方提供的基准镜像
例:
FROM centos
将centos:latest作为基准镜像FROM scratch
不依赖任何基准镜像
6.2 MAINTAINER & LABEL 说明信息
MAINTAINER yang
维护这个Dockerfile的个人或机构LABEL version = "1.0"
描述性信息,不影响功能LABEL description = "测试"
描述性信息,不影响功能
6.3 WORKDIR 设置工作目录
如果目录不存在会自动创建,尽量使用绝对路径
WORKDIR /usr/local
WORKDIR /usr/local/newdir
6.4 ADD & COPY 复制文件
将宿主机文件复制到镜像中,如果目录不存在则会创建,如果是压缩文件则自动解压缩;也可以将远程文件进行复制
COPY app ./webapps
将宿主机文件复制到容器内的./webapps
目录下ADD test.tar.gz ./
自动解压缩并复制到当前目录
6.5 ENV 设置环境常量
使用环境常量可以提高代码的可维护
定义了环境常量后,在Dockerfile后边的命令中便可以使用${常量名}的方式进行访问,在位置变后,只需要修改环境常量的值即可
ENV JAVA_HOME /usr/local/jdk
配置JAVA_HOME
的地址RUN ${JAVA_HOME}/bin/java -jar test.jar
使用JAVA_HOME
环境变量
7. Dockerfile运行指令
运行命令主要用于支持用户在镜像构建或容器创建时可以在镜像或容器内部执行各种命令
7.1 RUN
docker build 在Build构建时执行命令,调整镜像内部的文件,有以下两种格式
RUN java -jar test.jar
shell命令格式,使用shell执行,当前shell是父进程,生成一个子进程执行脚本,子进程shell执行结束后,退出子进程,回到当前shell
RUN ["java","-jar","test.jar"]
exec命令格式(官方推荐),会使用exec进程替换当前进程,pid保持不变,执行完毕直接退,并不会退回到之前的进程
7.2 ENTRYPOINT启动命令
docker run 容器内执行命令,容器启动时执行命令
- 如果写了多行ENTRYPONIT只有最后一行会被执行
- 推荐使用exec命令格式
7.3 CMD默认命令
docker run 容器内执行命令,容器启动后执行默认的命令或参数,用于设置默认执行命令
- 出现多个CMD则只有最后一个会被执行
- 如果容器启动时附加指令,则CMD被忽略
- 推荐使用exec格式
- 可在启动时从外界传参
7.4 ENTRYPONIT 和 CMD同时使用
同时使用时ENTRYPOINT的最后一行和CMD的最后一行会合并执行
如:ENTRYPOINT ["ls"]
CMD ["-a"]
CMD ["-h"]
按顺序执行后,在未进行外部传参的情况下,最终的效果为ls -h