容器相关命令:
容器操作:
启动容器
方法1:先创建一个容器:docker create 镜像名再启动容器:docker start 容器名(不推荐)
[root@localhost ~]# docker create -it myubuntu:18.04 //创建容器
7bc99c9ea102ab49cc400437824a9549495947105cf8f133742f18a99f522ebf
[root@localhost ~]# docker ps -a //查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bc99c9ea102 myubuntu:18.04 "bash" 7 seconds ago Created elastic_hertz
[root@localhost ~]# docker start 7bc99c9ea102 //启动容器
7bc99c9ea102
[root@localhost ~]# docker ps -a //再次查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bc99c9ea102 myubuntu:18.04 "bash" About a minute ago Up 4 seconds elastic_hertz
方法2:docker run 镜像名
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(2)options 常用命令选项
-t :打开一个终端,像使用交换机一样使用容器
-i:交互式访问
-d:剥离与当前终端的关系;否则会一直占据着终端
--name:容器名字
--network:指定网络
--rm:容器一停,自动删除
[root@localhost ~]# docker run myubuntu:18.04 /bin/echo "hello world"
hello world
当利用docker run来创建并启动容器时,docker在后台运行的标准包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载;
利用镜像创建一个容器,并启动该容器;
分配一个文件系统给容器,并在只读的镜像层外挂载一层可读写层;
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
从网桥的地址池分配一个ip地址给容器;
执行用户指定的应用程序;
执行完毕后容器被自动终止。
[root@localhost ~]# docker run myubuntu:18.04 /bin/zzh "hello world"
docker: Error response from daemon: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/zzh": stat /bin/zzh: no such file or directory: unknown.
ERRO[0000] error waiting for container: context canceled
[root@localhost ~]# echo $?
127
常见错误代码:
125:docker daemon执行错误,例如指定不了支持的docker命令参数;
126:所指定命令无法执行,例如权限出错;
127:容器内命令无法找到
[root@localhost ~]# docker run -it myubuntu:18.04 /bin/bash
root@be2c0ade27be:/# psPID TTY TIME CMD1 pts/0 00:00:00 bash10 pts/0 00:00:00 ps
root@be2c0ade27be:/# exit
-t选项让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。在容器内用ps命令查看进程,只运行了bash应用,并没有其他无关的进程。用户可以使用CTRL+d或输入exit命令退出容器。
[root@localhost ~]# docker run -itd myubuntu:18.04
守护态运行:
更多的时候,需要让docker容器在后台以守护态形式运行。此时,可以通过添加-d参数来实现。
停止和激活容器
停止容器:
docker stop 关闭运行的容器
docker kill 杀死运行的容器(不推荐)
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71ecd5b63ba4 myubuntu:18.04 "bash" 51 seconds ago Up 51 seconds test
[root@localhost ~]# docker stop test
test
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker start
(1)格式
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
(2)Options:
-a:附加到当前终端
-i:交互式
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71ecd5b63ba4 myubuntu:18.04 "bash" 51 seconds ago Up 51 seconds test
删除容器
正常删除容器,先关闭容器(stop,kill)再删除容器(rm)即可
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
428fbc85c1c9 myubuntu:18.04 "bash" About a minute ago Up About a minute test
[root@localhost ~]# docker stop test
test
[root@localhost ~]# docker rm test
test
删除所有容器,-f强制删除
[root@localhost ~]# docker rm -f `docker ps -aq`
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
进入容器
1.attach方法
[root@localhost ~]# docker attach 1b6f59c28263 //此为正常连接使用attach效果
root@1b6f59c28263:/# ls
bin etc lib64 opt run sys var
boot home media proc sbin tmp
dev lib mnt root srv usr
[root@localhost ~]# docker attach 1b6f59c28263 //此为复制会话后使用attach效果
root@1b6f59c28263:/# ls
bin etc lib64 opt run sys var
boot home media proc sbin tmp
dev lib mnt root srv usr
使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器时,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2.exec方法
[root@localhost ~]# docker exec -it test /bin/bash
root@428fbc85c1c9:/# exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
428fbc85c1c9 myubuntu:18.04 "bash" About a minute ago Up About a minute test
通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
容器迁移
1.导出
[root@localhost ~]# docker export -o test.tar test
[root@localhost ~]# docker export test > test2.tar
使用export有两种方式实现一种可以使用-o参数完成,还有一种可以使用重定向方式完成。
[root@localhost ~]# ll -h
总用量 253M
-rw------- 1 root root 64M 3月 13 16:59 192.168.27.137
-rw-------. 1 root root 706 1月 23 19:05 anaconda-ks.cfg
-rw------- 1 root root 64M 3月 13 16:59 images.tar
-rw-r--r-- 1 root root 63M 3月 13 19:37 test2.tar
-rw------- 1 root root 63M 3月 13 19:37 test.tar
[root@localhost ~]# scp test.tar 192.168.27.137:~ //将tar文件使用scp拷贝到137上
Authorized users only. All activities may be monitored and reported.
root@192.168.27.137's password:
test.tar 100% 62MB 261.1MB/s 00:00
2.导入
[root@localhost ~]# ll //先查看是否存在
总用量 129396
-rw-------. 1 root root 706 1月 23 19:05 anaconda-ks.cfg
-rw------- 1 root root 66983424 3月 13 17:00 images.tar
-rw------- 1 root root 65510912 3月 13 19:38 test.tar
[root@localhost ~]# docker import test.tar kongfu/test:v1 //使用import命令导入到本地路径下,注意拷贝过来后是以镜像形式存在。
sha256:4b06009c3c7367b1c63df6cc285322417b0901699556506a29caccc6b674dd6d
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kongfu/test v1 4b06009c3c73 10 seconds ago 63.1MB
busybox latest beae173ccac6 2 years ago 1.24MB
myubuntu 18.04 5a214d77f5d7 2 years ago 63.1MB
实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外从容器快照文件导入时可以重新指定标签等元数据信息。
容器常见监测命令
[root@localhost ~]# docker inspect test //查看容器具体信息
[{"Id": "b763e469011130780de3630023877f8d0c6bb64ce9de90d6c5a4940b818a594b","Created": "2024-03-13T11:36:12.916805739Z","Path": "bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 8838,"ExitCode": 0,"Error": "","StartedAt": "2024-03-13T11:36:13.057031767Z","FinishedAt": "0001-01-01T00:00:00Z"
...
]
[root@localhost ~]# docker top test
UID PID PPID C STIME TTY TIME CMD
root 8838 8821 0 19:36 pts/0 00:00:00 bash
[root@localhost ~]# docker stats test //动态监测信息
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B 1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b763e4690111 test 0.00% 404KiB / 3.297GiB 0.01% 1.16kB / 0B 0B / 0B
[root@localhost ~]# docker cp test.tar test:/tmp
[root@localhost ~]# docker exec -it test /bin/bash
root@b763e4690111:/# ls /tmp/
test.tar
root@b763e4690111:/# exit
exit
[root@localhost ~]# docker diff test
C /root
A /root/.bash_history
C /tmp
A /tmp/test.tar
[root@localhost ~]# docker port test