Docker的容器操作

本文最后更新于 2024年12月8日

因阿里云加速服务调整,从镜像仓库中拉取镜像时,需要科学上网访问DockerHub

1.容器

Docker容器是基于Docker镜像创建的一个运行实例。它是应用程序运行的隔离环境,类似于虚拟机,但更轻量和高效。与虚拟机相比,容器不需要包含操作系统的完整内核,而是共享宿主机的操作系统内核。容器只包含应用运行所需的最小依赖项,从而大幅降低资源占用。容器之间相互隔离,每个容器拥有自己的文件系统、进程空间、网络接口等。

容器启动速度极快(通常是秒级),因为它无需加载完整的操作系统。

2.容器常见操作

2.1 新建并启动容器

容器由镜像实例化启动,启动容器时会先寻找镜像,如果本地没有容器会向远端拉取。

启动容器的方式有很多种。

1.前台启动容器

docker run 镜像名:版本

2.后台运行容器

即启动守护式容器,返回容器ID。容器后台-d运行时,必须有一个前台进程,如果容器运行的命令不是那些一直挂起的命令,例如toptail,容器会自动退出,这个是docker机制的问题,例如nginx,正常情况下启动服务只需要启动对应的service,systemctl start nginx,但是这样做nginx在后台运行,导致docker前台没有运行的应用,docker认为无事可做,便会退出。最佳的解决方案是让你的应用以前台进程的方式运行。

docker run -d 镜像名:版本
[root@localhost ~]# docker run -d sonatype/nexus3:3.54.1
516d486e69d863c41e41fc5e908ffb40350c662966b3790c7868225b0684e126

3.以交互模式运行容器,通常配合-t使用

docker run -i 镜像名:版本

4.为容器重新分配一个伪终端,通常配合-i使用

docker run -t 镜像名:版本

5.以交互式建立容器

指定运行的终端/bin/bash

docker run -it 镜像名:版本 /bin/bash

如果镜像的默认命令(通过 CMD 或 ENTRYPOINT 指定)是交互式的Shell(例如 /bin/bash 或 /bin/sh),那么bash/bin/bash可以省略,Docker会直接运行默认命令,比如ubuntu默认会运行/bin/bash

docker run -it ubuntu

输出结果:容器ubuntu开始运行,并自动切换到容器中的/bin/bash root@c067a19d427c:/#

[root@localhost ~]# docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
afad30e59d72: Pull complete 
Digest: sha256:278628f08d4979fb9af9ead44277dbc9c92c2465922310916ad0c46ec9999295
Status: Downloaded newer image for ubuntu:latest
root@c067a19d427c:/# 

6.随机端口映射

docker run -P 镜像名:版本

7.指定端口映射,有以下四种形式

  • ip:hostPort:containerPort
    将容器内的 containerPort 映射到指定主机的 hostPort,并绑定到特定的 IP 地址。
  • ip::containerPort
    将容器内的 containerPort 映射到随机的主机端口,并绑定到特定的 IP 地址
  • hostPort:containerPort
    将容器内的 containerPort 映射到主机的 hostPort,不指定绑定 IP。
  • containerPort
    将容器内的 containerPort 映射到主机的随机端口,绑定到主机的所有网络接口。
docker run -d -p 13306:3306 镜像名:版本

8.运行并为容器指定一个新名字

docker run -d --name="mynginx" sonatype/nexus3:3.54.1

9.环境变量

使用-e指定环境变量,这些环境变量可以被容器内的应用程序所访问到

docker run -e MY_ENV=production my_image

指定多个

docker run -e VAR1=value1 -e VAR2=value2 my_image

2.2 查看运行的容器

正在运行的

docker ps 
[root@localhost ~]# docker ps -a 
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                       PORTS                                                      NAMES
508a327eac81        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 13 months ago                                                              frosty_ritchie
be633e9bd4b0        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 14 months ago                                                              epic_brattain
0d6691a51729        1bb6f28b9d23                    "docker-php-entrypoi…"   14 months ago       Exited (137) 14 months ago                                                              pedantic_liskov
02efe5a0233f        redis:7.0.11                    "docker-entrypoint.s…"   16 months ago       Exited (0) 14 months ago                                                                redis7
ae8dd5ed8c76        prom/prometheus:latest          "/bin/prometheus --c…"   17 months ago       Exited (0) 17 months ago                                                                prometheus
d380ff361ad5        nacos/nacos-server:v2.2.3       "bin/docker-startup.…"   17 months ago       Exited (143) 17 months ago                                                              nacos-standalone
ed47411ae068        grafana/grafana:latest          "/run.sh"                17 months ago       Exited (0) 17 months ago                                                                grafana
1b297c5ff801        portainer/portainer-ce:latest   "/portainer"             17 months ago       Up About an hour             0.0.0.0:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, 9000/tcp   portainer
5aed508fc491        sonatype/nexus3:3.54.1          "/opt/sonatype/nexus…"   17 months ago       Exited (137) 17 months ago                                                              nexus
6c365985f133        gitlab/gitlab-ce:latest         "/assets/wrapper"        19 months ago       Exited (137) 17 months ago                                                              gitlab
c5b4c8217fc0        mysql:5.7                       "docker-entrypoint.s…"   19 months ago       Exited (0) 14 months ago                                                                mysql5.7
3951414b08ba        kibana:7.4.2                    "/usr/local/bin/dumb…"   4 years ago         Exited (0) 19 months ago                                                                kibana
eaff1b448829        elasticsearch:7.4.2             "/usr/local/bin/dock…"   4 years ago         Exited (143) 19 months ago                                                              elasticsearch

现在和历史运行过的容器

docker ps -a 

最近n个运行过的容器

docker ps -n 2

只显示容器编号

docker ps -q  
[root@localhost ~]# docker ps -q
1b297c5ff801

不截取输出

docker ps  --no-trunc   
[root@localhost ~]# docker ps  --no-trunc
CONTAINER ID                                                       IMAGE                           COMMAND             CREATED             STATUS              PORTS                                                      NAMES
1b297c5ff8019abf47c6fe6bf23cc93507835ba98c1b0a88d4e92f52b1bab4c9   portainer/portainer-ce:latest   "/portainer"        17 months ago       Up About an hour    0.0.0.0:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, 9000/tcp   portainer

2.3 容器的停止

1.停止容器

docker stop 容器ID

2.启动容器

docker start 容器ID

3.重启容器

docker restart 容器ID

4.立刻停止容器

docker kill 容器ID

2.4 操作运行中的容器

1.docker attach进入容器

进入一个正在运行的容器,附加到其主进程的标准输入、输出和错误流,看到容器中运行的程序的实时输出,并直接与容器的主进程交互,例如正在运行top的容器,可以看到top实时输出,还可以输入命令和top交互。

docker attach 容器ID

2.docker exec -it进入容器

进入一个正在运行的容器,在运行的容器中启动一个新进程,通常是交互式Shell,不依赖容器的主进程,可以独立运行,不影响容器的主进程运行。

如果容器指定了默认shell,那么bash部分/bin/bash可省略。

docker exec -it 容器ID /bin/bash

3.exit 停止并退出容器

当你进入容器后,完成任务并希望关闭容器时使用,当通过docker exec或docker attach进入容器后,输入exit会停止运行的Shell进程,如果这个进程是容器的主进程(例如一个 Bash 会话或主要的服务进程),exit 会直接停止整个容器。

4.Ctrl+P+Q 停止并退出容器

从一个已附加的容器中退出交互界面,同时容器继续运行。当需要离开容器的交互环境,但希望容器继续在后台运行时使用,使用 docker attach 容器ID 附加到容器时,按下Ctrl+P,然后按 Q,会退出到宿主机终端,但是容器仍在运行。

2.5 删除容器

1.删除容器

docker rm 容器ID

2.强制删除容器

docker rm -f 容器ID

3.删除全部容器

docker rm $(docker ps -aq)

2.6 提交容器

通过commit将容器提交为一个新的镜像,具体语法是docker commit -m "描述" -a="作者" 容器ID 新镜像名称:标签

docker commit -m "new image" -a="zuozhe" c54fcba2de61 lzj/alpine:1.0.0

2.7 查看容器的日志

t 时间戳
f 跟随最新日志
--tail 数字,显示最后多少条

docker logs -f -t  容器ID

2.8 查看容器内运行的进程

docker top 容器ID

2.9 查看容器内部的细节

docker inspect 容器ID

Docker的容器操作
https://blog.liuzijian.com/post/1c0fc3e7-db2a-4031-a975-bdc546bbb9c4.html
作者
Liu Zijian
发布于
2023年10月17日
更新于
2024年12月8日
许可协议