一、Docker常用命令
1.基础命令
docker version # 查看docker版本信息
docker info # 查看docker的系统信息,包括容器信息和镜像信息
docker 命令 --help # 查看命令
2.镜像命令
docker images # 查看本机所有镜像
docker search # 搜索镜像
docker pull 镜像名[:tag] # 下载镜像,不带tag默认最新版本
docker rmi 镜像id # 删除镜像,加参数-f强制删除
3.容器命令
docker run [options] image # 运行容器
--name="name" # 指定容器名称
-d # 后台方式运行
-it # 使用交互的方式运行,进入容器查看内容
-p # 指定容器端口 主机端口:容器端口
-P # 随机指定端口
exit # 退出容器命令(后台运行方式退出不会终止容器)
Ctrl+P+Q # 不停止容器退出
docker ps # 列出正在运行的容器
-a # 列出所有运行过的容器记录
-n=? # 列出最近运行过的n的容器
-q # 只显示容器编号
docker rm 容器id # 删除容器不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
docker log 容器id # 查看容器日志
可选参数
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
docker logs -tf 容器id
docker logs --tail num 容器id #num为要显示的日志条数
docker top 容器id # 查看容器中的进程信息
docker inspect 容器id # 查看容器的元数据
docker exec -it 容器id /bin/bash # 进入容器
docker attach 容器id # 进入容器
# docker exec 进入容器后开启一个新的终端,可以在里面操作
# docker attach 进入容器正在执行的终端,不会启动新的进程
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG] # 使用docker commit 命令提交容器成为一个新的版本
4.拷贝操作
docker cp 容器id:容器内路径 目的主机路径 #拷贝容器的文件到主机中
docker cp 目的主机路径 容器id:容器内路径 #拷贝宿主机的文件到容器中
二、数据卷
1.简单使用
docker run -it -v 主机目录:容器目录 # 指定路径挂载方式,后面还有具名挂载和匿名挂载
2.查用命令
docker volume create my-vol # 创建数据卷
docker volume ls # 查看所有的数据卷
docker volume inspect my-vol # 查看指定数据卷的信息
docker volume rm my-vol # 删除数据卷
docker rm -v # 删除容器之时删除相关的卷
docker volume prune # 清理无主的数据卷
3.使用–mount挂载数据卷
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp
python app.py
# Docker 挂载主机目录的默认权限是读写 ,用户也可以通过添加readonly 参数指定为只读 。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system
4.具名挂载和匿名挂载
匿名挂载
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹
# eg:
docker run -d -P --name nginx -v /etc/nginx nginx
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录
[root@lxzforever ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
具名挂载
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls
命令可以查看当前数据卷的目录情况
[root@lxzforever ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912
[root@lxzforever ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
local juming-nginx
查看指定的数据卷信息的命令:docker volume inspect 数据卷名称
5.容器数据卷
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
# 接着设置数据卷挂载关系 启动容器,通过参数--volumes-from,设置容器和容器之间建立数据卷挂载关系
[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 30 14:58 dev
drwxr-xr-x 1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 108 root root 0 Dec 30 14:58 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume02
三、Dockerfile
Docker镜像发布的步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 镜像
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库
Dockerfile指令说明
FROM 指定基础镜像
MAINTAINER 镜像是谁写的,姓名+邮箱
RUN 镜像构建的时候需要运行的命令
ADD 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 保留端口配置
CMD 指定这个容器启动的时候要运行的命令(只有最后一个会生效)
EMTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV 构建的时候设置环境变量
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
关于DockerFile文件的脚本注意点有:
**1、**每个保留关键字(指令)都必须是大写字母
**2、**文件中的指令从上到下顺序执行,第一个指令必须是FROM
3、# 号表示注释
**4、**每一个指令都会创建提交一个新的镜像层,并提交!
构建镜像命令: docker build -f dockerfile文件路径 -t 镜像名[:版本号] .
(最后的.
不可忽略)
-t
参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点
另外,我们通过docker history 容器id
命令来查看镜像的构建步骤
RUN命令与CMD命令ENTRYPOINT命令的区别
RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令
CMD和ENTRYPOINT的区别
ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加
CMD :指定容器启动的时候要运行的命令,只有最后一个会生效