基本认识

Docker是linux容器(当然也有windows container docker)的一种封装,提供了简单操作的接口。

容器与虚拟机

容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。容器更便携,更高效(https://www.docker.com/resources/what-container)。

20190104154659144347828.png

容器是应用层的抽象,它将代码和依赖关系打包在一起。 多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。

虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。 虚拟机管理程序允许多台虚拟机在一台计算机上运行。 每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。

优点

轻量: 只对需要的bin/lib打包 部署快: 比虚拟机强 弹性伸缩: Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力(服务访问峰差很大的场景,可以做弹性适配)

常用命令

1). 镜像(image)

  1. docker的运行环境,可以理解成’快照’
  2. 镜像是一个虚拟的概念,由多层文件系统联合组成

2). 容器(container)

  1. 镜像运行中的’实体’
  2. image和container的关系,可以类比面向对象中的类和实例,容器是镜像运行中的实体
  3. 容器销毁,容器中存储的信息会丢失。但是容器的存储可以绑定数据卷(volume)或宿主机目录

3). 仓库

  1. 镜像(image)仓库,用户根据需要拉取镜像
  2. 有官方的仓库,也可以搭私有仓库

docker

查看版本

  docker --version 

查看空间占用

 docker system df

image

#镜像名称
docker search <image name>
#拉取 
docker pull [选项] [Docker Registry 地址[:端口号]/]    仓库名[:标签]
docker pull ubuntu:18.04 ##例如,参数不提供地址会从官网镜像获取镜像;参数无版本号会拉取最新的(latest)
#删除镜像
docker image rm  <IMAGE ID>
#搜索镜像(无法指定版本号)
docker search centos 

官方镜像地址为: https://hub.docker.com/

container

运行 docker run ...

举例:

#运行centos的echo命令:
docker run --name ctName  centos echo 'hello wolrd'
#操作centos命令行: 
docker run  --name ctname -t -i --rm centos bash
#后台运行nginx: 
docker run --name web -d -p 8088:80 -v /Users/tyrad/Documents/webapp:/usr/share/nginx/html nginx

参数解释

--name: 为运行起来的container(实体)起个名字 -t: 为容器分配一个终端(terminal)绑定到容器的输出上 -i: 让容器的标准输入保持打开 -v A:B: 容器目录B映射到本机目录A -d: 后台运行,类似& 、nohup、supervisor --rm: 退出后销毁容器,否则销毁需要手动 docker container rm ${name} -d -p 8080:80: 将容器的80端口映射到本机的80端口 -dit: 等同于 -d -i -t

查看某个容器的启动错误日志

 docker logs <#容器id#>

与运行容器交互

#ctName为容器名
docker attach ctName 
docker exec -it  ctName  bash 

docker attach 是 Docker 自带的命令,为容器分配一个终端绑定到容器的输出上 。但是exit时容器也会停止。 exec 作用同上。但是exit时容器不会停止。 需要配合 -it 使用。当然也可以运行其他命令,如

➜  ~ docker exec  web  echo 'hello'

停止

#退出容器的终端 :  
exit  或 Ctrl+d
#停止运行中的容器:  
docker container  stop ${name或返回的id}    

重新启动

#关闭中容器重启 
docker container    start ${name或返回的id}
#容器重新启动     
docker container restart ${name或返回的id} 

删除

#删除指定的(停止状态)的容器
docker container rm   ${name或返回的id} 

容器的导入导出

#导出容器快照
docker export 9b804b1b > Desktop/nginx.tar
#导入快照 (可以是网络地址或本地路径)
docker import http://example.com/exampleimage.tgz example/imagerepo 

快照export和save的区别是。 save会保存用户的操作,常用用途:保存作案现场并时候分析。

image镜像的导入导出

导出:

docker save  imageId  > ~/Desktop/import-nginx.tar

20190104154659476470874.png

导入:

docker load < ~/Desktop/import-nginx.tar   

导入并重命名 2019010415465948227928.png

数据卷(volume)

容器销毁时,容器内的数据都会销毁。为了数据的持久化需要用到数据卷(volume),也可以将目录映射(-v)。

需要注意:

  1. volume容器创建时就初始化,容器运行时就可以使用其中的文件
  2. volume能在不同的容器间共享和重用
  3. 对volume中数据的操作会马上生效
  4. 对volume中数据的操作不会影响容器本身
  5. volume证明周期独立于容器的生命周期。即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除。 (原文:https://blog.csdn.net/dream_broken/article/details/52314993 )

常用命令

#创建数据卷
➜  docker volume create docker-volume
docker-volume
#查看
➜  docker volume ls
DRIVER              VOLUME NAME
local               docker-volume 
#查看具体信息
➜  docker volume inspect docker-volume
[
    {
        "CreatedAt": "2018-12-26T08:43:45Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/docker-volume/_data",
        "Name": "docker-volume",
        "Options": {},
        "Scope": "local"
    }
]
#删除
➜ docker volume rm docker-volume

数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。 无主的数据卷可能会占据很多空间,要清理请使用以下命令

docker volume prune

数据拷贝

拷贝到宿主机

docker cp <containerId>:/file/path/within/container /host/path/target  
#举例
docker cp  ctName:/anaconda-post.log ~/Desktop/do2pdf

拷贝内容到容器

  1. -v挂载数据卷
  2. 也可以用docker cp
#	将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。 
docker cp /www/runoob 96f7f14e99ab:/www
#将/etc/nginx/nginx.conf 文件拷贝本机目录下 
docker cp web:/etc/nginx/conf.d /Users/tyrad/Documents/nginx
#/etc/nginx/conf.d目录拷贝到本机目录下
docker cp web:/etc/nginx/nginx.conf  /Users/tyrad/Documents/nginx

目录映射

-v A:B: 目录A为本机目录,B为容器目录

docker run --name web  -d    -p 8088:80   -v    /Users/tyrad/Documents/webapp:/usr/share/nginx/html    -v /Users/tyrad/Documents/nginx/nginx.conf:/etc/nginx/nginx.conf    -v  /Users/tyrad/Documents/nginx/conf.d:/etc/nginx/conf.d       nginx

网络

旧的链接方式 --link:

如果你之前有 Docker 使用经验,你可能已经习惯了使用 –link 参数来使容器互联。随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 –link 参数。

docker network create -d bridge my-net
#测试,容器之间通过name是可以ping通的
docker run --name test1 -it  --rm   --network my-net centos bash
docker run --name test1 -it  --rm   --network my-net centos bash

提交镜像

提交到官方仓库

  1. 注册
  2. docker login
  3. docker push,镜像名有要求,格式为用户名/镜像名,如tyrad/nginx