镜像构建上下文
如果注意,会看到 docker build
命令最后有一个 .
。 .
表示当前目录,而 Dockerfile
就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile
所在路径,这么理解其实是不准确的。如果对应上面的命令格式, 你可能会发现,这是在指定 上下文路径
。
如果在 Dockerfile 中这么写: COPY ./package.json /app/
这并不是要复制执行 docker build
命令所在的目录下的 package.json
,也不是复制 Dockerfile
所在目录下的 package.json
,而是复制 上下文
(context) 目录下的package.json
。
理解构建上下文对于镜像构建是很重要的,避免犯一些不应该的错误。比如有些初 学者在发现 COPY /opt/xxxx /app
不工作后,于是干脆将 Dockerfile
放到了硬盘根目录去构建,结果发现 docker build
执行后,在发送一个几十GB的东西,极为缓慢而且很容易构建失败。那是因为这种做法是在让 docker build
打包整个硬盘,这显然是使用错误。 一般来说,应该会将 Dockerfile
置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来
。如果目录下有些东西确实不希望构建时传给 Docker
引擎,那么可以用 .gitignore
一样的语法写一 个 .dockerignore
,该文件是用于剔除不需要作为上下文传递给 Docker
引擎的。
`
Dockerfile 制作镜像
docker build -t nginx:v3 .
scratch
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch
。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
FROM scratch ...
如果你以 scratch
为基础镜像的话,意味着你不以任何镜像为基础,接下来所写 的指令将作为镜像第一层开始存在。 不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如 swarm
、 etcd
。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供 运行时支持,所需的一切库都已经在可执行文件里了,因此直接FROM scratch
会让镜像体积更加小巧。使用 Go
语言 开发的应用很多会使用这种方式来制作镜 像,这也是为什么有人认为 Go
是特别适合容器微服务架构的语言的原因之一。
容器保存为镜像
docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
查看镜像内的历史记录
docker history nginx:v2
docker image ls -f dangling=true
#虚悬镜像(dangling image)
docker image prune
#删除虚悬镜像
docker system df
#查看镜像、容器、数据卷所占用的空间
docker inspect
#获取容器/镜像的元数据。
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1a5a10f50ee9 nginx 0.00% 850.2MiB / 251.6GiB 0.33% 674kB / 30.1MB 0B / 0B 41
e253113fa975 data_engine 0.22% 37.48MiB / 251.6GiB 0.01% 2.45GB / 1.85GB 0B / 0B 75
396085fec743 kafka 0.49% 1.288GiB / 251.6GiB 0.51% 1.87GB / 2.53GB 287kB / 7.27GB 139
18aad55b9f7c php-fpm 0.21% 628.1MiB / 251.6GiB 0.24% 1.84GB / 2.24GB 0B / 1.83MB 61
6a7baf75c448 mysql-db 0.04% 931.7MiB / 251.6GiB 0.36% 670MB / 1.07GB 6.81MB / 6GB 34
20d864a50688 elasticsearch 0.32% 5.491GiB / 15GiB 36.61% 229MB / 320MB 1.01MB / 9.37MB 337
89117b4ab8e2 zookeeper 0.04% 659.1MiB / 251.6GiB 0.26% 106MB / 63.1MB 0B / 656kB 47
c438951bf60d redis-db 0.15% 12.05MiB / 251.6GiB 0.00% 1.36GB / 464MB 0B / 1.18GB 4
f2cb059a1383 mongodb 0.37% 74.4MiB / 251.6GiB 0.03% 29.7MB / 29.2MB 0B / 633kB 35
## List Docker CLI commands
docker
docker container --help
## Display Docker version and info
docker --version
docker version
docker info
## Execute Docker image
docker run hello-world
## List Docker images
docker image ls
## List Docker containers (running, all, all in quiet mode)
docker container ls
docker container ls --all
docker container ls -aq
$ docker ps // 查看所有正在运行容器
$ docker stop containerId // containerId 是容器的ID
$ docker ps -a // 查看所有容器
$ docker ps -a -q // 查看所有容器ID
$ docker stop $(docker ps -a -q) // stop停止所有容器
$ docker rm $(docker ps -a -q) // remove删除所有容器
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image的话
docker rmi $(docker images -q)
# Create image using this directory's Dockerfile
docker build -t friendlyhello .
# Run "friendlyname" mapping port 4000 to 80
docker run -p 4000:80 friendlyhello
# Same thing, but in detached mode
docker run -d -p 4000:80 friendlyhello
# List all running containers
docker container ls
# List all containers, even those not running
docker container ls -a
# Gracefully stop the specified container
docker container stop <hash>
# Force shutdown of the specified container
docker container kill <hash>
# Remove specified container from this machine
docker container rm <hash>
# Remove all containers
docker container rm $(docker container ls -a -q)
# List all images on this machine
docker image ls -a
# Remove specified image from this machine
docker image rm <image id>
# Remove all images from this machine
docker image rm $(docker image ls -a -q)
# Log in this CLI session using your Docker credentials
docker login
# Tag <image> for upload to registry
docker tag <image> username/repository:tag
# Upload tagged image to registry
docker push username/repository:tag
# Run image from a registry
docker run username/repository:tag