docker初入

镜像操作

官方文档: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 /
    
  • --chown

  • --chmod

  • --link

  • --exclude

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_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • FTP_PROXY
  • ftp_proxy
  • NO_PROXY
  • no_proxy
  • ALL_PROXY
  • all_proxy

CMD

运行容器时会执行的命令,支持两种格式:

# exec格式
CMD ["executable","param1","param2"]
# exec格式,作为 ENTRYPOINT 的默认参数
CMD ["param1","param2"]

# shell格式
CMD command param1 param2

注意:

  1. dockerfile文件中只能有一个CMD指令,如果存在多个,那么只有最后一个生效。
  2. 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 是一个特殊的指令,它后面跟的是其它指令,比如 RUNCOPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

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 则是改变之后层的执行 RUNCMD 以及 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 会帮你建立目录。

COPYADD比较

COPYADD都是将资源加入到容器镜像中,而且都是在镜像构建过程中完成。区别在于ADD支持从远程URL获取资源。

  • 如果都是从本地获取资源,推荐COPY
  • 事实上,当获取远端资源时,更建议在RUN中执行wget或者curl命令。

RUNCMDENTRYPOINT三者的比较

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值