常见命令

镜像命令

  • docker pull :下载镜像
  • docker images:列出本地主机上的镜像
  • docker search httpd :在docker hub上查找指定名称的镜像
  • docker rmi httpd:删除镜像
  • docker tag 860c279d2fec kend/centos:dev:设置镜像标签
    • 镜像ID 用户名/镜像源名(repository name): 新的标签名(tag)

运行镜像,指定容器名

  • docker run -d --name dc -p 8080:8080 kend/myProject:latest /bin/echo "Hello world"
    • -d: 不输出结果,后台模式启动,返回容器ID
      • 后台模式:退出终端后,仍继续运行
      • -i 支持交互式操作
      • -t 开启终端
      • 可以连在一起写➡-it
    • -p 8080:8080:公网端口:容器内端口
      • 比如我写了个web项目,启动在8080端口,-p 123:8080,我就能通过访问localhost:123去访问
    • kend/myProject:latest : 镜像名
    • /bin/echo "Hello world:在启动的容器里执行的命令,要保证镜像为linux,才能执行该语句,不过推荐CMD语句写在Dockerfile

容器操作

  • docker ps :查看容器状态
  • docker stop/start/rm name(id):停止/启动/删除容器

如果-d后台运行后想进入容器,怎么做呢,使用docker exec

docker exec -it 243c32535da7 /bin/bash

如上,运行后进入容器并启动bash

  • docker top name(id):查看容器内进程

查看日志

docker logs -f -t --tail 100 name(id)

  • -f:保持对日志的实时跟踪
  • -t:加上时间戳
  • --tail 100:只显示最新的100行

构建镜像

Dockerfile文件

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像

指令

Dockerfile 指令 说明 使用
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令。 docker build时运行
CMD 指定容器创建时的默认命令。(可以被覆盖) docker run 时运行
CMD ["<可执行文件或命令>","","",…]
多个CMD时,仅最后一个生效
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖) 不会被docker run的参数所覆盖
多个ENTRYPOINT时,仅最后一个生效
ENV 在容器内部设置环境变量。 ENV = =
$key1 可以访问
ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。 跟ENV类似,不过只在docker build时运行
ADD 将文件、目录或远程URL复制到镜像中。 COPY(自动解压版)
COPY 将文件或目录复制到镜像中。 COPY <源路径1>… <目标路径>
WORKDIR 设置后续指令的工作目录。 WORKDIR <工作目录路径>
USER 指定后续指令的用户上下文。 USER <用户名>[:<用户组>]
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。 创建时不运行,被FROM时运行
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。

举个例子:

# Dockerfile
FROM golang:1.16-buster AS builder
RUN mkdir /src
ADD . /src
WORKDIR /src

RUN go env -w GO111MODULE=auto
RUN go build -o main .

FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=builder /src/main /main
EXPOSE 3000
ENTRYPOINT ["/main"]

COPY --from=builder /src/main /main

多阶段构建:

以上代码从名为builder的构建阶段的容器中,将/src/main目录下的文件复制到当前正在构建的容器的/main目录下

构建时从其他镜像复制文件:

COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

创建镜像

docker build -t kend/centos:6.7 .
  • -t :指定要创建的目标镜像名
  • . :Docker上下文,如果没指定Dockerfile,则在上下文中寻找

或者指定文件:

docker build -t kend/centos:6.7 . -f Dockerfile.copy

参考资料:

Docker Dockerfile | 菜鸟教程 (runoob.com)

Dockerfile 多阶段构建 · Docker – 从入门到实践 (docker-practice.github.io)