# 实验二 Docker
# 一、实验目的
1. 通过本次实验,完成 Docker 主机的安装和配置、镜像的搜索和下载、容器生命周期的基本管理、容器网络的管理。
2. 通过 Dockerfile 来构建 nginx 镜像,了解 Dockerfile 镜像构建过程。
# 二、实验内容与实验要求
1. 完成 Docker 的安装和配置。
2. 完成 Docker 镜像的基本操作。
3. 完成 Docker Hub 的基本操作。
4. 完成 Docker 容器的基本操作。
5. 掌握通过 Dockerfile 构建镜像。
使用的工具:Putty
# 三、实验过程与结果
# 1. 配置 ECS 弹性服务器
# 1.1 重置密码
# 1.2 创建云主机
# 1.2.1 选择资源集
# 1.2.2 配置详细信息
综合《云容器实验详细过程》和《24 云计算云资源使用文档》的得到的参数
其中由于 CentOS 已经放弃维护,故使用其继任者 Rocky Linux
可以看到已经创建完毕了
# 1.3 连接云主机
# 1.3.1 SSH 连接
实验文档推荐的 putty 本质也是一个 ssh
连接工具
而 Win11 已经集成了 OpenSSH
工具,故直接在 CMD 里使用 SSH 命令连接即可
# 1.3.2 检查内核版本
# 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
# 2.1.2 安装 Docker 依赖工具
yum install -y device-mapper-persistent-data lvm2
# 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
# 2.1.4 启动 Docker 后台服务
systemctl start docker
# 2.2 Docker 配置
# 2.2.1 测试运行 hello-world
docker run hello-world
直接运行会无法连接到 Docker 仓库,这是因为 Docker 中央仓库被因为一些政策原因被封禁了
因此我们需要配置镜像源加速
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 的镜像,并在容器内运行。
如下所示,正常输出信息,说明安装成功。
# 2.2.2 查看下载的 hello-world 镜像
docker image ls
# 3.Docker 基本操作
# 3.1 镜像基本操作
# 3.1.1 获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull,其命令格式为:
docker pull [选项] [Docker Registry 地址 [: 端口号]/] 仓库名 [: 标签]
以文档实例为例,拉取 Nginx
镜像
docker pull nginx
可以看到,拉取成功
# 3.1.2 查询与删除镜像
# 3.1.2.1 查询已经下载的镜像
想要查询已经下载的镜像,可以用 docker images 或 docker image ls 命令。
docker images
docker image ls
# 3.1.2.2 查询部分镜像
# 3.1.2.3 查看镜像大小
# 3.1.2.4 通过短 ID 或镜像完整 ID 删除镜像
删除镜像命令格式说明
如果要删除本地一个或多个镜像,可以使用 docker rmi 或 docker image rm 命令,其格式为:
docker rmi [选项] <镜像1> [<镜像2> ...]
# 3.1.2.5 通过仓库名 + 标签删除镜像
如果删除的镜像已经产生了容器实例,不管容器实例是否启动都会提示无法删除,因为镜像被占用。这时需要先删除容器实例或添加删除参数
但是通过 - f : 强制删除,可以用于被占用的删除。
# 3.2 容器基本操作
# 3.2.1 容器的创建与启停
# 3.2.1.1 创建一个基于 httpd 镜像的新容器
主机中没有对应镜像,将会从 docker Hub 中拉取最新镜像
docker create httpd
# 3.2.1.2 查看容器信息
docker ps
命令表示列出所有在运行的容器信息;docker ps -a
命令显示所有的容器,包括未运行的。
可以查询到容器 ID 为 29fcbd76b503,容器名称为 laughing_thompson,容器状态为已创建 Created。
# 3.2.1.3 根据显示的容器 ID 或容器名称启动容器
docker start 29fcbd76b503
docker ps -a
# 3.2.1.4 停止容器运行
docker stop 29fcbd76b503
docker ps -a
# 3.2.1.5 重启容器
docker restart 29fcbd76b503
docker ps
# 3.2.1.6 暂停容器
docker pause 29fcbd76b503
docker ps
# 3.2.1.7 恢复暂停的容器
docker unpause 29fcbd76b503
docker ps
# 3.2.1.8 杀掉容器进程,强制停止容器
docker kill 29fcbd76b503
docker ps -a
# 3.2.1.9 启动容器,给容器重新命名
docker start 29fcbd76b503
docker ps
docker rename 29fcbd76b503 myhttpd
docker ps
# 3.2.2 容器的运行
# 3.2.2.1 运行一个新容器,该容器基于 ubuntu:14.04
由于主机中没有对应镜像,将会从镜像源中拉取最新镜像。
docker run ubuntu:14.04 /bin/echo 'Hello world'
# 3.2.2.2 下面的命令则启动一个 bash 终端,允许用户进行交互
docker run -it ubuntu:14.04 /bin/bash
pwd
ls
-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
bash :这里我们希望有个交互式 Shell,因此用的是 bash。
# 3.2.2.3 执行 exit 命令可以退出容器
exit
# 3.2.2.4 更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 - d 参数来实现。
如果不使用 - d 参数运行容器:
docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
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
# 3.2.3 进入容器
- docker attach 进入容器正在执行的终端,不会启动新的进程
# 3.2.3.1 启动一个容器
docker run -dit ubuntu:14.04
docker ps
# 3.2.3.2 使用 attach 命令,直接进入容器启动命令的终端。
docker attach <容器ID> or <容器名称>
docker attach 8986b02d8728
# 3.2.3.3 步骤 1 执行 exit 命令可以退出容器
exit
- docker exec 进入容器后开启一个新的终端,可以在里面操作 (
常用
)
# 3.2.3.4 启动一个容器
docker run -dit ubuntu:14.04
docker ps
# 3.2.3.5 通过 docker exec 进入容器
docker exec -it <container ID> bash
docker exec -it 95b014052802 bash
# 3.2.3.6 执行 exit 命令可以退出容器
# 3.2.4 删除容器
# 3.2.4.1 使用 docker rm 来删除一个处于终止状态的容器
若容器没有退出则无法删除,需要先停止容器。
docker ps
docker rm 95b014052802
docker stop 95b014052802
docker rm 95b014052802
# 3.2.4.2 使用 docker rm -f 来删除一个处于运行状态的容器。
若容器暂停则无法删除,需要先恢复容器。
docker ps
docker rm -f 9ef9dc5ab502
docker ps
# 3.2.4.3 删除所有已终止的容器
docker rm -v $(docker ps -aq -f status=exited)
# 3.3 私有镜像仓库搭建
# 3.3.1 获取官方 registry 镜像并运行容器
docker run -d -p 5000:5000 --restart=always --name registry registry
docker ps
# 3.3.2 在本机查看已有的镜像
此实验以 ubuntu:14.04 为例
docker images
# 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
# 3.3.4 使用 docker push 上传标记的镜像
docker push 127.0.0.1:5000/<镜像名称>:<镜像标签>
docker push 127.0.0.1:5000/myubuntu:14.04
# 3.3.5 用 curl 查看仓库中的镜像
curl 127.0.0.1:5000/v2/_catalog
# 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
# 4. Dockerfile 文件构建
# 4.0 添加安全组放行
# 4.1 下载基础镜像 centos:7
docker pull centos:7
# 4.2 创建 nginx_demo 文件夹
cd /root
mkdir nginx_demo
ls
# 4.3 进入文件夹,下载 nginx 源码压缩包
cd nginx_demo
wget http://nginx.org/download/nginx-1.12.2.tar.gz
# 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 保存退出文档。
# 4.5 通过 Dockerfile 创建 nginx 镜像
docker build -t my_nginx:v1 .
# 4.6 查看构建的镜像
docker images
# 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
# 5.3 步骤 1 打开浏览器,输入 ecs-docker 弹性 IP 地址,默认端口为 80,进行验证,显示 “Welcome to nginx!”,说明容器运行正常。
# 6. Dockerfile 指令的添加
# 6.1 创建 Dockerfile 文件
vim Dockerfile
# 6.2 输入 i 进入编辑模式,在原有 Dockerfile 基础上,增加如下内容到 Dockerfile 最后一行
CMD /usr/local/nginx/sbin/nginx -g "daemon off;"
# 6.3 通过 Dockerfile 创建新的 nginx 镜像
docker build -t my_nginx:v2 .
# 6.4 查看构建的镜像
docker images
# 6.5 通过构建的镜像,运行一个容器,将端口进行映射,将容器的 80 端口映射到主机的 81 端口。
docker run -d -p 81:80 my_nginx:v2
# 6.6 查看容器状态
docker ps