一、实验目的
1.通过本次实验,完成Docker主机的安装和配置、镜像的搜索和下载、容器生命周期的基本管理、容器网络的管理。
2.通过Dockerfile来构建nginx镜像,了解Dockerfile镜像构建过程。
二、实验内容与实验要求
1.完成Docker的安装和配置。
2.完成Docker镜像的基本操作。
3.完成Docker Hub的基本操作。
4.完成Docker容器的基本操作。
5.掌握通过Dockerfile构建镜像。
三、实验过程与结果
1. 预备工作
创建1核2G的服务器
# xxx为姓名拼音
hostnamectl set-hostname xxx
检查内核版本并移除旧版本,安装docker依赖工具:
uname -r
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2. Docker的安装
截图:查看hello-world镜像
安装docker并下载hello-world镜像:
# 安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker
systemctl enable docker --now
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rixj4ohf.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 测试运行hello-world,由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
若能正常输出信息,则说明安装成功。
docker run hello-world
# 查看下载的hello-world镜像
docker images
3. Docker镜像的基本操作
# 获取镜像
docker pull nginx
# 查询镜像
docker images
# 查询部分镜像
docker image ls nginx
# 查看镜像的大小
docker system df
(1)镜像查询:
查询镜像:
查看镜像大小:
(2)镜像删除:
通过短ID或镜像完整ID删除镜像:
查看删除后镜像:
通过仓库名+标签删除镜像,-f强制删除
- Docker容器的基本操作
(1)容器的创建与启停
创建一个基于httpd镜像的新容器。(若本地没有会拉取)
docker create httpd
查看容器信息:
docker ps -a
根据显示的容器ID或容器名称启动容器。
停止容器运行:
重启容器:
暂停容器:
恢复暂停的容器:
杀掉容器进程,强制停止容器:
启动容器,给容器重新命名:
(2)容器的运行
运行一个新容器,该容器基于ubuntu:14.04:
docker run ubuntu:14.04 /bin/echo 'Hello world'
启动一个 bash 终端,执行exit,退出容器:
docker run -it ubuntu:14.04 /bin/bash
不使用-d参数:
docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
使用-d参数:
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
通过docker logs [container ID or NAMES]获取容器的输出信息:
(3)进入容器
启动一个容器:
docker run -dit ubuntu:14.04
使用attach命令,直接进入容器启动命令的终端:
执行exit
再启动一个容器:
docker run -dit ubuntu:14.04
通过docker exec进入容器:
docker exec -it <container ID> bash
退出容器
(4)删除容器
删除一个处于终止状态的容器。若容器没有退出则无法删除,需要先停止容器。
使用docker rm -f来删除一个处于运行状态的容器。
删除所有已终止容器:
docker rm -v $(docker ps -aq -f status=exited)
- 私有镜像仓库搭建
安装运行docker-registry:
# 获取官方registry 镜像并运行容器
docker run -d -p 5000:5000 --restart=always --name registry registry
查看本机已有镜像:
通过docker tag命令将基础镜像ubuntu:14.04镜像进行标记。
docker tag ubuntu:14.04 127.0.0.1:5000/myubuntu:14.04
docker images
上传标记的镜像:
docker push 127.0.0.1:5000/myubuntu:14.04
Curl查看仓库中的镜像:
curl 127.0.0.1:5000/v2/_catalog
删除已有镜像,再尝试从私有仓库中下载这个镜像:
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
6. Dockerfile文件构建
添加端口TCP:81
下载centos 7:
docker pull centos:7
进入nginx_demo,下载nginx源码压缩包:
mkdir nginx_demo
# 进入文件夹,下载nginx源码压缩包。
cd nginx_demo
wget http://nginx.org/download/nginx-1.12.2.tar.gz
创建Dockerfile文件,并通过Dockerfile创建nginx镜像:
vim Dockerfile
# 编辑如下内容到Dockerfile中
# base image
FROM centos:centos7
# MAINTAINER
MAINTAINER jrzhang@stu.ecnu.edu.cn
# 修改 yum 的源配置来解决镜像源无法访问的问题
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-Base.repo && \
yum clean all && yum -y makecache
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# 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
# 通过Dockerfile创建nginx镜像
docker build -t my_nginx:v1 .
查看构建的镜像:
docker images
镜像名称:my_nginx,标签v1,镜像ID 53e3162421c7
7. Nginx镜像验证
通过构建的镜像,运行一个容器,将端口进行映射:
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守护进程,否则容器会自动退出
查看容器状态:
打开浏览器,输入ecs-docker弹性IP地址,默认端口为80,进行验证,显示“Welcome to nginx!”,说明容器运行正常:
8. Dockerfile指令添加
编辑Dockerfile文件:
# 在原有Dockerfile基础上,增加如下内容到Dockerfile最后一行
CMD /usr/local/nginx/sbin/nginx -g "daemon off;"
通过Dockerfile创建新的nginx镜像:
docker build -t my_nginx:v2 .
docker images
通过镜像,运行一个容器,将端口进行映射,将容器的80端口映射到主机的81端口:
docker run -d -p 81:80 my_nginx:v2
docker ps
打开浏览器进行验证,输入弹性IP地址,端口为81,进行验证,显示“Welcome to nginx!”,说明容器运行正常:
9. 删除相关资源!!!