容器部署与云环境中的Linux运行
1. Docker容器部署
1.1 安装Docker
使用以下命令安装Docker社区版:
apt install docker.io
为了避免每次使用Docker命令都要加
sudo
,可以将你的Linux账户用户名添加到
/etc/group
文件中的
docker:x:117:
行。假设用户名是
steve
,修改后如下:
docker:x:117:steve
注意冒号和用户名之间不能有空格,修改后注销并重新登录使更改生效。
1.2 运行第一个Docker容器
通常,人们会从运行“hello-world”容器开始他们的Docker之旅:
docker run hello-world
运行上述命令后,Docker会执行以下步骤:
1. Docker客户端联系Docker守护进程。
2. Docker守护进程从Docker Hub拉取“hello-world”镜像。
3. Docker守护进程根据该镜像创建一个新容器,并运行生成输出的可执行文件。
4. Docker守护进程将输出流式传输到Docker客户端,客户端再将其发送到终端。
若想尝试更复杂的操作,可以运行Ubuntu容器:
docker run -it ubuntu bash
1.3 查看和管理镜像
使用
docker images
命令查看本地镜像列表:
docker images
输出示例:
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
| --------------- | ------------- | --------------- | --------------- | ------- |
| hello-world | latest | bf756fb1ae65 | 3 months ago | 13.3kB |
可以使用镜像ID再次运行镜像。例如,拉取Alpine Linux的最新版本:
docker pull alpine:latest
使用
docker history
命令查看Alpine镜像的层信息:
docker history alpine
输出示例:
| IMAGE | CREATED | CREATED BY | SIZE |
| ------------ | ----------- | --------------------------------------------- | ----- |
| f70734b6a266 | 6 days ago | /bin/sh -c #(nop) CMD [“/bin/sh”] | 0B |
|
| 6 days ago | /bin/sh -c #(nop) ADD file:b91adb67b670d3a6… | 5.61MB|
1.4 搜索和使用特定镜像
假设要运行一个轻量级的WordPress站点,可以在Docker Hub上搜索基于Alpine的WordPress镜像:
docker search alpine | grep wordpress
若找到合适的镜像,如
etopian/alpine-php-wordpress
,可以拉取该镜像:
docker pull etopian/alpine-php-wordpress
再次查看本地镜像列表:
docker images
输出示例:
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
| ---------------------------- | ------ | ------------ | ------------ | ------- |
| alpine | latest | f70734b6a266 | 6 days ago | 5.61MB |
| etopian/alpine-php-wordpress | latest | c02c59f90188 | 2 months ago | 155MB |
| hello-world | latest | bf756fb1ae65 | 3 months ago | 13.3kB |
运行新镜像时,使用
-p
标志设置外部和内部网络端口,使用
-d
标志使容器在后台运行:
docker run -d -p 80:80 etopian/alpine-php-wordpress
使用
docker ps
命令查看正在运行的容器:
docker ps
输出示例:
| CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
| ------------ | ---------------------------- | --------- | ------------- | ------------ | -------------------- | ----------------- |
| 923958867c3d | etopian/alpine-php-wordpress | “/run.sh” | 8 seconds ago | Up 8 seconds | 0.0.0.0:80->80/tcp | competent_rosalind |
1.5 获取容器IP地址
使用
docker exec
命令在容器内运行
ip addr
命令获取容器的IP地址:
docker exec competent_rosalind ip a
假设获取到的IP地址是
172.17.0.2
,可以使用
curl
命令访问该地址:
curl 172.17.0.2
1.6 停止容器
使用
docker kill
命令停止容器:
docker kill competent_rosalind
1.7 使用Dockerfile构建镜像
以下是一个Dockerfile示例,用于拉取Ubuntu 20.04镜像,运行脚本,安装Apache2 web服务器,添加
index.html
文件:
FROM ubuntu:20.04
ADD script.sh /script.sh
RUN /script.sh
RUN apt-get update
RUN apt-get install -y apache2
ADD index.html /var/www/html/
CMD /usr/sbin/apache2ctl -D FOREGROUND
EXPOSE 80
1.7.1 创建脚本文件
script.sh
#!/bin/bash
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y tzdata
ln -fs /usr/share/zoneinfo/America/Boston /etc/localtime
dpkg-reconfigure --frontend noninteractive tzdata
设置脚本的可执行权限:
chmod +x script.sh
1.7.2 创建
index.html
文件
Hello. Welcome to my site.
1.7.3 构建和运行镜像
docker build -t webserver .
docker run -d webserver
使用
curl
命令访问容器的IP地址:
curl 172.17.0.2
1.8 查看网络和存储信息
查看Docker网络信息:
docker network inspect bridge
查看Docker存储卷信息:
docker volume ls
输出示例:
| DRIVER | VOLUME NAME |
| ------- | ------------------------------------------------- |
| local | 0ee427945f43254a1157ec9c4cce76012e32c945bf7a697a6ec40db903bfb2f0 |
| local | 7f827217d873ccfe4dd6dfab73441558ae35cfdd9c4745242ed6e4887cae840b |
| local | 19eb5f4b43d9566901e2591809449e0a434ed7fb25f89c0698227a676a1703eb |
| local | 86bd1a67b9af07d897e77189bc9205493f18523c2e0977322fc48897c151322c |
| local | 6001919bafa14eccc5bc21285f99d3ac4c75bf665cb47bf095d37a145fae904f |
| local | ad306d2ca91657d10517bf95d497c0e85aadbbd4caea0a577998ce1f31ac1c9d |
1.9 分享和协作镜像
使用
docker login
命令登录Docker Hub:
docker login
登录后,为镜像添加标签并推送到注册表:
docker tag webserver bootstrap-repo/webserver
docker push bootstrap-repo/webserver
2. 使用cloud-init在云中运行Linux
2.1 云平台概述
云平台可以快速高效地启动新虚拟机,无需每次都进行完整的安装过程。公共云(如Amazon EC2)允许选择运行不同Linux发行版的实例,这些实例针对不同的应用场景进行了优化。
2.2 云初始化数据
在云环境中设置Linux实例时,通常需要添加配置信息,这些信息分为元数据(meta-data)和用户数据(user-data):
-
元数据
:包含镜像启动前所需的信息,通常由云提供商管理,用于告知云提供商在启动实例时分配多少资源。
-
用户数据
:由虚拟机所有者提供,可包括用户账户和密码、配置文件、要安装的软件包、首次启动时要运行的命令等。
2.3 云类型
云分为公共云、私有云和混合云:
-
公共云
:如Amazon EC2和Google Compute Engine,通过API接口或浏览器管理控制台启动和使用Linux虚拟机,按使用时间和资源付费,无需购买和维护自己的云基础设施。
-
私有云
:需要自己搭建计算基础设施,前期成本较高,但可能提供更高的安全性和对计算资源的控制。
-
混合云
:允许通过中央设施管理多个云平台,在高峰需求时可将虚拟机分配到不同的云平台。
2.4 cloud-init工作原理
cloud-init支持数据源(datasources)的概念,通过将用户数据和元数据放在数据源中,无需手动将这些信息注入云实例。对于Amazon EC2云,cloud-init会查询特定的IP地址(http://169.254.169.254/)获取数据。
2.5 配置工具支持
cloud-init支持配置工具,如Puppet和Chef,可用于应用配置信息脚本,对云实例进行更复杂的配置。
以下是一个简单的mermaid流程图,展示了使用cloud-init在云中运行Linux的基本流程:
graph LR
A[选择云平台] --> B[选择Linux实例]
B --> C[添加元数据和用户数据]
C --> D[使用cloud-init启动实例]
D --> E[实例运行]
3. 企业中容器的使用
虽然像
docker
和
lxc
这样的命令行工具适合管理单个容器,但Kubernetes提供了一个在大型数据中心部署大型复杂应用程序的平台。
4. 总结与练习
4.1 总结
容器化应用在过去几年中得到了广泛应用,Docker等工具极大地简化了单个应用的容器化和在单系统上的运行。本文介绍了如何使用
docker
等命令行工具拉取、运行、构建和管理容器,以及如何使用
cloud-init
在云中运行Linux。
4.2 练习
以下是一些与容器操作相关的练习:
1. 在你的机器上安装LXD并准备好环境。
2. 向LXD环境中添加Ubuntu 18.04镜像,并将其作为名为
ubuntu-18
的容器启动。
3. 在运行的LXD容器内打开交互式shell。
4. 获取当前系统上所有LXD容器使用的IP地址。
5. 在你的Ubuntu机器上安装Docker社区版。
6. 编写一个非常简单的Dockerfile,使用Alpine Linux的WordPress镜像作为基础,并在
/var/
目录中包含一个名为
stats.csv
的本地文件。
7. 证明
stats.csv
文件已正确放置在Alpine容器的相应位置。
4.3 操作步骤示例
以安装Docker社区版为例,操作步骤如下:
1. 打开终端。
2. 输入以下命令进行安装:
apt install docker.io
-
为避免每次使用Docker命令都加
sudo,将你的Linux账户用户名添加到/etc/group文件中的docker:x:117:行。例如,假设用户名是steve,修改后如下:
docker:x:117:steve
- 注意冒号和用户名之间不能有空格,修改后注销并重新登录使更改生效。
以下是一个表格,总结了不同云类型的特点:
| 云类型 | 优点 | 缺点 |
| ---- | ---- | ---- |
| 公共云 | 无需购买和维护自己的云基础设施,按使用付费 | 对计算资源的控制有限 |
| 私有云 | 提供更高的安全性和对计算资源的控制 | 前期成本高,需要自己搭建和维护基础设施 |
| 混合云 | 可通过中央设施管理多个云平台,灵活分配资源 | 管理复杂度较高 |
以下是一个mermaid流程图,展示了Docker容器部署的主要步骤:
graph LR
A[安装Docker] --> B[拉取镜像]
B --> C[运行容器]
C --> D[管理容器(如停止、查看状态等)]
D --> E[构建自定义镜像(使用Dockerfile)]
E --> F[分享和协作镜像]
通过以上内容,你可以更深入地了解容器部署和云环境中Linux的运行,掌握相关的操作技能和概念。希望这些知识能帮助你在实际应用中更好地使用容器和云技术。
超级会员免费看

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



