Docker的容器操作
因阿里云加速服务调整,从镜像仓库中拉取镜像时,需要国际联网访问DockerHub
1.容器
Docker容器是基于Docker镜像创建的一个运行实例。它是应用程序运行的隔离环境,类似于虚拟机,但更轻量和高效。与虚拟机相比,容器不需要包含操作系统的完整内核,而是共享宿主机的操作系统内核。容器只包含应用运行所需的最小依赖项,从而大幅降低资源占用。容器之间相互隔离,每个容器拥有自己的文件系统、进程空间、网络接口等。
容器启动速度极快(通常是秒级),因为它无需加载完整的操作系统。
2.容器常见操作
2.1 新建并启动容器
容器由镜像实例化启动,启动容器时会先寻找镜像,如果本地没有容器会向远端拉取。
启动容器的方式有很多种。
1.前台启动容器
docker run 镜像名:版本
2.后台运行容器
即启动守护式容器,返回容器ID。容器后台-d
运行时,必须有一个前台进程,如果容器运行的命令不是那些一直挂起的命令,例如top
,tail
,容器会自动退出,这个是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