简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
1 Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
2 Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
3 Docker架构
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
4 快速开始
4.1 准备
Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
4.1.1 查看Centos版本
uname -r
4.1.2 升级软件包及内核(选做)
yum update
4.2 Docker 安装
4.2.1 安装
- 在线使用yum安装
yum install docker
- 离线一键安装
下载解压,如图:
上传三个文件至服务器指定目录,执行:./install.py 脚本即可安装成功。
脚本核心代码:
- 离线自定义下载安装
官网离线安装教程:Install Docker Engine from binaries | Docker Documentation
下载安装包地址:Index of linux/static/stable/x86_64/
选择一个比较新的版本就可以,这里我选择 docker-19.03.6.tgz,下载完成后,把压缩包上传离线服务器进行解压。
tar -zxvf docker-19.0.3.6.tgz
解压出docker目录,并将目录中的文件全部复制到/usr/bin/
目录下
cp docker/* /usr/bin/
此时已经可以使用dockerd &
命令启动docker服务器,但是为了后期更好的维护,我们要为docker服务器配置systemctl
指令。cd /etc/systemd/system 目录中,vim docker.service,给文件中添加如下内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
这样便可以使用systemctl start docker
命令启动docker服务器或者使用systemctl status docker
查看docker服务器运行状态了。
4.2.2 启动
systemctl start docker
4.2.3 停止
systemctl stop docker
4.2.4 重启
systemctl restart docker
4.3.5 开机自起
systemctl enable docker
4.3.6 查看是否安装成功
rpm -qa |grep docker
4.3.7 查看docker版本
docker -v
4.3 常用操作
4.3.1 镜像
4.3.1.1 检索
docker search
4.3.1.2 拉取
docker pull 镜像名:tag
:tag 是可选的
tag表示标签,多位软件的版本,默认是latest
4.3.1.3 列表
# 查看所有本地镜像
docker images
4.3.1.4 删除
# 删除指定的本地镜像
docker rmi images-id
4.3.2 容器
4.3.2.1 运行验证
docker run -d --name hello-world
--name 自定义容器名
-d 后台运行
images-name 指定镜像模板
4.3.2.2 列表
docker -ps
-a 查看所有容器
4.3.2.3 停止
docker stop container-id
4.3.2.4 启动
docker start container-id
4.3.2.5 删除
# 删除指定的容器
docker rm container-id
# 删除所有
docker rm $(docker ps -a -q)
4.3.2.6 端口映射
-p 6379:6379
docker run -d -p 6379:6379 --name myredis docker.io/redis
4.3.2.7 容器日志
docker logs -f container-id
4.3.2.7 进入选择的容器内部
docker exec -it container-id bash
4.3.2.8 创建一个容器
docker run -it -v /docker_test:/yufei --name yufei_6 centos
-i 允许我们对容器内的 (STDIN) 进行交互
-t 在新容器内指定一个伪终端或终端
-v 是挂在宿机目录, /docker_test是宿机目录,/yufei是当前docker容器的目录,宿机目录必须是绝对的。
--name 是给容器起一个名字,可省略,省略的话docker会随机产生一个名字
4.3.2.9 退出docker
exit
4.3.2.10 导出/导入容器
导出容器
docker export 容器ID > 文件名.tar
导入容器
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
4.3.2.11 容器继承
# test02容器继承test01容器
docker run -it --name test02 --volumes-from test01
4.3.3 存储
docker 容器数据持久化涉及三个概念:系统卷、数据卷、数据卷容器。在日常运用中,运行一个纯应用,如:web应用、tomcat等通常都不需要考虑存储问题,但是如果需要运行中间件和数据库服务,如:MySql 容器、Redis 缓存容器等。就需要考虑数据持久性,确保节点重启等后数据不会丢失。
4.3.3.1 系统卷
系统卷的位置可以通过 docker info 命令查看,不同操作系统的位置略有不同。系统卷的数据修改不会影响其他容器数据,且生命管理周期内始终有效,但系统卷随着容器的删除而消亡。CentOS7一般情况是在:/var/lib/docker/overlay2
4.3.3.2 数据卷
数据卷的创建有四种方式:
(1)指定服务器目录的 bind mount 方式
在创建容器时增加参数 “-v 服务器目录绝对路径:容器目录路径”,将服务器目录添加到容器指定目录。
(2)让系统自由发挥的 volume 方式
在 Docker 启动过程中,-v 后面只需指定容器内的目录加载路径,不需要具体指定服务器目录绝对路径。通过命令可以查看具体容器内容,可以看到 Docker 为容器数据卷分配的服务器目录绝对路径。
docker inspect 容器ID
(3)Dockerfile 管理的 volume 方式
(4)先单独创建数据卷,再挂载到容器内部的 volume 方式
数据卷CentOS7一般情况是在:/var/lib/docker/volumes
4.3.3.3 数据卷容器
在数据强一致性要求的集群模式中,通常需要保证多个应用节点共享存储资源。单独创建数据卷容器,由该容器完成与 Docker 与 Host 服务器指定目录的关联,所有和共享数据相关的容器都直接通过 --volumes -from 参数挂载到该数据卷容器。
4.3.3.4 修改默认存储地址
# 停止docker
systemctl stop docker
vim /etc/docker/daemon.json
{
"graph":"/home/docker"
}
# 复制到指定目录
cp -r /var/lib/docker /home
systemctl daemon-reload
systemctl restart docker
4.3.4 网络
Docker 容器的网络技术很多,常用技术有:Docker 默认网络、自定义网络、第三方网络。
其中 none 网络、host 网络、bridge 网络和自定义 bridge 网络重点实现了 Docker Host 服务器上的多容器互通;而 overlay 网络、macvlan 网络和 Flannel 网络、Weave 网络、Calico 网络多用于实现跨服务器的多容器通信。
4.3.4.1 默认网络
docker network ls
(1)none 网络
none 是一种 null driver 类型的网络,在 Docker 安装完成后,已经默认创建完成。可以在启动容器的时候选择 none 网络。
docker run -it --network=none centos
在容器内输入命令 ip address 查询可用的网卡信息。
(2)host 网络
想要让容器可以正常地和服务器、其他容器甚至外网进行互联,最简单的方式就是让容器和服务器采用通一套网络协议栈,host 网络模式就是这个思路的实现,它使得容器中的应用可以和直接在服务器内运行一样滴使用网络资源。
(3)bridge 网络
bridge 网络模式正是服务器上多容器并存问题的解决手段。它不是将整个服务器网络提供给容器内部,而是为容器生成一套新的地址段。容器地址段和服务器地址段之间采用桥连的方式进行通联。
可以通过 docker network inspect bridge 命令来查看bridge网络的具体情况
4.3.4.2 自定义网络
除 Docker 原生自带的三个网络技术外,还可以自定义创建其他网络。
(1)自定义 bridge 网络
采用 bridge 网络驱动创建自定义的网络,并指定相关的容器IP地址段。自定义的 bridge 和原始的 bridge 非常接近。其独有的好处是IP地址段可控,同时还可以实现多个桥接器的多租户分离功能。
如:原docker0无法被宿主机访问,添加自定义bridge网络
brctl show
## 如果显示无指令 则使用以下命令下载
yum install -y bridge-utils
# docker服务暂停
systemctl stop docker
# 添加网桥
brctl addbr br0
# 添加ip字段
ip addr add 172.17.0.1/24 dev br0
# 停止网桥docker0
ip link set dev docker0 down
# 启用网桥br0
ip link set dev br0 up
# 修改docker默认网桥
vim /etc/docker/daemon.json
{
"bridge":"br0"
}
# 重启docker
systemctl start docker
# 重新查看网桥
brctl show
# 删除docker0
brctl delbr docker0
(2)overlay 网络
采用 Docker 提供的 overlay 网络驱动,创建 overlay 网络。
(3)macvlan 网络
使用 liunx 和 Docker 共同提供的 macvlan 模块,把多个 Docker 服务器的网络 MAC 地址串联起来,实现链路层的网络互通,使得不同的 Docker 服务器上的容器可以很方便地进行沟通。
4.3.4.3 第三方网络
第三方网络有:Flanne 网络、Weave 网络、Calico 网络等。
4.4 离线环境获取Docker镜像
在线环境获取docker比较简单,如下面6小节安装Mysql。离线环境就比较麻烦,一般有两种方式:1)搭建本地docker仓库,从本地仓库中获取docker镜像,这种方式暂不详述。2)在可以访问外网的服务器上,下载docker镜像,通过镜像迁移的方式,使离线服务器获取docker镜像,以下使用这种方式进行操作。
5.1 在线环境获取镜像
docker pull nextcloud
5.2 查看获取的镜像
docker images
5.3 将nextcloud镜像保存成tar归档文件
docker save -o nextcloud.tar nextcloud
docker save : 将指定镜像保存成 tar 归档文件。 -o :输出到的文件。
5.4 加载nextcloud镜像
把nextcloud压缩包下载下来,在上传到离线环境服务器上加载镜像。
docker load -i nextcloud.tar
docker load : 加载指定的tar归档文件格式的镜像。-i :指定要读取的tar归档文件格式的镜像。
5.5 加载完成,查看镜像
docker images
5.6 运行容器
docker run -d --restart=always --name nextcloud -p 9201:80 -v /opt/data6/onlyoffice/nextcloud:/data nextcloud
# 离线加载onlyoffice命令:docker run -i -t -d --restart=always --name onlyoffice -p 9202:80 onlyoffice/documentserver
- docker run :启动一个容器
- -d:后台运行容器
- --restart=always docker 重启的时候容器也会重启 (可选)
- --name nextcloud 命名容器的 name 为 nextcloud,可以替代容器 id 使用
- -p 80:9201 将容器的 80 端口映射到服务器的 80 端口
- -v 网盘的存储地址 (可选,存储组件建议自定义,如:/opt/data:/data)
- nextcloud 要启动的镜像名称