docker 常用命令

从国内daoclouddocker镜像源中拉去镜像
docker pull daocloud.io/centos:latest

docker run 命令(基于已有的镜像创建容器,运行容器)
-t:分配一个伪终端,意思是运行一个容器需要一个终端。
-i:即使不连接也保持输入状态,即开启终端后,该终端一直存在(不知道是否有超时),即交互的模式
-d:非交互的模式,即后台模式运行该容器。
-u:指定用户名
-w:容器内工作的目录
docker commit命令(基于已有的镜像的容器创建新镜像)
-a:  作者信息
-m:  提交消息
-p: 提交时暂停容器运行
基于本地模板导入一个镜像(推荐使用OpenVZ提供的模板来创建)
OPENVZ模板的下载地址为http://openvz.org/Download/templates/precreated
    使用命令导入镜像:cat tar包|docker import - 镜像名name:tag标签
    然后查看本地是否有该镜像:docker images


使用docker save 和docker load命令来存储和载入镜像。
存储镜像:docker save -o 文件名.tar 仓库:tag(哪个仓库的tag)
导入镜像:docker load从存出的本地文件中再导入到本地镜像库,例如:从文件nginx.1.8.tar导入镜像到本地镜像列表,如下所示:
    docker load --input nginx.1.8.tar
    或者
    docker load < nginx.1.8.tar


上传镜像
    使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登    录),命令格式为docker push name:tag
    用户在dockerhub网站注册后,即可上传自制的镜像。例如用户user上传本地的    test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push    命令上传镜像:
    docker tag test:latest user/test:latest
    docker push user/test:latest


容器就是镜像的一个运行实例,容器是带有可写的文件层。
虚拟机是模拟运行的一整套操作系统和跑在上面的应用,那么Docker容器就是独立运行的一个或一组应用,以及它们的必须运行环境。
对容器的操作有:创建容器、启动容器、终止容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。


1.创建容器
    使用docker create 命令新建一个容器(使用该命令创建的容器是停止的,使用docker start命令启动)
    docker create -it nginx:latest
    docker ps -a

新建并启动容器
启动方法有两种:基于镜像新建一个容器并启动,另一个是将在终止状态的容器重新启动。所需要的命令主要为:docker run,等价于先执行docker create后执行docker start。
例如:
docker run ubuntu /bin/echo 'Hello world'
Hello world
这跟在本地直接执行/bin/echo 'Hello world'几乎感觉不出任何区别。
建议:用docker run
docker在后台运行的标准操作包括:
1)检查本地是否存在指定的镜像,不存在就从
公有仓库下载。
2)利用镜像创建并启动一个容器。
3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
4)从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去。
5)从地址池配置一个IP地址给容器。
6)执行用户指定的应用程序。
7)执行完毕后容器被终止。
下面的命令则启动一个bash终端,允许用户进行交互:
docker run -t -i ubuntu:14.04 /bin/bash
这时候进入的是一个容器的伪终端。这时候用户可以在这个容器内进行操作
退出容器的命令是:exit或按ctrl+d,这时候该容器就是处于终止的状态。


守护态运行:即daemon形式运行。-d参数实现。
例如:docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
容器启动后会返回一个唯一的ID,也可以通过docker ps命令来查看容器信息
要获取容器的输出信息:docker logs 容器ID(可以写ID的前几个字符)


终止容器:docker stop 它会先向容器发送SIGTERM信号,等待一段时间后(默认是10s),再发送SIGKILL信号终止容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。
注意:docker kill 命令会直接发送SIGKILL信号来强行终止容器。
docker ps -a -q用于查看终止的容器。
处于终止的容器可以通过docker start重新启动。
docker restart 会重启一个运行的容器。


进入容器:
使用-d,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有很多方法,包括使用docker attach命令,docker exec命令,以及nsenter工具等。
attach命令:docker attach 容器name。attach命令不方便,即当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口音命令阻塞时,其他窗口也无法执行操作。
exec命令:docker exec -ti 容器ID

 

nsenter工具:需要额外安装yum install util-linux -y


导出镜像:docker save -o centos.tar docker.io/centos:latest
导入镜像:docker load --input /tmp/centos.tar
导出容器:docker export 7691a814370e > centos.tar
导入容器为镜像:cat centos.tar | docker import - test/centos:v1.0
这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

docker inspect --format "{{.State.Pid}}" 867e6627a194  #找到容器的第一个进程PID
nsenter -t PID号 -m -u -i -n -p  输入该命令便进入到容器中
nsenter --target上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中
 –mount参数是进去到mount namespace中
* –uts参数是进入到uts namespace中
* –ipc参数是进入到System V IPC namaspace中
* –net参数是进入到network namespace中
* –pid参数是进入到pid namespace中
* –user参数是进入到user namespace中


可以写个脚本进入容器
#!/bin/bash
# Use nsenter to access docker
docker_in(){
  NAME_ID=$1
  PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
  nsenter -t $PID -m -u -i -n -p
}
main(){
  docker_in $*
}
main $*


如何创建镜像?
方法一:根据已有容器生成镜像
    在容器中安装json和gem两个应用,同时exit
    使用docker commit命令提交更新后的副本
    docker commit -m "说明信息" -a "指定更新的用户信息" 容器ID 仓库名 tag
方法二:利用Dockerfile来创建镜像
        利用docker commit来扩展一个镜像比较简单,但是不方便在团队中分享。我    们可以使用docker build来创建一个新的镜像。为此,我们需要创建Dockerfile,    包含一些如何创建镜像的指令。
    1.新建一个目录和Dockerfile
      mkdir 101_tang_docker
      cd 101_tang_docker
      touch Dockerfile
      Dockerfile中每一条命令都创建镜像的一层。
      Dockerfile语法:
      使用#来注释
      FROM 指令告诉Docker使用哪个镜像作为基础
      接着就是维护者的信息
      RUN开头的指令会在创建中进行,比如安装一个软件包(yum或rpm),编写完成                Dockerfile后,使用docker build来生成镜像。
      例如:
      #This is comment
      FROM Centos:7.1
      MAINTAINTER Docker Newbee <[email protected]>
      RUN yum install lrzsz -y
      dockerfile做好后,使用docker build -t="仓库名:tag" . 来生成镜像,注                意.不要丢,-t标记来添加tag,指定新的镜像的用户信息,“.”是dockerfile              所在的路径,也可以替换为全路径。
      注意:一个镜像不能超过127层
      

 杀死所有正在运行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'

# 删除所有已经停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'

# 删除所有未打标签的镜像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'

# 删除所有已经停止的容器和未打标签的镜像.
alias dockerclean='dockercleanc || true && dockercleani'
      
# 给镜像打标签,同时进行仓库的定义
    docker tag friendlyhello username/repository:tag
#将镜像推送到注册服务器上
docker push username/repository:tag

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章