Dockerfile
1. 几个重要的关键词
- FROM 从什么镜像构建
- WORKDIR 工作目录
- COPY 拷贝文件到容器中
- RUN 运行shell语句,在构建时运行
- 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. 其他指令
ADD 和COPY
- ADD 对比COPY 可以从一个链接中加载
- ADD 自带解压包
ENTRYPOINT和CMD
- 如果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 # 刷新用户组权限