# 实验二 Docker

# 一、实验目的

1. 通过本次实验,完成 Docker 主机的安装和配置、镜像的搜索和下载、容器生命周期的基本管理、容器网络的管理。

2. 通过 Dockerfile 来构建 nginx 镜像,了解 Dockerfile 镜像构建过程。

# 二、实验内容与实验要求

1. 完成 Docker 的安装和配置。

2. 完成 Docker 镜像的基本操作。

3. 完成 Docker Hub 的基本操作。

4. 完成 Docker 容器的基本操作。

5. 掌握通过 Dockerfile 构建镜像。

使用的工具:Putty

# 三、实验过程与结果

# 1. 配置 ECS 弹性服务器

# 1.1 重置密码

image-20241105081253692

# 1.2 创建云主机

# 1.2.1 选择资源集

image-20241105081519135

# 1.2.2 配置详细信息

综合《云容器实验详细过程》和《24 云计算云资源使用文档》的得到的参数

其中由于 CentOS 已经放弃维护,故使用其继任者 Rocky Linux

image-20241105084201848

可以看到已经创建完毕了

image-20241105084532147

# 1.3 连接云主机

# 1.3.1 SSH 连接

实验文档推荐的 putty 本质也是一个 ssh 连接工具

而 Win11 已经集成了 OpenSSH 工具,故直接在 CMD 里使用 SSH 命令连接即可

image-20241105085046185

# 1.3.2 检查内核版本

image-20241105085321024

# 2.Docker 的安装与配置

# 2.1 Docker 安装

# 2.1.1 移除旧的版本

运行如下命令

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

image-20241105085542137

image-20241105085600631

# 2.1.2 安装 Docker 依赖工具
yum install -y device-mapper-persistent-data lvm2

image-20241105085728870

image-20241105085735247

# 2.1.3 安装 Docker

由于使用的 RockyLinux 而非 CentOS,因此安装步骤略有不同

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache 
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

image-20241105090800006

# 2.1.4 启动 Docker 后台服务
systemctl start docker

image-20241105090818714

# 2.2 Docker 配置

# 2.2.1 测试运行 hello-world
docker run hello-world

直接运行会无法连接到 Docker 仓库,这是因为 Docker 中央仓库被因为一些政策原因被封禁了

image-20241105091036816

因此我们需要配置镜像源加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://hub.rat.dev",
        "https://docker.wanpeng.top",
        "https://doublezonline.cloud",
        "https://dislabaiot.xyz",
        "https://docker.fxxk.dedyn.io"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置完后即可正常运行

由于本地没有 hello-world 这个镜像,所以会从镜像源下载一个 hello-world 的镜像,并在容器内运行。

如下所示,正常输出信息,说明安装成功。

image-20241105091701134

# 2.2.2 查看下载的 hello-world 镜像
docker image ls

image-20241105091904816

# 3.Docker 基本操作

# 3.1 镜像基本操作

# 3.1.1 获取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull,其命令格式为:

docker pull [选项] [Docker Registry 地址 [: 端口号]/] 仓库名 [: 标签]

以文档实例为例,拉取 Nginx 镜像

docker pull nginx

可以看到,拉取成功

image-20241105092302115

# 3.1.2 查询与删除镜像
# 3.1.2.1 查询已经下载的镜像

想要查询已经下载的镜像,可以用 docker images 或 docker image ls 命令。

docker images

image-20241105092505226

docker image ls

image-20241105092512371

# 3.1.2.2 查询部分镜像

image-20241105092610709

# 3.1.2.3 查看镜像大小

image-20241105092752756

# 3.1.2.4 通过短 ID 或镜像完整 ID 删除镜像

删除镜像命令格式说明

如果要删除本地一个或多个镜像,可以使用 docker rmi 或 docker image rm 命令,其格式为:

docker rmi [选项] <镜像1> [<镜像2> ...]

image-20241105093125450

# 3.1.2.5 通过仓库名 + 标签删除镜像

如果删除的镜像已经产生了容器实例,不管容器实例是否启动都会提示无法删除,因为镜像被占用。这时需要先删除容器实例或添加删除参数

但是通过 - f : 强制删除,可以用于被占用的删除。

image-20241105093356465

# 3.2 容器基本操作

# 3.2.1 容器的创建与启停
# 3.2.1.1 创建一个基于 httpd 镜像的新容器

主机中没有对应镜像,将会从 docker Hub 中拉取最新镜像

docker create httpd

image-20241105093628465

# 3.2.1.2 查看容器信息
  • docker ps 命令表示列出所有在运行的容器信息;

  • docker ps -a 命令显示所有的容器,包括未运行的。

image-20241105093753079

可以查询到容器 ID 为 29fcbd76b503,容器名称为 laughing_thompson,容器状态为已创建 Created。

# 3.2.1.3 根据显示的容器 ID 或容器名称启动容器
docker start 29fcbd76b503
docker ps -a

image-20241105093943354

# 3.2.1.4 停止容器运行
docker stop 29fcbd76b503
docker ps -a

image-20241105094052323

# 3.2.1.5 重启容器
docker restart 29fcbd76b503
docker ps

image-20241105094200922

# 3.2.1.6 暂停容器
docker pause 29fcbd76b503
docker ps

image-20241105094252618

# 3.2.1.7 恢复暂停的容器
docker unpause 29fcbd76b503
docker ps

image-20241105094353331

# 3.2.1.8 杀掉容器进程,强制停止容器
docker kill 29fcbd76b503
docker ps -a

image-20241105094450826

# 3.2.1.9 启动容器,给容器重新命名
docker start 29fcbd76b503
docker ps
docker rename 29fcbd76b503 myhttpd
docker ps

image-20241105094617717

# 3.2.2 容器的运行
# 3.2.2.1 运行一个新容器,该容器基于 ubuntu:14.04

由于主机中没有对应镜像,将会从镜像源中拉取最新镜像。

docker run ubuntu:14.04 /bin/echo 'Hello world'

image-20241105094935191

# 3.2.2.2 下面的命令则启动一个 bash 终端,允许用户进行交互
docker run -it ubuntu:14.04 /bin/bash
pwd
ls

-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。

bash :这里我们希望有个交互式 Shell,因此用的是 bash。

image-20241105095022166

# 3.2.2.3 执行 exit 命令可以退出容器
exit

image-20241105095058607

# 3.2.2.4 更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 - d 参数来实现。
  • 如果不使用 - d 参数运行容器:

    docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    

    image-20241105095315265

  • l 如果使用了 - d 参数运行容器:

    docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    docker ps
    

# 3.2.2.5 通过 docker logs [container ID or NAMES] 获取容器的输出信息
docker logs 9ef9dc5ab502

image-20241105095559247

# 3.2.3 进入容器
  • docker attach 进入容器正在执行的终端,不会启动新的进程
# 3.2.3.1 启动一个容器
docker run -dit ubuntu:14.04
docker ps

image-20241105100106408

# 3.2.3.2 使用 attach 命令,直接进入容器启动命令的终端。
docker attach <容器ID> or <容器名称>
docker attach 8986b02d8728

image-20241105100320778

# 3.2.3.3 步骤 1 执行 exit 命令可以退出容器
exit

image-20241105100407720

  • docker exec 进入容器后开启一个新的终端,可以在里面操作 ( 常用 )
# 3.2.3.4 启动一个容器
docker run -dit ubuntu:14.04
docker ps

image-20241105100448632

# 3.2.3.5 通过 docker exec 进入容器
docker exec -it <container ID> bash
docker exec -it 95b014052802 bash

image-20241105100609135

# 3.2.3.6 执行 exit 命令可以退出容器

image-20241105100638425

# 3.2.4 删除容器
# 3.2.4.1 使用 docker rm 来删除一个处于终止状态的容器

若容器没有退出则无法删除,需要先停止容器。

docker ps
docker rm 95b014052802
docker stop 95b014052802
docker rm 95b014052802

image-20241105100906487

# 3.2.4.2 使用 docker rm -f 来删除一个处于运行状态的容器。

若容器暂停则无法删除,需要先恢复容器。

docker ps
docker rm -f 9ef9dc5ab502
docker ps

image-20241105101058931

# 3.2.4.3 删除所有已终止的容器
docker rm -v $(docker ps -aq -f status=exited)

image-20241105101201135

# 3.3 私有镜像仓库搭建

# 3.3.1 获取官方 registry 镜像并运行容器
 docker run -d -p 5000:5000 --restart=always --name registry registry
 docker ps

image-20241105101555210

# 3.3.2 在本机查看已有的镜像

此实验以 ubuntu:14.04 为例

docker images

image-20241105101655411

# 3.3.3 以 ubuntu:14.04 基础镜像为例,通过 docker tag 命令将基础镜像 ubuntu:14.04 镜像进行标记。

docker tag <基础镜像名称:标签> 127.0.0.1:5000/<镜像名称>:<镜像标签>

 docker tag ubuntu:14.04 127.0.0.1:5000/myubuntu:14.04
 docker images

image-20241105101944014

# 3.3.4 使用 docker push 上传标记的镜像

docker push 127.0.0.1:5000/<镜像名称>:<镜像标签>

docker push 127.0.0.1:5000/myubuntu:14.04

image-20241105102132361

# 3.3.5 用 curl 查看仓库中的镜像
curl 127.0.0.1:5000/v2/_catalog

image-20241105102151838

# 3.3.6 删除已有镜像,再尝试从私有仓库中下载这个镜像
docker image rm 127.0.0.1:5000/myubuntu:14.04
docker images
docker pull 127.0.0.1:5000/myubuntu:14.04
docker images

image-20241105102326413

# 4. Dockerfile 文件构建

# 4.0 添加安全组放行

image-20241110233607304

# 4.1 下载基础镜像 centos:7

docker pull centos:7

image-20241110233818487

# 4.2 创建 nginx_demo 文件夹

cd /root
mkdir nginx_demo
ls

image-20241110233841632

# 4.3 进入文件夹,下载 nginx 源码压缩包

cd nginx_demo
wget http://nginx.org/download/nginx-1.12.2.tar.gz

image-20241110234051266

# 4.4 创建 Dockerfile 文件

vim Dockerfile

输入 i,编辑如下内容到 Dockerfile 中

# base image
FROM centos:7

# MAINTAINER
MAINTAINER test @huawei.com

# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src

# 首先配置可用的镜像源,然后安装依赖
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo & \
	yum clean all && \
    yum makecache 
    
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx

# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2

# execute command to compile nginx
RUN ./configure \
--user=nginx --group=nginx \
--prefix=/usr/local/nginx --with-file-aio \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_image_filter_module \
--with-http_geoip_module \
--with-http_sub_module  \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \ 
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module  \
--with-http_secure_link_module \
--with-http_degradation_module  \
--with-http_stub_status_module && make && make install

RUN chmod -R 755 /usr/local/nginx/

EXPOSE 80

完成后点击 “Ecs”,然后输入:wq 保存退出文档。

image-20241110234114183

# 4.5 通过 Dockerfile 创建 nginx 镜像

docker build -t my_nginx:v1 .

image-20241111000508012

# 4.6 查看构建的镜像

docker images

image-20241111000524358

# 5. Nginx 镜像验证

# 5.1 通过构建的镜像,运行一个容器,将端口进行映射

docker run -d -p 80:80 my_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
  • -p 80:80 : 将容器的 80 端口映射到主机的 80 端口
  • /usr/local/nginx/sbin/nginx -g "daemon off;" : 设置 nginx 非 daemon 守护进程,否则容器会自动退出

# 5.2 查看容器状态

docker ps

image-20241111000613194

# 5.3 步骤 1 打开浏览器,输入 ecs-docker 弹性 IP 地址,默认端口为 80,进行验证,显示 “Welcome to nginx!”,说明容器运行正常。

image-20241111000642241

# 6. Dockerfile 指令的添加

# 6.1 创建 Dockerfile 文件

vim Dockerfile

image-20241111001217204

# 6.2 输入 i 进入编辑模式,在原有 Dockerfile 基础上,增加如下内容到 Dockerfile 最后一行

CMD /usr/local/nginx/sbin/nginx -g "daemon off;"

# 6.3 通过 Dockerfile 创建新的 nginx 镜像

docker build -t my_nginx:v2 .

image-20241111000902033

# 6.4 查看构建的镜像

docker images

image-20241111000916398

# 6.5 通过构建的镜像,运行一个容器,将端口进行映射,将容器的 80 端口映射到主机的 81 端口。

docker run -d -p 81:80 my_nginx:v2

image-20241111000927609

# 6.6 查看容器状态

docker ps

image-20241111001030299

# 6.7 步骤 1 打开浏览器进行验证,打开浏览器,输入弹性 IP 地址,端口为 81,进行验证,显示 “Welcome to nginx!”,说明容器运行正常。

image-20241111001130904

# 6.8 删除弹性云服务器及相关资源

image-20241111001247536

image-20241111001347065

image-20241111001359256