« 上一篇下一篇 »

如何通过Docker快速搭建各种测试环境,容器Docker环境搭建的简单方法

  Docker作为轻量级的基于容器的解决方案,它对系统侵入性低,容易移植,天生就适合做复杂业务部署和开发环境搭建。最近研究了一下docker容器,觉得是一个非常不错的工具,对于大家来说,一定会是一个好助手。

首先了解一下Docker是什么?

Docker是一个容器引擎,可以用来部署应用。通过 Docker,可以实现快速交付,测试和部署代码,可移植性强。

Docker主要包括3个基本概念: 镜像、容器、仓库

镜像:是用于创建 Docker 容器的模板,类似于我们装虚拟机的时候下载的windows或者linux系统镜像。

容器:是独立运行的一个或一组应用,是镜像运行时的实体,类似于我们在虚拟机软件上安装一个windows系统,那这个运行的系统就是一个容器。容器可以被创建、启动、停止、删除、暂停等。

仓库:是用来存储镜像的

怎么样安装Docker呢?

以centos系统为例:

{没有linux服务器的,可以在本机装一个虚拟机,装一个linux系统,或者购买一个阿里云或者腾讯云的服务器,初学使用的话,新用户买个低配置的一年才几十块钱}

使用以下命令来设置稳定的仓库。

1
2
3
$ sudo yum-config-manager \
 --add-repo \
 https://download.docker.com/linux/centos/docker-ce.repo

使用命令安装最新版本的 Docker Engine-Community 和 containerd:

1
sudo yum install docker-ce docker-ce-cli containerd.io

启动 Docker:

1
sudo systemctl start docker

通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。

1
sudo docker run hello-world

到此,Docker的环境安装就告一段落了,如果是其他的linux系统要安装Docker的话,可以参考菜鸟教程上的步骤。

接下来可以自己去动手操作一下,用Docker去搭建MySQL,Tomcat、Nginx以及其他环境,熟练一下docker的一些常用命令和操作,部分企业的环境部署也用到了Docker,做测试了解一下这方面的一些知识的话,也还是有好处的。Docker 提升和进阶的话 ,可以结合 Docker + Kubernetes(简称k8s)一起学习。

 

Nginx环境构建

我将构建过程放到Git中:https://gitee.com/andals/docker-nginx

Readme中记录了构建所需要执行的脚本命令,大家访问上面的网址就可以看到,这里我简单介绍下项目的结构:

├── Dockerfile        //创建镜像的Dockerfile
├── pkg               //编译好的二进制包,可以直接使用,此外软件运行的一些配置文件或第三方包也放在这里
│   ├── conf
│   │   ├── fastcgi.conf
│   │   ├── http.d
│   │   ├── include
│   │   ├── koi-utf
│   │   ├── koi-win
│   │   ├── logrotate.conf
│   │   ├── logrotate.d
│   │   ├── mime.types
│   │   ├── Nginx.conf
│   │   ├── scgi_params
│   │   ├── uwsgi_params
│   │   └── win-utf
│   ├── luajit-2.0.3.tar.gz
│   └── Nginx-1.8.1.tar.gz
├── README.md
├── script                //里面放构建脚本
│   ├── build_image.sh    //构建镜像使用
│   ├── build_pkg.sh      //编译软件包时使用
│   ├── init.sh           //容器启动时执行
│   └── pre_build.sh      //软件依赖的共享库,编译和构建时都会用到
└── src                   //编译时需要的软件源码
├── modules
│   ├── ngx_devel_kit-0.2.19.tgz
│   ├── ngx_echo-0.53.tgz
│   └── ngx_lua-0.9.7.tgz
├── Nginx-1.8.1.tar.gz
└── openssl-1.0.2h.tar.gz


DockerFile说明

Dockerfile结构如下:

FROM andals/CentOS:7
MAINTAINER ligang <ligang1109@aliyun.com>

LABEL name="Nginx Image"
LABEL vendor="Andals"

COPY pkg/ /build/pkg/
COPY script/ /build/script/

RUN /build/script/build_image.sh

CMD /build/script/init.sh


整个构建框架为:

  1. 把构建需要的包(PKG目录中)放到镜像中

  2. 把构建脚本放到镜像中

  3. 执行构建脚本

  4. 容器启动时,执行init.sh,里面启动相应的服务


Readme.md中记录了执行构建的命令和容器运行命令,示例运行如下:

ligang@vm-xUbuntu16 ~/devspace/dbuild $ git clone git@gitee.com:andals/docker-Nginx.git Nginx
Cloning into 'Nginx'...
......

ligang@vm-xUbuntu16 ~/devspace/dbuild $ cd Nginx/
ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ ngxVer=1.8.1
ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ docker build -t andals/Nginx:${ngxVer} ./
Sending build context to Docker daemon   30.7MB
Step 1/8 : FROM andals/CentOS:7
......
Successfully built ea8147743031
Successfully tagged andals/Nginx:1.8.1

ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ docker run -d --name=Nginx-${ngxVer} --volumes-from=data-home -v /data/Nginx:/data/Nginx --net=host andals/Nginx:${ngxVer}
dbf3c0617eb34c4b1b4ea54c2961989612d5474db3b1acd1d717221e6e5cb516


说明:

--volumes-from=data-home这个就是我放置代码的数据卷,我喜欢把代码放到$HOME下面,所以这个卷的相关信息如下:

ligang@vm-xUbuntu16 ~ $ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                   PORTS               NAMES
578912a08ea7        andals/CentOS:7          "echo Data Volumn Ho…"   9 days ago          Exited (0) 9 days ago                        data-home
......

ligang@vm-xUbuntu16 ~ $ docker inspect 578912a08ea7
......
    "Mounts": [
        {
            "Type": "bind",
            "Source": "/home",
            "Destination": "/home",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }
......


/data/Nginx中放置Nginx的conf、log等,每个软件运行时的conf、log、data等我都统一放置在/data下面,如:

ligang@vm-xUbuntu16 ~ $ tree -d /data/ -L 1
/data/
├── mariadb
├── Nginx
└── redis

ligang@vm-xUbuntu16 ~ $ tree -d /data/Nginx/
/data/Nginx/
├── conf
│   ├── http.d
│   ├── include
│   └── logrotate.d
└── logs


启动容器时使用--net=host,作为开发环境简单实用

我就是通过这种方法完成了开发环境的构建,不再有多余的重复工作,并且新机器部署开发环境效率极高。

我目前用到的容器环境如下:

ligang@vm-xUbuntu16 ~ $ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                   PORTS               NAMES
dbf3c0617eb3        andals/Nginx:1.8.1       "/bin/sh -c /build/s…"   33 minutes ago      Up 33 minutes                                Nginx-1.8.1
3e31ef433298        andals/php:7.1.9         "/bin/sh -c /build/s…"   8 hours ago         Up 8 hours                                   php-7.1.9
360f94bf9c43        andals/jekyll:latest     "/bin/sh -c /build/s…"   9 days ago          Up 10 hours                                  jekyll-latest
0a7d58d1ca5e        andals/redis:4.0.8       "/bin/sh -c /build/s…"   9 days ago          Up 10 hours                                  redis-4.0.8
fdaa655b4a11        andals/samba:4.4.16      "/bin/sh -c /build/s…"   9 days ago          Up 10 hours                                  samba-4.4.16
6ad00a69befd        andals/mariadb:10.2.14   "/bin/sh -c /build/s…"   9 days ago          Up 10 hours                                  mariadb-10.2.14
578912a08ea7        andals/CentOS:7          "echo Data Volumn Ho…"   9 days ago          Exited (0) 9 days ago                        data-home


辅助工具dockerbox

使用Docker环境后,有个问题,就是没有办法很方便的和软件交互。

这是因为软件都执行在容器中,比如重启Nginx吧,需要下面这几步:

  1. 找到Nginx这个容器

  2. 进入Nginx这个容器

  3. 在容器里面再执行reload


也可以是:

  1. 找到Nginx这个容器

  2. 使用docker exec


但无论哪种方式,都比原先直接执行命令麻烦的多。

另外,有时也需要进入容器中,查看服务的运行情况。

为了方便的做这些事情,我开发了一个工具dockerbox,可以很方便的做到这些事情。


配置开机运行

最后再说下如何配置开机启动。

我使用虚拟机搭建的开发环境,所以配置这个会省事好多,我使用用了systemd:

ligang@vm-xUbuntu16 ~ $ ll /lib/systemd/system/dstart.service
-rw-r--r-- 1 root root 229 4月   3 21:35 /lib/systemd/system/dstart.service

ligang@vm-xUbuntu16 ~ $ cat /lib/systemd/system/dstart.service
[Unit]
Description=Docker Container Starter
After=network.target docker.service
Requires=docker.service

[Service]
ExecStart=/usr/local/bin/dbox -dconfPath=/home/ligang/.dconf.json start all

[Install]
WantedBy=multi-user.target