镜像操作
官方文档:https://docs.docker.com/engine/reference/commandline/image/
获取镜像
# 获取镜像,默认从docker hub下载,两者效果等同,推荐第一个
# docker [image] pull name[:tag] 不输入版本号,就默认下载最新版本(latest)
# registry.hub.docker.com是官方默认的Docker Hub,如果需要从非官方仓库下载,需要在前面加上私有仓库的前缀
docker image pull ubuntu:18.04 = docker pull ubuntu:18.04 = docker pull registry.hub.docker.com/ubuntu:18.04
# 配置镜像代理服务来加速
docker image pull name[:tag] --registry-mirror=proxy_url
镜像列表
# 镜像列表
docker images
docker image ls
# 常用的子命令选项
列出所有 -a, --all=true|false(默认false)
仅输入ID -q, --quiet=true|false(默认false)
清理镜像残留文件层
docker image prune -f
退出状态码
docker的退出状态码遵循chroot标准,必须在0-255之间,如果退出码不在这个范围内可以通过下面这个公式转换:
256−(mod(|code|/256))256−(mod(|code|/256))
- 0:正常退出
- 1-128:程序自身异常退出
- 129-255:外界将程序中断退出
修改docker网卡ip
修改/etc/docker/daemon.json
{
"bip": "192.168.10.0/16"
}
dockerfile
ADD
两种格式:
ADD [OPTIONS] <src> ... <dest>
ADD [OPTIONS] ["<src>", ... "<dest>"]
[OPTIONS]的可选参数如下:
-
--keep-git-dir 当是远端的git地址时,是否保存
.git这个目录,值为true时,保留.git目录。FROM alpine ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.10.1 /buildkit -
--checksum 验证远端资源,目前仅支持HTTP的资源
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz /
ARG
一般写在第一行,用于docker build的过程中,可以被 --build-arg 当作参数传递,在命令行中设置的变量值为优先。
# 格式
ARG <name>[=<default value>]
ARG author=tim
LABLE maintainer=${author}
# 这里author的值就被设置成了tom,命令行优先
docker build --build-arg author=tom -t xxx .
要在多个阶段中使用一个参数,每个阶段必须包含ARG指令。
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS
FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
**如果定义的变量名和ENV中的变量一样,以ENV中的优先。**区别于ARG,ENV指定的变量在镜像构建过程中始终展示。
在下面的示例中,CONT_IMG_VER的值式 v1.0.0,命令行传递的值优先ARG的默认定义,而ENV优先级更高
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER
docker build --build-arg CONT_IMG_VER=v2.0.1 .
对上面变量指定的优化:
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
预定义的变量
HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyFTP_PROXYftp_proxyNO_PROXYno_proxyALL_PROXYall_proxy
CMD
运行容器时会执行的命令,支持两种格式:
# exec格式
CMD ["executable","param1","param2"]
# exec格式,作为 ENTRYPOINT 的默认参数
CMD ["param1","param2"]
# shell格式
CMD command param1 param2
注意:
- dockerfile文件中只能有一个
CMD指令,如果存在多个,那么只有最后一个生效。 CMD在构建期间不会执行,只会指定镜像的预期命令。
COPY
两种格式:
COPY [OPTIONS] <src> ... <dest>
COPY [OPTIONS] ["<src>", ... "<dest>"]
可选的OPTIONS如下:
-
--from 指定从哪里获取,默认是context
# image|stage|context COPY [--from=<image|stage|context>] <src> ... <dest> -
--chown 指定拥有权限
-
--chmod 指定读写权限
COPY --chown=55:mygroup files* /somedir/ COPY --chown=bin files* /somedir/ COPY --chown=1 files* /somedir/ COPY --chown=10:11 files* /somedir/ COPY --chown=myuser:mygroup --chmod=644 files* /somedir/ -
--link 如果之前的层已经更改,使用--link,先前构建生成的层被重用并合并到新层之上。
-
--parents 指定是否包含父级目录
# syntax=docker/dockerfile:1.7-labs FROM scratch COPY ./x/a.txt ./y/a.txt /no_parents/ COPY --parents ./x/a.txt ./y/a.txt /parents/ # /no_parents/a.txt # /parents/x/a.txt # /parents/y/a.txt -
--exclude 去除不需要的文件
ENTRYPOINT
Entrypoint是指定容器启动时要执行的可执行文件或脚本,并且该命令在运行容器时不能被覆盖。Entrypoint可以看作是容器的默认执行命令,它会在运行容器时自动执行。如果在运行容器时指定了其他命令,则这些命令将作为Entrypoint命令的参数传递给容器。
通常情况下,Entrypoint用于指定容器启动时要运行的应用程序,而Cmd用于指定应用程序的默认参数。
ENV
# 设置环境变量
ENV <key>=<value> ...
EXPOSE
暴露对外访问的端口,可以指定是tcp还是udp,默认tcp
# 也可以在命令行指定
docker run -p 80:80/tcp -p 80:80/udp ...
FROM
指定基础镜像,本地不存在回去docker hub上去拉取。指令格式:
# 使用镜像的最新版本
FROM <image>
# 指定镜像版本
FROM <image>[:<tag>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
AS指定的新镜像的名称,可以被引用,参考如下:
FROM <name>
COPY --from=<name>
RUN --mount=type=bind,from=<name>
HEALTHCHECK
--interval=DURATION(default:30s)--timeout=DURATION(default:30s)--start-period=DURATION(default:0s)--start-interval=DURATION(default:5s)--retries=N(default:3)
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
MAINTAINER(deprecated)
ONBUILD
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
RUN
在镜像的构建过程中执行特定的命令,并生成一个中间镜像。
#shell格式
RUN <command>
#exec格式
RUN ["executable", "param1", "param2"]
RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。
如果不想使用这些缓存镜像,可以在构建时指定 --no-cache 参数,如:docker build --no-cache。
SHELL
SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shell,Linux 中默认为 ["/bin/sh", "-c"],windows中默认为["cmd", "/S", "/C"]
SHELL ["/bin/sh", "-c"]
STOPSIGNAL
STOPSIGNAL指令设置将发送到容器以退出的系统调用信号。
USER
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。
WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。
注意,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
VOLUME
定义卷,类似挂载,格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。
为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在容器运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。
当然,运行容器时可以覆盖这个挂载设置。比如:
$ docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。
WORKDIR
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
COPY和ADD比较
COPY和ADD都是将资源加入到容器镜像中,而且都是在镜像构建过程中完成。区别在于ADD支持从远程URL获取资源。
- 如果都是从本地获取资源,推荐
COPY。 - 事实上,当获取远端资源时,更建议在
RUN中执行wget或者curl命令。
RUN,CMD,ENTRYPOINT三者的比较
-
RUN命令执行命令并创建新的镜像层,通常用于安装软件包。 -
CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换。 -
ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行docker run时指定了其他命令)。
镜像管理
docker pull | build | images | rmi | history | inspect
容器管理
# 容器列表,运行容器,将容器提交镜像
docker ps | run | commit
# 启动,停止,重启,暂停进程,继续进程,强制杀掉
docker start | stop | restart | pause | unpause | kill
# 查看状态,查看日志,进入容器,删除容器(需要先停掉)
docker stats | logs | exec | (stop)rm
网络管理
四种模式:
-
bridge:桥接,默认(docker0),同个网桥下可根据容器名字访问
-
host:主机网络,与宿主机完全共享网络,如果容器使用80端口,宿主机也占用80端口
# --net host docker run --name myWeb --net host -d nignx:1.19 -
portMap:端口映射
# -p 8080:80(宿主机端口:容器端口) docker run --name myWeb -p 8080:80 -d nginx:1.19 -
none:无网络,完全隔离,安全性高,使用场景:计算数据,数据清洗,跑任务等等
# 创建网络,同网桥下,可名称访问
docker network create --driver bridge mynet
存储卷管理
docker volume ls
docker volume create myapp
docker volume inspect myapp
# -v (宿主机卷/宿主机路径:容器路径)
docker run --name myweb -d -v /host/html:/usr/share/nginx/html -p8080:80 nginx:1.19
docker-compose
yaml配置与docker命令对照

yaml编排
示例源码:notes/docker-compose/docker-compose-demo.zip · neogao/picgo - Gitee.com
web示例
# 使用官方的 Nginx 基础镜像
FROM nginx:1.19
# 可选:设置作者信息
LABEL maintainer="muxian@imooc.com"
# 可选:将本地的自定义 Nginx 配置文件复制到镜像中
# 如果不需要自定义配置,可以跳过这一步
# COPY nginx.conf /etc/nginx/nginx.conf
# 可选:将您的静态网站文件复制到 Nginx 的默认 web 根目录
# 这里假设您的静态文件位于当前目录的 "html" 文件夹中
COPY html/ /usr/share/nginx/html/
# 将图片文件复制到 Nginx 的默认 web 根目录下的 images 子目录中
# 这里假设您的图片文件位于当前目录的 "static/images" 文件夹中
COPY static/images/ /usr/share/nginx/html/images/
# 配置 Nginx 以将所有请求代理到后端接口的地址
# 这里的后端接口地址需要根据您的实际部署环境进行配置
# 例如,如果后端接口运行在同一 Docker 网络中,可以使用容器名称或服务名称来配置代理
# 如果后端接口运行在不同的主机上,需要将代理地址设置为实际的后端接口地址
COPY nginx.conf /etc/nginx/nginx.conf
# 可选:暴露 Nginx 监听的端口
# 默认情况下,Nginx 使用 80 端口
# EXPOSE 80
# 可选:定义启动容器时运行的命令
# 如果不定义,将使用 Nginx 默认启动命令
# CMD ["nginx", "-g", "daemon off;"]
server(java)示例
# 基于 Java 镜像构建
FROM openjdk:8u342-slim
# 配置参数
ENV JAVA_OPTS="-Xms128m -Xmx256m -Dspring.profiles.active=fat"
# 工作空间
WORKDIR /app/pr
COPY ./bdo-pr-base-provider-1.0.jar bdo-pr-base-provider-1.0.jar
# 暴露端口
expose 12006
# 启动
CMD java $JAVA_OPTS -jar bdo-pr-base-provider-1.0.jar
server(go)示例
# 使用官方的 Golang 基础镜像,指定 Go 版本
FROM golang:1.18 as build
# 设置工作目录
WORKDIR /app
# 将 Go 源代码复制到容器中
COPY . .
# 编译 Go 应用程序
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -o main
# 构建最终的容器镜像
FROM debian:buster-slim
# 复制编译后的 Go 应用程序到容器中
COPY --from=build /app/main /app/main
# 暴露应用程序的端口(根据您的应用程序配置)
EXPOSE 8080
# 设置启动命令
CMD ["/app/main"]
db示例
FROM mysql:8.0.21
ENV MYSQL_ROOT_PASSWORD=123456
ENV MYSQL_DATABASE=fruits
yaml示例
version: "3.8"
services:
db:
image: mm-supermarket-db:v1
container_name: mm-supermarket-db
build:
context: "./db"
dockerfile: Dockerfile
networks:
- mm-supermarket
server:
image: mm-supermarket-server:v1
container_name: mm-supermarket-server
build:
context: "./server"
dockerfile: Dockerfile
depends_on:
- db
networks:
- mm-supermarket
web:
image: mm-supermarket-web:v1
container_name: mm-supermarket-web
build:
context: "./web"
dockerfile: Dockerfile
ports:
- "80:80"
depends_on:
- server
networks:
- mm-supermarket
networks:
mm-supermarket:
driver: bridge
ipam:
config:
- subnet: 19.168.100.0/24
112

被折叠的 条评论
为什么被折叠?



