DockerFile和一些简单的操作命令

317 阅读4分钟

Dockerfile

1. 几个重要的关键词

  1. FROM 从什么镜像构建
  2. WORKDIR 工作目录
  3. COPY 拷贝文件到容器中
  4. RUN 运行shell语句,在构建时运行
  5. CMD 镜像启动后运行的脚本

2. Dockerfile样例

FROM alpine
WORKDIR /app
COPY ./temp /app
RUN echo 321 >> 1.txt
CMD tail -f 1.txt

3. 开始构建

docker build -t 镜像名称:指定版本号 .
# .表示 Dockerfile 位于当前目录中
# 也可以不指定版本号
# docker build -t test:v1 .

4. 其他指令

ADDCOPY

  • ADD 对比COPY 可以从一个链接中加载
  • ADD 自带解压包

ENTRYPOINTCMD

  • 如果ENTRYPOINT 非json形式,则CMD无效
  • 如果ENTRYPOINT和CMD 都是json,结果会变成 ENTRYPOINT+CMD拼接的shell语句

EXPOSE暴露端口

EXPOSE 80/tcp

VOLUME 指定映射文件出去

VOLUME /app/data

ENV 指定环境变量,运行时也一直有效

ENV name=charlotte

ARG 参数,在构建时有效,运行时无效

ARG的另外一个真正作用在 构建时通过命令可以覆盖Dockerfile中的值,等于说时 Dockerfile中定义了一个默认值

ARG sex=male
docker build -t demo --build-arg sex=female .

LABEL 指定一些源数据信息

一般写在第二行, 对镜像没有任何作用,搜索的时候可能有用

比如: docker inspect nginx

LABEL key="value" k1="v1"

ONBUILD 在当前镜像构建时不会有任何作用

ONBUILD ENV C=10

只有在其他镜像FROM这个镜像的时候才可以拿到值

如:docker build -t demo test 从demo2文件夹中的dockerfile构建

FROM demo
# 目录结构, 现在在最外层
├── Dockerfile
├── test
│   ├── Dockerfile
# 使用test目录中的dockerfile 来构建
docker build -t demo2 test
# 这时候test目录中的dockerfile 就可以拿到最外层dockerfile中的ONBUILD 里面的参数或命令

所以: 这个效果相当于在 FROM的下一行执行了 FROM镜像中的ONBUILD语句

不太常用的几个关键词

STOPSIGNAL 执行停止信号

HEALTHCHECK 配置容易健康状态检查

SHELL 指定shell 是哪种shell 一般是/bin/sh或者/bin/bash

最外层dockerfile

FROM alpine
WORKDIR /app
COPY ./config/config.yml /app/config/config.yml
COPY ./temp /app/
COPY ./StreamServer /app
RUN echo 321 >> 1.txt
ENV name=charlotte
ARG argsex=male
ENV sex=$argsex
ONBUILD ENV A=10
CMD echo $name && echo $xsex  && echo $A

test文件夹中的dockerfile

FROM demo

alpine的另外一种用法

FROM alpine:edge as builder
LABEL stage=go-builder
WORKDIR /app/
COPY ./ ./
RUN apk add --no-cache bash git go gcc musl-dev; \
    bash build.sh

FROM alpine:edge
LABEL MAINTAINER="charlotte"
VOLUME /opt/streamServer/data
WORKDIR /opt/streamServer/
COPY --from=builder /app ./
EXPOSE 8081
CMD ["./StreamServer"]

Docker 简单操作命令

1. 镜像 image

编译docker image

不要忘记这个 . 代表着dockerfile 在当前目录下

docker build -t stream-server .

删除镜像

docker rmi 镜像ID
# 这里可以加上-f 代表强制删除
docker rmi -f 镜像ID

给镜像打版本号(标签)

docker tag 镜像名称 仓库地址/项目名称/镜像名称:版本号
# e.g. 
docker tag charlotteliu/demo charlotteliu/demo:v1

推送镜像

docker push 镜像全称:版本号
# e.g.  不写版本号 就会给一个默认的latest
docker push charlotteliu/demo:v1 

⚠️: 推送之前先登录dockerhub 或者其他自建 再或者别的镜像仓库

docker login 仓库地址
# 仓库地址不写,默认会推送dockerhub
# 命令回车后,根据提示输入账号密码即可

查看本地所有镜像

docker image ls
# 或者可以用下面的
docker images

查看某个镜像详情

docker inspect 镜像名称

导出镜像

docker image save 镜像名称 -o 导出名称.img

导入镜像

docker image load -i 导出名称.img

查看镜像需要的物料

docker sbom imageName
# e.g.
docker sbom alpine:latest

2. 网络

每个容器都运行在独自的局域网中, 所以,在互相访问的场景中,我们需要来管理下容器的网络

# docker 网络相关命令
docker network --help

创建一个新的网络

在docker run 的时候可以把这个网络给加上去

docker network create 网络名称

查看所有网络

docker network ls

3. 文件系统

Volume 是Docker文件存储系统

# 关于volume的相关命令
docker volume --help

4. 容器(非常重要)

# 查看容器相关命令
docker container --help

查看容器运行占用系统资源

docker container stats
# 或者用下面的这个命令
docker stats

运行容器

通过docker 我们可以实现后台运行和自动重启

-d 为后台运行

-it 分配一个交互的命令行

docker container run 
  --name my-container  # 指定运行名称,否则是个随机的名字
  --rm                 # 结束后自动删除
  --net  mynet         # 指定容器使用哪个网络
  --volume ${PWD}:/tmp # 也可以简写成-v 把当前目录挂载到容器的 /tmp 上
  --volumes-from 卷名称 # 挂载卷到容器中
  --it                 # 进入容器内部,挂载终端
  -d                   # 后台运行
  --restart=always     # 无限重启容器
  -p 2333:8081         # 把容器外部的2333 和 容器内部的8081 建立映射
  --shm-size="2g"      # 设置共享内存大小为2g
stream-server          # 容器名称
bash                   # 容器执行的命令 根据不同的镜像可能没有bash 可以换成/bin/sh 但是注意,加上了bash Dockerfile中的CMD就不执行了

# e.g
docker run -itd --restart=always -v /opt/streamServer:/opt/streamServer/data -p 8081:8081 --name stream-server stream-server

查看当前运行的容器

docker ps

查看包含已经停止的容器

docker ps -a

进入正在运行的容器

docker exec -it 容器id /bin/sh

停止运行容器

docker stop 容器ID

删除停止的容器

容器必须先停止才能删除

docker rm 容器ID

把容器变成镜像

通过这个方法,可以替换 docker tag 来使用

docker commit -a "作者" -m "变更内容" 容器名称/容器ID 镜像全名:版本号(标签)
# e.g.
docker commit -a "charlotte" -m "test" charlotteliu/demo charlotteliu/demo:v1

强杀容器 相当于 kill -9

和stop 的区别,

docker kill

重启

docker container restart 容器ID
# 或者
docker restart 容器ID

日志

docker container 容器ID logs

docker mirror

类似于github 你想要拉的代码都在国外服务器

更改镜像地址

{
  "registry-mirrors":[
    "https://registry.docker-cn.com",
    "https://fao37qgz.mirror.aliyuncs.com",
    "https://kfwkfulq.mirror.aliyuncs.com",
		"https://pee6w651.mirror.aliyuncs.com",
    "https://21qq34jg.mirror.aliyuncs.com"
  ]
}
# 重新加载daemon 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker

免去sudo

# 免去sudo 使用docker
sudo groupadd docker				   # 创建新用户组
sudo usermod -aG docker $USER  # 当前用户加入用户组
newgrp docker 								 # 刷新用户组权限