Docker
Docker
查看容器日志
docker logs -f 容器id/name
查看容器内运行进程
docker top 容器id/name
检查容器底层信息
docker inspect 容器id/name
它会返回一个
json
文件,包含docker
容器的配置和状态信息
查看容器占用磁盘大小
docker system df
# 查看 每个 image、container 详细大小:
docker system df -v
其他
- 查询最后一次创建的容器:
docker ps -l
Docker容器使用
创建容器
docker run -v </本地绝对路径>:</容器内绝对路径> -it ubuntu /bin/bash
-i
: 交互式操作-t
: 终端ubuntu
:ubuntu
镜像/bin/bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash-v /本地绝对路径:/容器内绝对路径
:将目录挂在到容器中,方便数据共享,数据持久化,独立于容器的生存周期-v /本地绝对路径:/容器内绝对路径:ro
:ro
表示readonly
只读权限。
查看所有容器
docker ps -a
启动已停止运行的容器
docker start 容器id/name
后台运行
docker run -itd -P --name 别名 镜像名 /bin/bash
-d
: 后台运行,加上此参数,默认不会进入容器--name
: 容器名称, 可以不指定,默认是随机生成的
停止容器
docker stop 容器id/name
重启容器
docker restart 容器id/name
进入容器
容器在后台运行时,此刻想进入容器,可以使用如下命令:
attach
,此命令exit
退出时会停止容器
docker attach 容器id/name
exec
, 此命令exit
退出时不会停止容器
docker exec -it 容器id/name /bin/bashsh
导出容器快照文件
docker export 容器id/name > 导出路径/快照name.tar
导入容器快照文件
- 使用备份文件导入
docker import 快照name.tar 镜像name
- 使用url或者某个目录导入
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
删除容器时,容器必须是停止状态,否则会报错
docker rm -f 容器id/name
容器网络
-P
: 启动容器后,自动创建端口映射,将容器内使用的端口随机映射到主机上-p 5000:5000
: 将容器内使用的5000端口映射到主机上的5000端口- 查看容器端口映射情况,
docker port 容器id/name
Docker镜像使用
列出本地镜像列表
docker images
REPOSITORY
:表示镜像的仓库源TAG
:镜像的标签IMAGE ID
:镜像IDCREATED
:镜像创建时间SIZE
:镜像大小
同一仓库镜像可以有多个tag,代表不同的版本,使用
REPOSITORY:TAG
来定义不同的镜像
获取/载入 镜像
# 使用docker pull来获取ubuntu镜像
docker pull ubuntu
查找镜像
docker hub
网址为 https://hub.docker.com/
docker search httpd
NAME
: 镜像仓库源的名称DESCRIPTION
: 镜像的描述OFFICIAL
: 是否 docker 官方发布stars
: 类似 Github 里面的 starAUTOMATED
: 自动构建
删除镜像
docker rmi 镜像id/name
创建镜像
更新镜像
- 首先使用镜像创建一个容器 创建容器
docker run -t -i ubuntu:15.10 /bin/bash
docker commit -m="has update" -a="update" 镜像id update/ubuntu:v2
构建镜像
docker build -t ubuntu:v2 .
-t ubuntu:v2
: 指定创建的镜像名称.
: 指定当前目录,Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签
docker tag 镜像ID update/ubuntu:v2
Dockerfile
FROM 基础镜像
为映像构建指定基础镜像,会先在docker主机上查找该基础镜像,如果不存在会从docker hub上查找拉取。
# FROM语法
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# <image>:指定作为base image的名称
# <tag>:base image的标签,为可选项,省略时默认为 latest;
# <digest>为校验码
FROM <image> [AS <name>] 指定从一个镜像构建起一个新的镜像名字
FROM <image>[:<tag>] [AS <name>] 指定镜像的版本 Tag
MAINTANIER(已经废弃,使用LABEL更加灵活)
# MAINTANIER语法
MAINTAINER <name> <email>
LABEL
如果 base image 中也有标签,则继承,如果是同名标签,则覆盖。 为了减少图层数量,尽量将标签写在一个 LABEL 指令中去
# LABEL语法
LABEL <key>=<value> <key>=<value> <key>=<value> ...
WORKDIR
为接下来的 Dockerfile 指令指定当前工作目录,RUN、CMD、COPY、ADD
的工作目录都会同步变更
# WORKDIR语法
WORKDIR <path>
WORKDIR /app/test
ENV
在构建的镜像中设置环境变量,在后续的 Dockerfile 指令中可以直接使用,也可以固化在镜像里,在容器运行时仍然有效
# ENV语法
# 如果<value>中存在空格,需要转义或用引号"括起来
ENV <key>=<value> <key>=<value> <key>=<value> ...
# 如果 base image 中也有环境变量,则继承,如果是同名环境变量,则覆盖。 为了减少图层数量,尽量将环境变量写在一个 ENV 指令中去
也可以在容器运行时指定环境变量,替换镜像中的已有变量, docker run --env
<key>
=<value>
。 使用ENV可能会对后续的 Dockerfile 指令造成影响,如果只需要对一条指令设置环境变量,可以使用这种方式: RUN<key>
=<value>
<command>
VOLUME
挂在目录到容器内,指定数据持久化的目录,官方语言叫做挂载
VOLUME ["宿主机绝对路径"]
Docker挂载主机目录后Docker访问出现cannot open directory .: Permission denied
解决办法: 在挂载目录后多追加一个 --privileged=true即可
RUN
# 构建镜像时要执行的命令
RUN <command>
RUN ["executable", "param1", "param2"]
ADD
# 将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载
ADD ["<src>",... "<dest>"]
COPY
功能和 ADD 一样,只是复制,不会解压或者下载文件
CMD
# 启动容器后执行的命令,和 RUN 不一样,RUN 是在构建镜像是要运行的命令
当使用 docker run 运行容器的时候,这个可以在命令行被覆盖
CMD ["executable", "param1", "param2"]
ENTRYPOINT
# 执行命令,和 CMD 一样,只是这个命令不会被命令行覆盖
ENTRYPOINT ["executable", "param1", "param2"]
EXPOSE
# 暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)
EXPOSE <port>
EXPOSE 80
# 容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口
USER
指定运行命令时所使用的用户
USER <user>:[<group>]
USER test
ARG
设置构建镜像是要传递的参数
ARG <name>[=<value>]
ARG name=demo