Docker 有3个核心的概念:镜像、容器和仓库
  • 镜像是包含了可运行在Linux内核的程序以及数据,是分层的,只读
  • 通过镜像可以创建容器,容器在镜像上增加了一层可读写层来实现的,所以是可读写的,
  • 仓库是存储镜像的地方

镜像相关操作

从仓库中拉取远程镜像
docker image pull node
# 或
docker pull node
docker search imagename 查找镜像
docker images查看本机的镜像列表
docker inspect imagename 查看镜像元信息(比如镜像指定的端口号,CMD,ENTRYPOINT,默认挂载目录等)
移除镜像
docker image rm imageid
# 或
docker rmi imageid

容器相关操作

运行容器(有三种运行模式), 本地没有被使用的镜像会自动拉取
docker run <images> # 直接运行容器 运行后会自动退出(没有被挂起的情况下,比如CMD执行了tail -t或者nodemon等挂起的命令)
docker run -d --name 别名 <images:tags>   <commond> # 后台运行 守护进程 常驻内存
docker run -it  --name 别名 <images:tags>  <commond> # 终端交互方式,可以直接和容器交互
docker run -d  --name mymongo mongo:4  /bin/bash # 对容器指定别名
docker run -p 80:80 nginx # 对容器端口进行映射 -P 则随机绑定端口号
docker run -v /宿主内路径:容器内路径 // 挂载容器内目录到宿主机
再次进入容器
docker exec -it  containerid /bin/bash
docker logs containerid 查看容器标准输出
docker port containerid 查看当前映射端口配置和绑定地址
查看容器
docker ps  #查看已启动的容器
docker ps -a  #查看所有容器  包括已停止运行的
停止容器
docker stop containerid1,containerid2 ...
重启容器
docker restart containerid
移除容器
docker rm containerid
docker支持的选项
Options:
      --config string      Location of client config files (default "/Users/bj/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides
                           DOCKER_HOST env var and default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")
                           (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/Users/bj/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/Users/bj/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/Users/bj/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit
docker支持的命令
Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       根据Dockerfile创建一个镜像
  commit      以容器为基础创建镜像
  cp          在宿主机和容器之间拷贝文件或目录
  create      创建一个新容器
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        正在运行的容器中执行命令
  export      Export a container's filesystem as a tar archive
  history     显示镜像的历史信息
  images      查看镜像列表
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        kill一个或多个正在运行的容器
  load        从tar文件或者标准输入加载镜像
  login       登录Docker仓库
  logout      登出Docker仓库
  logs        查看容器日志
  pause       暂停一个或多个容器中的所有进程
  port        列出端口映射或容器的特定映射
  ps          查看正在运行的容器列表(-a 可以查看所有容器)
  pull        从仓库拉取镜像
  push        Push镜像到远程仓库
  rename      对容器进行重命名
  restart     重启一个或多个容器
  rm          删除一个或多个容器
  rmi         删除一个或多个镜像
  run         在新的容器中执行命令
  save        保存一个或多个镜像到tar文件
  search      在Docker Hub上检索镜像
  start       启动一个或多个已停止的容器
  stats       Display a live stream of container(s) resource usage statistics
  stop        停止一个或多个正在运行的容器
  tag         对已有镜像添加tag
  top         查看某个镜像中的进程情况
  unpause     Unpause all processes within one or more containers
  update      更新一个或多个容器的配置
  version     查看docker版本信息
  wait        Block until one or more containers stop, then print their exit codes
查看docker命令具体使用方法
# docker COMMAND --help
docker exec --help
Usage:	docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY

构建镜像

使用Dockerfile进行构建
通过docker commit 将容器保存为镜像
1. 通过docker commit生成镜像

Dockerfile常用配置

FROM 指定使用什么镜像作为基础 (指定更小的基础镜像来尽可能减少镜像体积)
WORKDIR 指定容器的工作目录(如果没有会自动创建)
COPY 将本地目录拷贝到容器内目录中
ADD 类似COPY,像容器内目录添加文件,不同是可以添加网络地址。如果被复制文件是压缩文件会自动解压
RUN 容器构建时执行,每一个RUN都会增加新的层,可以将多个需要执行的命令放到一个RUN中执行(使用&&连接)来减少镜像体积
CMD 容器启动时执行的命令,如果有多个CMD,最后一个生效。而且会被docker run命令行参数中指定要运行的程序所覆盖
ENTRYPOINT 指定入口。和CMD同时存在:如果ENTRYPOINT是非JSON格式则使用ENTRYPOINT,否则CMD和ENTRYPOINT拼接执行。且不会被docker run参数中命令覆盖(docker run 指定--entrypoint选项时除外)
EXPOSE 声明镜像对外暴露端口
VOLUME 指定挂载目录, 启动容器忘记数据卷时会自动挂载到匿名卷(docker run -v 可以修改挂载点)
ENV 指定环境变量,全局生效
AKG 也可以指定环境变量,编译过程中生效,可以docker时可以通过--build-akg key=value覆盖.也可以通过赋值给ENV实现传递到执行阶段
ONBUILD 当基于此镜像构建镜像时执行,参数可以是Dockerfile中其他命令,比如ENV CMD
FROM alpine
WORKDIR /app
COPY src/ /app
RUN npm install
CMD ['npm','start']
ENV NODE_ENV production

需要注意的是Dockerfile中可以存在多个FROM指令,即可以进行多阶段个构建(并非生成多个镜像,最后生成的镜像只有最后一个FROM,其他的FORM会被丢弃),比如可以分为:创建基础镜像,编辑打包,发布,运行等

我们可以根据Dockerfile构建镜像
docker build -t imagename .
将从仓库pull的镜像或自己构建的镜像导出
$ docker image save imagename -o ./image-name.tar.gz
将导出的镜像文件导入到本地镜像列表中
$ docker load < ./image-name.tar.gz
2. 通过docker commit生成镜像
docker commit -a 'xiaozhu<1289****@qq.com>' containerid  testimage:0.0.1
docker commit --help
Usage:	docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") // 作者信息
  -c, --change list      Apply Dockerfile instruction to the created image // 对创建的镜像应用Dockerfile指令
  -m, --message string   Commit message //提交信息
  -p, --pause            Pause container during commit (default true) // commit过程中暂停运行容器