常见命令
镜像命令
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
去访问
- 比如我写了个web项目,启动在8080端口,
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)