docker命令手册(初稿)


1. 使用:

1.1 查看docker版本

docker version

1.2 镜像操作:

1.2.1 查看所有镜像

docker images

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    2b7d6430f78d   6 days ago    142MB
busybox      latest    7a80323521cc   4 weeks ago   1.24MB

# 解释
REPOSITORY      # 镜像仓库源
TAG             # 镜像的标签
IMAGE ID        # 镜像的ID
CREATED         # 镜像的创建时间
SIZE            # 镜像的大小

--all , -a  Show all images (default hides intermediate images) # 显示所有
--digests  Show digests
--filter , -f  Filter output based on conditions provided
--format  Pretty-print images using a Go template
--no-trunc  Don’t truncate output
--quiet , -q  Only show numeric IDs # 只显示id

1.2.2 搜索镜像

docker search 镜像名

# 解释
Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output


docker search mysql --filter=STARS=3000 # 搜索出Stars大于3000的

1.2.3 下载镜像

docker pull 镜像名[:tag]  # 不写tag,默认是lasest

1.2.4 删除镜像

docker image rm XXXX  # XXXX 镜像名字或者ID 

可选参数:
--force, -f          # 强制删除映像
--no-prune           # 不要删除未标记的父映像

# 删除一个 可以通过名称 也可以指定id -f表示强制
docker rmi -f 9cfcce23593a
# 删除多个 用空格分隔id
docker rmi -f 镜像id 镜像id 镜像id
# 删除所有 
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除

1.2.5 镜像导入和导出

#导出
docker image save nginx:1.20.0 -o  nginx.image # 导出nginx 版本为1.20.0 当前目录输出文件名为nginx.image

#导入
docker image load -i  ./nginx.image  # 导入nginx 当前目录的文件名为nginx.image

1.2.6 镜像编译(dockerfile)

#编译 build
docker image build -t hello[:1.0] . # 将目录.(当前目录)下dockerfile文件进行编译,-t =名字[:版本号(默认latest)]

#例
docker images build -f dockerfile -t  nginx-my .

1.2.7 对已存在镜像变更新的标记

#标记 tag
docker image tag nginx piaohan/nginx:1.0 # 将镜像nginx克隆为piaohan/nginx版本号1.0的镜像

1.2.8 镜像发布(登录)

#docker Hub 发布 需要先登录
docker login

1.2.9 镜像发布(发布)

#docker Hub 发布
#需要先登录
#发布 push
docker image push  piaohan/nginx:1.0 # 将piaohan/nginx:1.0 推送到dockerHub上

1.2.9 镜像拉取

#docker Hub 
#需要先登录
#发布 pull
docker image pull  piaohan/nginx:1.0 # 将piaohan/nginx:1.0 镜像 拉取下来

1.2.10 镜像分层(创建的历史记录)

#查看本地镜像分层
docker image history  piaohan/nginx # piaohan/nginx:1.0 层级情况和大小

1.3 容器操作:

1.3.1 查看当前的容器

docker ps [可选参数]     # 当前正在运行的容器
docker ps -a            # 当前所有的容器(包括停止的)

1.3.2 创建并运行容器

# docker container run nginx

# 启动并进入容器
docker run -it nginx /bin/bash 
# 等价于:先run启动,然后通过exex /bin/bash 进入容器
docker run -it nginx 
docker exec -it 容器id /bin/bash

docker run --rm -it 容器id /bin/bash # 运行后退出自动删除容器

1.3.3 退出容器

exit        //停止容器
ctr+p+q     //非停止容器

1.3.4 删除容器

docker rm [可选参数] 容器id

# 删除所有容器 -f 强制的
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm

1.3.5 启动、重启、停止、杀死容器

启动:docker start   容器id
重启:docker restart 容器id
停止:docker stop    容器id
杀死:docker kill    容器id

1.3.6 查看容器运行的命令


C:\Users\Administrator> docker ps # 查看运行的容器
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
915ed8e9fed3   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   80/tcp    eager_bardeen

C:\Users\Administrator> docker top 91 # 查看容器运行的命令
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1646                1626                0                   17:06               ?                   00:00:00            nginx: master process nginx -g daemon off;
uuidd               1703                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1704                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1705                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1706                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1707                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1708                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1709                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1710                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1711                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1712                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1713                1646                0                   17:06               ?                   00:00:00            nginx: worker process
uuidd               1714                1646                0                   17:06               ?

1.3.7 通过容器提交为镜像

docker container commit  #容器Id [重新命名(piaohan/nginx)[:版本号]]
#可以将新创建的镜像push到dockerHub上

1.3.8 清理已经停止的容器

docker system prune -f 

扩展

prune 命令用来删除不再使用的 docker 对象。

删除所有未被 tag 标记和未被容器使用的镜像:

$ docker image prune

WARNING! This will remove all dangling images.

Are you sure you want to continue? [y/N] y

删除所有未被容器使用的镜像:

$ docker image prune -a

删除所有停止运行的容器:

$ docker container prune

删除所有未被挂载的卷:

$ docker volume prune

删除所有网络:

$ docker network prune

删除 docker 所有资源:

$ docker system prune

1.4 dockerfile

1.4.1 FROM

基础镜像的选择

$ docker image ls
REPOSITORY      TAG             IMAGE ID       CREATED          SIZE
bitnami/nginx   1.18.0          dfe237636dde   28 minutes ago   89.3MB
nginx           1.21.0-alpine   a6eb2a334a9f   2 days ago       22.6MB
nginx           1.21.0          d1a364dc548d   2 days ago       133MB

假如我们有一个 index.html 文件

<h1>Hello Docker</h1>

准备一个Dockerfile

FROM nginx:1.21.0-alpine

ADD index.html /usr/share/nginx/html/index.html

1.4.2 RUN(执行指令)

RUN 主要用于在Image里执行指令,比如安装软件,下载文件等

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz
RUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gz
RUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo
RUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ipinfo       latest    97bb429363fb   4 minutes ago   138MB
ubuntu       21.04     478aa0080b60   4 days ago      74.1MB
$ docker image history 97b
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
97bb429363fb   4 minutes ago   RUN /bin/sh -c rm -rf ipinfo_2.0.1_linux_amd…   0B        buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c mv ipinfo_2.0.1_linux_amd64 /…   9.36MB    buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c tar zxf ipinfo_2.0.1_linux_am…   9.36MB    buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c wget https://github.com/ipinf…   4.85MB    buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c apt-get install -y wget # bui…   7.58MB    buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c apt-get update # buildkit        33MB      buildkit.dockerfile.v0
<missing>      4 days ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      4 days ago      /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>      4 days ago      /bin/sh -c [ -z "$(apt-get indextargets)" ]     0B
<missing>      4 days ago      /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   811B
<missing>      4 days ago      /bin/sh -c #(nop) ADD file:d6b6ba642344138dc…   74.1MB

改进版

FROM ubuntu:20.04
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
    tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
    mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
ipinfo-new   latest    fe551bc26b92   5 seconds ago    124MB
ipinfo       latest    97bb429363fb   16 minutes ago   138MB
ubuntu       21.04     478aa0080b60   4 days ago       74.1MB
$ docker image history fe5
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
fe551bc26b92   16 seconds ago   RUN /bin/sh -c apt-get update &&     apt-get…   49.9MB    buildkit.dockerfile.v0
<missing>      4 days ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      4 days ago       /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>      4 days ago       /bin/sh -c [ -z "$(apt-get indextargets)" ]     0B
<missing>      4 days ago       /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   811B
<missing>      4 days ago       /bin/sh -c #(nop) ADD file:d6b6ba642344138dc…   74.1MB

1.4.3 文件复制和目录操作 (ADD,COPY,WORKDIR)

往镜像里复制文件有两种方式,COPYADD , 我们来看一下两者的不同。

复制普通文件

COPYADD 都可以把local的一个文件复制到镜像里,如果目标目录不存在,则会自动创建

FROM python:3.9.5-alpine3.13
COPY hello.py /app/hello.py

比如把本地的 hello.py 复制到 /app 目录下。 /app这个folder不存在,则会自动创建

复制压缩文件

ADDCOPY 高级一点的地方就是,如果复制的是一个gzip等压缩文件时,ADD会帮助我们自动去解压缩文件。

FROM python:3.9.5-alpine3.13
ADD hello.tar.gz /app/

如何选择

因此在 COPYADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD

目录的切换
WORKDIR 切换到目录,如果目录不存在会创建该目录

FROM python:3.9.5-alpine3.13
WORKDIR /app
COPY hello.py hello.py

1.4.4 构建参数和环境变量 (ARG vs ENV)

ARGENV 是经常容易被混淆的两个Dockerfile的语法,都可以用来设置一个“变量”。 但实际上两者有很多的不同。

FROM ubuntu:20.04
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
    tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
    mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_2.0.1_linux_amd64.tar.gz

ENV

FROM ubuntu:20.04
ENV VERSION=2.0.1
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
    tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
    mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz

ARG

FROM ubuntu:20.04
ARG VERSION=2.0.1
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
    tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
    mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz

区别

ARG 可以在镜像build的时候动态修改value, 通过 --build-arg

$ docker image build -f .\Dockerfile-arg -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0 .
$ docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
ipinfo-arg-2.0.0   latest    0d9c964947e2   6 seconds ago    124MB
$ docker container run -it ipinfo-arg-2.0.0
root@b64285579756:/#
root@b64285579756:/# ipinfo version
2.0.0
root@b64285579756:/#

ENV 设置的变量可以在Image中保持,并在容器中的环境变量里

1.4.5 容器启动命令1: CMD

CMD可以用来设置容器启动时默认会执行的命令。

原则:

  • 容器启动时默认执行的命令

  • 如果docker container run启动容器时指定了其它命令,则CMD命令会被忽略

  • 如果定义了多个CMD,只有最后一个会被执行。

FROM ubuntu:20.04
ENV VERSION=2.0.1
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
    tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
    mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz

CMD ["ipinfo"]
docker image build -t ipinfo .  # 编译当前目录的dockerfile
docker run -it ipinfo

上述镜像做容器运行时 会自动运行ipinfo 这个命令 遵循第三原则

1.4.6 容器启动命令2: ENTRYPOINT

ENTRYPOINT 也可以设置容器启动时要执行的命令,但是和CMD是有区别的。

  • CMD 设置的命令,可以在docker container run 时传入其它命令,覆盖掉 CMD 的命令,但是 ENTRYPOINT 所设置的命令是一定会被执行的。

  • ENTRYPOINTCMD 可以联合使用,ENTRYPOINT 设置执行的命令,CMD传递参数

FROM ubuntu:20.04
CMD ["echo", "hello docker"]

把上面的Dockerfile build成一个叫 demo-cmd 的镜象

$ docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
demo-cmd          latest    5bb63bb9b365   8 days ago   74.1MB
FROM ubuntu:20.04
ENTRYPOINT ["echo", "hello docker"]

build成一个叫 demo-entrypoint 的镜像

$ docker build -t demo-entrypoint .

$ docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
demo-entrypoint   latest    b1693a62d67a   8 days ago   74.1MB

CMD的镜像,如果执行创建容器,不指定运行时的命令,则会默认执行CMD所定义的命令,打印出hello docker

$ docker container run -it --rm demo-cmd
hello docker

但是如果我们docker container run的时候指定命令,则该命令会覆盖掉CMD的命令,如:

$ docker container run -it --rm demo-cmd echo "hello world"
hello world

但是ENTRYPOINT的容器里ENTRYPOINT所定义的命令则无法覆盖,一定会执行

$ docker container run -it --rm demo-entrypoint
hello docker
$ docker container run -it --rm demo-entrypoint echo "hello world"
hello docker echo hello world

2. 案例

2.1 下载centos 镜像

docker pull centos

2.2 新建容器实例并启动

docker run [可选参数] image

# 参数说明
--name="Name"   # 容器名字,用于区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 如-p 8080::8080
 -p ip:主机端口:容器端口
 -p 主机端口:容器端口(常用)
 -p 容器端口
 
-p 随机指定端口

# 测试,启动并进入容器
docker run -it centos /bin/bash 
# 等价于:
docker run -it centos 
docker exec -it 容器id /bin/bash
# 查看目录,查看容器内的centos,基本版本,很多命令都是不完善的!
ls
# 退出,从容器中退回主机
exit

2.3 查看运行的容器

# 查看正在运行的容器
docker ps
# 查看所有(包括曾经)运行的容器
docker ps -a
# 显示最近创建的容器,设置显示个数
docker ps -a - n=? 
# 只显示容器的编号(容器id)
docker ps -aq

[root@192 ~]docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@192 ~]docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
9939864fa2e6        centos              "bin/bash"          4 minutes ago       Exited (0) 4 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         8 minutes ago       Exited (0) 4 minutes ago                       lucid_cannon
a89ddb393d3d        bf756fb1ae65        "/hello"            19 hours ago        Exited (0) 19 hours ago                        gracious_bhabha

[root@192 ~] docker ps -a -n=2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
9939864fa2e6        centos              "bin/bash"          6 minutes ago       Exited (0) 6 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         10 minutes ago      Exited (0) 7 minutes ago 

[root@192 ~] docker ps -aq
9939864fa2e6
5f42e9930435
a89ddb393d3d

2.4 退出容器

# 容器停止退出
exit
# 容器不停止退出 注意必须在英文输入法下,中文输入法不行
Ctrl + P + Q

[root@192 ~] docker run -it centos /bin/bash

[root@bfcea13c40cd /] docker ps ##注意这里会自动给个命令,删掉

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
bfcea13c40cd        centos              "/bin/bash"         About a minute ago   Up About a minute                       stoic_wilson
edbd9366d959        centos              "/bin/bash"         7 minutes ago        Up 7 minutes                            affectionate_bartik

[root@192 ~] docker exec -it edbd9366d959 /bin/bash ## 再次进入
[root@edbd9366d959 /]# exit ##停止并推出
exit

2.5 删除容器

# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm

[root@192 ~] docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
bfcea13c40cd        centos              "/bin/bash"         29 minutes ago      Up 29 minutes                                   stoic_wilson
edbd9366d959        centos              "/bin/bash"         35 minutes ago      Up 35 minutes                                   affectionate_bartik
9939864fa2e6        centos              "bin/bash"          48 minutes ago      Exited (0) 48 minutes ago                       unruffled_knuth
5f42e9930435        centos              "/bin/bash"         52 minutes ago      Exited (0) 49 minutes ago                       lucid_cannon
a89ddb393d3d        bf756fb1ae65        "/hello"            20 hours ago        Exited (0) 20 hours ago                         gracious_bhabha

[root@192 ~] docker rm 5f42e9930435
5f42e9930435

[root@192 ~] docker rm edbd9366d959      # 注意正在运行的容器不能删除
Error response from daemon: You cannot remove a running container edbd9366d9596c744dd449119269b04de2f2a494e7fc471f6396bcefd94c33fe. Stop the container before attempting removal or force remove


[root@192 ~] docker ps -aq # 所有容器id
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d

[root@192 ~]# docker rm -f $(docker ps -aq) # 全部删除
bfcea13c40cd
edbd9366d959
9939864fa2e6
a89ddb393d3d

2.6 启动和停止/杀死容器的操作

docker start
docker restart
docker stop
docker kill

文章作者: 孤雪飘寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 孤雪飘寒 !
  目录