Docker

97 阅读4分钟

1 Docker简介

1.1 介绍

Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。

1.2 下载地址

Docker官网:www.docker.com

Docker中文网站:www.docker-cn.com

Docker Hub官网:hub.docker.com

2 Docker安装

2.1 Docker的基本组成

  • 镜像(image):是一个只读模板,用于创建docker容器,一个镜像可以创建多个容器
  • 容器(container):用镜像创建的运行实例,独立运行一个或者一组应用;可以看作是一个简易的Linux环境,可以被启动、开始、停止、删除,每个容器都是相互独立隔离的,保证安全的平台
  • 仓库(repository):集中存放镜像的场所,分为公开仓库和私有仓库

2.2 安装步骤

CentOS6.8安装Docker

安装的EPEL包:

yum install -y epel-release

安装docker:

yum install docker-io

配置文件位置:/etc/sysconfig/docker

启动docker:

service docker start

验证安装结果:

docker version

CentOS7.6安装docker

检查并移除旧版:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装必要的依赖库:

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  
sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker:

yum  -y  install docker-ce

启动:

sudo systemctl start docker
# 开机自启
sudo systemctl enable docker 
# 启动docker服务  
sudo systemctl start docker

测试:

docker run hello-world

配置阿里云镜像仓库:

编辑配置:

vim /etc/docker/daemon.json

添加如下内容(选择其中之一即可):

//阿里云
{ "registry-mirrors": ["https://esuhb4hb.mirror.aliyuncs.com"]}
//网易云
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }

保存文件,重启docker服务,依次执行下边的命令:

#刷新配置文件
sudo systemctl daemon-reload  
#重启docker
sudo systemctl restart docker

卸载:

systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker

2.3 底层原理

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

Docker利用的是宿主机的内核。新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免引寻、加载操作系统内核返个比较费时费资源的过程。

2.4 常用设置

开启远程访问

vim /usr/lib/systemd/system/docker.service
#修改配置
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
​
#加载docker守护线程
systemctl daemon-reload 
#重启docker
systemctl restart docker 

配置私有仓库地址

vim /etc/docker/daemon.json
#内容
{
  "insecure-registries":["192.168.66.169:5000","192.168.105.224:85"]
}
​
#加载docker守护线程
systemctl daemon-reload 
#重启docke
systemctl restart docker

3. Docker常用命令

3.1 帮助命令

docker version
docker info
docker --help

3.2 镜像命令

查看本地镜像:

#列出本地所有镜像
docker images 
#-a:列出本地所有的镜像 
#-q:只显示镜像id 
#--digests:显示镜像的摘要信息
#--no-trunc:显示镜像的完整信息

查找镜像:

docker search [OPTIONS] 镜像名字
#--no-trunc:显示完整镜像描述
#-s:列出收藏数不小于指定值的镜像
#--automated:只列出automated build类型的镜像

下载镜像:

docker pull 镜像名字

删除镜像:

#删除单个
docker rmi -f 镜像ID
#删除多个
docker rmi -f 镜像名1:tag 镜像名2:tag
#删除全部
docker rmi -f ${docker images -qa}

3.3 容器命令

新建并启动容器:

docker run [OPTIONS] IMAGE [COMMAND][ARG]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
​
#--name="容器新名字": 为容器指定一个名称;
#-d:后台运行容器,并返回容器ID,也即启动守护式容器;
#-i:以交互模式运行容器,通常与 -t 同时使用;
#-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
#-P:随机端口映射;
#-p:指定端口映射,有以下四种格式
      #ip:hostPort:containerPort
      #ip::containerPort
      #hostPort:containerPort
      #containerPort#启动交互式容器
#使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash 

列出当前所有正在运行的容器:

docker ps [OPTIONS] 
#OPTIONS说明(常用):
#-a:列出当前所有正在运行的容器+历史上运行过的
#-l:显示最近创建的容器
#-n:显示最近n个创建的容器
#-q:静默模式,只显示容器编号
#--no-trunc:不截断输出

退出容器:

#容器停止退出
exit
#容器不停止退出
ctrl+P+Q

启动容器:

docker start 容器ID或者容器名

重启容器:

docker restart 容器ID或者容器名

停止容器:

docker stop 容器ID或者容器名

强制停止容器:

docker kill 容器ID或者容器名

删除已停止的容器:

docker rm 容器ID
#一次性删除多个容器
docker rm -f ${docekr ps -a -q}
docker ps -a -q|xargs docker rm 

启动守护式容器:

#后台模式启动一个容器
docker run -d 容器名

查看容器日志:

docker logs -f -t --tail 容器ID
#-t:是加入时间戳
#-f:跟随最新的日志打印
#--tail:数字 显示最后多少条

查看容器内运行的进程:

docker top 容器ID

查看容器内部细节:

docker inspect 容器ID

进入正在运行的容器并以命令行交互:

docker exec -it 容器ID /bash/bash
#重新进入docker attach 容器ID#区别
#exec:在容器中打开新的终端,并且可以启动新的进程
#attach:直接进入容器启动命令的终端,不会启动新的进程

从容器内拷贝文件到主机上:

docker cp 容器ID:容器内路径 目的主机路径

提交容器副本:

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签]

实现本地镜像的导出、导入(export、import、save、load):

#使用 exportimport
docker export f299f501774c > hangger_server.tar
docker import - new_hangger_server < hangger_server.tar
#使用 save 和 load 
docker save 0fdf2b4c26d3 > hangge_server.tar
docker save -o images.tar postgres:9.6 mongo:3.4
docker load < hangge_server.tar

3.4 总结

# 当前 shell 下 attach 连接指定运行镜像
attach    Attach to a running container                
# 通过 Dockerfile 定制镜像
build     Build an image from a Dockerfile              
# 提交当前容器为新的镜像
commit    Create a new image from a container changes   
#从容器中拷贝指定文件或者目录到宿主机中
cp        Copy files/folders from the containers filesystem to the host path   
# 创建一个新的容器,同 run,但不启动容器
create    Create a new container                        
# 查看 docker 容器变化
diff      Inspect changes on a container's filesystem   
# 从 docker 服务获取容器实时事件
events    Get real time events from the server         
# 在已存在的容器上运行命令
exec      Run a command in an existing container        
# 导出容器的内容流作为一个 tar 归档文件[对应 import ]
export    Stream the contents of a container as a tar archive   
# 展示一个镜像形成历史
history   Show the history of an image                  
# 列出系统当前镜像
images    List images                                   
# 从tar包中的内容创建一个新的文件系统映像[对应export]
import    Create a new filesystem image from the contents of a tarball 
# 显示系统相关信息
info      Display system-wide information             
# 查看容器详细信息
inspect   Return low-level information on a container
# kill 指定 docker 容器
kill      Kill a running container                      
# 从一个 tar 包中加载一个镜像[对应 save]
load      Load an image from a tar archive              
# 注册或者登陆一个 docker 源服务器
login     Register or Login to the docker registry server 
# 从当前 Docker registry 退出
logout    Log out from a Docker registry server
# 输出当前容器日志信息
logs      Fetch the logs of a container                 
# 查看映射端口对应的容器内部源端口
port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    
# 暂停容器
pause     Pause all processes within a container        
# 列出容器列表
ps        List containers                               
# 从docker镜像源服务器拉取指定镜像或者库镜像
pull      Pull an image or a repository from the docker registry server   
# 推送指定镜像或者库镜像至docker源服务器
push      Push an image or a repository to the docker registry server    
# 重启运行的容器
restart   Restart a running container                   
# 移除一个或者多个容器
rm        Remove one or more containers                 
# 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
rmi       Remove one or more images             
# 创建一个新的容器并运行一个命令
run       Run a command in a new container              
# 保存一个镜像为一个 tar 包[对应 load]
save      Save an image to a tar archive                
# 在 docker hub 中搜索镜像
search    Search for an image on the Docker Hub         
# 启动容器
start     Start a stopped containers                    
# 停止容器
stop      Stop a running containers                     
# 给源中镜像打标签
tag       Tag an image into a repository                
# 查看容器中运行的进程信息
top       Lookup the running processes of a container   
# 取消暂停容器
unpause   Unpause a paused container                    
# 查看 docker 版本号
version   Show the docker version information           
# 截取容器停止时的退出状态值
wait      Block until a container stops, then print its exit code   

4 Docker容器

4.1 数据卷

数据卷是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

直接添加数据卷:

#添加数据卷命令
docker run -it -v /宿主机绝对路径目录:容器内目录 镜像名
#查看数据卷是否挂载成功
docker inspect 容器ID
#容器和宿主机之间数据共享

DockerFile添加数据卷:

VOLUME ["/宿主机绝对路径目录","/容器内目录"]

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

4.2 docker容器操作

docker容器安装ping apt-get update apt install inputils-ping apt-get install telnet

5 DockerFile解析

5.1 简介

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建步骤:①编写DockerFile文件;②docker build;③docker run

5.2 DockerFile构建过程解析

5.2.1 DockerFile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

5.2.2 Docker执行DockerFile的大致流程

  1. docker从就是镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行DockerFile中的下一条指令直到所有指令都执行完成

5.2.3 总结

  1. DockerFile

需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

  1. Docker镜像

在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

  1. Docker容器

容器是直接提供服务的。

5.3 DockerFile保留字指令

  • FORM:基础镜像,当前镜像是基于哪个镜像的
  • MAINTAINER:镜像维护者的姓名和邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露出的端口
  • WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像且add命令会自动处理URL和解压tar压缩包
  • COPY:类似add,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置COPY src dest COPY ["src","dest"]
  • VOLUME:容器数据卷,用于数据保存和数据持久化工作
  • CMD:指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
  • ENTRYPOINT:指定一个容器启动时要运行的命令
  • ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发