容器与云计算:从基础操作到企业应用
容器基础操作
容器技术在云计算领域扮演着重要角色,它能让应用的部署和管理更加高效。下面我们将详细介绍容器的一些基础操作。
容器的网络与停止
容器通常有自己的网络接口,例如一个容器可能只有一个外部网络接口(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)的简单示例。
-
创建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
-
创建FTP目录
:在主机的标准位置
/var/ftp/pub创建一个匿名FTP目录,并复制一些文件到该目录。
# mkdir -p /var/ftp/pub
# cp /etc/services /etc/login.defs /var/ftp/pub/
- 获取vsftpd容器镜像 :按照后续“构建容器镜像”部分的说明构建vsftpd镜像。可以使用以下命令检查镜像是否可用:
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
vsftpd latest 487d0db26098 5 seconds ago 208 MB
- 运行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
-
创建脚本
:在当前目录创建一个名为
cworks.sh的脚本,内容如下:
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
echo "This Container Works!"
-
创建Dockerfile
:在当前目录创建一个名为
Dockerfile的文件,内容如下:
FROM registry.access.redhat.com/ubi7/ubi-minimal
COPY ./cworks.sh /usr/local/bin/
CMD ["/usr/local/bin/cworks.sh"]
- 构建容器镜像 :
# 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...
- 运行容器 :可以使用容器名称(myproject)或其镜像ID(6837ec3a37a241)来运行容器。
# podman run 6837ec3a37a241
The Container Works!
从GitHub构建FTP容器
以下步骤描述了如何从GitHub上的软件获取构建vsftpd服务所需的软件,并将其构建和运行在容器中。
1.
安装git
:如果本地系统没有安装git,使用以下命令安装:
# yum install git -y
- 克隆项目 :克隆GitHub上的vsftpd容器镜像项目到本地目录。
# git clone
https://github.com/container-images/vsftpd.git
# cd vsftpd
# ls
default-conf/ Dockerfile LICENSE Makefile README.md
root/ s2i/ tests/
- 修改文件 :修改Dockerfile,使用最新的Fedora镜像。
FROM registry.fedoraproject.org/fedora
-
构建容器镜像
:从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...
- 检查镜像 :使用以下命令检查新镜像是否创建成功。
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/vsftpd latest aa0274872f23 4 minutes ago 607 MB
这个构建过程包含12个步骤,每个步骤都有其特定的作用,例如安装软件、设置环境变量、暴露端口等。
容器镜像的标记与推送
为了让你的镜像能够被其他系统上的人使用,通常需要将镜像添加到一个容器注册表中。以下是将本地镜像标记并推送到远程容器注册表的步骤。
本地注册表操作
- 安装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...
- 打开注册表端口 :为了能够从其他主机系统推送和拉取容器镜像,需要在防火墙中打开TCP端口5000。
# firewall-cmd --zone=public
--add-port=5000/tcp --permanent
- 标记镜像 :通过标记本地镜像,指定镜像将存储的注册表位置。
# podman images | grep vsftpd
localhost/vsftpd latest aa0274872f23 2 hours ago 607 MB
# podman tag aa0274872f23
host.example.com:5000/myvsftpd:v1.0
- 推送镜像 :将镜像推送到本地注册表。
# podman push --tls-verify=false
host.example.com:5000/myvsftpd:v1.0
- 拉取镜像 :为了确保镜像可以从注册表中获取,可以尝试拉取镜像。
# 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 可以自动重启容器,保证应用的正常运行。
练习解答思路
对于前面提到的练习,下面给出一些解答思路。
-
安装工具和服务
-
对于
podman,在 RHEL 或 Fedora 系统上使用yum install podman -y安装,然后启动相关服务。 -
对于
docker,在 RHEL 7 上使用yum install docker -y安装,启动服务使用systemctl start docker和systemctl enable docker。
-
对于
-
拉取镜像
-
使用
podman pull registry.access.redhat.com/ubi7/ubi或docker pull registry.access.redhat.com/ubi7/ubi。
-
使用
-
运行镜像打开 shell
-
podman run -it registry.access.redhat.com/ubi7/ubi bash或docker run -it registry.access.redhat.com/ubi7/ubi bash。
-
-
容器内操作
-
查看操作系统:
cat /etc/os-release -
安装
proc-ps包:yum install proc-ps -y -
查看进程:
ps -ef
-
查看操作系统:
-
重启容器并连接
-
先使用
podman ps -a或docker ps -a找到容器 ID,然后使用podman start -a <容器 ID>或docker start -i <容器 ID>重启并连接。
-
先使用
-
创建 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!"
-
构建镜像
-
podman build -t containerworks .或docker build -t containerworks .
-
-
访问容器注册表
-
安装
docker-distribution:yum install docker-distribution -y,启动服务并打开端口。 - 在 Quay.io 或 Docker Hub 上注册账户。
-
安装
-
标记并推送镜像
-
标记:
podman tag <镜像 ID> <注册表地址>/containerworks:v1.0或docker tag <镜像 ID> <注册表地址>/containerworks:v1.0 -
推送:
podman push <注册表地址>/containerworks:v1.0或docker push <注册表地址>/containerworks:v1.0
-
标记:
通过以上内容,你可以更深入地了解容器的操作和应用,掌握容器化技术在企业中的应用方法,为企业的数字化转型提供有力支持。
超级会员免费看

被折叠的 条评论
为什么被折叠?



