Docker容器基础学习一

一、Docker容器介绍

1.1、Docker简介

1)Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。

2)Docker是使用Go语言编写的一个程序运行、测试、交付的开放平台,Docker被设计为能够使你快速地交付应用。在Docker中,你可以将你的程序分为不同的基础部分,对于每一个基础部分都可以当做一个应用程序来管理。Docker能够帮助你快速地测试、快速地编码、快速地交付,并且缩短你从编码到运行应用的周期。Docker使用轻量级的容器虚拟化平台,并且结合工作流和工具,来帮助你管理、部署你的应用程序。Docker在其核心,Docker实现了让几乎任何程序都可以在一个安全、隔离的容器中运行。安全和隔离可以使你可以同时在机器上运行多个容器。Docker容器轻量级的特性,意味着可以得到更多的硬件性能。

3)Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率

4)docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行。一次构建,处处运行

5)docker是一种软件的打包技术

6)docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。

7)docker镜像有自己的文件系统。

8)docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

1.2、Docker与传统虚拟化对比

image

1.3、Docker组件

image

1.3.1、镜像(Image)

Docker镜像是Docker容器运行时的只读模板,每一个镜像由一系列的层(layers)组成;Docker使用UnionFS(联合文件系统)来将这些层联合到一二镜像中,UnionFS文件系统允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。

正因为有了这些层(layers)的存在,Docker才会如此的轻量。当你改变了一个Docker镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。所以你不用重新发布整个镜像,只需要升级。层使得分发Docker镜像变得简单和快速。

每个镜像都是从一个基础的镜像开始的,比如ubuntu,一个基础的Ubuntu镜像,或者是Centos,一个基础的Centos镜像。你可以使用你自己的镜像作为新镜像的基础,例如你有一个基础的安装了Nginx的镜像,你可以使用该镜像来建立你的Web应用程序镜像。(Docker通常从Docker Hub获取基础镜像)

Docker镜像从这些基础的镜像创建,通过一种简单、具有描述性的步骤,我们称之为 指令(instructions)。每一个指令会在镜像中创建一个新的层,指令可以包含这些动作:
1)运行一个命令。
2)增加文件或者文件夹。
3)创建一个环境变量。
4)当运行容器的时候哪些程序会运行。
这些指令存储在Dockerfile文件中。当你需要建立镜像的时候,Docker可以从Dockerfile中读取这些指令并且运行,然后返回一个最终的镜像。

1.3.2、容器(Container)

一个Docker容器包含了一个操作系统、用户添加的文件和元数据(meta-data)。每个容器都是从镜像建立的,镜像告诉Docker容器内包含了什么,当容器启动时运行什么程序,还有许多配置数据。Docker镜像是只读的,当Docker运行一个从镜像建立的容器,它会在镜像顶部添加一个可读写的层,应用程序可以在这里运行

容器运行过程

# docker run -i -t ubuntu /bin/bash

1)这个容器从哪个镜像创建,这里是ubuntu,基础的Ubuntu镜像。
2)在容器中要运行的命令,这里是/bin/bash,在容器中运行Bash shell。

#那么运行这个命令之后在底层发生了什么呢?按照顺序,Docker做了这些事情:
1)拉取ubuntu镜像:Docker检查ubuntu镜像是否存在,如果在本地没有该镜像,Docker会从Docker Hub下载。如果镜像已经存在,Docker会使用它来创建新的容器。
2)创建新的容器:当Docker有了这个镜像之后,Docker会用它来创建一个新的容器。
3)分配文件系统并且挂载一个可读写的层:容器会在这个文件系统中创建,并且一个可读写的层被添加到镜像中。
4)分配网络/桥接接口:创建一个允许容器与本地主机通信的网络接口。
5)设置一个IP地址:从池中寻找一个可用的IP地址并且服加到容器上。
6)运行你指定的程序:运行指定的程序。
7)捕获并且提供应用输出:连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。

1.3.3、仓库(Repository)

Docker仓库是Docker镜像的存储仓库。可以推送镜像到Docker仓库中,然后在Docker客户端,可以从Docker仓库中搜索和拉取镜像。

1.3.4、网络

1.3.5、存储

1.4、Docker架构

1)Docker使用客户端-服务器(client-server)架构模式。
2)Docker 客户端会与Docker守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。
3)Docker 客户端和守护进程可以运行在同一个系统上,当然也可以使用Docker客户端去连接一个远程的 Docker 守护进程。
4)Docker 客户端和守护进程之间通过socket或者RESTful API进行通信。

二、Docker安装部署

1)添加yum源

[root@docker01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2)添加docker源

[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo

3)yum安装docker

[root@docker01 ~]# yum install docker-ce -y
[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:28:55 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? #还没启动运行

4)启动docker

[root@docker01 ~]#systemctl start docker
[root@docker01 ~]#systemctl enable docker
[root@docker01 ~]#docker version 
[root@docker01 ~]#docker info

5)docker目录结构

[root@docker01 ~]#ll /var/lib/docker
drwx------ 2 root root 24 Nov 24 22:00 builder
drwx--x--x 4 root root 92 Nov 24 22:00 buildkit
drwx------ 2 root root  6 Nov 24 22:00 containers
drwx------ 3 root root 22 Nov 24 22:00 image
drwxr-x--- 3 root root 19 Nov 24 22:00 network
drwx------ 3 root root 40 Nov 24 22:00 overlay2
drwx------ 4 root root 32 Nov 24 22:00 plugins
drwx------ 2 root root  6 Nov 24 22:00 runtimes
drwx------ 2 root root  6 Nov 24 22:00 swarm
drwx------ 2 root root  6 Nov 24 22:00 tmp
drwx------ 2 root root  6 Nov 24 22:00 trust
drwx------ 2 root root 25 Nov 24 22:00 volumes

三、镜像加速配置

[root@docker01 ~]#vim /etc/docker/daemon.json  #默认文件不存在
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

#重启docker
[root@docker01 ~]#systemctl restart docker 

四、运行第一个容器(nginx)

[root@docker01 ~]#docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally #首先查看本地是否有镜像
latest: Pulling from library/nginx
000eee12ec04: Pull complete 
eb22865337de: Pull complete 
bee5d581ef8b: Pull complete 
Digest: sha256:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
Status: Downloaded newer image for nginx:latest #不加标签默认拉取最新的镜像
dbce70a5d8a04dbce900a8c48d0b0365127786fa8d8a4f599675fd098204836b
[root@docker01 ~]#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              231d40e811cd        2 days ago          126MB
[root@docker01 ~]#docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
dbce70a5d8a0        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   crazy_panini
[root@docker01 ~]#ps -ef|grep docker
root      11184      1  1 22:16 ?        00:00:08 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      11725  11184  0 22:23 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
root      11731  10128  0 22:23 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/dbce70a5d8a04dbce900a8c48d0b0365127786fa8d8a4f599675fd098204836b -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
image
posted @ 2019-11-25 10:21  运维人在路上  阅读(987)  评论(0编辑  收藏  举报