一、镜像
1.列出本地镜像
sudo docker images
2.搜索镜像
sudo docker search centos
3.拉取镜像
sudo docker pull centos
4.删除镜像
sudo docker rmi 镜像ID
若报错可能是因为该镜像生成了容器,可以先删除容器再删除镜像,或者强制删除
sudo docker rmi -f 镜像ID
二、容器
1.新建并启动容器
sudo docker run -it 镜像名
-d:后台运行容器,并返回容器ID, 也即启动守护式容器;
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-P:随机端口映射;
-p:指定端口映射,有以下四种格式
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
2.列出当前运行的容器
sudo docker ps
-a :列出所有容器
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
3.退出容器
#容器停止退出
exit
#容器不停止退出
ctrl+d
4.启动容器
sudo docker start 容器ID
5.重启容器
sudo docker restart 容器ID
6.停止容器
sudo docker stop 容器ID
7.强制停止容器
sudo docker kill 容器ID
8.删除已停止容器
运行中的容器不能删除
#删除指定容器
docker rm -f 容器ID
#一次性删除多个容器
docker rm -f $(docker ps -a -q)
9.后台运行容器
#使用镜像centos以后台模式启动一个容器
sudo docker run -itd centos /bin/bash
10.进入容器
#在使用 -d 参数启动后,容器会进入后台。此时想要进入容器,可以通过以下指令进入:
sudo docker exec -it 容器ID /bin/bash
注意: 这时exit退出,容器不会停止
11.从容器内拷贝文件到主机上
sudo docker cp 容器ID:容器内路径 目的主机路径
12.容器数据卷Volumes
将容器中产生的数据持久化到宿主机,直接命令添加
#不必事先创建目录
sudo docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
三、Dockerfile指令
1.FROM
基础镜像,当前镜像是基于哪个镜像的
#基于centos
FROM centos
2.MAINTAINER
镜像维护者的姓名和邮箱
MAINTAINER yantao "yantao@qq.com"
3.RUN
在build时,让容器运行命令
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
#基于centos
FROM centos
#安装wgetRUN yum install wgetRUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"RUN tar -xvf redis.tar.gz
#以上执行会创建 3 层镜像。可简化为以下格式:
FROM centosRUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
4.EXPOSE
当前容器对外暴露的端口
EXPOSE <端口1> [<端口2>...]
5.WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)
WORKDIR <工作目录路径>
6.ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key> <value>ENV JAVA_HOME /usr/local/jdk1.8
7.COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY [--chown=<user>:<group>] <源路径1> <目标路径>#将readme.md文件拷贝进容器/usr/local/路径下COPY readme.txt /usr/local/readme.txt
[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
8.ADD
ADD 指令和 COPY 的使用格式一致
ADD 的优点:会自动解压压缩包,但是这会增加构建的时间
9.VOLUME
VOLUME ["<路径1>", "<路径2>"...]
10.CMD
指定一个容器启动时要运行的命令,它有两个特点
1.在写了多个时候,只会运行最后一个
2.CMD会被docker run 之后的命令替换掉
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
11.ENTRYPOINT
1.在写了多个时候,只会运行最后一个
2.不会被docker run 之后的命令替换掉,而是可以接收deocker run 之后的参数作为指令的参数
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
12.ONBUILD
在A文件中写入该指令,B继承A的镜像构建时,会触发该指令,该指令会优先于A的其他指令执行
四、构建镜像
1.构建
#会自动使用Dockerfile
#参数 . 是执行上下文--当前目录,构建中当需要使用本机文件时,就会在这个参数的目录下寻找。
sudo docker build -t nginx:v3 .
#若文件名不是Dockerfile,需要指定文件
sudo docker build -f MyDockerfile2 -t nginx:v3 .