容器基本操作
查看容器
docker ps
docker ps:获取正在运行的容器的状态docker ps -a:获取各容器的当前状态docker ps -q:静默模式,只显示容器编号
常用组合:删除所有容器
docker rm -f `docker ps -qa`
启动容器
docker create
不常用,使用docker create命令新建的容器会处于停滞状态,可以使用docker start命令来启动它
[root@server ~]# docker create --name nginx-1 nginxf0e9083b87e62896343f8ec9acbc6e4305b3b2854703b0b6ca7008ffadca58dc[root@server ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf0e9083b87e6 nginx "/docker-entrypoint.…" 2 seconds ago Created nginx-1[root@server ~]# docker start nginx-1nginx-1[root@server ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf0e9083b87e6 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 | 设置容器重启策略 |
- 示例
[root@server ~]# docker run -d -p 8080:80 --name nginx-1 nginxcafa8920e6535f30aa8d8f17e7697de5e71e9c1415578a76cf6fe888949a2ee2[root@server ~]# curl 192.168.31.99:8080 -IHTTP/1.1 200 OKServer: nginx/1.21.6Date: Sun, 13 Mar 2022 07:56:22 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Tue, 25 Jan 2022 15:03:52 GMTConnection: keep-aliveETag: "61f01158-267"Accept-Ranges: bytes[root@server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMEScafa8920e653 nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-1
[root@server ~]# docker run -it centos[root@41f38dc54818 /]# exit[root@server ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES44b7c91b89f8 centos "/bin/bash" About a minute ago Exited (130) 57 seconds ago stupefied_haslett
端口映射
用户是无法直接访问容器内部的网络的,因此需要将容器和宿主机进行NAT的端口映射,这样的话用户访问宿主机的指定端口,就会映射到内部容器的指定端口,从而获得服务

随机映射
使用-P参数
[root@server ~]# docker run -d -P nginxfc8884d235dd1cca8cd3f636c6bfdacf83b2204406c4ae407dc5d292508e0d70[root@server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESfc8884d235dd nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp amazing_cerf[root@server ~]# docker port fc8880/tcp -> 0.0.0.0:4915380/tcp -> :::49153[root@server ~]# curl 192.168.31.99:49153 -I
指定映射
使用-p选项
[root@server ~]# docker run -d -p 8080:80 --name nginx-1 nginx[root@server ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMEScafa8920e653 nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-1[root@server ~]# docker port nginx-180/tcp -> 0.0.0.0:808080/tcp -> :::8080[root@server ~]# curl 192.168.31.99:8080 -I
-p可以多次使用,映射多个端口
[root@server ~]# docker run -d -p 8081:80 -p 4430:443 -p 33060:3306 --name nginx-2 nginx[root@server ~]# docker port nginx-2443/tcp -> 0.0.0.0:4430443/tcp -> :::443080/tcp -> 0.0.0.0:808180/tcp -> :::80813306/tcp -> 0.0.0.0:330603306/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

- 容器退出后自动删除:
--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

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
