Skip to content

前言

经常用docker,但是从来没有系统性的总结过docker满足生产力需要掌握的内容

镜像

docker可以理解为一个具有初始操作的快照模版,docker通过运行一个镜像生成容器。

  • docker pull nodejs 拉取镜像
  • docker images 或者 docker ls 查看本地镜像
  • docker image rm xx-image

镜像加速器

sh
echo "{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}" >> /etc/daemon.json

systemctl daemon-reload
systemctl restart docker

容器

容器相当于镜像的实例化,每个容器都是一个进程,如果想让容器一直存在需要容器的启动进程一直存在。

  • docker container ls 查看当前系统的容器
  • docker run --name somename -it --rm -p -v --mount --link -d --restart。
    • -p 本地端口:容器内端口;
    • -v 本地本地路径(绝对路劲)|数据卷:容器内路径
    • --mount source=some-volumn,target=/var/xxx 绑定本地目录或者数据卷
    • -it 绑定本地的输入输出
    • --rm 容器终止后删除容器
    • --restart always 容器总是重启
    • --link 添加另一个容器来组成网络(总是或默认创建一个容器网络)
  • docker container inspect xxx 查看容器具体信息
  • docker container exec xx -it sh 容器执行某个新命令,常用于进入容器查看信息

数据卷

docker 数据卷(相当于一个目录)可用在多个容器之前共享,不会随着容器终止而清空内容,通过--mount 或者-v 绑定到容器中

  • docker volume xxxname
  • docker volume inspect xxx 查看某个数据卷,主要查看存放位置等。

docker 网络

  • docker network ls 查看所有的网络
  • docker network create -d bridge xxx 创建一个桥接网络(一个新的网络,桥接在原host上面的)

docker 在安装时默认会生成host和bridge两个网络。重点是bridge网络,通过虚拟网桥docker0和容器的网口连接,虚拟网桥又通过宿主机的iptable进行转发。

我们每创建一个网络就相当于开了一个子网,可以自定义网关和子网范围

Dockerfile

docker 能够从Dockerfile文件创建镜像,一般社区中的镜像大部分都是Dockerfile创建,Dockerfile是由一系列指令构成,每一个指令都会构建一层,指令不要太多,功能类似的指令尽量放到一层

  • FROM 镜像基础来源,可以是另一个镜像
  • RUN 执行命令, 尽量将多个指令合并 && \
  • COPY 复制目录或者文件到镜像中,支持linux通配符 COPY home* /user/src/home, 会自动创建目录,而且会保留文件的元数据(权限等)
  • ADD 如果是URL,会直接下载文件(权限600),如果是压缩包会解压。ADD指令不会缓存, 每次都会重新构建。总是使用COPY,需要解压时才使用ADD
  • CMD 容器的启动命令,容器总是需要一个默认启动命令 CMD ["nginx", "-g", "xx"]
  • ENTRYPOINT 如果指明了该项,CMD会作为ENTRYPOINT的参数拼接在后面,常用实现一个命令行工具,比如ENTRYPOINT实现指令 CMD实现参数
  • ENV配置镜像默认环境变量,
  • ARG 配置在构建过程中的环境变量,而且只在FROM后生效用于辅助构建。但是不会存在到镜像中。比如声明一些变量
  • VOLUME 定义匿名卷,VOLUME /data 将/data挂载到匿名卷中,如果容器启动时没有指明卷,就会匿名生成一个,所以不是很关注的卷不需要自己再挂载目录
  • EXPOSE 声明容器内部暴露的端口
  • WORKDIR 声明每个指令镜像内的工作目录(和build时分开),注意在dockerfile中下面不会工作,因为每条指令是单独的,不会共享 RUN cd /app RUN echo "sdf" > xx.txt
  • USER 指定当前指令之后所有的指令的user,同样也是要在FROM后,而且系统中必须要先创建这个角色
  • SHELL 指定RUN ENTRYPOINT CMD指令在哪个shell下运行。默认是["/bin/sh", "-c"]

多阶段构建

如果不用多阶段构建,需要将上一个容器的内容拷贝(docker cp)到宿主机,再用COPY拷贝到下一个阶段的容器中去 FROM ubuntu:lasted as builder WORKDIR /app/data COPY ./test ./test RUN npm build FROM ubuntu:lasted as builder // 需要和上面一个FROM相同 RUN npm run deploy

docker build -f xxxdockerfile -t nginx:tag ./xxx --target builder 注意最后一个./xx 表示构建过程中的上下文,比如COPY ./local/xxx /app 表示的是.local的相对位置, docker会将上下文目录中所有内容拷贝到镜像中,通过.dockerignore忽略部分文件

docker compose

docker compose文件主要由两部分组成,公共部分和容器部分。公共部分指明当前compose需要创建的网络,数据卷等。容器部分和启动容器类似