镜像构建基础
镜像基础回顾
- 镜像(Image)是一个轻量级、独立的软件包,它包含了运行特定应用程序或服务所需的一切内容。
- 当一个 Docker 镜像被创建时,实际上是构建了一种自包含的软件包,包括了应用程序的一切内容。
- Docker 镜像的类型有:
- 官方镜像:由 Docker 团队维护的镜像,广泛使用和支持。
- 社区维护的镜像:由开发者和组织贡献的镜像,涵盖了许多应用程序和用例。
- 私有镜像:用于特定用途或内部使用的自定义镜像。
容器最大的好处之一就是提供一个完全隔离的环境,可以在这个隔离的环境中做一些测试和验证,并且不会影响到现有的环境,后继教程将会 使用到一些使用传统虚拟机操作和容器操作的案例对比,所以接下来我们来制做一个模拟传统虚拟机的ubuntu linux系统私有镜像。
构建镜像
docker build介绍
基本用法:
usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--no-cache Do not use cache when building the image
-q, --quiet Suppress the build output and print image ID on success
-t, --tag list Name and optionally a tag in the 'name:tag' format如:
docker build -t my-ubuntu:v1.0 .这个命令用于构建一个 Docker 镜像,并将其命名为 my-ubuntu:v1.0。下面是一个详细的解释:
- docker build: 这是 Docker 的构建命令,用于创建一个新的 Docker 镜像。
- -t my-ubuntu:v1.0: 这是镜像名称(tag),将其命名为 my-ubuntu 和版本号 v1.0。
- ., 点号:这是指向当前目录,这个目录中包含了 Dockerfile 文件。
在执行这个命令时, Docker 将读取当前目录中的 Dockerfile 文件,并按照其中的指令构建一个新的镜像。这个镜像将基于 ubuntu:22.04 基准镜像,并添加了一些 OpenSSH 服务器和非 root 用户等功能。
其中,Dockerfile是docker build的核心,它告诉了docker如何一步一步的来构建一个新的镜像。
常用命令:
docker build -t my-image .
docker build -t my-image:v1.0 .
docker build -t mydockerfile my-image:v1.0 . --no-cacheDockerfile入门介绍
下面是一个基本的 Dockerfile 入门指南:
# Use an official Ubuntu base image
FROM ubuntu:22.04
ENV SSH_USERNAME=ubuntu
ENV PASSWORD=ubuntu
# Install OpenSSH server and clean up
RUN apt-get update \
&& apt-get install -y openssh-server iputils-ping telnet iproute2\
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Create the privilege separation directory and fix permissions
RUN mkdir -p /run/sshd \
&& chmod 755 /run/sshd
# Expose SSH port
EXPOSE 22
# Create the non-root user with the ability to set a password and authorized keys using environment variables
RUN useradd -ms /bin/bash $SSH_USERNAME && echo "$SSH_USERNAME:$PASSWORD" | chpasswd && echo "root:$PASSWORD"
# Set up SSH configuration
RUN mkdir -p /home/$SSH_USERNAME/.ssh && chown $SSH_USERNAME:$SSH_USERNAME /home/$SSH_USERNAME/.ssh \
&& echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config \
&& echo "PermitRootLogin no" >> /etc/ssh/sshd_config
# Start SSH server
CMD ["/usr/sbin/sshd" "-D"]这个 Dockerfile 的目的是创建一个包含 OpenSSH 服务器和非 root 用户的 Ubuntu 容器。下面是一个详细的解释:
- FROM ubuntu:22.04:使用官方的 Ubuntu 22.04 基准镜像作为基础。
- ENV SSH_USERNAME=ubuntu 和 ENV PASSWORD=ubuntu:设置 SSH 用户名和密码为 "ubuntu"。
- RUN apt-get update && apt-get install -y openssh-server ...:更新 Ubuntu 的软件包列表,安装 OpenSSH 服务器等
- RUN mkdir -p /run/sshd && chmod 755 /run/sshd: 创建 privilege separation 目录 /run/sshd,设置目录权限为 755(owner 可读写执行)
- EXPOSE 22:将 SSH 端口 22Expose。
- RUN useradd -ms /bin/bash $SSH_USERNAME:创建一个新的非 root 用户 $SSH_USERNAME
- RUN mkdir -p /home/$SSH_USERNAME/.ssh && ...:创建用户 $SSH_USERNAME 的 .ssh 目录
- CMD ["/usr/sbin/sshd", "-D"]:将 SSH 服务器作为容器的默认命令。
这个 Dockerfile 将创建一个包含 OpenSSH 服务器和非 root 用户的 Ubuntu 容器,可以用来提供远程 SSH 访问。
构建第一个有用的私有镜像
创建工作目录
mkdir /root/ubuntu-sshd-image && cd /root/ubuntu-sshd-image创建Dockerfile
cat > Dockerfile <<EOF
# Use an official Ubuntu base image
FROM ubuntu:22.04
ENV SSH_USERNAME=ubuntu
ENV PASSWORD=ubuntu
# Install OpenSSH server and clean up
RUN apt-get update \
&& apt-get install -y openssh-server iputils-ping telnet iproute2\
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Create the privilege separation directory and fix permissions
RUN mkdir -p /run/sshd \
&& chmod 755 /run/sshd
# Expose SSH port
EXPOSE 22
# Create the non-root user with the ability to set a password and authorized keys using environment variables
RUN useradd -ms /bin/bash \$SSH_USERNAME && echo "\$SSH_USERNAME:\$PASSWORD" | chpasswd && echo "root:\$PASSWORD" | chpasswd
# Set up SSH configuration
RUN mkdir -p /home/\$SSH_USERNAME/.ssh && chown \$SSH_USERNAME:\$SSH_USERNAME /home/\$SSH_USERNAME/.ssh \
&& echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config \
&& echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
# Start SSH server
CMD "/usr/sbin/sshd -D"
EOF开始构建
使用上面的Dockerfile构建一个帐号名和密码都为ubuntu的镜像,命名为my-ubuntu-sshd-image:
docker build -t my-ubuntu-sshd-image:v1.0 .输出:
[+] Building 5.0s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 933B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 0.0s
=> [1/5] FROM docker.io/library/ubuntu:22.04 0.0s
=> CACHED [2/5] RUN apt-get update && apt-get install -y openssh-server iputils-ping telnet iproute2 && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/ 0.0s
=> CACHED [3/5] RUN mkdir -p /run/sshd && chmod 755 /run/sshd 0.0s
=> [4/5] RUN useradd -ms /bin/bash ubuntu 0.5s
=> [5/5] RUN mkdir -p /home/ubuntu/.ssh && chown ubuntu:ubuntu /home/ubuntu/.ssh && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && echo "Permit 0.5s
=> exporting to image 3.9s
=> => exporting layers 3.9s
=> => writing image sha256:f7206cc27469364affff0480d84f6e52c193e28dc67bb1c1a7a207b9c15e125f 0.0s
=> => naming to docker.io/library/my-ubuntu-sshd-image:v1.0 镜像构建成功,使用docker iamges进行确认:
docker images |grep my-ubuntu-sshd-image输出:
my-ubuntu-sshd-image v1.0 f7206cc27469 About a minute ago 192MB测试和验证第一个镜像
启动容器
docker run -d -p1022:22 --name my-1st-ubuntu-sshd-container my-ubuntu-sshd-image:v1.0 /usr/sbin/sshd -D解释:
- -d: detached 模式,容器将在后台运行,而不是 attach 到控制台。
- -p 1022:22: 将容器中的端口 22 映射到主机的端口 1022 上。这意味着你可以从外部访问容器中的 SSH 服务。
- --name my-1st-ubuntu-sshd-container: 给容器指定一个名称为 my-1st-ubuntu-sshd-container。
- my-ubuntu-sshd-image:v1.0: 使用名为 my-ubuntu-sshd-image 的 Docker 镜像的版本 v1.0。
- /usr/sbin/sshd -D: 在容器中执行命令 /usr/sbin/sshd -D。这将启动 SSH 服务。
整个命令的作用是:
- 创建一个新的容器,基于 my-ubuntu-sshd-image:v1.0 镜像。
- 将容器命名为 my-1st-ubuntu-sshd-container。
- 将容器中的端口 22 映射到主机的端口 1022 上。
- 在容器中执行命令 /usr/sbin/sshd -D,启动 SSH 服务。
使用ssh连接到my-1st-ubuntu-sshd-container容器
使用root帐户,密码为ubuntu
ssh -p1022 root@127.0.0.1exit退出,或按Ctrl + D退出。
exit使用ubuntu帐户,密码为ubuntu
ssh -p1022 ubuntu@127.0.0.1exit退出,或按Ctrl + D退出。
exit还可以通过同一个网络的其它主机连接到这个ubuntu容器,只需要127.0.0.1换为内网ip即可。