常用命令

image.png

基础操作

1、镜像

镜像命名格式:

  1. [Docker Registry地址] : 端口号 / 分类 / 仓库名 : 标签TAG
  2. | | | | |
  3. | | | | 默认是latest
  4. | | | 拉取的镜像名
  5. | | 默认是library
  6. | 默认是80
  7. 默认是docker.io

1.1 查看镜像

  1. docker images
  2. docker images -qa #-a查看本地所有镜像,-q查看本地镜像的id

image.png

1.2 搜索镜像

  1. docker search IMAGENAME
  2. 例如
  3. docker search nginx

官方镜像仓库docker hub ,也可以浏览器搜索查找

image.png
image.png

1.3 拉取镜像

  1. docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  2. 例如
  3. docker pull nginx #不写参数都是默认

image.png
可以从国内镜像站拉取,例如网易云仓库:
https://c.163.com
进入后登录进入控制台,搜索进入到镜像中心
https://c.163yun.com/hub#/home
搜索查看复制拉取地址进行拉取
image.png
image.png

  1. docker pull hub.c.163.com/library/centos:latest

image.png

1.4 查看镜像详细信息

  1. docker inspect IMAGEID

image.png

1.5 删除镜像

  1. docker image rmi [选项] <IMAGE1> [<IMAGE2> ...] #选项 -f 表示强制删除
  2. docker rmi -f $(docker images -qa) #删除所有镜像

image.png

1.6 给镜像打标签

  1. docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

有的场景从其他镜像站拉取后名字都是默认的,是很长很难记的名字,就可以使用tag将已经拉取的镜像打标签,则会生成一个较好记的名字,但是实际上前后的镜像ID 都是相同的,本质上都是相同的一个镜像,类似于Linux系统中的软连接,也可以说是设置一个别名。如下:

  1. [root@vms10 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx latest 605c77e624dd 2 months ago 141MB
  4. mysql latest 3218b38490ce 2 months ago 516MB
  5. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  6. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  7. [root@vms10 ~]# docker tag hub.c.163.com/library/centos:latest centos:v1
  8. [root@vms10 ~]# docker images
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. nginx latest 605c77e624dd 2 months ago 141MB
  11. mysql latest 3218b38490ce 2 months ago 516MB
  12. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  13. centos v1 328edcd84f1b 4 years ago 193MB
  14. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB

image.png
当删除其中一个的时候只是取消标签,当删除唯一的一个的时候才是真正的删除。
image.png

1.7 导出镜像

  1. docker save [OPTIONS] IMAGE [IMAGE1 IMAGE2 IMAGE3...]
  2. docker save > image.tar # 命令用于将 Docker镜像保存到标准输出。
  3. docker save -o image.tar # 命令用于将 Docker镜像保存到指定文件。

1.8 导入镜像

  1. docker load [OPTIONS] IMAGE.tar
  2. docker load < imageName.tar # 用于从标准输入载入镜像。
  3. docker load -i imageName.tar # 用于从文件载入镜像。

image.png

如果有很多镜像需要导出,标签TAG都不统一,可以通过脚本一起导出

  1. vim save_all_image.sh
  2. #!/bin/bash
  3. images=$(docker images | grep -v 'TAG' | awk '{print $1":"$2}' | tr "\n" " " )
  4. docker save $images > all_image.tar

1.9 查看容器内的环境进程

  1. docker history IMAGE # 主要查看CMD 运行的命令

image.png

如果遇到显示不全的可以加上 —no-trunc
image.png

2、容器

2.1 查看容器

  1. docker ps # 查看正在运行的容器
  2. docker ps -a # 查看所有的容器

2.2 创建并启动容器

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  2. OPTIONS参数说明:
  3. -i:保持容器运行。通过和-t同时使用。加入-it这两个参数以后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭。
  4. -t:为容器重新分配一个伪输入终端,通常和-i同时使用。
  5. -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。
  6. -it:创建的容器一般称为交互式容器。
  7. -id:创建的容器一般称为守护式容器。
  8. --name:为创建的容器命名。
  9. -p:映射端口 外部端口:容器内部暴露的端口

命令参数详细列表

选项 说明
-d, —detach=false 指定容器运行于前台还是后台,默认为 false。
-i, —interactive=false 打开 STDIN,用于控制台交互。
-t, —tty=false 分配 tty 设备,该可以支持终端登录,默认为 false。
-u, —user=”” 指定容器的用户。
-a, —attach=[] 登录容器(必须是以 docker run -d 启动的容器)。
-w, —workdir=”” 指定容器的工作目录。
-c, —cpu-shares=0 设置容器 CPU 权重,在 CPU 共享场景使用。
-e, —env=[] 指定环境变量,容器中可以使用该环境变量。
-m, —memory=”” 指定容器的内存上限。
-P, —publish-all=false 指定容器暴露的端口。
-p, —publish=[] 指定容器暴露的端口。
-h, —hostname=”” 指定容器的主机名。
-v, —volume=[] 给容器挂载存储卷,挂载到容器的某个目录。
–volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录。
–cap-add=[] 添加权限。
–cap-drop=[] 删除权限。
–cidfile=”” 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法。
–cpuset=”” 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU。
–device=[] 添加主机设备给容器,相当于设备直通。
–dns=[] 指定容器的 dns 服务器。
–dns-search=[] 指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件。
–entrypoint=”” 覆盖 image 的入口点。
–env-file=[] 指定环境变量文件,文件格式为每行一个环境变量。
–expose=[] 指定容器暴露的端口,即修改镜像的暴露端口。
–link=[] 指定容器间的关联,使用其他容器的 IP、env 等信息。
–lxc-conf=[] 指定容器的配置文件,只有在指定 —exec-driver=lxc 时使用。
–name=”” 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字。
–net=“bridge” 器网络设置:
1. bridge 使用 docker daemon 指定的网桥。
2. host //容器使用主机的网络。
3. container:NAME_or_ID >//使用其他容器的网路,共享 IP 和 PORT 等网络资源。
4. none 容器使用自己的网络(类似–net=bridge),但是不进行配置。
–privileged=false 指定容器是否为特权容器,特权容器拥有所有的 capabilities。
–restart=“no” 指定容器停止后的重启策略:
1. no:容器退出时不重启。
2. on-failure:容器故障退出(返回值非零)时重启。
3. always:容器退出时总是重启。
–rm=false 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)。
–sig-proxy=true 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理。

示例:

  1. [root@vms10 ~]# docker run hub.c.163.com/library/centos
  2. [root@vms10 ~]# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. [root@vms10 ~]# docker ps -a
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. f589995d310c hub.c.163.com/library/centos "/bin/bash" 8 seconds ago Exited (0) 8 seconds ago happy_newton

1、没有写任何参数,名字系统随机生成名字
2、执行完毕后状态STATUS 为退出的状态,是由于默认centos镜像内部CMD执行的是bash/shell,执行完毕后就退出了对应的shell ,可以通过docker history查看CMD ,退出后变为Exited状态
image.png

  1. docker run -t hub.c.163.com/library/centos

加上 -t 选项,给其分配 tty 设备,该可以支持终端登录,执行后进入但是此镜像并没有提供交互的环境,执行命令都是卡死的,无法退出操作,只能是强制删除退出。
image.png
另开一个终端删除此镜像,会出现
Error response from daemon: You cannot remove a running container c6082e3f646a2cda997f6de4e2c196b95713e0a0549c455e9559c259a76bb656. Stop the container before attempting removal or force remove
无法删除正在运行的容器,加上 -f 选项强制删除
image.png

  1. docker run -it --name=cc hub.c.163.com/library/centos

加上 -i -t 选项,可以写在一起 -it 或者 -ti 都可以,没有顺序要求,可以进行交互操作,并且可以加上 —name=cc 设置一个名字以便容易操作
image.png
但是此时间如果在容器中执行下exit退出后在看这个容器状态变为Exited状态了。
image.png
可以在运行的时候加上 —restart=always 参数,这样exit就不会退出容器

  1. docker run -it --name=cc --restart=always hub.c.163.com/library/centos

image.png

如果需要临时创建一些测试的容器,测试完毕退出后自动删除对应的镜像,那么可以加上 —rm 参数,退出后自动删除、
注意: —rm 与 —restart=always 是无法同时使用的,只能使用其中一个

  1. [root@vms10 ~]# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. [root@vms10 ~]# docker run -it --name=cc --rm --restart=always hub.c.163.com/library/centos
  4. docker: Conflicting options: --restart and --rm.
  5. See 'docker run --help'.
  6. [root@vms10 ~]# docker run -it --name=cc --rm hub.c.163.com/library/centos
  7. [root@2e929ac6201c /]# ls
  8. anaconda-post.log dev home lib64 media opt root sbin sys usr
  9. bin etc lib lost+found mnt proc run srv tmp var
  10. [root@2e929ac6201c /]# exit
  11. exit
  12. [root@vms10 ~]# docker ps -a
  13. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

image.png

2.3 进入容器

  1. docker attach [OPTIONS] CONTAINER

如果按照之前操作exit退出容器后还想进入的话可以通过 attach 进入
image.png
与其相反的 参数是 detach 不进入容器,通常是运行启动容器的时候添加,缩写为 -d 则不进入容器。

  1. docker run -idt --name=cc --restart=always hub.c.163.com/library/centos

image.png

2.4 运行容器时候指定执行容器内命令

不指定的话默认是运行容器内部CMD命令,在最后指定命令则会执行对应的命令

  1. [root@vms10 ~]# docker run -idt --name=cc --restart=always hub.c.163.com/library/centos
  2. c494de0b05863f7613b226c8d5d8eb2c0a637d6e5f646635d4dcef0451f8974d
  3. [root@vms10 ~]# docker top cc
  4. UID PID PPID C STIME TTY TIME CMD
  5. root 16781 16760 1 02:43 pts/0 00:00:00 /bin/bash
  6. [root@vms10 ~]# docker rm cc -f
  7. cc
  8. [root@vms10 ~]# docker run -idt --name=cc --restart=always hub.c.163.com/library/centos sleep 10000
  9. bd6b4dfd54c9379bf5e09c7601db091712a3d3842c9e101a15c9ed538d1bcc4f
  10. [root@vms10 ~]# docker top cc
  11. UID PID PPID C STIME TTY TIME CMD
  12. root 16892 16872 2 02:44 pts/0 00:00:00 sleep 10000

image.png
这个时候在执行docker attach cc 卡住无法正常进入到容器内部,因为/bash/shell命令已经变更,当前是运行sleep命令
image.png

可以通过exec 选项进入

  1. docker exec [options] container command [arg...]

exec命令参数列表

参数 描述
–detach, -d 后台运行模式,在后台执行命令相关命令。
–detach-keys 覆盖容器后台运行的一些参数信息。
–env, -e 设置环境变量。
–interactive, -i 展示容器输入信息 STDIN。
–privileged 为命令提供一些扩展权限。
–tty, -t 命令行交互模式。
–user, -u 设置用户名。

上述无法进入的情况可以通过exec 执行一个bash命令进入到容器运行使用,通过docker top 可以看到bash进程

  1. docker exec -it cc bash

image.png

可以使用 -e 设置内部环境变量

  1. [root@vms10 ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. [root@vms10 ~]# docker run -it --name=cc --restart=always -e xx=HAHA01 -e yy=HAHA02 hub.c.163.com/library/centos
  4. [root@279ab6145ce2 /]# echo $xx
  5. HAHA01
  6. [root@279ab6145ce2 /]# echo $yy
  7. HAHA02
  8. [root@0399e5baf69a /]# echo $zz
  9. [root@0399e5baf69a /]# exit

image.png

2.5 查看容器启动日志

  1. docker logs [OPTIONS] CONTAINER

docker logs命令参数

参数 描述
docker logs —details 显示 log 信息的额外的详细信息。
docker logs -f, —follow 跟踪日志输出。
docker logs —since 显示某个开始时间的所有日志。
docker logs —tail 仅列出最新 N 条容器日志。
docker logs -t, —timestamps 显示时间戳。

示例:启动一个MySQL容器

  1. [root@vms10 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  4. hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407MB
  5. [root@vms10 ~]# docker ps -a
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. [root@vms10 ~]# docker run -idt --name=db --restart=always hub.c.163.com/library/mysql
  8. 46c6ca5c8051fc41b293e02936839a7fb96c8ac63ada51d183254831dcb57567
  9. [root@vms10 ~]# docker ps -a
  10. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  11. 46c6ca5c8051 hub.c.163.com/library/mysql "docker-entrypoint.s…" 3 seconds ago Restarting (1) Less than a second ago db

image.png
启动后容器状态是Restarting ,并非是Up。可以通过docker logs 查看日志排错

  1. [root@vms10 ~]# docker logs db
  2. error: database is uninitialized and password option is not specified
  3. You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

image.png
报错意思就是这个镜像定义好变量,启动的时候需要指定MYSQL_ROOT_PASSWORD ,这些变量并非随意写,是这个镜像决定的,如MySQL
https://c.163yun.com/hub#/library/repository/info?repoId=2955
image.png

  1. [root@vms10 ~]# docker run -idt --name=db --restart=always -e MYSQL_ROOT_PASSWORD=123 hub.c.163.com/library/mysql
  2. 117ce45e104d4333cba3f460883d83659b557e036bec110f9e8ed3cf0fceb581
  3. [root@vms10 ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 117ce45e104d hub.c.163.com/library/mysql "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 3306/tcp db

启动后状态就是Up正常的了。
image.png
链接测试,先查看容器IP地址,在进行链接

  1. [root@vms10 ~]# docker exec -it db ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 76: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  8. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  9. valid_lft forever preferred_lft forever
  10. [root@vms10 ~]# mysql -uroot -h172.17.0.2 -p
  11. Enter password:
  12. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  13. MySQL [(none)]>

image.png

2.6 映射端口

  1. -p host_port:container_port # 物理机端口:容器端口

默认外部是无法直接访问到容器内部的程序端口的,需要映射到物理机才可以访问的。
示例1:

  1. [root@vms10 ~]# docker run -itd --name=web --restart=always -p 80 nginx
  2. aa5d32b8096538a227c656519a98722e02b669c133c836f47aab3d5baf243689
  3. [root@vms10 ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. aa5d32b80965 nginx "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp web
  6. 117ce45e104d hub.c.163.com/library/mysql "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 3306/tcp db
  7. [root@vms10 ~]# netstat -ntulp | grep 49153
  8. tcp 0 0 0.0.0.0:49153 0.0.0.0:* LISTEN 19838/docker-proxy
  9. tcp6 0 0 :::49153 :::* LISTEN 19845/docker-proxy

只写一个端口默认指的是容器中的端口,此时间物理机会随机映射监听在一个端口,可以通过docker ps 查看,如上,nginx容器自动映射到物理机的49153 端口,访问物理机的49153 端口则是容器的80端口。
image.png

示例2:

  1. [root@vms10 ~]# docker run -itd --name=web --restart=always -p 80:80 nginx
  2. 0cd419cbb49f97b276e19bebd2a28e480d683eb554a77a2b86aa96eb059f6045
  3. [root@vms10 ~]# netstat -ntulp | grep 80
  4. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19996/docker-proxy
  5. tcp6 0 0 :::80 :::* LISTEN 20002/docker-proxy

将容器80映射到物理机80端口,访问IP地址即可访问。
image.png

2.7 启动容器

  1. docker start [OPTIONS] CONTAINER [CONTAINER...]

2.8 停止容器

  1. docker stop [OPTIONS] CONTAINER [CONTAINER...]

2.9 重启容器

  1. docker restart [OPTIONS] CONTAINER [CONTAINER...]

image.png

2.10 查看容器属性

  1. docker inspect [OPTIONS] NAME|ID [NAME|ID...]

image.png

2.11 强制停止容器

  1. docker kill [OPTIONS] CONTAINER [CONTAINER...]

类似于linux中强制kill一个进程。

2.12 删除容器

  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]

Docker rm命令参数

参数 说明
-f 通过 SIGKILL 信号强制删除一个运行中的容器。
-l 移除容器间的网络连接,而非容器本身。
-v:-v 删除与容器关联的卷。

image.png

2.13 物理机与容器互相拷贝文件

  1. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH # 从容器复制到宿主机
  2. docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH # 从宿主机复制到容器

示例:

  1. [root@vms10 ~]# docker cp /etc/issue web:/tmp
  2. [root@vms10 ~]# docker cp web:/etc/hosts hosts

image.png