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):
#使用 export 和 import
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的大致流程
- docker从就是镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行DockerFile中的下一条指令直到所有指令都执行完成
5.2.3 总结
- DockerFile
需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
- Docker镜像
在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
- Docker容器
容器是直接提供服务的。
5.3 DockerFile保留字指令
- FORM:基础镜像,当前镜像是基于哪个镜像的
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露出的端口
- WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且add命令会自动处理URL和解压tar压缩包
- COPY:类似add,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
COPY src destCOPY ["src","dest"] - VOLUME:容器数据卷,用于数据保存和数据持久化工作
- CMD:指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
- ENTRYPOINT:指定一个容器启动时要运行的命令
- ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发