docker学习
docker是一个开源的应用容器引擎,可以在一个操作系统中抽象出多个虚拟环境,可以让那个开发者在对应的虚拟环境进行添加对应的依赖,并且不同的虚拟环境相互隔离。
可以理解一个liunx服务器是一个单独的环境,可以部署docker引擎,划分出多个不同的虚拟环境,每一个环境就是一个容器,一个容器里面的就是一个单独的环境,可以有liunx的端口号、资源等。
docker 基础知识
1. 安装docker
常见其他教程
2. image镜像、containers
image是一个镜像可以看做一个java文件
containers一个运行的容器,可以看作一个class文件。
image是我们下载到docker中的镜像,但是还没有运行,如果执行run,则运行镜像,会生成一个容器,该容器就是一个单独的环境。
docker ps 查询正在运行的容器
docker images 查询所有的镜像
3. docker中的run
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
常见OPTIONS说明:
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
如果指定了-it则会打开一个终端,输出对应程序的数据,如果关闭了窗口,则对应执行的sh命令也会关闭。
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
–name xx:指定容器名称
-v: 绑定容器中的地址,让文件地址绑定,相当于容器中的文件路径相当于宿主机上的容器路径。
-e xx=yy 设置环境变量,有些软件会读取环境变量的内容。
比如-it,运行后,当前进程会有一个交互终端,而-d则没有
–net=host
–net=host (-和-有两个)
这样会使用主机资源,也就是ip和port直接使用主机。
docker 查看容器信息
docker inspect id
docker 进入容器
docker exec -it id /bin/bash
推出:exit
dockerfile介绍
dockerfile是用来构建docker镜像的文件,也就是说如果后续自己要部署一个自定义的容器,则需要编写dockerfile,这个文件十分简单,使用DockerFile创建镜像逐渐成为企业交付的标准。
- 每一个指令必须大写字母
- 执行从上到下顺序执行
- # 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
1. 编写文件
常见指令
FROM 指明构建的新镜像是来自于哪个基础镜像
MAINTAINER 指明镜像维护者及其联系方式(姓名+邮箱)
RUN 制作镜像的时候需要运行的命令,RUN后面接linux里的命令,这个命令是在制作镜像的时候使用的
WORKDIR 镜像的工作目录,docker exec 命令执行的时候进入的目录
VOLUME 向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用
EXPOSE 指明容器运行的时候暴露的端口
ONBUILD 当构建一个被继承DockerFile的时候,就会运行ONBUILD指令,触发指令
ENV 设置镜像环境变量,这样在run的时候可以通过-e指定对应变量
ADD ADD和COPY作用相似,可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式的文件解压后复制到指定位置
COPY COPY指令用来将本地的文件或者文件夹复制到镜像的指定路径下
# 文件复制均使用 COPY 指令,在需要自动解压缩的场合使用 ADD 指令
CMD 指定这个容器启动的时候要运行的命令Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
# 如果docker run后面出现与CMD指定的相同的命令,那么CMD就会被覆盖。而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令
docker中cmd和entrypoint区别
ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数(在run的时候后面是定义为ARG的) 当 作 传 递 给ENTRYPOINT
- RUN 指令:用于指定 docker build 过程中要运行的命令。
- 注意,一个RUN指令可以运行多个命令,之间用&&符号隔开,这样只生成一层镜像层。
- CMD是启动构建映像时容器默认执行的命令。一个Dockerfile只能有一个CMD。使用docker run $image $other_command启动容器时,可以覆盖CMD。
- CMD指令可让您设置默认命令,该命令为仅在运行容器而不指定命令时执行。如果Docker容器使用命令运行,则默认命令为忽略了。如果Dockerfile具有多个CMD指令,则除最后一条以外的所有指令CMD指令将被忽略.
- ENTRYPOINT 指令:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序;但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序;
- ENV name docker ENTRYPOINT echo “Hello, $name”
- 其中$符号可以指定对应环境变量参数
- 要明白enterpoint是执行shell还是执行command命令,command命令不会被shell解析
-
使用如下格式,可以解析:ENTRYPOINT [“/bin/sh”, “-c”, “echo hello, $name”],也就是最后一个空是一个shell操作。
copy 复制文件
如果我们容器需要使用到宿主机的文件,则可以使用copy进行复制到容器中。必然我们的容器是tomcat,对应执行的war在外部容器,则可以使用copy将外部的war进行复制过来。
2. build执行镜像
docker build -f [path] -t [name].
如:docker build -f ./Dockerfile -t api-xxx:1.0.1 .
其实知识
- 如果要运行一个含有mysql容器的时候,可以创建二个dockerFile一个是mysql一个是java,这样就不需要在java中的dockerFile的mysql容器给写进来,后续可以使用服务编排docker-compose
- 在docker run的时候最后可以指定对应的命令,比如 ls -s ,比如./xxx.sh 脚本, 如果dockfile使用CMD,则会替换对应的CMD,CMD就是默认启动的命令。比如mysql启动,则dockfile有对应的CMD [mysqld]