Docker新手入门实战教程 | 张戈博客

  • 时间:
  • 浏览:4

一、实践背景

为了学习Docker,当当我们先结合实际需求,设计另二个 二个 场景case:假设有二个 另一方网站,想使用Nginx反向代理方案,不不可不能不能在国内外快速搭建多个类似于于CDN的节点,提供集群式的WEB访问服务。

帮我要到的方案如下:

  • 常规部署方案:    购买云主机->环境初始化->部署Nginx->配置反向代理->DNS解析
  • Docker部署方案:购买云主机->yum 安装docker->拉取自定义镜像并执行->DNS解析
  • 腾讯云容器方案: 腾讯云容器服务->创建服务->DNS解析

很明显,使用Docker部署方案,整个过程会变得简单快捷,也更易自动化。当然,若删剪后要对IDC有特殊要求一段话,腾讯云的容器服务当选为最佳方案。

下面简单记录下我从Docker镜像的创建、上传到部署的实践过程。

实验环境:

  • 腾讯云:CentOS Linux release 7.2.1511 (Core)
  • 阿里云:CentOS Linux release 7.2.1511 (Core)
  • Docker version 1.12.6, build 88a4867/1.12.6
  • Docker 镜像版本:Centos 官方最新版
  • Nginx 版本:Tengine 2.2.0
  • 但会 略..

二、制作镜像

1、安装配置Docker

# 安装docker
yum install -y docker

# 配置腾讯云镜像加速(官方的龟速)
vim /etc/sysconfig/docker
#新增如下参数:
OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'

#重启docker服务:
systemctl restart docker

2、制作基础镜像

拉取 centos官方基础镜像
docker pull centos
查看当前镜像
docker images
[[email protected] docker]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB

运行并进入镜像:

docker run -ti docker.io/centos:latest /bin/bash

此时,终端将会进入了镜像顶端,现在当当我们可不能不能根据另一方的需求安装额外的组件,比如我这次不可不能不能 用到crontab任务计划服务、程序池池守护supervisor等,没有直接在你你这名终端刚始于操作:

[[email protected] /]# yum install -y epel-release crontabs
[[email protected] /]# yum install -y python-pip
[[email protected] /]# pip install --upgrade pip
[[email protected] /]# pip install supervisor

Ps:顶端的PS提示符中的 0d7f7b8769d9 而是我本次启动的 CONTAINER ID ,在下面的commit即将用到。

完成必要组件安装日后,按下 Ctrl +D 退出系统,接着使用 docker commit 命令创建新镜像,比如命名为 nginx-proxy-base,版本latest:

docker commit 0d7f7b8769d9 centos/nginx-proxy-base:latest

执行完成后,可不能不能使用 docker images 查看刚创建的镜像:

[[email protected] ~]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
centos/nginx-proxy-base                                 latest              676fcfff6d3c        About an hour ago   366 MB

到此,当当我们就创建了二个 自定义的Docker基础镜像(Ps:基础镜像类似于二个 VM虚拟机的快照,方便后续步骤都可不能不能从你你这名基础上重新制作。)

3、制作服务镜像

有了前面的基础镜像日后,当当我们可不能不能在此基础之加带带程序池池或自定义配置,打包为服务镜像。以本文背景需求为例,为了方便后续维护,Nginx我采用纯静态编译土办法,制作成绿色便携版本。

但会 ,当当我们先在宿主机上静态编译二个 符合需求的Nginx(仅展示关键步骤,依赖组件自行搞掂):

# 把所有依赖都静态编译进去
./configure  --prefix=/usr/local/nginx \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre=../pcre-8.39  \
--with-zlib=../zlib-1.2.11 \
--with-http_sub_module \
--with-openssl=../openssl-1.0.2j \
--add-module=../ngx_cache_purge-2.3 \
--add-module=../ngx_http_substitutions_filter_module
# 安装
make && make install

安装后得到 /usr/local/nginx 目录,接着当当我们按照实验需求修改Nginx各项配置,比如反向代理:

server {
    listen 200;
    server_name demo.domain.com;
    access_log /data/wwwlogs/demo.domain.com.log;
    index index.html index.htm index.php;

    location  / {
        proxy_pass http://xxx.xxx.xxx.xxx;
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_redirect off;
        proxy_set_header Host demo.domain.com;
    }
}

删剪配置OK后,运行nginx,确保可不能不能正常工作。

4、编写Dockerfile

①、创建二个 目录,比如:

mkdir -p /data/docker-nginx-proxy
cd /data/docker-nginx-proxy

②、创建 supervisor配置文件,注意不可不能不能 非daemon模式,很多 此处crond会带上-n参数:

[supervisord]
nodaemon=true

[program:crond]
command=crond -n 

[program:nginx]
command=/usr/local/nginx/sbin/nginx

③、继续创建但会 所需文件,比如 crontab.list:

0 3 * * * /usr/local/nginx/sbin/nginx -s reload > /dev/null 2>&1

④、将前面的nginx目录拷贝过来:

cp -rf /usr/local/nginx .

⑤、编写Dockerfile文件:

vim Dockerfile

FROM  centos/nginx-proxy-base:latest
MAINTAINER <[email protected]>
# 将所需文件基因重组到镜像指定路径
ADD nginx /usr/local/nginx
ADD supervisord.conf /etc/supervisord.conf

# 定义但会



命令(将会Docker是分层的,这里建议将多个命令通过&&连接,写到二个

RUN顶端来减少Docker层数)
# 指定时区,外理Dcoker时间和宿主机时间差异什么的问题
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo Asia/Shanghai > /etc/timezone && \
    ln -sf /usr/local/nginx/sbin/nginx /bin/ && \
    echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf && \
    crontab /etc/crontab.list
			 
# 运行 supervisor,这里注意CMD不到用一次
CMD ["/usr/bin/supervisord"]

附:dockerfile 常用指令,可不能不能按实际需求自行加带:

FROM:指定基础image
MAINTAINER:用来指定镜像创建者信息
ADD:从src基因重组文件到container的dest路径
RUN:在容器顶端执行命令
CMD:设置container启动时执行的操作,不到是四根,多条则只执行最后四根
EXPOSE:指定容器不可不能不能

映射到宿主机器的端口,也可不能不能再run的日后指定
ENV:用于设置环境变量
VOLUME:指定挂载点,使容器中的二个

目录具有持久化存储数据的功能

 5、构建镜像

命令为:docker build -t=”[name]:[tag]” ./ ,比如:

docker build -t="centos/nginx-proxy:v1" ./

Build完成后,再执行docker images就可不能不能看得人日后创建的镜像:

[[email protected] docker-nginx-proxy]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
centos/nginx-proxy                                      v1                  f2ed91429b31        31 seconds ago      370.8 MB
centos/nginx-proxy-base                                 latest              676fcfff6d3c        About an hour ago   366 MB

接着,可不能不能下测试镜像否有能正常运行,命令语法大致如下:

docker run -v [宿主目录]:[镜像目录] -ti -p [宿主端口]:[镜像端口] 镜像名称:版本

若加带 -d 参数,docker将会后台运行,这里当当我们看得人下日后创建的镜像否有正常, 很多 采用前台运行模式,命令如下:

docker run -v /data/docker:/data/wwwlogs -ti -p 200:200 centos/nginx-proxy:v1

执行过程:

[[email protected] docker-nginx-proxy ~]# docker run -v /data/docker:/data/wwwlogs -ti -p 443:443 -p 200:200 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest 
/usr/lib/python2.7/site-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
2017-09-03 06:34:59,613 CRIT Supervisor running as root (no user in config file)
2017-09-03 06:34:59,615 INFO supervisord started with pid 1
2017-09-03 06:35:00,617 INFO spawned: 'nginx' with pid 7
2017-09-03 06:35:00,622 INFO spawned: 'crond' with pid 8
2017-09-03 06:35:01,689 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-09-03 06:35:01,689 INFO success: crond entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

可不能不能看得人,镜像不不可不能不能正常运行,接着当当我们还可不能不能继续测试下启动的Nginx否有不不可不能不能正常提供服务,这里就不删剪介绍了。

三、私有仓库

前文将会制作了二个 包含Nginx反向代理服务的Docker镜像,此时还不到在本地使用,若是要让但会 服务器不可不能不能用到你你这名镜像,当当我们可不能不能使用 docker registry 创建二个 私有仓库,步骤如下:

1、拉取私有仓库registry

docker pull registry

此时,执行docker images应该可不能不能看得人二个 镜像:

[[email protected] docker-nginx-proxy]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
centos/nginx-proxy                                      v1                  f2ed91429b31        About an hour ago   370.8 MB
centos/nginx-proxy-base                                 latest              676fcfff6d3c        2 hours ago         366 MB
docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB
docker.io/registry                                      latest              9d0c4eabab4d        3 months ago        33.17 MB

 2、拉起仓库

docker run -d -p 20000:20000 -v /data/images:/tmp/registry docker.io/registry

 3、推送镜像

第一步查看镜像列表时,拿到不可不能不能 推送的镜像的ID,比如 f2ed91429b31

①、先打tag,语法如下:

docker tag [image id] [仓库地址]/[命名空间]/[镜像名称]:[版本]

②、但会 push,语法如下:

docker push [仓库地址]/[命名空间]/[镜像名称]

执行过程如下所示:

[[email protected] docker-nginx-proxy]# docker tag f2ed91429b31 localhost:20000/centos/nginx-proxy:latest      
[[email protected] docker-nginx-proxy]# docker push localhost:20000/centos/nginx-proxy
The push refers to a repository [localhost:20000/centos/nginx-proxy]
158fae47d4e2: Pushed 
4a5dcec3edb7: Pushed 
ae9a40cbe568: Pushed 
7abc8eb8fc0f: Pushed 
d8a5f0f5adc1: Pushed 
7dc25a4e14aa: Pushed 
c7ee46ed4410: Pushing [===>                                               ] 9.669 MB/153.1 MB
b362758f4793: Pushing [======>                                            ] 26.78 MB/192.5 MB

完成后,执行docker images就可不能不能看得人日后提交的镜像了:

[[email protected] docker-nginx-proxy]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
localhost:20000/centos/nginx-proxy                       latest              f2ed91429b31        About an hour ago   370.8 MB
centos/nginx-proxy                                      v1                  f2ed91429b31        About an hour ago   370.8 MB
centos/nginx-proxy-base                                 latest              676fcfff6d3c        2 hours ago         366 MB
docker.io/centos                                        latest              328edcd84f1b        4 weeks ago         192.5 MB
docker.io/registry                                      latest              9d0c4eabab4d        3 months ago        33.17 MB

③、测试拉取:

现在可不能不能在本机(本机可不能不能先删除在拉取)或另找一台服务器进行docker pull拉取测试。

比如,先在宿主机上删除你你这名镜像:

[[email protected] docker-nginx-proxy]# docker rmi localhost:20000/centos/nginx-proxy
Untagged: localhost:20000/centos/nginx-proxy:latest
Untagged: localhost:20000/centos/[email protected]:20e7898413c368ee8dbfac0649fbfbb2d43510c20024d01e6ea3ec3f1a5d7c152

此时,docker images 列表将会消失,再执行 docker pull 就又回来了。

[[email protected] docker-nginx-proxy]# docker pull localhost:20000/centos/nginx-proxy
Using default tag: latest
Trying to pull repository localhost:20000/centos/nginx-proxy ... 
sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c20024d01e6ea3ec3f1a5d7c152: Pulling from localhost:20000/centos/nginx-proxy
Digest: sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c20024d01e6ea3ec3f1a5d7c152
Status: Downloaded newer image for localhost:20000/centos/nginx-proxy:latest

4、离线方案

当私有仓库无法使用时(比如地处网络限制),当当我们还可不能不能将镜像保存为二个 tar包,方便离线使用,使用也非常简单:

①、export / import 方案

使用 docker ps -a 查看当前正在运行的docker镜像列表,得到对应的 CONTAINER ID,执行如下一段话可不能不能将运行中的镜像导出到指定tar包:

docker export [CONTAINER ID] > centos-nginx-proxy-latest.tar

有了tar包日后,就可不能不能使用 import 来导入:

cat centos-nginx-proxy-latest.tar | docker import - centos/nginx-proxy:v1

②、save / load 方案

使用 docker images 查看本地已有镜像列表,得到对应的IMAGE ID,但会 执行如下一段话可不能不能将本地已地处镜像保存到指定tar包:

docker save  [IMAGE ID] > centos-nginx-proxy-latest.tar

顶端则可不能不能使用 load 来加载tar包镜像:

docker load < centos-nginx-proxy-latest.tar

并都在方案的区别:

  • export 不到导出正在运行的镜像,而 save 可不能不能直接导出本地镜像;
  • export 导出的镜像文件一般会小于 save 保存的镜像(本文实践数据:相差38MB);
  • export 导出(import导入)是根据容器拿到的镜像,再导入后要丢失镜像所有的历史,很多 无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>,而save保存(load加载)的镜像,没有丢失镜像的历史,可不能不能回滚到日后的层(layer)。

四、容器服务

上述私有仓库我我嘴笨 将会可不能不能满足整个实验背景需求,当当我们可不能不能在购买但会 云主机日后,就可不能不能通过私有仓库外网地址快速拉起二个 Nginx反向代理服务了。

但会 ,当当当我们知道国内的云主机删剪后要小水管,而按流量收费的模式也比较昂贵。此时,本文的主角才姗姗来迟:腾讯云-容器服务。

简单来说,腾讯云的容器服务,而是我给当当我们提供了二个 在云端的Docker私有仓库,当当我们可不能不能将制作好的镜像,推送到腾讯云私有镜像仓库,但会 就可不能不能在腾讯云或国内外但会 云主机上快速拉起自定义的Docker镜像服务了,非常非常方便!但会 ,最重要的是…该服务目前免费。

下面简单分享一下腾讯云容器服务的使用土办法。

1、创建仓库

①、开通镜像服务

打开腾讯云-容器服务:https://console.qcloud.com/ccs

按照页面提示填写相关信息并设置仓库密码:

②、接着在【我的创建】页面新建二个 镜像仓库:

得到腾讯云私有仓库地址:

即:ccr.ccs.tencentyun.com/myspace/nginx-proxy

③、重置密码

将会忘记密码一段话,可不能不能使用【重置密码】功能来设置新的密码:

2、上传镜像

①、仓库认证

username 填写你登录腾讯云的账号,一般是QQ号码

docker login --username=[username] ccr.ccs.tencentyun.com

②、推送镜像

和前文推送镜像到本地私有仓库一样,先查看镜像ID,但会 如下先打tag,但会 推送:

docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]
docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]

比如:

docker tag f2ed91429b31 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
docker push ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest

成功后,就可不能不能在腾讯云容器页面查看得人日后提交的镜像版本了:

3、拉取镜像

最后,当当我们就可不能不能在不可不能不能 部署Nginx反代服务的云主机上进行拉取操作了。

比如,我在阿里云主机上拉取你你这名镜像:

①、安装docker:yum install docker

②、启动docker:systemctl restart  docker.service

③、登录腾讯云仓库

docker login --username=xxxxx http://ccr.ccs.tencentyun.com/myspace/nginx-proxy

④、拉取镜像

docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy

[[email protected] ~]# docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy
Using default tag: latest
Trying to pull repository ccr.ccs.tencentyun.com/myspace/nginx-proxy ... 
latest: Pulling from ccr.ccs.tencentyun.com/myspace/nginx-proxy
74f0853ba93b: Downloading [===========================>                       ] 39.11 MB/72.25 MB
e7fa91cce4c4: Downloading [================================>                  ] 37.65 MB/57.14 MB
c7319b8f7fbc: Download complete 
faf81200992b4: Download complete 
79327b915b74: Download complete 
702ede4e59c4: Download complete 
77e09cc85e34: Download complete 
8a265e81261a: Download complete

⑤、运行镜像

这里当当我们正式执行,很多 加带 -d 参数:

docker run -v /data/docker:/data/wwwlogs -dti -p 443:443 -p 200:200 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest

整个过程不到5分钟,真的非常方便!

五、小结

本文记录了二个 实际的Dokcer应用场景从创建、上传直到部署的删剪过程,Docker为当当我们提供了二个 新的软件发布土办法,假如将应用以及相关的依赖打包成Docker镜像,并上传到镜像仓库日后,当当我们就可不能不能快速拉起二个 定制服务,毫无拖泥带水,从而极大的繁复了部署。

本文还简单的介绍了腾讯云的容器服务,通过容器服务,当当我们可不能不能上传自定制Docker镜像,可不能不能在腾讯云主机或但会 国内网服务器上快速拉起应用服务,加快了业务部署节奏,并降低了运维成本。

当然,最重要的还是当当我们通过你你这名实践,熟悉了Docker的基本知识和基础使用土办法。