Docker安装使用指引
-
引言
-
背景
-
公司,部门的服务器日渐增多,管理越来越复杂,测试服务器和调研投入成本越来越高各类环境隔离处理非常困难。
-
编写目的
指导质量管理部门技术相关同事学习掌握Docker,通过Docker解决环境隔离,降低环境搭建的时间和硬件成本,降低技术方案调研成本等目的。
-
使用对象
质量管理部技术相关同事
目标受众:
本文的预期受众是从事项目管理、软件开发、软件测试的软件工程师。要想按照本文中的步骤进行操作,您应该具备的技能有如下:
- Shell脚本开发
- Linux系统基础
-
Docker介绍
Docker 这个单词英文原意是码头工人,搬运工的意思,这个搬运工搬运的是各种应用的容器。
官方的说法是,Docker 是提供给开发者和系统管理员一个分布式应用的开放平台。在更多人的理解中,Docker 是一种把你的应用或者服务打包后放在容器中运行的技术。
Docker 可以说有三个关键点:构建,运输,运行。这三个词可以对应我上述提到的那句话,构建即为打包,既然是打包了,那么就需要可以方便地搬运到各个地方,为什么要搬运呢?归根到底,我们是要运行打包了的应用和服务。
Docker 存在的意图是让你把各种语言编写的程序应用以带有普适性的形式打包好,你只要拿到打包好的东西,可以忽略程序本身依赖的环境或者开发的语言,直接使用 Docker 便可以运行起来。在这个实际意义之上,最重要的是 Docker 提供了容器技术来隔离多个打包的应用或者服务之间的相互影响,同时由于打包的东西具有普适性,那么在应用规模的层面上也很便于扩展。
对于运维的管理人员,Docker 提供了一种可移植的标准化部署流程,对于开发者,Docker 提供了一种开发环境的管理方法。
Docker 可以帮助我们做到:
-
隔离应用的依赖和环境
-
创建容易分发的,即启即用的,便于复制的应用
-
允许我们的应用实例简单,快速地扩展
-
快速部署测试环境,测试应用后销毁
-
Docker安装及及使用
-
Docker的核心概念
-
-
镜像
按照Docker的规则,制作的应用。
镜像的大小不等于通过docker images 看到的每个镜像大小的合集,docker镜像采用了分层的机制。上层使用共同下层,各自不同部门构建各自的独立分层。
docker的镜像通过联合文件系统(union filesystem)将各层文件系统叠加在一起。
镜像的两个特性:
已有的分层镜像只能读不能改,上层镜像优先高于底层镜像。
-
容器
利用镜像所启动的就是容器,容器会启动预定义的进程与用户交付,对外提供服务
-
分层
每一个镜像都是一层一层叠加的,最多有128层
aufs最多支持128层。(用户可以通过commit基于容器分层的概念,创建新的镜像,但是最多不能超过128层,Dockerfile中每一条run增加一层)
查看镜像分了多少层:docke history xxx (--tree 查看详细内容)
-
仓库
镜像的存储地
-
Docker的安装
Docker在Windows,mac,Ubuntu,Centos6.5和Centos7+有不同的安装方式。
公司linux服务器基本使用的Centos,以下演示说明将以Centos进行操作和说明。
-
查看系统版本
1 2 |
[root@Sonar-104 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) |
-
安装docker
CentOS6
对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下
1 2 |
$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm $ sudo yum install docker-io |
CentOS7
CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:
1 |
$ sudo yum install docker |
安装之后启动 Docker 服务,并让它随系统启动自动加载。
1 2 |
$ sudo service docker start $ sudo chkconfig docker on |
Centos 6.5会因为内核问题无法启动docker并报错
1 2 |
WARN[0000] You are running linux kernel version 2.6.32-431.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0. |
解决办法:yum upgrade device-mapper-libs
查看docker进程是否启动:
1 |
ps -aux | grep docker |
-
Docker 常用命令
Docker 提供了很多命令来管理镜像和容器,我们可以使用 --help 来查看帮助详情,这里提及一些常用的。
-
docker version / Docker info 查看基本信息
-
docker exec -ti Container /bin/bash 连接到容器上运行bash
-
docker logs CONTAINER 查看日志,如run命令后的运行结果,Docker logs -f 查看实时的日志
-
docker kill 杀死Docker容器进程,你可以使用Docker kill $(Docker ps -aq)杀死所有的Docker进程,后者打印出所有的容器的容器id(包括正在运行的,和没有运行的)
-
docker rm CONTAINER 删除一个容器,记得要先停止正在运行的容器,再去删除它
-
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/容器外向容器内复制文件(也可以用挂载的形式哦)
-
docker commit -a "mike" -m "镜像的一些改动" CONTAINER 当你在容器内做了某种操作后,如增加了一个文件,你可以用这个命令把修改提交,重新打包为镜像
-
docker push 推送镜像
-
docker history IMAGES 查看镜像的修改历史
-
docker ps -a | grep "Exited" | awk '{print $1 }'| xargs Docker rm 删除exited的容器
-
docker rmi $(Docker images | awk '/^<none>/ {print $3}') 删除tag为NONE的容器
-
docker images 查看本地有哪些镜像可以使用的。
-
docker rmi <image name> 可以用来删除某个特定的镜像。
-
docker ps -a 可以用来查看所有的容器,包括运行中的和已经停止的。
-
docker restart/start/stop <container name> 启动或者停止某个容器。
-
docker logs 查看一个容器的日志。
-
Docker pull 拉取镜像
注意:docker run 是运行一个镜像,所以每一次跑都会创建一个新的容器,如果你并不是需要多个容器的话,使用 docker start/restart/stop/kill 来管理。
-
Docker进阶使用
-
容器间共享文件
Docker 的容器和外部环境是相对隔离的,并且容器是一次性的,运行结束后并不会有任何的持久化的文件或者数据。所以当我们需要做应用数据的持久化,或者保留应用的日志文件时,我们需要用到 Docker 提供的一些方法来把外部系统的目录映射到容器的目录,从而达到把我们需要的持久化数据存放在特定位置的目的。
对于 docker run 命令,我们可以使用 docker run -v [host-src]:[container-dest][:<options>] 来指定目录的映射。其中,host-src 是系统目录,container-dest 是要映射到的容器里的目录,options 是可选的配置选项,通常是权限配置,例如 ro 只读,或者 rw 可读可写等。
假设我们要把 /var/tmp 映射到容器中的 /var/tmp,我们可以这么做:
docker run -v /var/tmp:/var/tmp:rw -it ubuntu bash
更多的相关内容可以参考:mount volume
所以,你可以通过把一个系统目录映射到多个容器中去,通过这种方式在系统和多个容器中共享文件和目录。
Docker 可以运行一个容器,然后使用 --link 来连接到现有运行的一个容器中,去获取某些需要的数据或者文件
-
Dockerfile,创建一个自己的镜像
-
创建一个目录,然后新建一个 Dockerfile 文件,Docker 在创建镜像时要基于这个文件的配置,我们看下这个文件应该有哪些内容:
1 2 3 4 5 6 |
FROM: docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortune
CMD /usr/games/fortune -a | cowsay |
FROM 表示即将创建的镜像基于哪一个镜像来创建,假设你要创建一个 node 应用的镜像,那么你可能是 FROM: node:latest。
RUN 表示在创建镜像时,运行后边的命令来更新镜像的相关内容,很多情况下是用于安装你应用相关的依赖,所以 apt-get 用得很多。
CMD,表示容器运行镜像时默认执行的命令,当我们上边这个镜像创建后,使用 run 时,会在镜像加载好了之后在容器环境中运行 /user/games/fortune -a | cowsay。一个镜像只能有一个 CMD 配置,如果有多个,默认是使用最后一个。
写好 Dockerfile 文件之后,在该目录下运行 docker build -t docker-whale .。
-t 用于指定镜像的名称,通常我们会使用 <组织名>/<应用名> 来作为镜像名称,可以参考 Docker Hub 上现有的镜像。
接下来就可以看到 Docker 开始创建镜像,结束之后,如果没报错信息,那么你可以使用 docker images 查看到你刚才创建的镜像。
现在很多的项目都会带上 Dockerfile 文件,例如 docker-node 等,所以你可以尝试去了解这些项目的 Dockerfile 文件,看看是如何构建镜像的。
关于 Dockerfile 详细的说明可以参考官网文档:Dockerfile reference
由于Docker 特殊的文件分层以及容器创建的步骤,良好地编写 Dockerfile 可以让容器运行地更加高效。
-
Docker Compose
Docker提供一个容器编排工具可以把多个容器连接到一起统一管理的工具,Docker Compose,允许用户在一个模板(YAML)中定义一组相关联的应用容器,这组容器会根据模板中的"--link"等参数,对启动的优先级自动排序,简单的执行一条"docker-compose up",就可以把同一个服务中的多个容器依次创建和启动。
-
Docker Compose安装
Centos7
安装Docker-Compose之前,请先安装 python-pip
1.首先检查linux有没有安装python-pip包
1 2 |
# pip -V -bash: pip: command not found |
2.没有python-pip包就执行命令
1 |
# yum -y install epel-release |
3.执行成功之后,再次执行
1 |
# yum install python-pip |
4.对安装好的pip进行升级 pip install --upgrade pip
1 |
# pip install --upgrade pip |
5.至此,pip安装好了,执行pip -V 再次检查pip环境
1 2 |
# pip -V pip 9.0.1 from /usr/lib/python2.7/site-packages (python 2.7) |
安装Docker-Compose
1.终端执行:
1 |
#pip install docker-compose |
报错:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out
解决:pip --default-timeout=200 install -U docker-compose
2.检查docker-compose 安装:
1 2 |
# docker-compose -version docker-compose version 1.17.1, build 6d101fb |
-
Docker Compose使用
Docker Compose 常用命令:
-
执行新容器组:docker-compose up (后台运行 + "-d")
-
删除容器组:docker-compose down
-
查询容器组所有容器状态:docker-compose ps
-
停止容器组:docker-compose stop
-
启动容器组:docker-compose start
-
指定YAML配置文件:docker-compose -f xxx/docker-compose.yml up/down/ps/stop/start
注:默认配置文件名为docker-compose.yml,可以通过"-f"选项指定
可以看下官网提供的 Demo ,了解一下 Docker Compose 使用起来是怎么样的。
首先,我们需要创建一个 docker-compose.yml 文件,例如官网给出的 wordpress 例子:
1 2 3 4 5 6 |
version: '2' services: web: build: . command: php -S 0.0.0.0:8000 -t /code/wordpress/ ports: - "8000:8000" depends_on: - db volumes: - .:/code db: image: orchardup/mysql environment: MYSQL_DATABASE: wordpress |
一个 docker-compose.yml 大致的内容如上,一个主要的服务名称,然后便是这个这个服务对应的容器相关的配置,例如容器名称,构建的目录,端口映射,容器连接,对外的环境变量,目录映射,运行命令等。整个配置文件相对清晰易懂。
在这个文件中,可以编写多个服务的配置,然后在该目录下运行 docker-compose up 便可以运行这个文件配置的相关服务,而无须手动地一个个去启动需要的容器,同时,这个配置文件管理各个容器之间的关系也相对容易。更多详细内容请参考官方文档 compose file。
官方提供了很多例子来说明如何使用 Docker Compose 来构建需要多个容器配合的应用,例如 wordpress,django 等,通常我们要创建一个 Web 应用,是离不开数据库,缓存,web 系统本身等多个服务支撑,Docker Compose 可以帮助我们更好地使用多个容器来创建和管理复杂的系统。
-
配置docker 镜像加速
在Docker Hub官网上注册帐号,即可下载使用仓库里的全部的docker镜像。而因为网络原因,国内的开发者没办法流畅的下载镜像,经常会出现下载中断的错误。解决方法就是使用国内的容器Hub加速服务,本质就是更改pull优先级较高的服务器为国内的站点。
-
国内docker镜像加速站
-
系统环境
操作系统: CentOS 7
docker版本: 1.9.11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@vm-50-151 docker]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@vm-50-151 docker]# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-61.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.6
Built: Tue Oct 24 15:40:21 2017
OS/Arch: linux/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-61.git85d7426.el7.centos.x86_64
Go version: go1.8.3
Git commit: 85d7426/1.12.6
Built: Tue Oct 24 15:40:21 2017
OS/Arch: linux/amd64
-
DaoCloud加速
http://guide.daocloud.io/dcs/daocloud-9153151.html,DaoCloud现在是提供一个一键脚本配置registry-mirror,这尼玛有坑,配了后我就启动不了服务了。
测试后发现,是/etc/docker/daemon.json 文件李的json格式存在问题,直接手动修改
1
vi /etc/docker/daemon.json
修改后
1
2
3
4
5
6
7
[root@vm-50-151 docker]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"http://9aba2c9f.m.daocloud.io"
],
"insecure-registries": []
}
重启服务器
1
2
[root@vm-50-151 docker]# service docker restart
Redirecting to /bin/systemctl restart docker.service
搜索镜像
1
2
3
4
5
6
[root@vm-50-151 docker]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 5249 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 1628 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 367 [OK]
docker.io docker.io/percona Percona Server is a fork of the MySQL rela... 301 [OK]
经过使用测试:下载docker镜像时不再出现下载失败提示,粗略估计下载速度在200k/s左右,基本满足使用需求。
-
其他问题
-
-
降低docker-compose版本
通过docker-compose启动容器,报错:
1
ERROR: The Docker Engine version is less than the minimum required by Compose. Your current project requires a Docker Engine of version 1.10.0 or greater.
可以看出是因为,docker和docker-compose版本不一致导致的问题。
升级 Docker 过于麻烦,只能降 docker-compose 的版本。
先看一下我们已经安装的 Docker 版本:
升级 Docker 过于麻烦,只能降 docker-compose 的版本。
先看一下我们已经安装的 Docker 版本:
1
2
[root@Redmine-186 docker-compose]# docker -v
Docker version 1.7.1, build 786b29d/1.7.1
经查 Docker Compose Github Docs,发现 docker-compose 1.5.2 版本是兼容 Docker 1.7.1 的:Note that Compose 1.5.2 requires Docker 1.7.1 or later.。
好了,开始降级 docker-compose,先卸载:
1
# pip uninstall docker-compose
再安装指定版本:
1
# pip install docker-compose==1.5.2
至此,docker-compose 降版本成功!
-
docker-compose.yml 版本问题
解决完 docker-compse 版本问题适配之后,对着已有的 docker-compose.yml 执行",会提示不能正常识别 docker-compose.yml 文件中的内容。究其原因,是因为我们的 docker-compose 1.5.2 只支持 V1 版本的 docker-compose.yml ,那么好,把现在 V2 版本的 docker-compose.yml 改成 V1 版本的格式。
V1 版本的 docker-compose.yml 只被支持到 docker-compose 1.6.x。再往后的 docker-compose 版本就不再支持 V1 版本的 docker-compose.yml。
先看文档:Compose file versions and upgrading。
V1 版本的 docker-compose.yml 文件格式主要区别就是:
- 没有开头的 version 声明
- 没有 services 声明
- 不支持 depends_on
- 不支持命名的 volumes, networks, build arguments 声明
- 其他我没用到的所以没细究的区别