容器操作基础命令
命令格式:
docker run [选项] [镜像名] [shell 命令] [参数]
docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo ‘hello wold’] #单次执行,没有自定义容器名称
docker run centos /bin/echo ‘hello wold’ #启动的容器在执行完 shel 命令就退出了
1、从镜像启动一个容器
会直接进入到容器,并随机生成容器 ID 和名称
root@z2:/opt# docker run -it docker.io/centos bash
[root@2cc162b4ce58 /]# exit
exit
root@z2:/opt# docker run -it docker.io/centos bash
[root@2cc162b4ce58 /]# exit
exit
root@z2:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a38095d25c7 centos "bash" 37 seconds ago Up 36 seconds compassionate_thompson
ctrl+p+q 也行 退出容器 不注销 。 exit 直接退出容器
root@z2:/opt# docker run -it docker.io/centos bash
[root@9a38095d25c7 /]# root@z2:/opt# cd ~
2、显示正在运行的容器
docker ps
3:显示所有容器
包括当前正在运行以及已经关闭的所有容器
docker ps -a
4、删除运行中的容器
docker rm 删除正在运行的容器
docker rm -f 强制删除正在运行的容器
docker rm -fv 强制删除正在运行的容器 并且删除数据目录。
docker rm -f 9a38095d25c7
5、随机映射端口
docker run -P docker.io/nginx
前台启动并随机映射本地端口到容器的 80
前台启动的会话窗口无法进行其他操作,除非退出,但是退出后容器也会退出
随机端口映射,其实是默认从 32768 开始
为什么是容器内的端口是 80,是因为dockerfile 中定义了暴露端口
oot@z2:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49921f78ab97 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp cranky_thompson
ace8c9ee964d centos "bash" About an hour ago Up About an hour blissful_mayer
测试: curl 127.0.0.1:32768
6、 指定端口映射
默认tcp协议,监听地址:0.0.0.0
方式 1:本地端口 81 映射到容器 80 端口:
docker run -p 81:80 --name nginx-test-port1 nginx
方式 2:本地 IP:本地端口:容器端口
docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx
方式 3:本地 IP:本地随机端口:容器端口
docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx
方式 4:本机 ip:本地端口:容器端口/协议,默认为 tcp 协议
docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx
方式 5:一次性映射多个端口+协议:
docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
7. 查看容器的日志
docker logs 容器ID/name 一次查看
root@z2:~# docker logs 49921f78ab97
172.17.0.1 - - [13/May/2020:14:25:40 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
docker logs -f 容器ID/name 持续查看
root@z2:~# docker logs -f 49921f78ab97
172.17.0.1 - - [13/May/2020:14:25:40 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
8:查看容器已经映射的端口
port List port mappings or a specific mapping for the container
root@z2:~# docker port nginx-test-port5
443/tcp -> 0.0.0.0:443
53/udp -> 0.0.0.0:55
80/tcp -> 0.0.0.0:86
9:自定义容器名称
–name
如果不自定义话,名称是随机的
root@z2:~# docker run -it --name nginx-test nginx
aa5b1f11e70635754fa3c6646c89dc04b7d5753022d439023aa3aee33fda7d5e
root@z2:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa5b1f11e706 nginx "nginx -g 'daemon of…" 22 seconds ago Up 21 seconds 80/tcp nginx-test
10. 后台启动容器
-d, --detach Run container in background and print container ID
docker run -d -P --name nginx-test1 docker.io/nginx
11. 创建并进入容器
创建容器后直接进入,执行 exit 退出后容器关闭
docker run -t -i --name test-centos2 docker.io/centos /bin/bash
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
12、单次运行
容器退出后自动删除
–rm Automatically remove the container when it exits
docker run -it --rm --name nginx-delete-test docker.io/nginx
13 、传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令
root@z1:~# docker run -d centos /usr/bin/tail -f '/etc/hosts'
405e0d68a703499acbfc5a20c3aeadb7a20a530081aa7229110c0ad6ce10fcf9
14. 容器的启动和关闭
root@z2:~# docker stop 017fcfa5fdf1
017fcfa5fdf1
root@z2:~# docker start 017fcfa5fdf1
017fcfa5fdf1
root@z2:~#
15. 进入到正在运行的容器
1. 使用 attach 命令
使用方式为 docker attach 容器名,attach 类似于 vnc,操作会在各个容器界面显示,所有使用此方式进入容器的操作都是同步显示的且 exit 后容器将被关闭,且使用 exit 退出后容器关闭,不推荐使用,需要进入到有 shell 环境的容器,比如 centos 为例
root@z1:~# docker run -it centos bash
[root@6598e2bdcf85 /]# ls
在另外一个窗口
root@z1:~# docker attach 6598e2bdcf85
[root@6598e2bdcf85 /]# touch a.xt
然后在其中的任何一个窗口操作, 另外一个窗口都可以实时看见
2.使用 exec 命令:
执行单次命令与进入容器,不是很推荐此方式,虽然 exit 退出容器还在运行
docker exec -it 3ff2cc97728b bash
3.使用 nsenter 命令:
推荐使用此方式,nsenter 命令需要通过 PID 进入到容器内部,不过可以使用docker inspect 获取到容器的 PID:
使用docker inspect
-f, --format string Format the output using the given Go template
root@z1:~# docker inspect -f "{{.State.Pid}}" d13333791831
3168
当然也可以取到容器的IP地址
root@z1:~# docker inspect -f "{{.NetworkSettings.IPAddress}}" d13333791831
172.17.0.3
nsenter 进入容器
root@z1:~# nsenter -t 3168 -m -u -i -n -p
[root@d13333791831 /]#
Run a program with namespaces of other processes.
-t, --target <pid> target process to get namespaces from
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-p, --pid[=<file>] enter pid namespace
脚本方式:将 nsenter 命令写入到脚本进行调用,如下
#!/bin/bash
d(){
name_id=$1
pid=$(docker inspect -f "{{.State.Pid }}" ${name_id} )
nsenter -t ${pid} -m -u -i -n -p
}
d $1
root@z2:~# bash docker_in.sh 017fcfa5fdf1
[root@017fcfa5fdf1 /]# exit
logout
root@z2:~#
16. 批量关闭正在运行的容器
docker ps 默认只显示 运行中的容器
docker ps -a 显示所有所有容器
-q 显示容器ID
docker ps -aq 显示所有容器的ID
docker stop $(docker ps -a -q)
正常关闭所有运行中的容器
17. 批量删除已退出容器
docker rm -f `docker ps -aq -f status=exited`
子命令的参数 -f, --filter filter Filter output based on conditions provided ,,表示基于条件过滤出
18.批量删除所有容器
docker rm -f $(docker ps -a -q)
19.批量强制关闭正在运行的容器:
docker kill $(docker ps -a -q)
20. 指定容器 DNS:
Dns 服务,默认采用宿主机的 dns 地址一是将 dns 地址配置在宿主机
二是将参数配置在 docker 启动脚本里面 –dns=1.1.1.1
docker run -it --rm --dns 223.5.5.5 centos bash
[root@2dcef6864a19 /]# cat /etc/resolv.conf
nameserver 223.5.5.5
docker rm -f $(docker ps -a -q)
19.批量强制关闭正在运行的容器:
docker kill $(docker ps -a -q)
20. 指定容器 DNS:
Dns 服务,默认采用宿主机的 dns 地址一是将 dns 地址配置在宿主机
二是将参数配置在 docker 启动脚本里面 –dns=1.1.1.1
docker run -it --rm --dns 223.5.5.5 centos bash
[root@2dcef6864a19 /]# cat /etc/resolv.conf
nameserver 223.5.5.5