1 - 创建nginx服务
本文档旨在帮助大家了解如何快速创建一个容器集群内的 nginx 服务。
前提条件
- 已部署 TKEStack 控制台。
- 已创建集群。如没有另外创建集群,可以先使用global集群。如要尝试创建新集群,请参见 创建集群。
操作步骤
创建 Nginx 服务
- 登录TKEStack 控制台 。
- 单击左侧导航栏中【集群管理】,进入“集群管理”页面,单击需要创建服务的集群 ID。
- 进入【工作负载】的【 Deployment 】中,选择【新建】。如下图所示:
- 在“新建Workload”页面,只需输入下图中红框的参数即可。
注意:服务所在集群的安全组需要放通节点网络及容器网络,同时需要放通30000 - 32768端口,否则可能会出现容器服务无法使用问题。
- 单击上图中的【创建Workload】,完成创建。如下图所示:
注意:当运行/期望Pod数量一致时,负载完成创建。
- 如果在第5步中有创建Service,则可以在【服务】下的【Service】看到与刚刚创建的Deployment同名的Service
访问 Nginx 服务
可通过以下两种方式访问 nginx 服务。
通过主机节点端口访问 nginx 服务
在本地主机的浏览器地址栏输入集群任意节点IP:30000 端口
,例如10.0.0.1:30000
即可访问服务。如果服务创建成功,访问服务时直接进入 nginx 服务器的默认欢迎页。如下图所示:
注意:如果本地主机在集群内网中,输入节点的内网IP地址即可;如果本地主机不在集群内网中,需要输入节点的外网IP地址
通过服务名称访问 nginx 服务
集群内的其他服务或容器可以直接通过服务名称访问。
2 - 编写HelloWorld程序
操作场景
本文档旨在帮助大家了解如何快速创建一个容器集群内的 Hello World 的 Node.js 版的服务。
前提条件
- 已部署 TKEStack 控制台。
- 已创建集群。如没有另外创建集群,可以先使用global集群。如要尝试创建新集群,请参见 创建集群。
操作步骤
编写代码制作镜像
编写应用程序
以CentOS 7.6为例
安装node.js,然后依次执行以下命令,创建并进入 hellonode 的文件夹。
yum install -y nodejs mkdir hellonode cd hellonode/
执行以下命令,新建并打开 server.js 文件。
vim server.js
按 “i” 或 “insert” 切换至编辑模式,将以下内容输入 server.js。
var http = require('http'); var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('Hello World!'); }; var www = http.createServer(handleRequest); www.listen(80);
按 “Esc”,输入 “:wq”,保存文件并返回。
执行以下命令,执行 server.js 文件。
node server.js
测试 Hello World 程序,有以下两种办法。 1. 另起一个终端,再次登录节点,执行以下命令。
curl 127.0.0.1:80 # 终端会输出一下信息 Hello World!
打开本地主机的浏览器,以
IP地址:端口
的形式访问,端口为80。 网页出现Hello world!
说明 Hello World 程序运行成功。注意:如果本地主机不在该节点所在的内网,IP地址应该是该节点的外网地址
创建 Docker 镜像
在 hellonode 文件夹下,创建 Dockerfile 文件。
[root@VM_1_98_centos hellonode]# vim Dockerfile
按 “i” 或 “insert” 切换至编辑模式,将以下内容输入 Dockerfile 文件。
FROM node:4.4 EXPOSE 80 COPY server.js . CMD node server.js
按 “Esc”,输入 “:wq”,保存文件并返回。
执行以下命令,构建镜像。
docker build -t hello-node:v1 .
执行以下命令,查看构建好的 hello-node 镜像。
docker images
显示结果如下,则说明 hello-node 镜像已成功构建,记录其 IMAGE ID。如下图所示:
上传该镜像到镜像仓库
依次执行以下命令,上传镜像到 qcloud 仓库。
sudo docker login -u tkestack -p 【访问凭证】 default.registry.tke.com
sudo docker tag 【IMAGEID】 default.registry.tke.com/【命名空间】/helloworld:v1
sudo docker push default.registry.tke.com/【命名空间】/helloworld:v1
- 请将命令中的 【访问凭证】 替换为 已创建的访问凭证。
- 请将命令中的 【IMAGEID】 替换为 你自己创建镜像的ID,示例中的ID如上图158204134510。
- 请将命令中的 【命名空间】 替换为 已创建的命名空间。
显示以下结果,则说明镜像上传成功。
在镜像仓库命名空间中进行确认
通过该镜像创建 Hello World 服务
登录 TKEStack 控制台。
单击左侧导航栏中【集群管理】,进入“集群管理”页面。
单击需要创建服务的集群 ID,进入工作负载 “Deployment” 详情页,选择【新建】。如下图所示:
在“新建Workload”页面,仅输入以下红框内容即可:
注意:
- 镜像,地址要填全:default.registry.tke.com/【命名空间】/【镜像名】,例如:default.registry.tke.com/test/helloworld
- 服务所在集群的安全组需要放通节点网络及容器网络,同时需要放通30000 - 32768端口,否则可能会出现容器服务无法使用问题。
单击【创建Workload】,完成 Hello World 服务的创建。
访问 Hello World 服务
可通过以下两种方式访问 Hello World 服务。
通过主机节点端口访问 Hello World 服务
选择【服务】>【Service】,在“Service”管理页面,看到与名为helloworld的Deployment同名的 helloworld Service已经运行,如下图所示:
在本地主机的浏览器地址栏输入
集群任意节点IP:30000 端口
,例如10.0.0.1:30000
即可访问服务。如果服务创建成功,访问服务时页面会返回Hello World!
注意:如果本地主机在集群内网中,输入节点的内网IP地址即可;如果本地主机不在集群内网中,需要输入节点的外网IP地址
通过服务名称访问 Hello World 服务
集群内的其他服务或容器可以直接通过服务名称访问。
更多关于Docker 镜像请参见 如何构建 Docker 镜像 。
3 - 如何构建Docker镜像
说明
DockerHub 提供了大量的镜像可用,详情可查看 DockerHub 官网。
Docker 容器的设计宗旨是让用户在相对独立的环境中运行独立的程序。
Docker 容器程序在镜像内程序运行结束后会自动退出。如果要令构建的镜像在服务中持续运行,需要在创建服务页面指定自身持续执行的程序,如:业务主程序,main 函数入口等。
由于企业环境的多样性,并非所有应用都能在 DockerHub 找到对应的镜像来使用。 您可以通过以下教程了解到如何将应用打包成Docker镜像。
Docker 生成镜像目前有两种方式:
- 通过 Dockerfile 自动构建镜像;
- 通过容器操作,并执行 Commit 打包生成镜像。
Dockerfile 自动编译生成(推荐使用)
以 Dockerhub 官方提供的 WordPress 为例,转到 github 查看详情 >>
其 Dockfile 源码如下:
FROM php:5.6-apache
# install the PHP extensions we need
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mysqli opcache
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=2'; \
echo 'opcache.fast_shutdown=1'; \
echo 'opcache.enable_cli=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
RUN a2enmod rewrite expires
VOLUME /var/www/html
ENV WORDPRESS_VERSION 4.6.1
ENV WORDPRESS_SHA1 027e065d30a64720624a7404a1820e6c6fff1202
RUN set -x \
&& curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz" \
&& echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
&& tar -xzf wordpress.tar.gz -C /usr/src/ \
&& rm wordpress.tar.gz \
&& chown -R www-data:www-data /usr/src/wordpress
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
# ENTRYPOINT resets CMD
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]
通过上述 Dockerfile 文件可以了解到,内置执行了许多的 Linux 命令来安装和部署软件。
操作步骤
在终端创建一个名为worldpress的文件夹,在该文件夹下创建 Dockerfile 文件,文件内容即以上代码。通过 docker build ./
命令来构建镜像。
[root@VM_1_98_centos ~]# mkdir worldpress
[root@VM_1_98_centos ~]# ls
worldpress
[root@VM_1_98_centos ~]# cd worldpress/
[root@VM_1_98_centos worldpress]# vi Dockerfile
[root@VM_1_98_centos worldpress]# ls
Dockerfile
[root@VM_1_98_centos worldpress]# docker build ./
Sending build context to Docker daemon 3.072kB
Step 1/12 : FROM php:5.6-apache
5.6-apache: Pulling from library/php
5e6ec7f28fb7: Pull complete
cf165947b5b7: Pull complete
7bd37682846d: Pull complete
······
通过 docker images 命令即可查看到构建完成的镜像。
[root@VM_88_88_centos worldpress]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
worldpress latest 9f0b470b5ddb 12 minutes ago 420 MB
docker.io/php 5.6-apache eb8333e24502 5 days ago 389.7 MB
使用 Dockerfile 来构建镜像有以下建议: 1. 尽量精简,不安装多余的软件包。 2. 尽量选择 Docker 官方提供镜像作为基础版本,减少镜像体积。 3. Dockerfile 开头几行的指令应当固定下来,不建议频繁更改,有效利用缓存。 4. 多条 RUN 命令使用''连接,有利于理解且方便维护。 5. 通过 -t 标记构建镜像,有利于管理新创建的镜像。 6. 不在 Dockerfile 中映射公有端口。 7. Push 前先在本地运行,确保构建的镜像无误。
执行 Commit 实现打包生成镜像
通过 Dockerfile 可以快速构建镜像,而通过 commit 生成镜像可以解决应用在部署过程中有大量交互内容以及难以通过 Dockerfile 构建的问题。
通过 commit 构建镜像操作如下: 1. 运行基础镜像容器,并进入console。
[root@VM_88_88_centos ~]# docker run -i -t centos
[root@f5f1beda4075 /]#
安装需要的软件,并添加配置。
[root@f5f1beda4075 /]# yum update && yum install openssh-server Loaded plugins: fastestmirror, ovl base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/4): base/7/x86_64/group_gz | 155 kB 00:00:00 (2/4): extras/7/x86_64/primary_db | 166 kB 00:00:00 (3/4): base/7/x86_64/primary_db | 5.3 MB 00:00:00 (4/4): updates/7/x86_64/primary_db ...... ...... ...... Dependency Installed: fipscheck.x86_64 0:1.4.1-5.el7 fipscheck-lib.x86_64 0:1.4.1-5.el7 openssh.x86_64 0:6.6.1p1-25.el7_2 tcp_wrappers-libs.x86_64 0:7.6-77.el7 Complete!
配置完成后打开新终端保存该镜像。
shell [root@VM_88_88_centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5f1beda4075 centos "/bin/bash" 8 minutes ago Up 8 minutes hungry_kare [root@VM_88_88_centos ~]# docker commit f5f1beda4075 test:v1.0 sha256:65325ffd2af9d574afca917a8ce81cf8a710e6d1067ee611a87087e1aa88e4a4 [root@VM_88_88_centos ~]# [root@VM_88_88_centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v1.0 65325ffd2af9 11 seconds ago 307.8 MB