Docker入门

33 篇文章 1 订阅

什么是Docker

首先来介绍一下什么是Docker,Docker是早于2013年发布的开源项目,它借助操作系统的虚拟化技术来实现应用间的资源隔离,从而应用能更加快速方便地打包和部署在任何地方。根据官网描述,Docker是一个借助容器进行开发,部署和运行应用的工具,通俗来说,Docker容器好比一个集装箱一样,里面存放了应用所需要的文件和依赖,这种把应用标准化的过程被叫做为“容器化”。

Docker适合做什么

对于开发人员来说,容器技术为应用的部署提供了沙盒环境,开发者可以在独立的容器运行和管理应用程序进程,Docker提供的抽象层使得开发人员之间可以保持开发环境相对的一致,因此Docker适合用于应用隔离,搭建沙箱环境,此外,由于Docker容器的轻量化,它也被适用于进行持续集成和持续部署。

Container VS VM

 

人们经常用虚拟机和容器来做比较,那么它们两之间有什么区别呢?其实它们最核心的区别在于虚拟化资源的层面不一样,虚拟机是在硬件层之上实现虚拟化的,而容器则直接在操作系统之上实现虚拟化,从图中可以看出,每个虚拟机都需要在一个Guest OS之上,而容器则可以都处在同一个宿主机之上。

因为容器没有虚拟机造成的额外损耗,所以与虚拟机对比,容器不仅运行效率更高,而且部署速度也更快。

 

Docker Engine

Docker Engine是用于运行和编排容器的基础设施工具,我们平时说到的Docker大多数指的是Docker Engine,也就是在命令行和Docker进行交互的时候打交道的后台进程。

这是Docker Engine目前的架构,Docker客户端通过REST API与Docker Daemon来进行交互,Daemon把命令下发给containerd,containerd负责容器的生命周期管理以及镜像管理等,而runc负责创建容器。

Docker首次发布时,Docker Engine由两个核心组件构成:LXC和Docker Daemon。Docker Daemon是单一的二进制文件,包含诸如 Docker客户端、Docker API、容器运行时、镜像构建等。LXC提供了对Namespace(资源隔离)和CGroup(资源限制)等基础工具的操作能力,它们是基于Linux内核的容器虚拟化技术。

安装Docker

安装好Docker后,可以执行两条命令查看Docker环境以及版本信息:

  • docker version
  • docker info

Docker镜像

如果说Docker容器本质上是一个运行的进程以及它需要的一些依赖,而Docker镜像则是定义容器的一个"模版",容器则是镜像运行的一个实例。镜像是一个打包好的文件,里面包含了应用程序运行所需的所有库、配置和依赖。

Docker镜像结构

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。以Dockerfile为例,每一行指令都产生一个新层。

镜像由一个或多个只读的镜像层构建而成,每个镜像层拥有独立的哈希值,Docker在拉取或推送镜像时,会判断哪几层在本地或远端已存在,避免不必要的操作。

Docker镜像命令

我们可以通过下面这些命令进行一些Docker镜像相关的基本操作。

1. 创建镜像

基于已有镜像的容器创建,主要使用docker commit命令创建,命令格式为

docker commit [OPTIONS] CONTAINER [RESPOSITORY[:TAG]]

主要选项包括

-a , --author="": 作者信息
-c , --change=[]: 提交时候执行的Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
-m, --message="": 提交消息
-p, --pause=true: 提交时暂停容器运行

示例如下,在python镜像基础上添加pipenv,创建新镜像

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
7302b6369fd7        python              "/bin/bash"         About a minute ago   Up About a minute                       pensive_brahmagupta
➜  ~ docker commit -m "add pipenv and requests-html" -a "colin" 7302b6369fd7 colin/python:pipenv

➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
colin/python        pipenv              46694127f275        5 seconds ago       999MB

2.搜索镜像

docker search xxx    # xxx是关键词

3.打标签

docker tag centos my_tag

4. 存出和载入镜像

可以使用docker save和docker load命令来存出和载入镜像。

  • 存出镜像
例如存出上文新生成的python镜像,使用如下命令即可
➜  ~ docker save -o python_pipenv.tar colin/python:pipenv

之后就可以通过复制镜像文件分享了。

  • 载入镜像
docker  load  --input  python_pipenv.tar
或
docker load < python_pipenv.tar

导入成功后就可以通过docker images命令查看

5.删除镜像

docker rmi centos
 

Docker容器

容器是镜像的一个运行的实例,用户可以从单个镜像上启动一个或多个容器。

 

Docker容器的生命周期

容器在创建时进入Created状态,运行后进入Running状态,接着会进入到Pause状态或Exited状态,对已经退出的容器执行重启操作会使容器进入Restarting状态,随后转为Running状态。

Docker容器操作

1.创建容器

docker run -it centos bash

这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl+d 退出该bash,当退出后这个容器也会停止。

2.启动,停止,重启容器

docker start | stop | restart  container_id | container_name

 3.查看容器

docker ps

默认只输出正在运行的容器,要查看所有容器需要增加-a参数

4.运行容器常用参数(docker run)

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name nginx-lb : 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--link : 添加链接到另一个容器;
-p: 映射容器端口到宿主机
-v : 挂载本地目录到容器内部
--restart : 标志会检查容器的退出代码,并据此来决定是否要重启容器,默认是不会重启
- always:无论容器的退出代码是什么,Docker都会自动重启该容器
- on-failure:只有当容器的退出代码为非0值的时候才会自动重启。另外,该参数还接受一个可选的重启次数参数,`--restart=on-fialure:5`表示当容器退出代码为非0时,Docker会尝试自动重启该容器,最多5次。

5.容器查看日志

docker logs  container_id
docker logs -f container_id        # 持续打印
docker logs -f --tail 10 container_id    # 持续打印最后10行

6.进入容器

docker attach container_id

但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了

7.打开虚拟终端进入容器

# 进入一个后台正在运行的容器
docker exec -it container_id  bash

与attach不同的是退出后容器依然运行。

8.删除容器

docker rm  container_id

默认运行着的容器不会删除,要删除运行着的容器需要加-f参数

9.导出容器到容器文件包

docker  export  container_id  > file.tar

10、从容器文件包导入

cat file.tar |docker import - bin_test # 这样会生成bin_test的镜像

docker save 和docker export的区别

  • docker save保存的是镜像(image),docker export保存的是容器(container);
  • docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
  • docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

常用命令

docker pull ${CONTAINER NAME}                    #拉取镜像
docker images                                    #查看本地所有镜像
docker ps                                        #查看所有正在运行的容器,加-q返回id
docker ps -a                                     #查看所有容器,加-q返回id
docker rmi ${IMAGE NAME/ID}                      #删除镜像
docker rm ${CONTAINER NAME/ID}                   #删除容器
docker save ${IMAGE NAME} > ${FILE NAME}.tar     #将镜像保存成文件
docker load < ${FILE NAME}.tar                   #从文件加载镜像
docker start ${CONTAINER NAME/ID}                #运行一个以前运行过的容器
docker stop ${CONTAINER NAME/ID}                 #停止一个正在运行的容器
docker logs ${CONTAINER NAME/ID}                 #显示运行容器的日志
docker run...                                    #运行一个容器
    --name ${container name}                          #设置容器名称
    -p ${host port}:${container port}                 #映射主机和容器内的端口
    -e ${env name}=${env value}                       #添加环境变量
    -d                                                #后台运行
    -v ${host folder path}:${container folder path}   #将主机目录挂在到容器内

高级命令

# Advance use 
docker ps -f "status=exited"                                   #显示所有退出的容器
docker ps -a -q                                                #显示所有容器id
docker ps -f "status=exited" -q                                #显示所有退出容器的id
docker restart $(docker ps -q)                                 #重启所有正在运行的容器
docker stop $(docker ps -a -q)                                 #停止所有容器
docker rm $(docker ps -a -q)                                   #删除所有容器
docker rm $(docker ps -f "status=exited" -q)                   #删除所有退出的容器
docker rm $(docker stop $(docker ps -a -q))                    #停止并删除所有容器
docker start $(docker ps -a -q)                                #启动所有容器
docker rmi $(docker images -a -q)                              #删除所有镜像
docker exec -it ${CONTAINER NAME/ID} /bin/bash                 #进入容器内
docker exec -it ${CONTAINER NAME/ID} ping ${CONTAINER NAME/ID} #一个容器ping另外一个容器
docker top ${CONTAINER NAME/ID}                                #显示一个容器的top信息
docker stats                                                   #显示容器统计信息(正在运行)
    docker stats -a                                            #显示所有容器的统计信息(包括没有运行的)
    docker stats -a --no-stream                                #显示所有容器的统计信息(包括没有运行的) ,只显示一次
    docker stats --no-stream | sort -k8 -h                     #统计容器信息并以使用流量作为倒序
docker system 
      docker system df           #显示硬盘占用
      docker system events       #显示容器的实时事件
      docker system info         #显示系统信息
      docker system prune        #清理文件

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值