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

容器快照文件会丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),而镜像文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

原文地址:https://www.cnblogs.com/liuyongsheng/p/6724753.html