容器基本操作

查看容器

docker ps

  • docker ps:获取正在运行的容器的状态

  • docker ps -a:获取各容器的当前状态

  • docker ps -q:静默模式,只显示容器编号

常用组合:删除所有容器

  1. docker rm -f `docker ps -qa`

启动容器

docker create

不常用,使用docker create命令新建的容器会处于停滞状态,可以使用docker start命令来启动它

  1. [root@server ~]# docker create --name nginx-1 nginx
  2. f0e9083b87e62896343f8ec9acbc6e4305b3b2854703b0b6ca7008ffadca58dc
  3. [root@server ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. f0e9083b87e6 nginx "/docker-entrypoint.…" 2 seconds ago Created nginx-1
  6. [root@server ~]# docker start nginx-1
  7. nginx-1
  8. [root@server ~]# docker ps -a
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. f0e9083b87e6 nginx "/docker-entrypoint.…" 21 seconds ago Up 1 second 80/tcp nginx-1

docker run

  • docker run <选项> <容器镜像名> <执行的操作>
  • 运行容器的常用选项 | 选项 | 说明 | | :—- | :—- | | -d | 是否在后台运行容器,默认为否 | | -i | 保持标准输入打开,默认为false,通常与-t一起使用 | | -t | 给容器分配一个终端,默认为false,通常与-i一起使用 | | -p | 指定容器的端口如何映射到宿主机端口,比如-p 8080:80 (<宿主主机端口>:<容器端口>) | | -P | 通过NAT机制将容器端口自动映射到本地主机的临时端口 | | —rm | 容器退出后自动删除 | | -h | 指定容器内的主机名 | | —name | 指定容器的名字 | | -v | 挂载主机上的文件卷到容器内 | | -e | 指定容器内的环境变量 | | —cpu-shares | 允许容器使用cpu资源的相对权重,默认一个容器能用满一个核的cpu | | —cpuset-cpus | 限制容器能使用哪些cpu核心 | | -m | 限制容器内使用的内存,单位可以是b、k、m、g | | —link :alias | 用来连接2个容器,被连接的容器和接收容器之间可以互相通信,其中name和id是源容器的name和id,alias是源容器在link下的别名 | | —restart | 设置容器重启策略 |
  • 示例
  1. [root@server ~]# docker run -d -p 8080:80 --name nginx-1 nginx
  2. cafa8920e6535f30aa8d8f17e7697de5e71e9c1415578a76cf6fe888949a2ee2
  3. [root@server ~]# curl 192.168.31.99:8080 -I
  4. HTTP/1.1 200 OK
  5. Server: nginx/1.21.6
  6. Date: Sun, 13 Mar 2022 07:56:22 GMT
  7. Content-Type: text/html
  8. Content-Length: 615
  9. Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
  10. Connection: keep-alive
  11. ETag: "61f01158-267"
  12. Accept-Ranges: bytes
  13. [root@server ~]# docker ps
  14. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  15. cafa8920e653 nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-1
  1. [root@server ~]# docker run -it centos
  2. [root@41f38dc54818 /]# exit
  3. [root@server ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 44b7c91b89f8 centos "/bin/bash" About a minute ago Exited (130) 57 seconds ago stupefied_haslett

端口映射

用户是无法直接访问容器内部的网络的,因此需要将容器和宿主机进行NAT的端口映射,这样的话用户访问宿主机的指定端口,就会映射到内部容器的指定端口,从而获得服务

Docker容器管理 - 图1

随机映射

使用-P参数

  1. [root@server ~]# docker run -d -P nginx
  2. fc8884d235dd1cca8cd3f636c6bfdacf83b2204406c4ae407dc5d292508e0d70
  3. [root@server ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. fc8884d235dd nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp amazing_cerf
  6. [root@server ~]# docker port fc88
  7. 80/tcp -> 0.0.0.0:49153
  8. 80/tcp -> :::49153
  9. [root@server ~]# curl 192.168.31.99:49153 -I

指定映射

使用-p选项

  1. [root@server ~]# docker run -d -p 8080:80 --name nginx-1 nginx
  2. [root@server ~]# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. cafa8920e653 nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-1
  5. [root@server ~]# docker port nginx-1
  6. 80/tcp -> 0.0.0.0:8080
  7. 80/tcp -> :::8080
  8. [root@server ~]# curl 192.168.31.99:8080 -I

-p可以多次使用,映射多个端口

  1. [root@server ~]# docker run -d -p 8081:80 -p 4430:443 -p 33060:3306 --name nginx-2 nginx
  2. [root@server ~]# docker port nginx-2
  3. 443/tcp -> 0.0.0.0:4430
  4. 443/tcp -> :::4430
  5. 80/tcp -> 0.0.0.0:8081
  6. 80/tcp -> :::8081
  7. 3306/tcp -> 0.0.0.0:33060
  8. 3306/tcp -> :::33060

后台启动容器

  • 当容器前台启动时,前台进程的退出会导致容器的退出,因此更多时候需要让容器在后台启动
[root@server ~]# docker run -d nginx
a5f5cdbbf3d9eaebfac61e31c106eb5f7b9a16cd47d3722acce1e4e930ea71b7
  • 传递运行命令

容器需要有一个前台运行的进程才能保持容器的运行,因此可以在启动容器的时候传递运行命令,比如说是ping baidu.com

[root@server ~]# docker run -it centos
[root@41f38dc54818 /]# exit

# 查看容器信息,可以发现容器已经是退出状态了
[root@server ~]# docker ps -a
# centos进行ping操作,并且在后台运行
[root@server ~]# docker run -d centos ping baidu.com

# 查看容器信息,可以发现是正在运行状态
[root@server ~]# docker ps

Docker容器管理 - 图2

  • 容器退出后自动删除:--rm
[root@server ~]# docker pull hello-world
[root@server ~]# docker run --name hello_world_test --rm hello-world
[root@server ~]# docker ps -a
# 无法看见hello-world镜像的容器,可以看出这个容器运行完就已经被删除了

停止容器

暂停容器

  • 挂起容器
[root@server ~]# docker run -d -it centos bash
e96b0c267611e535b5634423745809523363e042f11554489b84956c182522f6
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
e96b0c267611   centos    "bash"    6 seconds ago   Up 5 seconds             determined_ride
[root@server ~]# docker pause determined_ride 
determined_ride
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS                       PORTS     NAMES
e96b0c267611   centos    "bash"    About a minute ago   Up About a minute (Paused)             determined_ride


# 挂起的容器是无法进入的
[root@server ~]# docker exec -it determined_ride bash
Error response from daemon: Container determined_ride is paused, unpause the container before exec
  • 取消挂起容器
[root@server ~]# docker unpause determined_ride 
determined_ride
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
e96b0c267611   centos    "bash"    2 minutes ago   Up 2 minutes             determined_ride

终止容器

  • 停止容器
[root@server ~]# docker run -d --name nginx-1 nginx
47fcae6f0554e5c148e5bd51e1e08575ffde09d4978fc270201b1322e592a925
[root@server ~]# docker stop nginx-1 
nginx-1
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
47fcae6f0554   nginx     "/docker-entrypoint.…"   5 minutes ago   Exited (0) 6 seconds ago             nginx-1
  • 重新启动容器
[root@server ~]# docker start nginx-1 
nginx-1
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
47fcae6f0554   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 4 seconds   80/tcp    nginx-1

删除容器

  • 删除已经退出的容器:docker rm [容器名/容器ID]

  • 删除正在运行的容器:docker rm -f [容器名/容器ID]

  • 删除所有容器

docker rm -f `docker ps -qa`

进入容器

有三种方式:

  • attach:不推荐
  • exec:常用
  • nsenter:用在脚本很方便

attach

  • 使用docker attach进入Docker容器

  • docker attach <容器名/容器ID>

使用此方式进入容器的操作都是同步显示,并且在退出(exit)容器的时候,容器就会被关闭,因此不推荐使用这种方式进入容器

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS        PORTS     NAMES
c584cdb32071   centos    "bash"    1 second ago   Up 1 second             centos-1
[root@server ~]# docker attach centos-1 
[root@c584cdb32071 /]# exit

[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
c584cdb32071   centos    "bash"    14 seconds ago   Exited (0) 4 seconds ago             centos-1

Docker容器管理 - 图3

exec

作用:执行单次命令与进入容器

  • 使用docker exec进入Docker容器

  • docker exec <选项> <容器名/容器ID> <命令>

可以使用docker exec -it <容器名/容器ID> bash,退出容器后容器还在运行

进入容器

[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
1c958916d428   centos    "bash"    9 seconds ago   Up 7 seconds             centos-1
[root@server ~]# docker exec -it centos-1 bash
[root@1c958916d428 /]# exit
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
1c958916d428   centos    "bash"    5 minutes ago   Up 5 minutes             centos-1

执行单次命令

[root@server ~]# docker exec -d centos-1 ping baidu.com
[root@server ~]# docker exec -it centos-1 bash
[root@1c958916d428 /]# ps -aux | grep ping
root         88  0.3  0.1  52288  2368 ?        Ss   13:52   0:00 ping baidu.com
root        109  0.0  0.0   9192   728 pts/2    S+   13:53   0:00 grep --color=auto ping

nsenter

nsenter命令需要通过pid进入到容器内部,可以使用docker inspect获取到容器的pid

  • 通过docker inspect获取到某个容器的进程id
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
1c958916d428   centos    "bash"    14 minutes ago   Up 14 minutes             centos-1

[root@server ~]# docker inspect -f "{{.State.Pid}}" centos-1
21002
  • 通过nsenter进入到容器的内部
[root@server ~]# nsenter -t 21002 -m -u -i -n -p
[root@1c958916d428 /]#
  • 也可以使用脚本的方式进入,更加方便,退出容器后容器不会停止
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
1c958916d428   centos    "bash"    25 minutes ago   Up 25 minutes             centos-1
[root@server ~]# ./docker_in.sh centos-1
[root@1c958916d428 /]# exit
logout
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
1c958916d428   centos    "bash"    27 minutes ago   Up 27 minutes             centos-1

指定容器DNS

通过将参数配置在docker启动命令中来指定容器的DNS

[root@server ~]# docker run -it --dns 8.8.8.8 centos:7 bash
[root@025d61a44fe6 /]# cat /etc/resolv.conf 
nameserver 8.8.8.8
[root@025d61a44fe6 /]# ping baidu.com        # 能通

导入导出容器

docker export

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行的状态

[root@server ~]# docker run -d -it --name centos-1 centos:7
927ed6b588d2816ecac2ebc9b47b9d6a095e695058c242e50605bd7794223a7b
[root@server ~]# docker exec -it centos-1 bash
[root@927ed6b588d2 /]# touch /root/test 
[root@927ed6b588d2 /]# exit   

[root@server ~]# docker export -o /opt/centos.tar centos-1
[root@server ~]# ll /opt/centos.tar -h
-rw------- 1 root root 202M 3月  13 22:30 /opt/centos.tar

docker import

导出的文件可以使用docker import命令导入变成镜像

[root@server ~]# docker import /opt/centos.tar mycentos:v1
sha256:d8c3bb177076a19ad431316ac1f81040fa12a3078313534c415b28ebb0c62ce8
[root@server ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mycentos      v1        d8c3bb177076   4 seconds ago   204MB
nginx         latest    c919045c4c2b   12 days ago     142MB
hello-world   latest    feb5d9fea6a5   5 months ago    13.3kB
centos        7         eeb6ee3f44bd   5 months ago    204MB
centos        latest    5d0da3dc9764   5 months ago    231MB

[root@server ~]# docker run -d -it --name mycentos-1 mycentos:v1 bash
23e5694fe40bbe36eeec5bda642ea1cb7992da6758cf39f36d99eba3029a2b47
[root@server ~]# docker exec -it mycentos-1 bash
[root@23e5694fe40b /]# ls /root/test 
/root/test