docker常用命令

137 阅读10分钟

docker常用命令

帮助命令

docker version  #查看版本号等基本信息
docker info     #详细的docker系统信息,包含镜像和容器的数量
docker --help   #帮助信息

镜像命令

docker images 查看本机所有镜像

 ✘  ~/.docker  docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB
​
#REPOSITORY 镜像名称
#TAG        镜像版本号
#IMAGE ID   镜像ID
#CREATED    镜像发布时间
#SIZE       镜像大小#可选项
Options:
  -a, --all             显示所有镜像
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           只显示镜像ID

docker search 镜像查询

docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11219     [OK]
mariadb                           MariaDB Server is a high performing open sou…   4263      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   833                  [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   91
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   88
centurylink/mysql                 Image containing mysql. Optimized to be link…   59                   [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         45
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   41                   [OK]
prom/mysqld-exporter                                                              40                   [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   35
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   30
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   30                   [OK]
mysql/mysql-router                MySQL Router provides transparent routing be…   21
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   20
arey/mysql-client                 Run a MySQL client from a docker container      18                   [OK]
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   16                   [OK]
yloeffler/mysql-backup            This image runs mysqldump to backup data usi…   7                    [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  7                    [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   3
jelastic/mysql                    An image of the MySQL database server mainta…   2
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                2                    [OK]
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   1                    [OK]
centos/mysql-80-centos7           MySQL 8.0 SQL database server                   1
monasca/mysql-init                A minimal decoupled init container for mysql    0
​
#说明
NAME: 镜像仓库源的名称
​
DESCRIPTION: 镜像的描述
​
OFFICIAL: 是否 docker 官方发布
​
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
​
AUTOMATED: 自动构建。
​
#可选项
Options:
  -f, --filter filter   列出符合过滤条件的镜像 docker search --filter=STARS=300 mysql
      --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 pull 镜像下载

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository  #拉取所有 tagged 镜像
      --disable-content-trust   Skip image verification (default true)        #忽略镜像的校验,默认开启
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output                       #抑制详细输出
  
  
docker pull tomcat
Using default tag: latest   #默认下载最新版本
latest: Pulling from library/tomcat #下载路径
627b765e08d1: Pull complete   #分层下载,联合文件系统
c040670e5e55: Pull complete
073a180f4992: Pull complete
bf76209566d0: Pull complete
f10db7ba7580: Pull complete
5b2f970878fa: Pull complete
ed434bfebf18: Pull complete
f6c437110aa9: Pull complete
a772951f83db: Pull complete
752225c3768e: Pull complete
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf #验证签名
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest #真是路径
  
  
docker pull tomcat ==>docker pull docker.io/library/tomcat:latest

#指定版本下载
docker pull tomcat:jdk8-corretto
jdk8-corretto: Pulling from library/tomcat
430235fb155c: Pull complete
deb7345e8715: Pull complete
364d4feb5485: Pull complete
bdcf0eab5f7f: Pull complete
8c41a02d3afa: Pull complete
Digest: sha256:8488feee97ccd7c62b7e25b3a77d4c62816a92d47c1b7b2798447298d591b510
Status: Downloaded newer image for tomcat:jdk8-corretto
docker.io/library/tomcat:jdk8-corretto

docker rmi 镜像删除

docker rmi 镜像ID
​
Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]
​
Remove one or more images
​
Options:
  -f, --force      Force removal of the image     #强制删除;
  --no-prune   Do not delete untagged parents #不移除该镜像的过程镜像,默认移除;
      
#删除多个镜像
docker rmi 镜像ID 镜像ID2
      
#删除所有镜像
docker rmi -f $(docker images -aq)

容器命令

docker run 运行容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
​
Options:
  -d: 后台运行容器,并返回容器ID;
  -i: 以交互模式运行容器,通常与 -t 同时使用;
  -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  -P: 随机端口映射,容器内部端口随机映射到主机的端口
  -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
      #四种方式
      -p ip:主机端口:容器端口
      -p 主机端口:容器端口
      -P 容器端口
      容器端口
  --name="nginx-lb": 为容器指定一个名称;
  -h "mars": 指定容器的hostname;
  -e username="ritchie": 设置环境变量;
  --env-file=[]: 从指定文件读入环境变量;
  --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  -m :设置容器使用内存最大值;
  --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  --link=[]: 添加链接到另一个容器;
  --expose=[]: 开放一个端口或一组端口;
  --volume , -v: 绑定一个卷
  
#交互模式启动容器
docker run -it centos /bin/bash
#使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
#使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口
docker run -P -d nginx:latest
#使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
#绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
​
  

docker ps 查询容器

docker ps [OPTIONS]
​
List containers
​
Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided    #根据条件过滤显示的内容
      --format string   Pretty-print containers using a Go template #指定返回值的模板文件
  -n, --last int        Show n last created containers (includes all states) (default -1) #列出最近创建的n个容器。
  -l, --latest          Show the latest created container (includes all states) #显示最近创建的容器。
      --no-trunc        Don't truncate output
  -q, --quiet           Only display container IDs
  -s, --size            Display total file sizes    #显示总的文件大小

退出容器

#在容器内直接退出,容器关闭
exit
#退出不关闭容器
control + p + q

容器起停

docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID

docker rm 删除容器

docker rm --help
​
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
​
Remove one or more containers
​
Options:
  -f, --force     Force the removal of a running container (uses SIGKILL)   #通过 SIGKILL 信号强制删除一个运行中的容器。
  -l, --link      Remove the specified link                                 #移除容器间的网络连接,而非容器本身。
  -v, --volumes   Remove anonymous volumes associated with the container    #删除与容器关联的卷。
  
 #删除所有容器
 docker rm $(docker ps -aq)

常用命令

docker logs 日志查看

docker logs --help
​
Usage:  docker logs [OPTIONS] CONTAINER
​
Fetch the logs of a container
​
Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output    #跟踪日志输出
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)    #显示某个开始时间的所有日志
  -n, --tail string    Number of lines to show from the end of the logs (default "all") 
  -t, --timestamps     Show timestamps  #显示时间戳
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

docker top 查看容器内进程

docker inspect 查看原数据

docker inspect --help
​
Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]
​
Return low-level information on Docker objects
​
Options:
  -f, --format string   Format the output using the given Go template       #指定返回值的模板文件
  -s, --size            Display total file sizes if the type is container   #显示总的文件大小
      --type string     Return JSON for specified type                      #为指定类型返回JSON

进入正在运行中的容器

# 1
docker exec 
​
Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
​
Run a command in a running container
​
Options:
  -d, --detach               Detached mode: run command in the background   #分离模式: 在后台运行
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
      --env-file list        Read in a file of environment variables
  -i, --interactive          Keep STDIN open even if not attached   #即使没有附加也保持STDIN 打开
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY    #分配一个伪终端
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container
  
 docker exec -it 9df70f9a0714 /bin/bash
 
# 2
docker attach
​
Usage:  docker attach [OPTIONS] CONTAINER
​
Attach local standard input, output, and error streams to a running container
​
Options:
      --detach-keys string   Override the key sequence for detaching a container
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)
      
#要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)
​
#区别
docker exec 重新打开一个客户端
docker attach 进入正在运行的客户端

docker cp 容器与主机之间的数据拷贝

Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
​
Copy files/folders between a container and the local filesystem
​
Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.
​
Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH
  
#将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
#将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www
#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中
docker cp  96f7f14e99ab:/www /tmp/

dockerfile

FROM

定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx

RUN

用于执行后面跟着的命令行命令。有以下俩种格式:

# shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。# exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz
# 如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
# [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
# 推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
​
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

1、不传参运行

$ docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0
​
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

格式:

ARG <参数名>[=<默认值>]

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:

EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:

WORKDIR <工作目录路径>

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:

USER <用户名>[:<用户组>]

构建镜像

docker网络

Docker 默认又三种网络模式

  • bridge: 桥接(默认)
  • host: 与主机共享网络
  • none: 不设置网络
# 查看 docker 网络
docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2e08257eda7d   bridge    bridge    local
fccfe7c833c5   host      host      local
fa66e48b7a5d   none      null      local

自定义网络

docker network create --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

实战测试

mysql安装

docker run --name mysql5.7 -v ~/dockerdir/mysql/mysql5.7/data:/var/lib/mysql -v ~/dockerdir/mysql/mysql5.7/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

常用网站

查找镜像

dockerhub

https://registry.hub.docker.com/