基本认识
Docker是linux容器(当然也有windows container docker
)的一种封装,提供了简单操作的接口。
容器与虚拟机
容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。容器更便携,更高效(https://www.docker.com/resources/what-container)。
容器是应用层的抽象,它将代码和依赖关系打包在一起。 多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。
虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。 虚拟机管理程序允许多台虚拟机在一台计算机上运行。 每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。
优点
轻量: 只对需要的bin/lib打包
部署快: 比虚拟机强
弹性伸缩: Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力(服务访问峰差很大的场景,可以做弹性适配)
常用命令
1). 镜像(image)
- docker的运行环境,可以理解成’快照’
- 镜像是一个虚拟的概念,由多层文件系统联合组成
2). 容器(container)
- 镜像运行中的’实体’
- image和container的关系,可以类比面向对象中的类和实例,容器是镜像运行中的实体
- 容器销毁,容器中存储的信息会丢失。但是容器的存储可以绑定数据卷(volume)或宿主机目录
3). 仓库
- 镜像(image)仓库,用户根据需要拉取镜像
- 有官方的仓库,也可以搭私有仓库
docker
查看版本
查看空间占用
image
docker search <image name>
docker pull [选项] [Docker Registry 地址[:端口号]/] 仓库名[:标签]
docker pull ubuntu:18.04
docker image rm <IMAGE ID>
docker search centos
官方镜像地址为: https://hub.docker.com/
container
运行 docker run ...
举例:
docker run --name ctName centos echo 'hello wolrd'
docker run --name ctname -t -i --rm centos bash
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
查看某个容器的启动错误日志
与运行容器交互
#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
导入:
docker load < ~/Desktop/import-nginx.tar
导入并重命名
数据卷(volume)
容器销毁时,容器内的数据都会销毁。为了数据的持久化需要用到数据卷(volume),也可以将目录映射(-v)。
需要注意:
- volume容器创建时就初始化,容器运行时就可以使用其中的文件
- volume能在不同的容器间共享和重用
- 对volume中数据的操作会马上生效
- 对volume中数据的操作不会影响容器本身
- 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 cp <containerId>:/file/path/within/container /host/path/target
docker cp ctName:/anaconda-post.log ~/Desktop/do2pdf
拷贝内容到容器
- -v挂载数据卷
- 也可以用docker cp
docker cp /www/runoob 96f7f14e99ab:/www
docker cp web:/etc/nginx/conf.d /Users/tyrad/Documents/nginx
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
docker run --name test1 -it --rm --network my-net centos bash
docker run --name test1 -it --rm --network my-net centos bash
提交镜像
提交到官方仓库
- 注册
docker login
docker push
,镜像名有要求,格式为用户名/镜像名
,如tyrad/nginx
额外的
centos开机启动配置