docker入门

时间:2022-07-26
本文章向大家介绍docker入门,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在LXC的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机 一样简单。

Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。 镜像:Docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。 容器:使用镜像常见的应用或者系统,我们称之为一个容器。 仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。

docker引擎架构

docker引擎是一个C/S结构的应用

server是一个常驻进程,REST API实现了client和server间的交互协议,CLI实现容器和镜像的管理,为用户提供统一的操作界面。client通过接口与server进程通信实现容器的构建、运行和发布。

安装docker

确保centos系统内核版本高于3.10

[root@localhost ~]# uname -r
3.10.0-514.el7.x86_64

安装依赖包

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

添加docker软件源

yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo

更新YUM缓存

[root@localhost ~]# yum makecache fast

安装docker ce

[root@localhost ~]# yum -y install docker-ce

设置默认国内镜像仓库

[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

启动docker

[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker

查看版本

[root@localhost ~]# docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:22 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:19:08 2018
  OS/Arch:          linux/amd64
  Experimental:     false

 docker镜像管理

镜像不是一个单一的文件,而是由多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

镜像的工作原理:

当我们启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID为目录下,我们可以使用chroot进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据将会删除,只读镜像不变。

镜像从哪里来?

Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 地址:https://hub.docker.com/explore 配置镜像加速器:https://www.daocloud.io/mirror curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

镜像常用命令

ls    列出镜像
build  构建镜像来自dockerfile
history 查看镜像历史 
inspect 显示一个或多个镜像详细信息
pull    从镜像仓库拉取镜像
push    推送一个镜像到镜像仓库
rm     移除镜像
prune    移除未使用的镜像,没有被标记或被任何容器引用的。
tag    创建一个引用源镜像标记目标镜像
export  导出容器文件系统到tar归档文件
import  导入容器文件系统tar归档文件创建镜像
save    保存一个或多个镜像到tar归档文件
load    加载镜像来自tar归档或标准输出

从docker仓库搜索镜像

[root@localhost ~]# docker search nginx

获取镜像

[root@localhost ~]# docker pull nginx

查看镜像

[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              62f816a209e6        13 days ago         109MB

查看镜像的历史分层

[root@localhost ~]# docker  history nginx

导出一个镜像

[root@localhost ~]# docker image save nginx > nginx.tar

导入一个镜像

[root@localhost ~]# docker load < nginx.tar

删除镜像

[root@localhost ~]# docker image rm nginx

创建镜像的方法有以下3种方式: (1)基于已有镜像的容器创建 (2)基于本地模板导入 (3)基于Dockerfile创建

容器管理

Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。 基于每个镜像的json文件,Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。

当使用docker run来创建并启动容器时,Docker在后台运行的标准操作: (1)检查本地是否存在指定的镜像centos,不存在就从公有仓库下载 (2)利用镜像创建并启动一个容器 (3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 (4)从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去 (5)从地址池配置一个IP地址给容器 (6)执行用户指定的应用程序 (7)执行完毕后,容器被终止

创建容器常用选项

选项            描述
-i, –interactive    交互式
-t, –tty         分配一个伪终端
-d, –detach       运行容器到后台
-e, –env         设置环境变量
-p, –publish list    发布容器端口到主机
-P, –publish-all    发布容器所有EXPOSE的端口到宿主机随机端口
–name string      指定容器名称
-h, –hostname     设置容器主机名
–ip string       指定容器IP,只能用于自定义网络
–network        连接容器到一个网络
–mount mount      将文件系统附加到容器
-v, –volume list   绑定挂载一个卷
–restart string   容器退出时重启策略,默认no,可选值:[always|on-failure]

管理容器的常用命令

选项          描述
ls          列出容器
inspect      查看一个或多个容器详细信息
exec        在运行容器中执行命令
commit      创建一个新镜像来自一个容器
cp        拷贝文件/文件夹到一个容器
logs        获取一个容器日志
port        列出或指定容器端口映射
top        显示一个容器运行的进程
stats      显示容器资源使用统计
stop/start    停止/启动一个或多个容器
rm        删除一个或多个容器

创建容器

[root@localhost ~]# docker create -it nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
f17d81b4b692: Pull complete 
82dca86e04c3: Pull complete 
046ccb106982: Pull complete 
Digest: sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341
Status: Downloaded newer image for nginx:latest
f51d7ef037f53073825efda4ad76d99a3041328c2569ccf337388c72f2f2bd4a
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f51d7ef037f5        nginx               "nginx -g 'daemon of…"   8 seconds ago       Created                                 competent_kalam
[root@localhost ~]# docker start f51d7ef037f5  #启动容器
f51d7ef037f5
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
f51d7ef037f5        nginx               "nginx -g 'daemon of…"   About a minute ago   Up 3 seconds        80/tcp              competent_kalam

进入容器

[root@localhost ~]# docker exec -it f51d7ef037f5 /bin/bash

删除容器

[root@localhost ~]# docker rm f51d7ef037f5

 端口映射

[root@localhost ~]# docker run -d -p 80:80 --name=nginx -h nginx_web nginx

查看容器日志

[root@localhost ~]# docker logs nginx

容器资源限制

选项                  描述
-m,–memory           容器可以使用的最大内存量
–memory-swap          允许交换到磁盘的内存量
–memory-swappiness=<0-100>  容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable       禁用OOM Killer
-cpus              可以使用的CPU数量
–cpuset-cpus          限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares           CPU共享(相对权重)