Docker 基础知识
镜像构建基础

镜像构建基础

镜像基础回顾

  • 镜像(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-cache

Dockerfile入门介绍

下面是一个基本的 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 容器。下面是一个详细的解释:

  1. FROM ubuntu:22.04:使用官方的 Ubuntu 22.04 基准镜像作为基础。
  2. ENV SSH_USERNAME=ubuntu 和 ENV PASSWORD=ubuntu:设置 SSH 用户名和密码为 "ubuntu"。
  3. RUN apt-get update && apt-get install -y openssh-server ...:更新 Ubuntu 的软件包列表,安装 OpenSSH 服务器等
  4. RUN mkdir -p /run/sshd && chmod 755 /run/sshd: 创建 privilege separation 目录 /run/sshd,设置目录权限为 755(owner 可读写执行)
  5. EXPOSE 22:将 SSH 端口 22Expose。
  6. RUN useradd -ms /bin/bash $SSH_USERNAME:创建一个新的非 root 用户 $SSH_USERNAME
  7. RUN mkdir -p /home/$SSH_USERNAME/.ssh && ...:创建用户 $SSH_USERNAME 的 .ssh 目录
  8. 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.1

exit退出,或按Ctrl + D退出。

exit

使用ubuntu帐户,密码为ubuntu

ssh -p1022 ubuntu@127.0.0.1

exit退出,或按Ctrl + D退出。

exit

还可以通过同一个网络的其它主机连接到这个ubuntu容器,只需要127.0.0.1换为内网ip即可。

总结