docker学习笔记
来源:互联网 发布:gommdb数据库编辑器 编辑:程序博客网 时间:2024/06/05 05:31
docker
Docker 是一个开源的应用容器引擎。作用是让开发者打包自己的应用软件和依赖环境到一个可移植的容器中。然后发布出来。
Docker是典型的PaaS平台业务,和IaaS的Openstack相比较。除了一个达到了应用级别,一个只是达到操作系统级别之外。在虚拟化的方面,Docker并没有传统虚拟化的Hypervisor层。因为Docker只是基于容器的轻量级虚拟化,其虚拟化技术是基于内核的Cgroup和Namespace技术,处理逻辑和内核深度融合,所以在许多方面,Docker都与真机性能十分接近。
可能有人懵了,Hypervisor是什么,Cgroup和Namespace又是什么。
Hypervisor:一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)
至于Cgroup和Namespace在之后会介绍
在通信上,Docker并不会直接与内核交互,他是通过一个更为底层的工具Libcontainer与内核交互。Libcontainer是真正意义上的容器引擎,他通过clone系统调用直接创建容器。
传统虚拟机的架构
Docker 的架构图
Docker的功能与组件
Docker的组成:
1.Docker 客户端
2.Docker daemon
3.Docker容器
4.Docker镜像
5.Registry
一. Docker客户端
Docker客户端一般通过Docker command来发起请求。
功能:就是发起请求
二.Docker daemon
Docker daemon也可以被理解为Docker server,或者说是Docker Engine 来描述,因为它实际驱动整个Docker功能的核心。
功能:接收客户端的请求并返回结果,实现上涉及了容器,镜像,存储等多个方面。
三.Docker容器
Docker容器是核心内容,在概念上,容器很好的诠释了Docker集装箱的概念。集装箱可以存放任何货物,并且通过邮轮将货物运往世界各地,并不用关心集装箱里到底装了什么,他只要运行起来就好了。
功能:Docker通过Libcontainer实现对容器整个生命周期的管理,信息的设置等等,而容器是对镜像的完美诠释,容器以镜像为基础,同时又给镜像提供了一个标准和隔离的环境。
四.Docker镜像
与容器相对应,容器是一个完整的,隔离的运行环境。而镜像就是运行环境的静态体现,是一个还没有运行的环境。
功能:提供镜像
五.Registry
Registry(注册表)提供的是存放镜像的仓库,通常被部署到云端,在镜像的传输过程中,Registry就是这个传输的中转站,假如在公司将一个软件运行环境制作成镜像,并且上传到Regsitry中,这时在家里也可以方便的下载运行了。
Docker公司提供的官方是Registry叫Docker Hub。
安装Docker
这个看官网是最权威的了,可以在Centos,Ubuntu上等等上部署。
https://docs.docker.com/engine/installation/linux/centos/#prerequisites
官方的资料是最好的学习资料,而且从安装到入门再到进阶都有详细的资料,还是应该从官方网站上学习。
# docker --helpUsage:docker COMMANDA self-sufficient runtime for containersOptions: --config string Location of client config files (default "/root/.docker") -D, --debug Enable debug mode --help Print usage -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") --tlskey string Path to TLS key file (default "/root/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quitManagement Commands: container Manage containers image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker volume Manage volumesCommands: attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
再了解一下Docker就正式接触一下Docker。
容器组成
Cgroup:资源控制
Namespace:访问隔离
rootfs:文件系统隔离
容器引擎:生命周期控制
Cgroup介绍
是Control group的简称,属于Linux的特性。用于隔离和限制一组进程对系统资源的调用,这些资源包括CPU,内存,block/IO 和网络带宽。
- 资源限制(Resource Limitation):cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)。
- 优先级分配(Prioritization):通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。
- 资源统计(Accounting): cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。
- 进程控制(Control):cgroups可以对进程组执行挂起、恢复等操作。
Namespace介绍
是将全局资源做封装,使得每个Namespace都有一份独立的资源,就是各个空间的资源互相不影响,比如在A空间定义了一个防火墙规则,并不会影响B空间的防火墙规则, 在A中的IP地址也是独立的,内核规则也是不互相影响的。
- IPC:隔离system V IPC 和POSIX消息队列
- Network:隔离网络资源。
- Mount:隔离文件系统的挂载点。
- PID:隔离进程的ID
- UTS:隔离主机名
- User:隔离用户ID和组ID
关于网络的namespace相关博客: http://blog.csdn.net/ghost_leader/article/details/71075551
Docker镜像
下来先快点接触一下Docker,按照官网上的介绍使用步骤,运行了第一个实例。
# docker run hello-worldHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
docker的官网上举了这样一个例子。当使用python应用时,因为没有python的运行环境,而造成无法运行。所以可以使用docker来封装一个环境。
首先创建一个空目录。
# mkdir Docker
进入Docker目录
# vim Dockerfile# Use an official Python runtime as a base imageFROM python:2.7-slim# Set the working directory to /appWORKDIR /app# Copy the current directory contents into the container at /appADD . /app# Install any needed packages specified in requirements.txtRUN pip install -r requirements.txt# Make port 80 available to the world outside this containerEXPOSE 80# Define environment variableENV NAME World# Run app.py when the container launchesCMD ["python", "app.py"]
创建配置文件,配置所需的Python库。
# vim requirements.txtFlaskRedis
创建python代码
# vim app.pyfrom flask import Flaskfrom redis import Redis, RedisErrorimport osimport socket# Connect to Redisredis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)app = Flask(__name__)@app.route("/")def hello(): try: visits = redis.incr('counter') except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv('NAME', "world"), hostname=socket.gethostname(), visits=visits)if __name__ == "__main__":app.run(host='0.0.0.0', port=80)
构建应用。
# lsapp.py Dockerfile requirements.txt# docker build -t friendlyhello .Sending build context to Docker daemon 4.608kBStep 1/7 : FROM python:2.7-slim...
运行
# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEfriendlyhello latest 93423083d7ee 3 minutes ago 195MBpython 2.7-slim 1c7128a655f6 5 days ago 183MBhello-world latest 48b5124b2768 4 months ago 1.84kB# docker run -d -p 4000:80 friendlyhello2c5de434a914af2cc7b6a6b6a3bb4813e61d9d69682ea736b646b907f7847e22
此时4000端口已经被监听
# lsof -i :4000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 12445 root 4u IPv6 229078 0t0 TCP *:terabase (LISTEN)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 12445 root 4u IPv6 229078 0t0 TCP *:terabase (LISTEN)
访问试试
停止运行容器
# docker stop 2c
(2c就可以代表2c5de434a914了)
(2c就可以代表2c5de434a914了)
分享我的镜像
首先按照官网的提示,在cloud.docker.com上注册了一个账号。
然后
# docker login 登录
标记相关的镜像。
# docker tag friendlyhello 454041823/hello:tag
上传
# docker push 454041823/hello:tagThe push refers to a repository [docker.io/454041823/hello]7fe3e2095f40: Pushing [==> ] 512.5kB/11.82MB268907610fca: Pushing [==================================================>] 5.12kB802dd921ccea: Pushed 7b7f69d6236f: Pushing [=========> ] 1.113MB/5.737MB667e68ed0db3: Pushing [=> ] 934.4kB/45.71MB5eac2de68a97: Pushing [> ] 77.82kB/7.749MB8d4d1ab5ff74: Waiting
一旦完成,就可以直接运行了。
# docker run -d -p 4000:80 454041823/hello:tag
下面介绍一下docker的相关简单命令。
docker run <容器名字> 运行一个新的容器
docker images 列出所有的镜像
docker build -t friendlyname . 利用目录中的文件创建一个镜像
运行相关
docker run -p 4000:80 friendlyname 运行一个镜像,并且端口映射
docker run -d -p 4000:80 friendlyname 独立模式运行
管理镜像/容器相关
docker ps 列出当前正在运行的容器
docker ps -a 列出所有在运行的容器
docker stop <容器名字> 停止一个容器
docker kill <容器名字> 强制停止一个容器
docker rm <容器名字> 删除一个容器
docker rm $(docker ps -a -q) 删除所有的容器
docker rmi <镜像名字> 删除一个镜像
docker rmi $(docker images -q) 删除所有镜像
分享镜像相关
docker login 登录cloud.docker.com
docker tag username/repository:tag 标记容器
docker push username/repository:tag 上传容器
docker run -p 4000:80 username/repository 运行远端的容器
但是,访问docker 的官网太慢了。
这就需要一个docker加速器了。
daocloud提供的加速器用起来很方便啊!!!!
什么事docker加速器呢,就是使用docker时,经常需要从官方拉取镜像,但是网络问题,操作很慢。
这样就出现了加速器,极大的提升了国内访问docker hub的速度。
配置方法。
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://c99cdc9f.m.daocloud.io
# systemctl restart docker
这节就写到这,更多的再后面再写。
阅读全文
1 0
- Docker学习笔记-Docker入门
- Docker学习笔记-Docker容器
- Docker学习笔记-Docker端口映射
- Docker学习笔记--Docker常用命令
- Docker学习笔记-Docker端口映射
- Docker学习笔记-Docker端口映射
- Docker学习笔记-Docker端口映射
- Docker 网络学习笔记
- docker学习笔记
- docker 学习笔记
- Docker学习笔记1
- openstack学习笔记----Docker
- Docker学习笔记
- Docker学习笔记(1)
- docker学习笔记1
- docker学习笔记
- Docker学习笔记之一
- docker 学习笔记1
- linux中与mysql兼容的数据库:mariadb
- 板端串口乱码,无数据
- 最短路径题目(Dijkstra)
- uboot之flash初始化
- git push error: 无法推送一些引用到XXX
- docker学习笔记
- java中连接池的几种方式
- redis 空格问题
- 初学欧拉图,知识总结,后续增加
- c# enum
- 从零认识tomcat,构建一机多实例tomcat集群
- hdu1172猜数字
- 进程通信——匿名管道实现和验证
- 异或交换数值