docker 笔记(部分)
- 查看docker的基本信息
docker version
docker info
docker image ls
//查看镜像
docker image rm imageName
//删除imageName
docker container run imageName
//run imageName(如果image imageName不存在会去拉取)
docker container ls -a
//查看所有container和其状态
docker container stop containerName or ID
//stop container
docker container rm ID
//删除container
docker container start ID
//运行一个创建了但是停掉了的container
docker container ps -aq
//列出所有container id
docker container stop $(docker container ps -aq)
//停止所有的container
不能直接删除一个run 的container,但是可以-f 强制删除
容器的两种模式:attached(前台) detached(后台)
docker image run -d -p 80:80 nginx
//后台运行detach
docker attach id
//detach -->attach
docker container logs id
查看detach的 id的 logs
docker container logs -f id
// 动态跟踪
- 交互:
docker exec -it ID sh(经常用)
//进入一个正在运行的容器内部shell
docker container run -it containerName sh
// 创建一个容器并且进入交互式模式
docker container top id
- docker container run -d --p 80:80 --name 容器别名 nginx
上面命令执行的细节:
1.在本地查找是否有nginx这个image镜像,但是没有发现去远程的image registry查找nginx镜像(默认的registry是Docker Hub),而且下载最新版本的nginx镜像 (nginx:latest 默认)
2.基于nginx镜像来创建一个新的容器,并且准备运行
3.docker engine分配给这个容器一个虚拟IP地址
4.在宿主机上打开80端口并把容器的80端口转发到宿主机上
5.启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)
- image获取:
1.docker hub
docker image pull imageName:版本号/
/拉取image,版本号默认为lasted
docker image inspect imageId
// 查看image详细信息.
docker image rm id
(只有coantainer里面也rm 了才可以删除,stop也不行,或者强制删除)
2.离线导入导出
docker image save imagename -o filename
//将image导出为一个文件
docker image load -i filename
3.dockerfile
docker image build -f dockerfilename -t imageName:tag .
(.表示当前目录)
docekr image push userID/imageName:tag
//push自己的image到docker hub.
docker image pull userID/imageName:tage
//拉取user的版本为tag的image到本地.
- docker commit
docker container commint containerID imageName:tag
//将一个container 打包成一个image(用的少)
- scratch
是一个空的镜像,什么都没有
dockerfile
镜像选择原则
官方镜像优于非官方的镜像,如果没有官方镜像,则尽量选择Dockerfile开源的
固定版本tag而不是每次都使用latest
尽量选择体积小的镜像
docker image build -f dockerFileNmae -t imageName .//将dockerFileName 构建为名字为imageName的镜像 .表示当前路径
FROM 选择基础镜像
RUN 主要用于在Image里执行指令,比如安装软件,下载文件等。尽量把语句写一个run里面
文件复制和目录操作,COPY ADD
把本地的一个文件复制到镜像里,如果镜像没有目标文件,则会自动创建。比如把本地的 hello.py 复制到 /app 目录下。 /app这个镜像不存在,则会自动创建。
ADD和COPY区别就是复制的是一个gzip等压缩文件时,ADD会帮助我们自动去解压缩文件。需要自动解压缩的场合使用 ADD。
- WORKDIR: 切换当前镜像的目录,如果不存在就创建目录
- ENV ARG 环境变量
ENV 设置的变量可以在Image中保持,并在容器中的环境变量里
ARG 可以在镜像build的时候动态修改value, 通过 --build-arg
- 容器启动命令CMD ENTRYPOINT:CMD可以用来设置容器启动时默认会执行的命令。
注意:如果docker container run启动容器时指定了其它命令,则CMD命令会被忽略并且如果定义了多个CMD,只有最后一个会被执行。但是ENTRYPOINT一定会执行**
- DockerFile 技巧
1.合理使用缓存,把改变的尽量放到后面。
2.合理使用 .dockerignore
3.镜像的多阶段构建
4.尽量使用非root用户
docker的存储
Docker主要提供了两种方式做数据的持久化
- Data Volume, 由Docker管理, 持久化数据的最好方式
- Bind Mount,由用户指定存储的数据具体mount在系统什么位置
docker volume ls //查看volume DIRVER 和 VOLUMENAME
docker volume inspect VOLUMENAME //查看volume详细信息
dcoker volume prune //一次性删除所有volume
docekr container run -v localDir:containerDir imageName //把本地文件作为volume映射到容器。(如果两个不同的容器映射同一个本地的文件,在A容器里面修改volume对B容器可见)
Bind Mount
用户自己指定host机器的目录mount到container中。但是bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。所以bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。