docker image

docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7

docker image是需要定制化build的一个安装包,包括基础镜像+应用的二进制部署包

docker image内不建议有运行期需要修改的配置文件

Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image

docker image的最佳实践之一是尽量重用和使用网上公开的基础镜像

 

为docker添加国内镜像,加速下载镜像:

修改配置文件/etc/docker/daemon.json,如果该文件没有则进行创建:


[root@docker ~]# cat /etc/docker/daemon.json 
{
    "dns": ["192.168.101.2","8.8.8.8"],
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}



然后重启docker:



# systemctl restart docker



 

关于image的一些命令:

搜索镜像:



# docker search nginx



nginx为镜像名称(镜像名称如:centos、nginx、redis)

拉取镜像:



# docker pull nginx



列出本地镜像:


# docker images(docker images --help)
 
   

       # docker image ls -a 同样是列出镜像(docker image ls --help查看)


删除镜像:


# docker  rmi nginx    (docker rmi image_name/image_id)
 
   

       # docker image rm nginx同样是删除镜像(docker image rm image_name/image_id)


  -f:force强制删除



  note:如果镜像被容器占用了,需要先删除容器,才能删除镜像



[root@aliyun ~]            # docker image ls -q           


            4760dc956b2d           


            2d743d41a4ba           


            57601981c989           


            5cb13972bd2b           


            5d4d51c57ea8           


            006de56999d1           


            5fbc887a9773           


            ffcdd49c4f06           


            fed968450a87           


            9d95756f4947           


            a92c139758db           


            9b179c4d385e           


            ff426288ea90           


            3f8a4339aadd           


            6704d778b3ba



将镜像导出:



# docker save -o centos.tar centos
 
    

        [root@docker ~]# ll 
    
 
    

        total 200420 
    
 
    

        -rw-------. 1 root root 1249 Oct 27 04:52 anaconda-ks.cfg 
    
 
    

        -rw-------. 1 root root 205225472 Oct 27 15:22 centos.tar


将本地包导入到镜像中:



# docker load --input centos.tar



Linux 查看 docker 容器时间 什么命令查看docker容器_json

 

Docker container:

Docker container是image的实例,共享内核

Docker  container里可以运行不同os的image,比如Ubuntu的或者centos

Docker container不建议内部开启一个sshd服务,1.3版本后新增了docker exec命令进入容器进行排查问题

Docker container没有ip地址,通常不会有服务端口暴露,是一个封闭的沙盒

 

Docker daemon:

Docker daemon是创建和运行container的Linux守护进程,也是Docker 最主要的核心组件

Docker daemon可以理解为Docker container的container

Docker daemon可以绑定本地端口并提供REST API服务,用来远程访问和控制

Linux 查看 docker 容器时间 什么命令查看docker容器_docker_02

Docker container的一些命令操作:

 查看容器:



# docker ps



查看所有的容器:



# docker ps -a



启动一个容器:



# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
# docker run    启动一个容器并执行命令(容器是本机host的一个进程,如果进程没有后续操作,那么状态将是exited)



创建一个名称为mycentos的container,并执行/bin/bash:



# docker run --name mycentos centos /bin/bash



  --name:表示容器的name,后面的centos表示使用的哪个镜像(镜像name)



   /bin/bash:表示执行的command

Linux 查看 docker 容器时间 什么命令查看docker容器_java_03



容器可以使用容器id和容器name来识别(与镜像类似)



容器有状态(exited表示已经退出了)



启动容器:



# docker start mycentos



关闭容器:



# docker stop mycentos



删除容器:



# docker rm mycentos



上面的操作都可以使用容器的唯一标识(容器名称或者容器id)

-f:force强制删除

 

创建一个具有tty伪终端的容器:



# docker run -t --name mycentos centos /bin/bash [root@92f0af59184d /]#



可以看见直接进入到了容器的终端,但是由于没有使用-i(交互功能,所以使用命令会卡住)

此时查看该容器状态:

Linux 查看 docker 容器时间 什么命令查看docker容器_操作系统_04

查看本机host进程:

Linux 查看 docker 容器时间 什么命令查看docker容器_java_05

可以看出进程中包含的一长串字符就是该容器的uuid,由于进程没有关闭所以容器状态就是up

现在将容器关闭掉:

Linux 查看 docker 容器时间 什么命令查看docker容器_java_06

可以看见容器状态已经exited了

Linux 查看 docker 容器时间 什么命令查看docker容器_centos_07

而相应的本机host的进程已经结束了



note:docker的容器就是本机host的某一个包含容器uuid的进程,进程关闭了那么容器也就是停止了



删除所有的exited容器:



# docker ps -a -q|xargs docker rm



创建一个以后台模式运行的容器:



[root@docker ~]# docker run -d --name mycentos centos /bin/bash
f61a3e75ebb5f78d1f593e7c92bf2a997077abc38287991818749550367b8150



  -d:以后台模式创建,返回容器的uuid




Linux 查看 docker 容器时间 什么命令查看docker容器_操作系统_08

因为创建的只是一个后台运行的容器,容器并没有被安排操作其他的命令(/bin/bash),所以容器的状态还是exited,本机host的进程是没有这个容器的



 



创建一个以后台模式运行不间断的容器:


[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 
5ef7fa20faa1071ad1a6eff2241368b113cbf45e1b89c6a292907a4f1a3e4269


Linux 查看 docker 容器时间 什么命令查看docker容器_centos_09



为什么这里的容器状态一直是up,那是因为执行的命令:sh -c "while true;do echo hello world;sleep 2;done" 是在容器中每隔2s打印一次hello world,并一直循环下去




Linux 查看 docker 容器时间 什么命令查看docker容器_json_10

查看本机host的进程也能看见,进程一直处于运行状态



将运行的容器stop就可以停止掉容器



# docker stop mycentos



Linux 查看 docker 容器时间 什么命令查看docker容器_docker_11



可以将停止的状态处于运行状态(当然前提是容器的命令必须有运行的执行)



# docker start mycentos



 -t与命令/bin/bash结合进入到了终端,但是却不能操作:


[root@docker ~]# docker run -t --name test saltstack/ubuntu-14.04 /bin/bash
root@b588c6131109:/# ls


上述在终端不具有交互功能,于是加上-i:


[root@docker ~]# docker run -it --name mycentos centos /bin/bash
[root@176f5440f328 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


  创建一个进入到了容器终端,并能执行交互命令的容器



  -i:interactive具有交互功能



  /bin/bash:进入到bash环境



  -t:提供伪终端



[root@176f5440f328 /]# exit
exit


  exit:表示退出了容器的终端




Linux 查看 docker 容器时间 什么命令查看docker容器_centos_12

  退出容器终端后,容器状态也是退出了,本机host进程也停止运行了



  容器的状态会随着command的命令执行而改变



  如果需要将容器持续不断的运行,那么将command变为持续不断的运行就可以



[root@docker ~]# docker run -dt --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 
8179b8e95e31675986ccda57bb95650d6ea460105e23a67a4e692b7966354250



创建的一个持续不断运行的container(命令是隔两秒打印一次的不中断的)



可以用docker stop container_id 进行停止(停止后就可以删掉了)




Linux 查看 docker 容器时间 什么命令查看docker容器_docker_13

停止全部container,并删除:




Linux 查看 docker 容器时间 什么命令查看docker容器_操作系统_14

 

docker exec和nsenter的区别:



[root@docker ~]# docker exec --help
    Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    Run a command in a running container



现在创建一个一直运行的container:


[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 
292cf95a7853e70978657d7c05f7abd4bff27f1c4e73d97a32b4639d1c0165fc

[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
292cf95a7853        centos              "sh -c 'while true..."   3 seconds ago       Up 3 seconds                            mycentos


docker exec表示在一个运行的container中执行命令



Linux 查看 docker 容器时间 什么命令查看docker容器_centos_15



Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
      --help                 Print usage
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])


Linux 查看 docker 容器时间 什么命令查看docker容器_centos_15



执行某一个命令ls /



[root@docker ~]# docker exec -it 292cf95a7853 ls /
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var



还可以标准输入命令:



[root@docker ~]# docker exec  292cf95a7853 echo hello
hello



当docker exec执行如下可以进入到container中:

Linux 查看 docker 容器时间 什么命令查看docker容器_centos_17

同等的nsenter命令也可以完全进入到container中:

如果没有这个命令需要进行安装:yum install util-linux

1、确定该container的pid:


[root@docker ~]# docker inspect -f {{.State.Pid}} 292cf95a7853
27515


2、使用nsenter连接:



[root@docker ~]# nsenter --target `docker inspect -f {{.State.Pid}} 292cf95a7853` --net --ipc --pid --mount --uts
[root@292cf95a7853 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


nsenter是关于namespace命名空间的命令,能够是一些资源能够进行隔离



  PID:进程隔离(process id)



  NET:网络接口(network)



  IPC:管理跨进程通信的访问(interprocess communication)



  MNT:管理挂载点(mount)



  UTS:隔离内核和版本标识(unix timesharing system)



  USER:隔离用户