docker常用命令

docker 官方文档地址
中文文档

镜像构建上下文

如果注意,会看到 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 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写 的指令将作为镜像第一层开始存在。 不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如 swarmetcd 。对于 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