这篇笔记来总结一些常用的Docker命令的使用方法,Dockerfile指令的一些作用
安装Docker就不说了,网上教程太多,主要就是两种方式,一种是通过yum安装,一种是通过脚本来安装,推荐使用通过脚本来安装,因为方便。
Docker的一些概念
网上对于Docker的概念介绍已经特别多了,Docker基本上只需要知道下面几个概念就可以了:
镜像:相当于把一套运行环境打包了,形成了一个镜像,比如说装系统用的ISO文件,就是一个镜像
容器:把镜像运行起来就是容器,类似于正在使用中的Windows
仓库:保存Docker镜像的地方,比如说Docker官方仓库里面可以搜索到Docker的镜像,也可以保存自己构建的镜像
Dockerfile:用来构建Docker镜像的一个文件
镜像tar文件:把Docker镜像导出形成的tar文件,也可以通过tar文件导入镜像
引用free-coder的一张图,bilibili视频av58402749
Docker命令总结
可以使用Play With Docker
来在线体验这些命令
docker search
查找镜像,最多一次返回25个结果
docker search 镜像名
-s, --stars
一个数字,用来规定镜像的最低星级
docker pull
从镜像仓库中拉取(下载)镜像到本地
docker pull 镜像名:标签名
例如:docker pull nginx
来下载一个nginx
镜像,如果不加标签名,默认相当于:docker pull nginx:latest
docker push
推送镜像到仓库中
docker push 镜像名
在使用docker push
前要学会如何在本地构建出docker
镜像,请看下面的构建镜像部分
docker images
查看当前机器上Docker已经下载的镜像
docker images -a
--all , -a
:查看所有的镜像,包含中间层镜像
--filter , -f
:一个数组,过滤要显示的列表
--no-trunc
:不适用截断容器id的形式显示,言下之意就是显示全镜像id
--quiet , -q
:只返回镜像id
docker info
查看docker的信息,存储驱动,存储的位置等
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 nginx
和docker run -d -p 81:80 nginx
是可以同时存在的但是
docker run -d -p 80:80 nginx
和docker 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 port
查看容器端口的映射情况,显示的时候容器端口 -> 宿主机端口
docker port 容器ID
docker cp
将宿主机和容器中的文件互相拷贝
docker cp 6dd4380ba708:/etc/nginx/nginx.conf ~/nginx/conf
docker logs
查看容器日志
docker logs -f --tail 0
--follow , -f
实时的显示容器日志
--timestamps , -t
在容器日志每一行前面添加一个日志时间
--tail
默认值为all,可以规定一个数字,来规定显示最新的几条
妙用
-f
和--tail 0
的结合使用可以显示最新的日志
docker top
可以查看运行中容器的进程
docker top [容器ID|容器名字]
docker attach
让在后台运行的应用再次切换到前台运行
docker attach [容器ID|容器名字]
docker stop
停止一个容器,发出停止信号,等待容器的停止
docker stop [容器ID|容器名字]
docker kill
直接停止一个容器,暴力停止
docker stop [容器ID|容器名字]
docker start
重新启动已经被停止了的容器
docker start 容器ID
使用方法
docker start -i [容器名|容器ID]
其中的参数
-i
和docker run
中的-i
参数作用一样
docker restart
重新启动一个或多个容器
docker restart 容器ID 容器ID ...
docker ps
查看已经运行的容器
docker ps -a
-a
列出所有的容器
-l
列出最新创建的同期
docker inspect
对容器进行检查,并且返回容器的很多配置信息,配置信息使用JSON的形式返回
既支持容器的查看也支持镜像的查看
docker inspect
docker save
将镜像保存为tar文件
docker save 容器id > 文件名.tar
docker load
将tar文件加载成为镜像
docker load < 文件名.tar
docker exec
在正在运行的容器中启动一个新的进程
docker exec -d -i -t [容器名|容器ID] [命令] [参数]
-d -i -t
和docker run
中的参数意思一样
docker rm
删除容器(只能删除已经停止的容器,不能删除正在运行中的容器)
docker rm 容器ID
--force , -f
如果容器没有停止,可以使用这个参数进行强制删除
docker rmi
删除镜像,可以一次填写多个镜像名称
docker rmi 镜像ID
妙用
删除所有镜像docker rmi $(docker images ubuntu -q)
-f
:强制删除
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 build
通过Dockerfile构建出镜像
一般使用方法:docker build -t="镜像名" Dockerfile文件所在目录(当前目录为.
)
docker build -t "springmvc_demo" .
--tag , -t
指定构建镜像的标签名
--rm
成功构建后删除中间容器,默认值为true
--quiet , -q
静静的构建
--pull
构建的时候始终下载较新版本的镜像
--no-cache
构建镜像的时候不适用缓存(第一次构建留下来的中间层镜像就属于缓存)
--force-rm
总是强制删除中间层容器
Dockerfile指令
Dockerfile中的注释使用#
-
FROM:使用方法
FROM <image>:<tag>
这里指定的镜像必须是一个已经存在的镜像,后面的指令都会基于这个镜像来执行,必须是第一行非注释指令
-
MAINTAINER (已经不推荐使用)
指定镜像的作者信息,包含镜像的所有者和联系信息
MAINTAINER CY
-
RUN
指定了当前镜像中运行的命令,可以是shell形式和exec形式
shell形式:
RUN echo hello
exec形式:
RUN ['/bin/bash', '-c', 'echo hello']
注意每运行一个RUN指令就会产生一个镜像,所以尽量要做到RUN后面的命令”惜字如金“
-
EXPOSE
指定运行该镜像的容器所使用的端口
使用方法:
EXPOSE <post> [<port>...]
-
CMD
用来提供容器运行的默认命令(默认行为),与RUN类似,RUN在容器构建时运行,CMD在容器运行时运行
例如容器启动的时候运行Nginx:
CMD ["nginx", "-g", "daemon off;"]
如果使用docker run运行一个容器的时候指定了命令,那么CMD中的命令会被覆盖
CMD指令除了RUN指令的两种形式外,还提供了了一个参考的形式
CMD ["param1", "param2"]
这样就可以作为ENTRYPOINT指令的默认参数了
-
ENTERYPOINT
和CMD的区别就是不会被docker run指定的命令覆盖,如果要覆盖,需要使用下面命令
需要注意的是docker run指定的命令并不会执行
docker run --entrypoint
-
COPY
拷贝文件到容器中
COPY hom* /mydir/ COPY hom?.txt /mydir/
-
ADD
和COPY的区别,文件会自动解压缩,可以将一个URL链接中的文件复制到目标文件夹中
ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # adds "test" to /absoluteDir/
-
VOLUME
定义匿名卷
-
WORKDIR
规定容器的工作目录
-
ENV
设置环境变量
-
ARG
设置环境变量,和ENV很类似,区别就是
ARG
所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。 -
USER
指定当前用户
-
ONBUILD
如果有在当前镜像的基础上构建的其他镜像的时候,会先执行ONBUILD后面指定的Dockerfile命令
ONBUILD后面的指令不在当前镜像中执行