Docker & Dockerfile

CY 2019年03月07日 953次浏览

这篇笔记来总结一些常用的Docker命令的使用方法,Dockerfile指令的一些作用

安装Docker就不说了,网上教程太多,主要就是两种方式,一种是通过yum安装,一种是通过脚本来安装,推荐使用通过脚本来安装,因为方便。

Docker的一些概念

网上对于Docker的概念介绍已经特别多了,Docker基本上只需要知道下面几个概念就可以了:

镜像:相当于把一套运行环境打包了,形成了一个镜像,比如说装系统用的ISO文件,就是一个镜像

容器:把镜像运行起来就是容器,类似于正在使用中的Windows

仓库:保存Docker镜像的地方,比如说Docker官方仓库里面可以搜索到Docker的镜像,也可以保存自己构建的镜像

Dockerfile:用来构建Docker镜像的一个文件

镜像tar文件:把Docker镜像导出形成的tar文件,也可以通过tar文件导入镜像

引用free-coder的一张图,bilibili视频av58402749

Docker的概念.png

Docker命令总结

可以使用Play With Docker来在线体验这些命令

查找镜像,最多一次返回25个结果

docker search 镜像名

-s, --stars一个数字,用来规定镜像的最低星级

更详细的docker seach命令的查看

docker pull

从镜像仓库中拉取(下载)镜像到本地

docker pull 镜像名:标签名

​ 例如:docker pull nginx来下载一个nginx镜像,如果不加标签名,默认相当于:docker pull nginx:latest

更详细的docker pull命令的查看

docker push

推送镜像到仓库中

docker push 镜像名

在使用docker push前要学会如何在本地构建出docker镜像,请看下面的构建镜像部分

更详细的docker push命令的查看

docker images

查看当前机器上Docker已经下载的镜像

docker images -a

--all , -a:查看所有的镜像,包含中间层镜像

--filter , -f:一个数组,过滤要显示的列表

--no-trunc:不适用截断容器id的形式显示,言下之意就是显示全镜像id

--quiet , -q:只返回镜像id

更详细的docker images命令的查看

docker info

查看docker的信息,存储驱动,存储的位置等

docker info

更详细的docker info命令的查看

docker run

运行镜像,创建一个容器,如果没有该镜像,则会自动下载

docker run 镜像 [命令] [参数]

例如:docker run ubuntu echo 'Hello Word'启动一个ubuntu容器并且执行一个echo命令

其中的参数

  • -d使用守护进程运行(后台运行)

    例如:docker run -d nginx

  • -p 宿主机端口:容器端口将宿主机端口和容器端口进行映射

    例如:docker run -d -p 80:80 nginx,注意,宿主机的端口号指定不能重复,容器的端口可以重复

    比如说docker run -d -p 80:80 nginxdocker run -d -p 81:80 nginx是可以同时存在的

    但是docker run -d -p 80:80 nginxdocker run -d -p 80:81 nginx是不能同时存在的

  • -i为容器始终打开标准输入

  • -t为Docker容器提供一个伪tty终端

    通常-i-t同时使用,目的是启动一个交互式的容器(可以通过命令行控制容器内部)

    例如:docker run -i -t ubuntu /bin/bach

  • --rm:关闭容器后自动删除该容器

  • --volume , -v:将容器中的文件映射到宿主机上,容器运行时使用宿主机中的文件

  • --link--link [容器ID|容器名字]:别名将某个容器的IP地址以别名的方式添加到目标容器的hosts文件中

  • --name: 定义启动的时候容器的名字,多个容器的名字不能相同,如果不指定,Docker会自动给一个容器名字

  • --env , -e: 设置环境变量,比如说安装MySQL的时候可以设置用户名和密码

Ctrl + P / Ctrl + Q 可以让容器后台运行,可以结合docker attach来再次进入

更详细的docker run命令的查看

docker port

查看容器端口的映射情况,显示的时候容器端口 -> 宿主机端口

docker port 容器ID

更详细的docker port命令的查看

docker cp

将宿主机和容器中的文件互相拷贝

docker cp 6dd4380ba708:/etc/nginx/nginx.conf ~/nginx/conf

更详细的docker cp命令的查看

docker logs

查看容器日志

docker logs -f --tail 0

--follow , -f实时的显示容器日志

--timestamps , -t在容器日志每一行前面添加一个日志时间

--tail默认值为all,可以规定一个数字,来规定显示最新的几条

妙用

-f--tail 0的结合使用可以显示最新的日志

更详细的docker logs命令的查看

docker top

可以查看运行中容器的进程

docker top [容器ID|容器名字]

更详细的docker top命令的查看

docker attach

让在后台运行的应用再次切换到前台运行

docker attach [容器ID|容器名字]

更详细的docker attach命令的查看

docker stop

停止一个容器,发出停止信号,等待容器的停止

docker stop [容器ID|容器名字]

更详细的docker stop命令的查看

docker kill

直接停止一个容器,暴力停止

docker stop [容器ID|容器名字]

更详细的docker kill命令的查看

docker start

重新启动已经被停止了的容器

docker start 容器ID

使用方法

docker start -i [容器名|容器ID]

其中的参数

-idocker run中的-i参数作用一样

更详细的docker start命令的查看

docker restart

重新启动一个或多个容器

docker restart 容器ID 容器ID ...

更详细的docker restart命令的查看

docker ps

查看已经运行的容器

docker ps -a

-a 列出所有的容器

-l 列出最新创建的同期

更详细的docker ps命令的查看

docker inspect

对容器进行检查,并且返回容器的很多配置信息,配置信息使用JSON的形式返回

既支持容器的查看也支持镜像的查看

docker inspect

更详细的docker inspect命令的查看

docker save

将镜像保存为tar文件

docker save 容器id > 文件名.tar

更详细的docker save命令的查看

docker load

将tar文件加载成为镜像

docker load < 文件名.tar

更详细的docker load命令的查看

docker exec

在正在运行的容器中启动一个新的进程

docker exec -d -i -t [容器名|容器ID] [命令] [参数]

-d -i -tdocker run中的参数意思一样

更详细的docker exec命令的查看

docker rm

删除容器(只能删除已经停止的容器,不能删除正在运行中的容器)

docker rm 容器ID

--force , -f如果容器没有停止,可以使用这个参数进行强制删除

更详细的docker rm命令的查看

docker rmi

删除镜像,可以一次填写多个镜像名称

docker rmi 镜像ID

妙用

删除所有镜像docker rmi $(docker images ubuntu -q)

-f :强制删除

更详细的docker rmi命令的查看

更多命令的查看

man docker命令可以查看docker的其他命令的详情使用信息

Docker构建镜像

Docker构建镜像后可以使用docker push推送到docker仓库中

Docker构建镜像的方式有两种:

docker commit(通过容器的方式构建)

docker build(通过Dockerfile的方式构建)

docker commit

提交一个容器,使其成为镜像

使用方法

docker commit -a 'CY' -m '修改了Nginx容器的配置' [容器名|容器ID] codelunatic/change_nginx

参数说明

--author , -a指定镜像的作者

--message , -m指定镜像的注释信息

--pause , -p提交镜像的时候默认暂停,可以使用该命令设置为不暂停(false)

更详细的docker commit命令的查看

docker build

通过Dockerfile构建出镜像

一般使用方法:docker build -t="镜像名" Dockerfile文件所在目录(当前目录为.)

docker build -t "springmvc_demo" .

--tag , -t指定构建镜像的标签名

--rm成功构建后删除中间容器,默认值为true

--quiet , -q静静的构建

--pull构建的时候始终下载较新版本的镜像

--no-cache构建镜像的时候不适用缓存(第一次构建留下来的中间层镜像就属于缓存)

--force-rm总是强制删除中间层容器

更详细的docker build命令的查看

Dockerfile指令

Dockerfile中的注释使用#

  • FROM:使用方法

    FROM <image>:<tag>
    

    这里指定的镜像必须是一个已经存在的镜像,后面的指令都会基于这个镜像来执行,必须是第一行非注释指令

    更多FROM指令信息 中文

  • MAINTAINER (已经不推荐使用)

    指定镜像的作者信息,包含镜像的所有者和联系信息

    MAINTAINER CY
    

    更多MAINTAINER 指令信息

  • RUN

    指定了当前镜像中运行的命令,可以是shell形式和exec形式

    shell形式:

    RUN echo hello
    

    exec形式:

    RUN ['/bin/bash', '-c', 'echo hello']
    

    注意每运行一个RUN指令就会产生一个镜像,所以尽量要做到RUN后面的命令”惜字如金“

    更多RUN指令信息 中文

  • EXPOSE

    指定运行该镜像的容器所使用的端口

    使用方法:

    EXPOSE <post> [<port>...]
    

    更多EXPOSE指令信息 中文

  • CMD

    用来提供容器运行的默认命令(默认行为),与RUN类似,RUN在容器构建时运行,CMD在容器运行时运行

    例如容器启动的时候运行Nginx:

    CMD ["nginx", "-g", "daemon off;"]
    

    如果使用docker run运行一个容器的时候指定了命令,那么CMD中的命令会被覆盖

    CMD指令除了RUN指令的两种形式外,还提供了了一个参考的形式

    CMD ["param1", "param2"]
    

    这样就可以作为ENTRYPOINT指令的默认参数了

    更多CMD指令信息 中文

  • ENTERYPOINT

    和CMD的区别就是不会被docker run指定的命令覆盖,如果要覆盖,需要使用下面命令

    需要注意的是docker run指定的命令并不会执行

    docker run --entrypoint
    

    更多ENTERYPOINT指令信息 中文

  • COPY

    拷贝文件到容器中

    COPY hom* /mydir/
    COPY hom?.txt /mydir/
    

    更多COPY指令信息 中文

  • ADD

    和COPY的区别,文件会自动解压缩,可以将一个URL链接中的文件复制到目标文件夹中

    ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
    ADD test /absoluteDir/         # adds "test" to /absoluteDir/
    

    更多ADD指令信息 中文

  • VOLUME

    定义匿名卷

    更多VOLUME指令信息 中文

  • WORKDIR

    规定容器的工作目录

    更多WORKDIR指令信息 中文

  • ENV

    设置环境变量

    更多ENV指令信息 中文

  • ARG

    设置环境变量,和ENV很类似,区别就是ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。

    更多ENV指令信息 中文

  • USER

    指定当前用户

    更多USER指令信息 中文

  • ONBUILD

    如果有在当前镜像的基础上构建的其他镜像的时候,会先执行ONBUILD后面指定的Dockerfile命令

    ONBUILD后面的指令不在当前镜像中执行

    更多ONBUILD指令信息 中文