作者:cao.dingzheng; cai.ruiying [ZSK]
1 初识Docker
1.1 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口,它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就像在真实的物理机上运行一样。这样一来,就不用担心环境问题。
1.2 为什么使用它?
为什么要使用Docker呢?我们来看看它的几大优势。第一,快速交付和部署,解决环境配置难题;第二,高效虚拟化,内核级的虚拟化,使得它占用资源少、启动快、体积小,能够带来更高的性能和使用效率;第三,灵活应用,它几乎可以在任意的平台上运行,包括物理机、虚拟机、云服务器等,因此它的迁移、扩展更轻松;第四,简单易用,它的修改以增量的方式被分发和更新,从而实现自动化并且高效的管理。
下面我们对比一下Docker与常用的Linux虚拟机的关键点,就可以一目了然的了解到Docker的优势。
1.3 Docker VS VM
VM(Virtual Machine,虚拟机)是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。
Docker只包含应用程序以及依赖库,基于libcontainer运行在宿主机上(libcontainer 是Docker中用于容器管理的包),并处于隔离环境,因此Docker更加轻量高效,
至此,我们可以了解到,我们可以把Docker当作轻量级的虚拟机,它同样能够能够提供虚拟化的环境,但是成本却小得多,一台主机上可以同时运行数千个 Docker 容器。 当然,它目前仍然存在不足,例如:隔离效果不如VM;网络配置功能相对简单,主要以桥接方式为主等。通过这些了解,我们可以根据自己的需要,选择使用。
2 安装与使用
(备注:本文以CentOS为例。)
2.1 安装
Docker支持CentOS及以上64位版本,我们根据自己Linux机器的具体版本,来选择安装。
(1) 查看Linux版本
命令:uname -r
解析:
(2) 查询可安装版本
命令:yum list docker-ce --showduplicates | sort -r
(3) 安装
命令:yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io
例如:yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
注意:这里的版本,要从我们刚才查询到的列表中选择。
2.2 使用
(1) 启动
命令:systemctl start docker
(2) 验证
命令:docker --help,或者:docker run hello-world
(3) 在容器内运行一个应用程序
命令:docker run ubuntu:15.10 /bin/echo "Hello world"
解析:
ubuntu:15.10 格式是docker镜像名称:tag标签,指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
运行效果如下:
2.3 运行交互式容器
2.3.1 前台模式
命令:docker run -i -t ubuntu:15.10 /bin/bash
参数解释:
-i: 交互式操作。
-t: 终端
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
2.3.2 后台模式
(1) 启动
命令:docker run -it -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
参数解释:
-d:后台运行
在输出中,我们没有看到期望的 "hello world",而是一串长字符:0ecf61b8208b8d87bce7f6472e4c934b3001ec825457a2c43221dd84ec38fb58
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以查看进行:docker ps
解析:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
NAMES: 自动分配的容器名称。
容器状态如下:
(2) 查看运行日志
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
命令:docker logs ID号 或者docker logs 容器名称(NAMES)
(3) 停止容器运行
命令:docker kill ID号/容器名称(NAMES)或者docker stop ID号/容器名称(NAMES)
2.4 常用命令
2.4.1 查看所有的容器
命令:docker ps -a
2.4.2 启动已停止的容器
命令:docker start ID号 或者docker start 容器名称(NAMES)或者docker restart ID号/容器名称(NAMES)来进行重启(已有容器)
2.4.3 后台启动容器
后台启动容器命令:docker run -itd --name centos7-test centos:centos7 /bin/bash
参数解释:
--name:为启动的容器命名
在使用 -d 参数时,容器启动后会后台运行。
2.4.4 进入后台运行的容器
(1) 进入后台运行的容器:docker attach ID号或者names
说明:退出容器终端会导致容器停止。
(2) 进入后台运行的容器:docker exec -it ID号或者names /bin/bash
说明:推荐大家使用 docker exec 命令,此命令进入容器后,退出容器终端时,不会导致容器的停止。
2.4.5 退出容器
命令:exit
2.4.6 导出容器/镜像
(1) 导出容器:docker export ID号或者names > 导出路径
如:docker export 1e560fca3906 > ubuntu.tar
docker export ubuntu-test > /home/qc/cdz/docker/ubuntu.tar
(2) 导出镜像:
docker save image > 路径
如:docker save cdz/centos7.v2 > /home/qc/cdz/docker/centos/centos7.v2.tar
2.4.7 导入镜像
命令:cat /home/qc/cdz/docker/centos7.tar | docker import – cdz/ centos7.v1: centos7
可以通过docker images查看镜像库
2.4.8 删除容器
命令:docker rm -f ID号或者names
2.4.9 删除镜像
命令:docker image rm -f IMAGE ID 或者RESPOSITORY:TAG
3 实战演示-docker部署LuckyFrame服务端
3.1 docker安装centOS
访问 CentOS 镜像库地址:
https://hub.docker.com/_/centos?tab=tags&page=1
拉取指定版本的centOS镜像:docker pull centos:centos7
运行容器:docker run -itd --name centos-test centos:centos7
3.2 docker安装MySQL
访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags
运行MySQL:
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31
参数说明:
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
3.3 docker安装Python
访问 Python 镜像库地址:
https://hub.docker.com/_/python?tab=tags&page=5
运行Python:
docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py
参数解释:
-v $PWD/myapp:/usr/src/myapp: 将主机中当前目录下的 myapp 挂载到容器的 /usr/src/myapp。
-w /usr/src/myapp: 指定容器的 /usr/src/myapp 目录为工作目录。
python helloworld.py: 使用容器的 python 命令来执行工作目录中的 helloworld.py 文件。
3.4 将本地文件拷贝到docker容器中
命令:docker cp 拷贝文件 容器id/names:拷贝到的容器目录
如:
3.5 防火墙配置
直接pull下载的centos7镜像存在防火墙未关闭无法访问的问题,这里提供解决方法。
首先运行centos7镜像后进入容器。
然后下载firewalld systemd:yum install firewalld systemd -y
查看放火墙状态:systemctl status firewalld
彻底关闭防火墙,两个命令均需执行:
systemctl disable firewalld.service
systemctl stop firewalld
最后将运行的容器导出为tar包再导入到imags里,这时防火墙问题已经解决了。
3.6 构建LuckyFrame平台服务端镜像
3.6.1 创建Dockerfile
(备注:这里LuckyFrame平台服务端运行需要java环境)
首先将jdk的压缩包jdk-8u261-linux-x64.tar.gz、luckyframe的Web端LuckyFrameWeb.jar放到同一路径下,在该路径下建一个Dockerfile文件。
如:
# 拉取基本镜像 FROM cdz/centos7.v2:centos7 # 维护者信息 MAINTAINER caodingzheng # 加载jdk安装包 ADD jdk-8u261-linux-x64.tar.gz /usr/local # 环境变量设置 ENV JAVA_HOME /usr/local/jdk1.8.0_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin # 设置语言 ENV LANG="en_US.UTF-8" # 导入jar包 ADD LuckyFrameWeb.jar /LuckyFrameWeb.jar # 执行jar包 ENTRYPOINT ["java","-jar","/LuckyFrameWeb.jar"]
说明:
这里不需要设置对外端口
LuckyFrameWeb.jar已经是配置好的,包括数据库和端口,配置的端口号为8018。
3.6.2 构建镜像
使用docker build创建镜像,命令为:
docker build -f Dockerfile -t 镜像名称:tag标签 .
如:docker build -f luckyframeDockerfile -t luckyframe3.2:centos7 .
注意:最后的“.”不要遗漏,这里表示当前路径。
3.7 创建容器(运行LuckyFrame服务端)
命令:docker run -itd --name luckyframe -p 8018:8018 luckyframe3.2:centos7 /bin/bash
这样我们的LuckyFrameWeb.jar包就启动好了,我们可以通过设置的端口进行访问。
访问地址:http://ip:port/login
4 常见问题
4.1 安装报错
问题:
Package: 3:docker-ce-18.09.9-3.el7.x86_64 (docker-ce-stable) Requires: container-selinux >= 2.9
原因:
container-selinux版本低或者是没安装。yum 安装container-selinux 一般的yum源又找不到这个包。需要安装epel源才能yum安装container-selinux。
解决方法:
直接用yum安装container-selinux可能会报错,可以进行如下步骤:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release
yum install container-selinux
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
这时docker镜像就完成了安装。
4.2 直接pull下载的centos7镜像存在防火墙未关闭无法访问
解决方法:
首先运行centos7镜像后进入容器。
然后下载firewalld systemd:yum install firewalld systemd -y
查看放火墙状态:systemctl status firewalld
彻底关闭防火墙,两个命令均需执行:
systemctl disable firewalld.service
systemctl stop firewalld
最后将运行的容器导出为tar包再导入到imags里,这时防火墙问题已经解决了。