docker容器操作
1、创建容器
1.1、新建容器
//新建容器
sudo docker create -it ubuntu:latest
//查看所有容器
sudo docker ps -a
//启动容器
sudo docker start 8e80
//停止容器
sudo docker stop 8e80
1.2、新建并启动容器
docker run命令等同于docker create+docker start,利用docker run来创建并启动容器时,docker在后台运行的标准操作如下:
01、检查本地是否存在指定的镜像,不存在就从公有仓库下载。
02、利用镜像创建并启动一个容器。
03、分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
04、从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
05、从地址池配置一个IP地址给容器。
06、执行用户指定的应用程序。
07、执行完毕后容器被终止。
//输出Hello world后容器自动终止
sudo docker run ubuntu /bin/echo 'Hello world'
//启动一个bash终端,允许用户交互(可使用ctrl+d或exit退出交互模式)
sudo docker run -t -i ubuntu:14.04 /bin/bash
-t, --tty Allocate a pseudo-TTY
-i, --interactive Keep STDIN open even if not attached
1.3、守护态运行
//通过-d参数可以让容器在后台以守护态运行
sudo docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
//可以通过docker logs查看容器输出信息
sudo docker logs 0cb
sudo docker logs -ft 0cb
2、终止容器
docker stop命令会首先向容器发送SIGTERM信号,等待一段时间后(默认为10s),再发送SIGKILL信号终止容器。
//终止容器
sudo docker stop 0cb
//指定3s后终止容器
sudo docker stop -t 3 0cb
//立即终止容器
sudo docker kill 0cb
//查看终止状态容器ID信息
sudo docker ps -a -q
//启动/重启容器
sudo docker start/restart 0cb
3、进入容器
3.1、attach命令
sudo docker attach 容器名称/容器ID
liuyongsheng@ubuntu:~$ sudo docker run -idt ubuntu c0e7b1acc3018a319e4a6fb8ad191a2286a8f493cb35465adb0a8531b9393546 liuyongsheng@ubuntu:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0e7b1acc301 ubuntu "/bin/bash" 3 seconds ago Up 2 seconds angry_mclean liuyongsheng@ubuntu:~$ sudo docker attach c0e7 root@c0e7b1acc301:/#
缺点:当多个窗口同时attach到同一个容器时,所有窗口同步显示。当某个窗口命令阻塞,其它窗口也无法执行操作。
3.2、exec命令
//进入刚创建的容器并启动一个bash
sudo docker exec -ti 容器id /bin/bash
3.3、nsenter工具
//获取容器进程PID
PID=`sudo docker inspect -f "{{.State.Pid}}" 容器ID`
//通过容器进程PID连接到容器
sudo nsenter --target $PID --mount --uts --ipc --net --pid
liuyongsheng@ubuntu:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0e7b1acc301 ubuntu "/bin/bash" 10 minutes ago Up 8 minutes angry_mclean liuyongsheng@ubuntu:~$ PID=`sudo docker inspect -f "{{.State.Pid}}" c0e7` liuyongsheng@ubuntu:~$ echo $PID 7363 liuyongsheng@ubuntu:~$ sudo nsenter --target $PID --mount --uts --ipc --net --pid root@c0e7b1acc301:/# w 14:52:24 up 1:52, 0 users, load average: 0.02, 0.03, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root@c0e7b1acc301:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 14:43 ? 00:00:00 /bin/bash root 10 0 0 14:52 ? 00:00:00 -bash root 14 10 0 14:52 ? 00:00:00 ps -ef root@c0e7b1acc301:/#
4、删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项包括:
-f, --force Force the removal of a running container (uses SIGKILL) 强行终止并删除一个运行中的容器
-l, --link Remove the specified link 删除容器的连接,但保留容器
-v, --volumes Remove the volumes associated with the container 删除容器挂载的数据卷
liuyongsheng@ubuntu:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0e7b1acc301 ubuntu "/bin/bash" 24 minutes ago Up 23 minutes angry_mclean liuyongsheng@ubuntu:~$ sudo docker rm c0e7 Error response from daemon: You cannot remove a running container c0e7b1acc3018a319e4a6fb8ad191a2286a8f493cb35465adb0a8531b9393546. Stop the container before attempting removal or force remove liuyongsheng@ubuntu:~$ sudo docker stop c0e7 c0e7 liuyongsheng@ubuntu:~$ sudo docker rm c0e7 c0e7 liuyongsheng@ubuntu:~$ sudo docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" 4b2fa37a901571606a067c07cf540e526ace3a4367765c4ef1dd1f53b587264b liuyongsheng@ubuntu:~$ sudo docker logs 4b2f hello world hello world liuyongsheng@ubuntu:~$ sudo docker rm -f 4b2f 4b2f
5、导入和导出容器
docker export/docker import
liuyongsheng@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19305643e241 ubuntu "/bin/sh -c 'while..." 5 minutes ago Up 5 minutes clever_volhard 47a99b7b695b ubuntu "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago gallant_blackwell liuyongsheng@ubuntu:~$ sudo docker export 1930 > test_for_run.tar liuyongsheng@ubuntu:~$ sudo docker export 47a9 > test_for_stop.tar liuyongsheng@ubuntu:~$ du -sh test_* 97M test_for_stop.tar 97M test_f_run.tarliuyongsheng@ubuntu:~$ sudo docker rm -f 1930 47a9 1930 47a9 liuyongsheng@ubuntu:~$ cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0 sha256:0cb33157929df8183a1aae6fd172303f1c42e9e9fd939e73cfac35124f47f019 liuyongsheng@ubuntu:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 0cb33157929d 9 seconds ago 97.3MB ubuntu latest 6a2f32de169d 4 days ago 117MB centos latest a8493f5f50ff 10 days ago 192MB registry latest 136c8b16df20 10 days ago 33.2MB
容器快照文件会丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),而镜像文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。