创建容器

docker create

常用参数:

--name:为容器分配一个名字

-v | --volume  :为容器绑定安装一个卷,例如-v /data 会为容器创建一个/data分区出来




例如:

# docker create -it ubuntu:latest
2434968ec612b085b4b34e93f9858fdc36fb94e2a4527966a14ef93e1a18a00f

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
2434968ec612        ubuntu:latest       "/bin/bash"         3 seconds ago       Created                                      mystifying_proskuriakova


启动容器

docker start

使用docker create创建的容器处于停止状态,可以使用docker start命令启动

# docker start  mystifying_proskuriakova

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                   PORTS               NAMES
2434968ec612        ubuntu:latest       "/bin/bash"         About a minute ago   Up 3 seconds                                 mystifying_proskuriakova


停止容器

docker stop [-t|--time[=10]] [CONTAINER...]

首先向容器发送SIGTERM信号,等待超过一段时间后(默认为10秒)后,再发送SIGKILL信号来终止容器


重启容器

docker restart


进入容器

attach

使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,这时候要进入容器可以使用attach或者exec或者第三方的nsenter工具等。

docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]]  CONTAINER

--detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q

--no-stdin=true | false:是否关闭标准输入,默认是保持打开。

--sig-proxy=true | false :是否代理收到的系统信息给应用进程,默认为true

如:

##创建并启动一个容器 名为test
# docker run -itd --name test  ubuntu:latest       
3a4a6614acbfc820f5da3983527e3e585946f27393fab17b1ce09adb7c757206

##查看容器进程
[root@OPS01-LINTEST02 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3a4a6614acbf        ubuntu:latest       "/bin/bash"         4 seconds ago       Up 3 seconds                            test

##连接到该容器
[root@OPS01-LINTEST02 ~]# docker attach test
root@3a4a6614acbf:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

注意:使用attach连接到容器时,如果多个窗口同时使用attach连接到同一个容器时,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作


exec命令

从docker1.3版本开始提供更加方便的exec命令,可以在容器内直接执行任意命令,用法为

docker exec [-d|-detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
  • -i, --interactive=true|false:打开标准输入接受用户输入命令,默认为false;

  • --privileged=true|false: 是否给执行命令最高权限,默认为false

  • -t, --tty=true|false:分配伪终端

  • -u, --user="":执行命令的用户名或ID

例如:

进入到前面创建的容器中

 docker exec -it test /bin/bash

在容器中执行ls命令

root@3a4a6614acbf:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr


nsenter进入容器

1、首先安装nsenter

docker run --rm jpetazzo/nsenter cat /nsenter > /usr/local/bin/nsenter && chmod +x /usr/local/bin/nsenter

执行上面的命令,会将nsenter安装在/usr/local/bin/nsenter目录下


2、获取容器State ID

PID=$(docker inspect --format {{.State.Pid}} )

这里是根据容器名称或者容器ID获取State ID

例如:

PID=$(docker inspect --format {{.State.Pid}} my-nginx)
113754


3、使用nsenter连接容器

nsenter --target $PID --mount --uts --ipc --net --pid


将2、3写成脚本con_container.sh保存在/usr/local/bin目录下,方便以后使用

#!/bin/bash
PID=`docker inspect --format {{.State.Pid}} $1`
nsenter --target $PID --mount --uts --ipc --net --pid


删除容器

docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]

主要支持的选项:

  • -f, --force=false:是否强制终止并删除一个运行中的容器

  • -l, --link=false:删除容器的连接,但保留容器

  • -v, --volumes=false:删除容器挂载的数据卷

默认情况下,docker rm只能删除处于终止状态的容器,如果要删除运行状态的容器,可以使用-f参数,docker会先发送SIGKILL信号给容器,终止其应用,然后删除容器


导入导出容器

有时候需要将容器从一个系统迁移到另一个系统,可以使用导入导出功能

1、导出容器

导出一个已经创建的容器到文件,不管此时容器是否处于运行状态,可以使用docker export 命令,用法:

docker export [-o|--output [=""]] CONTAINER

-o:指定导出的tar文件名

例如:

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3a4a6614acbf        ubuntu:latest       "/bin/bash"         41 minutes ago      Up 25 minutes                           test

# docker export -o test_for_run.tar test

# ls
test_for_run.tar

导出之后,就可以将文件上传到其他机器上,使用导入命令导入到系统中,从而实现容器的迁移


2、导入容器

导出的test_for_run.tar文件可以使用import命令导入变成镜像,该命令格式为:

docker import [-c --change[=[]]] [-m|--message[=MESSAGE]] file|URL|-REPOSITORY[:TAG]

用户可以通过-c,--change=[] 选项在导入的同时执行对容器进行修改的Dockerfile指令

# docker import test_for_run.tar ubuntu:v1.0       
sha256:2c82ae3a0afe67122ce5fabe397025bc19bffef5c2a6b873098567846c00cfdc

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              v1.0                2c82ae3a0afe        1 second ago        69.8MB
ubuntu              v1                  c4af03e0f787        22 hours ago        87MB
ubuntu              14.04               578c3e61a98c        7 days ago          223MB
ubuntu              latest              113a43faa138        7 days ago          81.1MB
nginx               latest              cd5239a0906a        7 days ago          109MB
centos              7                   49f7960eb7e4        8 days ago          200MB
centos              latest              49f7960eb7e4        8 days ago          200MB
centos              6                   70b5d81549ec        2 months ago        195MB


容器高级功能配置

配置容器的DNS和主机名

--dns=IP_ADDR:指定容器的DNS地址,默认使用和宿主机一样的DNS服务器地址

--host HOSTNAME,-h HOSTNAME:配置容器的主机名,默认使用容器ID为主机名

--name:配置容器名称,例如 --name webserver