刚开始学Hyperledger Fabric的时候关于Docker的知识草草看了一下就过去了,后面才发现对区块链的网络不知所以然,于是重新学了Docker,再去看Fabric网络部分的时候豁然开朗。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
基本概念
- 镜像(Image):是一个特殊的文件系统,分层构建。
- 容器(Container):一个镜像可以产生多个容器。不要向存储层写入,因为容器消亡时存储层随之消亡,应用数据卷(Volume)写入,数据卷独立于容器。
- 仓库(Respository):一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
Ubuntu安装Docker
测试是否安装成功
docker run hello-world
镜像
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
镜像ID是镜像唯一的标识。
- 搜索镜像
docker search image_name
- 拉取镜像
docker pull name:tag
注:以上命令省略了仓库地址,默认为Docker Hub,省略了仓库名,Docker Hub的默认仓库为library。
- 列出镜像
docker image ls
注意上面这个命令只显示了顶层镜像,还有中间层镜像,可用这个命令显示全部镜像
docker image ls -a
如果要列出镜像的ID,则用参数 -q
,如docker image ls -q
- 查看并删除虚悬镜像
一般虚悬镜像没有存在的价值。
docker image ls -f dangling=true //查看
docker image prune //删除
- 删除镜像
可以使用ID、镜像名、摘要删除镜像
docker image rm ID|镜像名|摘要
docker image rm $(docker image ls -q redis) //删除所有仓库名为redis的镜像
- 查看镜像、容器、数据卷所占的空间
docker system df
- Dockerfile
容器
- 查看容器
docker container ls //列出运行中的容器
加参数-a
查看所有容器(包括终止状态的容器)
- 新建容器并启动
docker run -t -i ubuntu:14.04 /bin/bash //启动一个bash终端,允许用户进行交互。
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开。
如果要后台运行加参数-d
docker container logs [container ID or NAMES] //后台运行情况下查看输出的信息
- 启动已终止的容器
docker container start yourStoppedContainer
- 停止容器
docker container stop [ID or name]
docker container restart [ID] \\重启容器
- 进入容器
容器后台运行时进入容器
docker exec [ID or name] //可加参数-i -t等
docker exec -it ubuntu bash //eg
- 删除容器
docker container rm [ID or name]
docker container prune //清除所有处于终止状态的容器
仓库
通过docker search命令来查找官方仓库中的镜像,并利用 docker pull命令来将它下载到本地。
Docker数据管理
两种方式:
- 数据卷(Volume)
- 挂载主机目录(Bind mounts)
数据卷
被设计用来持久化数据的,它的生命周期独立于容器
- 创建一个数据卷
docker volume create my-vol
- 查看数据卷
docker volume ls
- 清空无主数据卷
docker volume prune
挂载主机目录
就是挂载本地文件到容器
使用网络
外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。
使用-p时,随机映射49000-49900之间的一个端口到容器的端口。
-p
也可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
容器互联
将容器加入自定义的网络来连接多个容器。
- 新建网络
docker network create -d bridge my-net
其中-d
指定网络类型,可选bridge
和overlay
。
- 连接容器
运行一个容器并连接到新建的my-net 网络
docker run -it --rm --name busybox1 --network my-net busybox sh
其中--rm
指定结束运行时删除该容器,--name
指定容器的名字
加入同一个网络的容器可以ping通。
配置DNS
- 在/etc/docker/daemon.json中自动配置
- 也可运行容器时通过参数手动配置,比如设定容器的主机名:
-h HOSTNAME
…
Docker Compose
用于快速部署分布式应用。
通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。
- 运行compose项目
docker-compose up
Compose模板文件
- 每个服务都必须通过 image 指令指定镜像或 build 指令(需要Dockerfile)等来自动构建生成镜像。
- command:容器启动后默认执行的命令
command: echo "hello world"
- env_file:从文件中获取环境变量
- environment:环境变量,字典格式
- labels:为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息。
- networks:配置连接的网络
- volumes:数据卷所挂载路径设置。
- extends:扩展服务(感觉就像面向对象里的继承一样=_=)
其它学习资源
docker常用命令
终止并删除所有容器
- docker stop (docker ps -q) & docker rm (docker ps -q) & docker rm (docker ps -aq)
kill any stale or active containers:
- docker rm -f $(docker ps -aq)
Clear any cached networks:
- docker network prune