78、容器与云计算:从基础操作到企业应用

容器与云计算:从基础操作到企业应用

容器基础操作

容器技术在云计算领域扮演着重要角色,它能让应用的部署和管理更加高效。下面我们将详细介绍容器的一些基础操作。

容器的网络与停止

容器通常有自己的网络接口,例如一个容器可能只有一个外部网络接口(eth0@if11),并被分配了IP地址10.88.0.6/16。当你完成操作后,可以通过输入 exit 来退出容器的shell并停止容器。

[root@e9086da6ed70 /]# exit

即使shell和容器不再运行,容器仍然以停止状态存在于系统中。需要注意的是,单独使用 podman ps 命令不会显示停止的容器,你需要添加 --all 选项。

[root@e9086da6ed70 /]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
[root@e9086da6ed70 /]# podman ps --all
CONTAINER ID IMAGE         COMMAND CREATED    STATUS         PORTS 
NAMES
437ec53386ca ...ubi:latest bash    1 hour ago Up 1 minute ago       
go_ein
从容器运行FTP服务器

为了方便在使用完容器后将其丢弃,通常希望将可变数据存储在容器外部。以下是一个从容器运行FTP服务器(vsftpd)的简单示例。

  1. 创建vsftpd.conf文件 :在默认位置 /etc/vsftpd/vsftpd.conf 创建该文件。以下是一个示例配置:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=NO
connect_from_port_20=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
vsftpd_log_file=/dev/stdout
syslog_enable=NO
background=NO
pasv_enable=Yes
pasv_max_port=21100
pasv_min_port=21110
  1. 创建FTP目录 :在主机的标准位置 /var/ftp/pub 创建一个匿名FTP目录,并复制一些文件到该目录。
# mkdir -p /var/ftp/pub
# cp /etc/services /etc/login.defs /var/ftp/pub/
  1. 获取vsftpd容器镜像 :按照后续“构建容器镜像”部分的说明构建vsftpd镜像。可以使用以下命令检查镜像是否可用:
# podman images
REPOSITORY  TAG    IMAGE ID     CREATED        SIZE
vsftpd      latest 487d0db26098 5 seconds ago  208 MB
  1. 运行vsftpd容器镜像 :运行vsftpd容器时,需要暴露端口并将主机的文件挂载到容器中。
# podman run -d -p 20:20 -p 21:21 \
   -p 21100-21110:21100-21110 \
-v /etc/vsftpd/:/etc/vsftpd/ \
-v /var/ftp/pub:/var/ftp/pub \
--name vsftpd vsftpd
# podman ps
CONTAINER ID  IMAGE         COMMAND          CREATED
    STATUS             PORTS                     NAMES
3a5d094dd4b5  vsftpd:latest /usr/local/s2... 9 seconds ago
    Up 10 seconds ago  0.0.0.0:20-21->20-21/tcp  vsftpd

这里使用的选项说明如下:
- -d :以分离模式运行容器,使vsftpd服务在后台运行。
- -p :将标准FTP端口(TCP 20和TCP 21)映射到主机网络接口的相同端口号,同时打开被动FTP所需的端口范围(21100 - 21110)。
- --rm :如果添加该选项,容器退出时将被删除。
- -v :使用 -v 选项将主机系统的配置文件目录(/etc/vsftpd)和要共享的内容目录(/var/ftp)绑定挂载到容器的相同位置。
- --name :设置容器的名称为vsftpd(或你喜欢的任何名称)。

为了使vsftpd服务可以在本地系统之外访问,需要打开相应的FTP端口和被动FTP端口:

# firewall-cmd --zone=public --add-service=ftp
# firewall-cmd --zone=public \
     --permanent --add-service=ftp
# firewall-cmd --zone=public \
     --add-port=21100-21110/tcp
# firewall-cmd --zone=public \
     --permanent --add-port=21100-21110/tcp
# firewall-cmd reload
容器的启动与停止

除非你特别设置容器在停止时被删除( --rm 选项),否则当容器停止、暂停或失败时,它仍然存在于系统中。可以使用 ps 选项查看系统中所有容器的状态。

# podman ps
CONTAINER ID  IMAGE                    COMMAND           CREATED
    STATUS                PORTS                     NAMES
4d6be3e63fe3  localhost/vsftpd:latest  /usr/local/s2...  About an 
hour ago
    Up About an hour ago  0.0.0.0:20-21->20-21/tcp  vsftpd
# podman ps -a
CONTAINER ID  IMAGE                    COMMAND              CREATED
    STATUS                PORTS                     NAMES
7da88bd62667  ubi8/ubi:latest          bash                 2 minutes 
ago
    Exited 7 seconds ago                            silly_wozniak
4d6be3e63fe3  localhost/vsftpd:latest  /usr/local/s2i/ru... About an 
hour ago
    Up About an hour ago  0.0.0.0:20-21->20-21/tcp  vsftpd

单独使用 podman ps 只显示正在运行的容器,添加 -a 选项可以查看所有容器,包括已停止但尚未删除的容器。可以使用 start 选项重启已停止的容器:

# podman start -a 7da88bd62667
[root@7da88bd62667 /]#
构建容器镜像

构建容器镜像需要一个Dockerfile来描述如何构建镜像,以及任何你想包含在镜像中的其他内容。下面介绍两种构建容器镜像的方法。

构建简单容器镜像

以下步骤将从一个Dockerfile创建一个简单的容器。
1. 创建项目目录

# mkdir myproject
# cd myproject
  1. 创建脚本 :在当前目录创建一个名为 cworks.sh 的脚本,内容如下:
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
echo "This Container Works!"
  1. 创建Dockerfile :在当前目录创建一个名为 Dockerfile 的文件,内容如下:
FROM registry.access.redhat.com/ubi7/ubi-minimal
COPY ./cworks.sh /usr/local/bin/
CMD ["/usr/local/bin/cworks.sh"]
  1. 构建容器镜像
# podman build -t myproject .
STEP 1: FROM registry.access.redhat.com/ubi7/ubi-minimal
STEP 2: COPY ./cworks.sh /usr/local/bin/
6382dfd00f7bedf1a64c033515a09eff37cbc6d1244cbeb4f4533ad9f00aa970
STEP 3: CMD ["/usr/local/bin/cworks.sh"]
STEP 4: COMMIT myproject
6837ec3a37a241...
  1. 运行容器 :可以使用容器名称(myproject)或其镜像ID(6837ec3a37a241)来运行容器。
# podman run 6837ec3a37a241
The Container Works!
从GitHub构建FTP容器

以下步骤描述了如何从GitHub上的软件获取构建vsftpd服务所需的软件,并将其构建和运行在容器中。
1. 安装git :如果本地系统没有安装git,使用以下命令安装:

# yum install git -y
  1. 克隆项目 :克隆GitHub上的vsftpd容器镜像项目到本地目录。
# git clone 
https://github.com/container-images/vsftpd.git
# cd vsftpd
# ls
default-conf/  Dockerfile  LICENSE  Makefile  README.md
root/          s2i/        tests/
  1. 修改文件 :修改Dockerfile,使用最新的Fedora镜像。
FROM registry.fedoraproject.org/fedora
  1. 构建容器镜像 :从vsftpd目录使用 podman 命令构建容器镜像。
# podman build -t vsftpd .
STEP 1: FROM registry.fedoraproject.org/fedora:31
Getting image source signatures
Copying blob c0a89efa8873 done
Copying config aaaa3e1d6a done
Writing manifest to image destination
Storing signatures
STEP 2: ENV SUMMARY="Very Secure Ftp Daemon" ...
STEP 3: LABEL maintainer="Dominika Hodovska <dhodovsk@redhat.com>"       
...
STEP 4: RUN dnf install -y vsftpd && dnf clean all
          && mkdir /home/vsftpd
...
Installing:
vsftpd    x86_64   3.0.3-32.fc31   fedora   164 k
...
Complete!
99931652dceacc2e9...
STEP 5: VOLUME /var/log/vsftpd
b79b229d09f726356...
STEP 6: EXPOSE 20 21
b0af5428800140104...
STEP 7: RUN mkdir -p ${APP_DATA}/src
b3652e0d07e35af79...
STEP 8: WORKDIR ${APP_DATA}/src
f9d96dee640c5cedc...
STEP 9: COPY ./s2i/bin/ /usr/local/s2i
ded9b512693ccabaa...
STEP 10: COPY default-conf/vsftpd.conf /etc/vsftpd/vsftpd.conf
0c48af8d4f72b76c7...
STEP 11: CMD ["/usr/local/s2i/run"]
STEP 12: COMMIT vsftpd
aa0274872f23ae94dfee...
  1. 检查镜像 :使用以下命令检查新镜像是否创建成功。
# podman images
REPOSITORY       TAG    IMAGE ID     CREATED       SIZE
localhost/vsftpd latest aa0274872f23 4 minutes ago 607 MB

这个构建过程包含12个步骤,每个步骤都有其特定的作用,例如安装软件、设置环境变量、暴露端口等。

容器镜像的标记与推送

为了让你的镜像能够被其他系统上的人使用,通常需要将镜像添加到一个容器注册表中。以下是将本地镜像标记并推送到远程容器注册表的步骤。

本地注册表操作
  1. 安装docker-distribution :在RHEL 7或最近的Fedora系统上安装并启动docker-distribution。
# yum install docker-distribution -y
# systemctl start docker-distribution
# systemctl enable docker-distribution
# systemctl status docker-distribution
• docker-distribution.service-v2 Registry server for Docker
   Loaded: loaded
    (/usr/lib/systemd/system/docker-distribution.service;
    enabled; vendor pres>
    Active: active (running) since Wed 2020-01-01...
  1. 打开注册表端口 :为了能够从其他主机系统推送和拉取容器镜像,需要在防火墙中打开TCP端口5000。
# firewall-cmd --zone=public
 --add-port=5000/tcp --permanent
  1. 标记镜像 :通过标记本地镜像,指定镜像将存储的注册表位置。
# podman images | grep vsftpd
localhost/vsftpd  latest  aa0274872f23  2 hours ago  607 MB
# podman tag aa0274872f23 
host.example.com:5000/myvsftpd:v1.0
  1. 推送镜像 :将镜像推送到本地注册表。
# podman push --tls-verify=false 
host.example.com:5000/myvsftpd:v1.0
  1. 拉取镜像 :为了确保镜像可以从注册表中获取,可以尝试拉取镜像。
# podman pull --tls-verify=false \
              host.example.com:5000/myvsftpd:v1.0
公共注册表操作

如果使用公共注册表,如Quay.io或Docker Hub,操作步骤如下:

# podman login quay.io
Username: myownusername
Password: ***************
# podman tag aa0274872f23 \
    quay.io/myownusername/myvsftpd:v1.0
# podman push quay.io/myownusername/myvsftpd:v1.0
容器在企业中的应用

虽然Docker项目在简化单个容器的使用方面取得了巨大进展,但Kubernetes项目帮助将Linux容器推向了企业级应用。像docker和podman这样的命令行工具适合管理单个容器,而Kubernetes则提供了一个平台,用于在大型数据中心部署大型、复杂的应用程序。

总结

容器化应用在过去几年中得到了广泛的应用。Docker项目极大地简化了单个应用的容器化和在单系统上的运行。像podman这样的工具也可用于在Linux系统上部署和管理单个容器。通过本文介绍的内容,你可以掌握使用docker和podman等命令行工具来拉取、运行、构建和管理容器的方法,这些知识将为你理解容器化的工作原理以及后续学习Kubernetes如何在整个企业中管理容器化应用奠定基础。

练习

以下是一些与容器操作相关的练习,如果你遇到困难,可以参考相关资料获取解决方案。
1. 选择 podman (适用于任何RHEL或Fedora系统)或 docker (RHEL 7),安装包含所选工具的软件包,并启动使用这些命令所需的任何服务。
2. 使用 docker podman ,将镜像 registry.access.redhat.com/ubi7/ubi 拉取到你的主机。
3. 运行 ubi7/ubi 镜像以打开一个bash shell。
4. 在容器内打开bash shell后,运行一些命令以查看容器所基于的操作系统,安装 proc-ps 包,运行一个命令查看容器内运行的进程,然后退出。
5. 再次重启容器,并使用交互式shell连接到它。完成后退出shell。
6. 从 ubi7/ubi 基础镜像创建一个简单的Dockerfile,包含一个名为 cworks.sh 的脚本,该脚本使用 echo 输出字符串 “The Container Works!”,并将该脚本添加到镜像中,使其作为默认命令运行。
7. 使用 docker podman 从刚刚创建的Dockerfile构建一个名为 containerworks 的镜像。
8. 通过安装 docker-distribution 包或在Quay.io或Docker Hub上获取账户,获得对容器注册表的访问权限。
9. 标记并将你的新镜像推送到你选择的容器注册表。

容器与云计算:从基础操作到企业应用

容器操作流程总结

为了更清晰地展示容器从创建到部署的整个过程,下面用一个流程图来概括:

graph LR
    A[选择工具并安装服务] --> B[拉取镜像]
    B --> C[运行镜像打开shell]
    C --> D[在容器内操作]
    D --> E[停止/重启容器]
    E --> F[构建镜像]
    F --> G[标记镜像]
    G --> H[推送镜像到注册表]
容器操作命令对比
操作 podman命令示例 docker命令示例(RHEL 7)
查看正在运行的容器 podman ps docker ps
查看所有容器 podman ps -a docker ps -a
拉取镜像 podman pull registry.access.redhat.com/ubi7/ubi docker pull registry.access.redhat.com/ubi7/ubi
运行镜像 podman run -it registry.access.redhat.com/ubi7/ubi bash docker run -it registry.access.redhat.com/ubi7/ubi bash
构建镜像 podman build -t myproject . docker build -t myproject .
标记镜像 podman tag aa0274872f23 host.example.com:5000/myvsftpd:v1.0 docker tag aa0274872f23 host.example.com:5000/myvsftpd:v1.0
推送镜像 podman push --tls-verify=false host.example.com:5000/myvsftpd:v1.0 docker push --tls-verify=false host.example.com:5000/myvsftpd:v1.0
容器在企业应用中的优势与挑战

在企业环境中使用容器具有诸多优势,但也面临一些挑战。

优势
  • 资源利用率高 :容器可以在同一台物理机或虚拟机上运行多个应用,提高了资源的利用率,降低了硬件成本。
  • 快速部署 :容器化的应用可以快速部署和启动,减少了应用上线的时间。
  • 可移植性强 :容器可以在不同的环境中运行,如开发、测试和生产环境,确保了应用在不同环境中的一致性。
挑战
  • 管理复杂性 :随着容器数量的增加,管理和监控容器变得更加复杂,需要使用专门的工具来进行管理。
  • 安全问题 :容器的隔离性并非绝对,存在一定的安全风险,需要采取相应的安全措施来保障容器的安全。
  • 网络配置 :容器的网络配置相对复杂,需要合理规划网络以确保容器之间的通信和外部访问。
容器管理工具的选择

在企业中,选择合适的容器管理工具至关重要。除了前面提到的 docker podman 用于管理单个容器外,Kubernetes 是一个广泛使用的容器编排平台,用于管理大规模的容器集群。

Kubernetes 的优势
  • 自动化部署和扩展 :Kubernetes 可以自动化地部署和扩展容器化应用,根据负载情况自动调整容器的数量。
  • 服务发现和负载均衡 :Kubernetes 提供了服务发现和负载均衡的功能,确保应用的高可用性和性能。
  • 自我修复 :当容器出现故障时,Kubernetes 可以自动重启容器,保证应用的正常运行。
练习解答思路

对于前面提到的练习,下面给出一些解答思路。

  1. 安装工具和服务

    • 对于 podman ,在 RHEL 或 Fedora 系统上使用 yum install podman -y 安装,然后启动相关服务。
    • 对于 docker ,在 RHEL 7 上使用 yum install docker -y 安装,启动服务使用 systemctl start docker systemctl enable docker
  2. 拉取镜像

    • 使用 podman pull registry.access.redhat.com/ubi7/ubi docker pull registry.access.redhat.com/ubi7/ubi
  3. 运行镜像打开 shell

    • podman run -it registry.access.redhat.com/ubi7/ubi bash docker run -it registry.access.redhat.com/ubi7/ubi bash
  4. 容器内操作

    • 查看操作系统: cat /etc/os-release
    • 安装 proc-ps 包: yum install proc-ps -y
    • 查看进程: ps -ef
  5. 重启容器并连接

    • 先使用 podman ps -a docker ps -a 找到容器 ID,然后使用 podman start -a <容器 ID> docker start -i <容器 ID> 重启并连接。
  6. 创建 Dockerfile

FROM registry.access.redhat.com/ubi7/ubi
COPY cworks.sh /usr/local/bin/
CMD ["/usr/local/bin/cworks.sh"]

其中 cworks.sh 内容为:

#!/bin/bash
echo "The Container Works!"
  1. 构建镜像

    • podman build -t containerworks . docker build -t containerworks .
  2. 访问容器注册表

    • 安装 docker-distribution yum install docker-distribution -y ,启动服务并打开端口。
    • 在 Quay.io 或 Docker Hub 上注册账户。
  3. 标记并推送镜像

    • 标记: podman tag <镜像 ID> <注册表地址>/containerworks:v1.0 docker tag <镜像 ID> <注册表地址>/containerworks:v1.0
    • 推送: podman push <注册表地址>/containerworks:v1.0 docker push <注册表地址>/containerworks:v1.0

通过以上内容,你可以更深入地了解容器的操作和应用,掌握容器化技术在企业中的应用方法,为企业的数字化转型提供有力支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值