命令
打镜像(最后有个点代表当前路径) | docker build -t XXXXXXX . |
运行镜像 | docker run -d -p 8850:8850 XXXXXX 或者 docker run -it XXXXXX |
查看镜像 | docker images |
镜像重命名 | docker tag a:0.0.1 b:0.0.2 |
删除镜像 | docker rmi IMAGE ID 或 REPOSITORY:TAG |
查看所有的容器,包括未运行的 | docker ps -a |
终止容器 | docker stop ID |
启动&重启容器 | docker start ID 以及 docker restart ID |
删除容器 | docker rm ID (需要先停止) docker rm -f ID |
删除镜像 | docker rmi ID |
进入容器 | docker attach ID 或者 docker exec -it ID /bin/bash (表示shell类型) |
登录私库 | docker login -u username -p pwd repository.xxxx.com |
打标签 | docker tag b8b371ec6a52 image1:v1.0.1 |
推送到私库 | docker push image1:v1.0.1 |
镜像导出成tar | docker save -o c:\x.tar xxxx |
tar文件导入镜像 | docker load -i my.tar |
删除所有已经停止的容器 | docker rm $(docker ps -a -q) |
删除所有未被容器使用的镜像 | docker image prune -a |
删除所有none的镜像 | docker rmi `docker images | grep “<none>” | awk ‘{print $3}’` |
按规则批量删除 | 资料 |
docker system df -v | docker各种东西磁盘占用情况 |
docker volume prune | 清理未被容器使用的volume |
docker volume rm $(docker volume ls -qf dangling=true) | 删除所有未被任何容器关联引用的卷 |
docker system prune( -a) | 自动清理资源:已停止的container、未被容器使用的volume、未被容器关联的network、悬空image |
部分命令详细可参考:https://www.cnblogs.com/ivictor/archive/2015/09/08/4791274.html
Dockerfile
基础:
http://www.dockerinfo.net/dockerfile%e4%bb%8b%e7%bb%8d
样例:
FROM maven:3.6.3-jdk-8-buster AS build
COPY . /build/
WORKDIR /build
RUN mvn clean package -Dskiptests
RUN ls /build/XxxService/target/
FROM openjdk:8-jdk-alpine
#create workdir
RUN mkdir -p /usr/local/service
WORKDIR /usr/local/service
#add jar file
COPY --from=build /build/XxxService/target/XxxService.jar app.jar
#set time zone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#port
EXPOSE 80
#run app
ENTRYPOINT ["java","-server","-jar","app.jar"]
以上样例中出现了多阶段构建的方法,目的是减小最终镜像的大小,不将源码和编译工具放进最终镜像中。
多阶段构建:https://www.qikqiak.com/post/multi-stage-build-for-docker/
减小镜像体积的方法:https://www.jb51.net/article/194887.htm
原理
a. FROM java8 是使用本地镜像
b. 如果我想在一个已经运行的容器中 临时修改时间,可能出现以下情况:
date -s '2020-01-07 15:00:40'
date: cannot set date: Operation not permitted
docker容器的隔离是基于Linux的Capability机制实现的, Capability机制将超级用户的高级权限划分成为不同的单元. 目前Docker容器默认只用到了以下的Capability:
CHOWN, DAC_OVERRIDE, FSETID, FOWNER, MKNOD, NET_RAW, SETGID, SETUID, SETFCAP, SETPCAP, NET_BIND_SERVICE, SYS_CHROOT, KILL, AUDIT_WRITE
后续内容待补充。。。
registry可视化
- pull镜像docker-registry-web:latest
- docker run -d -p 28882:8080 -e REGISTRY_URL=http://127.0.0.1:28881/v2 -e REGISTRY_READONLY=false docker-registry-web:latest
- 访问 28882端口即可
如果该镜像运行在windows,URL不是localhost:28882.而是这个IP->
磁盘不够问题
1.节点磁盘不够
干掉无用容器和镜像等。
2.registry容器volume占用过大
由于数据卷大小自动增加,即使删掉无用镜像,volume也不会变小。
registry容器内部清理垃圾命令:docker exec -it registry /bin/registry garbage-collect /etc/docker/registry/config.yml