Docker 容器操作命令

10,261 阅读12分钟

一、 启动容器

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称

1. 命令语法

docker run [选项] [镜像名] [shell命令] [参数] 
常用选项作用
-i以交互模式运行容器,与-t一起使用
-t为容器重新分配一个伪输入终端,与-i一起使用
-d后台运行容器,并返回容器ID
--name 容器名称给容器取名
-h 名称指定容器的hostname
-P(大写)随机端口映射,容器内部端口 随机 映射到主机的端口
-p(小写)指定端口映射,格式为:主机(宿主)端口:容器端口

2. 后台启动容器

可以使用 -d 选项后台启动容器

[root@localhost ~]#  docker run -d nginx
b83c93907887044cb19de25b7d80e63c5ed226e0c34e330bfc3068666a68d218

3. 设置容器退出后启动规则

规则说明
no默认为否,退出时不自动重启容器
on-failure[:max-retries]仅当容器以非零退出状态退出时才重新启动。可以选择限制Docker守护进程尝试重新启动的次数
always无论退出状态如何,始终重新启动容器。当您指定always时,Docker守护进程将尝试无限期地重新启动容器。容器也总是在守护进程启动时启动,而不管容器的当前状态如何
unless-stopped无论退出状态如何,始终重新启动容器,但是如果容器之前已处于停止状态,则不要在守护进程启动时启动它

示例:

[root@localhost ~]#docker run -d  --restart always   httpd 

4. 启动容器执行一次性的命令

系统类的容器,启动后没有执行任何操作,不像 httpd nginx需要持续向外提供服务, 所以系统类的容器默认是一次性的容器启动就退出

[root@localhost ~]#  docker run  centos:7 echo  "hello world"
hello world
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS                     PORTS     NAMES
f604ddde5bd7   centos:7   "echo 'hello world'"      6 seconds ago    Exited (0) 6 seconds ago             relaxed_chatterjee
docker run echo.png

5. 使用命令将系统类容器持续运行

使用 docker run -it

[root@localhost ~]#  docker run -it centos:7 bash

[root@localhost ~]#  docker run -it centos:7 tail -f /etc/passwd
docker run -it.png

6. 退出容器

  • exit 如果直接使用 exit 那么容器也将停止
[root@localhost ~]#  docker run -it centos:7 bash
[root@c2cbc2849b9c /]# exit
exit
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS                     PORTS     NAMES
c2cbc2849b9c   centos:7   "bash"                    11 seconds ago   Exited (0) 5 seconds ago             priceless_montalcini
exit.png
  • ctrl+p+q 同时按三个键ctrl+p+q ,容器依然存在
[root@localhost ~]#  docker run -it centos:7 bash
[root@d07d0f31390a /]#      //同时按三个键ctrl+p+q
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND                   CREATED              STATUS                          PORTS     NAMES
d07d0f31390a   centos:7   "bash"                    About a minute ago   Up About a minute                         hungry_bhaskara
ctrl+p+q.png

7. 启动容器时指定名称

容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以使用--name 名称自定义设置名字,注意每个容器的名称要唯一。

[root@localhost ~]#  docker run --name n1 nginx
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS                      PORTS     NAMES
3866328c92bd   nginx      "/docker-entrypoint.…"   19 seconds ago   Exited (0) 12 seconds ago             n1
docker --name.png

8. 设置容器内的名称

可以使用-h 名称自定义hostname

[root@localhost ~]#  docker run -it -h 7-1 centos:7 bash
[root@7-1 /]# 
docker -h.png

二、 查看容器状态

1. 显示当前存在容器

使用命令 docker ps [OPTIONS]

命令作用
docker ps查看当前运行状态的容器
docker ps -a查看所有容器的状态 包括退出的和运行的
docker ps -q只显示运行状态的容器的ID (-aq 显示所有状态的容器的ID)
docker ps -s查看容器的大小 (-as 显示所有容器的大小)
docker ps -l查看最近的一个容器状态
docker ps -n 数字列出最近创建的n个容器
docker ps -f根据条件过滤显示的内容

挑选状态:

[root@localhost ~]#  docker ps -f status=exited   //退出状态
[root@localhost ~]#  docker ps -f status=running  //运行状态
docker ps -f.png

2. 查看容器内的进程

使用命令 docker top CONTAINER [ps OPTIONS]

[root@localhost ~]#  docker run -d --name n1 nginx  //启动一个容器,取名为 n1
3162bc2996890fd52c281d58e509f7fc63ce4ae21f5dc0542f093e3be38b3129
[root@localhost ~]#  docker top n1  //查看 n1 容器中的进程状态
top.png

3. 查看容器资源使用情况

使用命令 docker stats [OPTIONS] [CONTAINER...]进行查看(类似 top 会一直动态刷新)

[root@localhost ~]#  docker stats     //查看所有容器资源使用情况
[root@localhost ~]#  docker stats n1  //查看单个容器,可以跟容器id或容器名字

[root@localhost ~]#  docker stats  --no-stream     //查看所有,并且只运行一次
[root@localhost ~]#  docker stats  --no-stream n1  //查看n1,并且只运行一次
stats.png

4. 查看容器的详细信息

使用命令 docker inspect [OPTIONS] NAME|ID [NAME|ID...]

docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等

[root@localhost ~]#  docker inspect n1  
inspect.png
`选择性查看`
[root@localhost ~]#  docker inspect -f {{.State.Status}} n1
running

[root@localhost ~]#  docker inspect -f {{.NetworkSettings.IPAddress}} n1
172.17.0.3
//-f 通过Go模板来格式化输出容器的信息

5. 查看容器的日志

使用命令 docker logs [OPTIONS] CONTAINER可以查看容器中运行的进程在控制台输出的日志信息

[root@localhost ~]#  docker logs n1  //查看n1容器的日志

docker logs  -f  容器id   //实时追踪  
logs.png

三、 删除容器

docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉

[root@localhost ~]#  docker rm -f n1 n2        //可以根据名字删除
[root@localhost ~]#  docker rm -f c2cbc2849b9c //也可以根据id进行删除
[root@localhost ~]#  docker rm -f 60           //id可以缩写
docker rm.png
`删除退出状态的容器`
docker ps -qf status=exited |xargs -n1 docker rm
//xargs 是一个用于从标准输入读取数据,‌并将这些数据作为参数传递给另一个命令的工具。-n1 参数指定每次从输入中读取一个参数(‌即一个容器的ID)‌
sczt.png

四、 容器开启停止

docker start|stop|restart|pause|unpause 容器ID

五、 进入容器

1. attach

docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器。

2. exec

在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:  
-d, --detach              Detached mode: run command in the background
-e, --env list            Set environment variables
-i, --interactive         Keep STDIN open even if not attached
-t, --tty                 Allocate a pseudo-TTY

常见用法:docker exec -it 容器ID sh|bash

  • 一次性操作
[root@localhost ~]#  docker run -it --name c1 centos:7 bash
[root@240ad6b13bb0 /]# exit
exit
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND   CREATED         STATUS                     PORTS     NAMES
240ad6b13bb0   centos:7   "bash"    9 seconds ago   Exited (0) 6 seconds ago             c1
ycx1.png
  • 持久操作
[root@localhost ~]#  docker run -itd --name c2 centos:7
65f6f186530446e9516015af3c70d6d26e0226135ee05c62934289a6a1b673ea
[root@localhost ~]#  docker exec -it c2 bash
[root@65f6f1865304 /]# exit
exit
[root@localhost ~]#  docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
65f6f1865304   centos:7   "/bin/bash"   24 seconds ago   Up 23 seconds                         c2
exec.png

六、 暴露容器的端口

docker port CONTAINER [PRIVATE_PORT[/PROTO]] 可以查看容器的端口映射关系

1. 暴露随机端口

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务 docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化。

[root@localhost ~]#  docker run -d  -P --name n1 nginx  //启动进程并暴露端口
d5b7da32fdf8ddce3c26523c7239bb2920e0abee29386a1c52a892e81f07f579
[root@localhost ~]#  docker port n1
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
-P.png

2. 指定端口映射

docker run -p 主机(宿主)端口:容器端口 可以将容器的预定义的指定端口映射到宿主机的相应端口

注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同

[root@localhost ~]#  docker run -d  -p 9527:80 --name n2 nginx  //将容器的80端口映射成宿主机的9527端口
6a712ff21957848e403fa7b0df7b854a8847c1efaca3f17f0b36f8e5d82d5f67
[root@localhost ~]#  docker port n2
80/tcp -> 0.0.0.0:9527
80/tcp -> [::]:9527
-p 9527.png

如何在不删除容器的情况下,修改已经创建的容器的端口映射关系? 停止docker程序,改json文件。

七、 容器内部的hosts文件

容器会自动将容器的ID加入自己的 /etc/hosts 文件中,并解析成容器的IP

  • 一次性查看主机名
[root@localhost ~]#  docker run --rm alpine cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      10f5f65c07f3
  • 进入到容器中 查看主机名
[root@localhost ~]#  docker run -d  alpine  tail -f /etc/hosts  //运行容器
c5e23fa9a42e11c21672ab63d2aa0069572091931daa89982a07edb9f4a7a9d7
[root@localhost ~]#  docker exec -it c5e23 sh   //进入容器
/ # cat /etc/hosts     //查看主机名
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      c5e23fa9a42e
  • 人为的修改hosts文件,--add-host添加指定信息
[root@localhost ~]#  docker run -it --rm --name a1 --add-host www.kgc.com:6.6.6.6 --add-host www.accp.com:9.9.9.9 alpine
/ # cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
6.6.6.6 www.kgc.com
9.9.9.9 www.accp.com
172.17.0.4      27f4b5783cc2
--add-host.png

八、 指定DNS

容器的dns服务器,默认采用宿主机的dns地址,可以在容器启动时加选项 --dns=x.x.x.x指定其它的DNS地址,也可以在 /etc/docker/daemon.json 文件中进行指定。

[root@localhost ~]#  docker run -it --rm  --dns 1.1.1.1 --dns 2.2.2.2 centos:7 bash //指定容器的dns
[root@de9b5c2a47f0 /]# cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 1.1.1.1
nameserver 2.2.2.2

# Based on host file: '/etc/resolv.conf' (legacy)
# Overrides: [nameservers]
docker --dns.png

九、 容器内和宿主机之间复制文件

使用命令 docker cp

docker  cp  容器id:要复制的文件  容器中的文件夹  //将容器中的文件拷贝到本地
docker  cp  容器中的文件夹  容器id:要复制的文件  //将本地文件拷贝到容器中
  • 将容器中的文件传给真机 docker cp 容器id:要复制的文件 容器中的文件夹
准备一个a.txt文件
[root@localhost ~]#  docker run -it --name c1 centos:7 bash
[root@38a80de2f1df /]# echo aaa > a.txt

再新打开一个终端执行 docker cp 命令
[root@localhost ~]#  docker cp 38:/a.txt /opt/  //将容器中a.txt的文件传给真机
Successfully copied 2.05kB to /opt/
[root@localhost ~]#  ls /opt
a.txt  containerd  rh
cp1-1.png cp1-2.png
  • 将真机中的文件传给容器 docker cp 容器中的文件夹 容器id:要复制的文件
[root@localhost ~]#  docker cp /etc/passwd 38:/  //将真机的/etc/passwd文件传给容器
Successfully copied 4.1kB to 38:/

[root@38a80de2f1df /]# ls
a.txt  anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  passwd  proc  root  run  sbin  srv  sys  tmp  usr  var
cp2-1.png cp2-2.png

十、 容器传递参数

有些容器运行时,需要传递变量,可以使用 -e <参数>--env-file <参数文件> 实现

命令总结

命令作用
docker ps运行状态的容器信息
docker ps -a查看所有容器
docker ps -aq只看容器的id
docker create建立容器
docker start开启容器
docker stop停止容器
docker run运行镜像 先去本地找镜像,没有就去网上仓库拉取,拉取后建立容器
-i 人机交互
-t 分配一个终端
-d 后台启动
--rm 一次性的容器,退出就删除 (测试时使用)
--name 容器设置一个名称
-P 随机暴露端口,镜像中要事先知道什么端口提供服务
-p 指定暴露的端口80:80 ,前面是真机的80,后面的80是容器的80
--restart always 一旦容器意外退出,会自动启动容器,有四个规则默认是no,容器停止不自动启动
--dns ip地址 #在建立容器的时候设置dns服务器
--add-host 域名 ip地址 #在/etc/hosts文件中加入dns解析
-e 传递参数
docker cp真机和容器之间 复制文件
docker rm -f强制删除容器
docker exec -it 容器名字/id sh进入容器
docker top 容器名/id查看容器中的进程
docker stats 容器名/id查看容器资源使用情况
--no-stream 只运行一次
docker logs 容器名/id查看容器日志