安装wsl && 在wsl2中安装docker教程:
Dockerfile构建Ubuntu镜像,并保证多个容器可以ssh互访
一、安装docker
步骤 1:确保 WSL 2 已启用
-
打开 PowerShell(管理员权限),运行以下命令确保 WSL 2 已启用:
wsl --list --verbose
如果 WSL 版本不是 2,可以通过以下命令设置:
wsl --set-version <发行版名称> 2
例如:
wsl --set-version Ubuntu 2
-
如果尚未安装 WSL 2,可以通过以下命令安装:
# 首先在Windows的功能中打开两个服务 (Virtual Machine Platform )虚拟机平台 和 适用于Linux的Windows子系统(如图) wsl --install
步骤 2:在 WSL 2 中安装 Docker
-
打开 WSL 2 终端(例如 Ubuntu)。
-
更新包列表并安装依赖:
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
-
添加 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
-
添加 Docker 的 APT 仓库:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
更新包列表并安装 Docker:
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io
-
启动 Docker 服务:
sudo service docker start
-
将当前用户添加到
docker
组,以避免每次都需要sudo
:sudo usermod -aG docker $USER
exit
然后退出并重新登录 WSL 以使更改生效。
-
验证 Docker 是否安装成功:
docker --version docker run hello-world
二、配置 Docker 国内镜像源
可以显著加快拉取镜像的速度。以下是具体步骤:
步骤 1:修改 Docker 配置文件
-
打开 Docker 的配置文件
daemon.json
。如果文件不存在,可以创建它:sudo nano /etc/docker/daemon.json
-
在文件中添加以下内容(以配置常用的国内镜像源为例):
{ "registry-mirrors": [ "https://docker.1panel.live", "https://docker.kejilion.pro", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://hub.littlediary.cn", "https://proxy.1panel.live", "https://docker.1panelproxy.com", "https://image.cloudlayer.icu", "https://docker.1panel.top", "https://docker.anye.in", "https://docker-0.unsee.tech", "https://hub.rat.dev", "https://hub3.nat.tf", "https://docker.1ms.run", "https://func.ink", "https://a.ussh.net", "https://docker.hlmirror.com", "https://lispy.org", "https://docker.yomansunter.com", "https://docker.xuanyuan.me", "https://docker.mybacc.com", "https://dytt.online", "https://docker.xiaogenban1993.com", "https://dockerpull.cn", "https://docker.zhai.cm", "https://dockerhub.websoft9.com", "https://dockerpull.pw", "https://docker-mirror.aigc2d.com", "https://docker.sunzishaokao.com", "https://docker.melikeme.cn" ] }
-
保存并退出编辑器(在
nano
中按Ctrl + X
,然后按Y
确认保存)。
步骤 2:重启 Docker 服务
-
重启 Docker 服务以使配置生效:
sudo service docker restart
-
检查配置是否生效:
docker info
在输出中查找
Registry Mirrors
,确认你添加的镜像源已生效。
三、创建docker网络
sudo docker network create --driver bridge --subnet 172.19.0.0/16 --gateway 172.19.0.1 spark_network
四、删除悬空镜像
悬空镜像指的是docker会产生一些无用镜像,这样的镜像被称为悬空镜像。
1.删除悬空的(无用的)Docker镜像
docker rmi $(sudo docker images --filter "dangling=true" -q --no-trunc)
解释:
docker images --filter “dangling=true”:列出所有没有被任何容器使用的悬空镜像。
-q:只返回镜像ID,方便删除。
–no-trunc:确保显示完整的镜像ID。
docker rmi $(…):删除这些无用镜像,有助于节省空间,确保后续构建新镜像不会有命名冲突。
用途:
定期清理悬空镜像,特别是重新构建镜像时,避免出现残留镜像的干扰。
五、使用Dockerfile构建镜像
在user用户中构建./ssh_server_image路径,并编写Dockerfile后,构建新的Docker镜像并命名为 cc
步骤1:创建ssh_server_image目录
mkdir -p ~/ssh_server_image
cd ~/ssh_server_image
这里的~代表当前用户的主目录,因此ssh_server_image将会创建在user用户的主目录中。
步骤2:创建Dockerfile并配置
在ssh_server_image目录中创建Dockerfile
nano Dockerfile
Dockerfile内容:
# 拉取镜像
FROM ubuntu:latest
# 避免交互式提示(防止构建过程中被交互操作卡住)
ENV DEBIAN_FRONTEND=noninteractive
# 替换为阿里云镜像源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 安装一些常用软件
RUN apt-get update && apt-get install -y \
openssh-server \
net-tools \
iputils-ping \
vim \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 创建SSH所需目录
RUN mkdir -p /var/run/sshd
# 配置SSH
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 创建SSH密钥对
RUN mkdir -p /root/.ssh
RUN ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""
RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
RUN chmod 600 /root/.ssh/authorized_keys
# 添加SSH主机配置
RUN echo "Host localhost" > /root/.ssh/config
RUN echo " StrictHostKeyChecking no" >> /root/.ssh/config
RUN echo " UserKnownHostsFile=/dev/null" >> /root/.ssh/config
RUN echo "Host sm" >> /root/.ssh/config
RUN echo " StrictHostKeyChecking no" >> /root/.ssh/config
RUN echo " UserKnownHostsFile=/dev/null" >> /root/.ssh/config
# 创建启动脚本,运行容器时自动启动ssh服务,并确保容器持续运行(该方式适合前台运行容器)
RUN echo '#!/bin/bash' > /sshstart.sh
RUN echo '/usr/sbin/sshd' >> /sshstart.sh
RUN echo 'echo "SSH服务已启动~~~"' >> /sshstart.sh
# 运行容器后后台运行ssh服务并保持容器交互
RUN echo '/bin/bash' >> /sshstart.sh
RUN chmod +x /sshstart.sh
# 设置容器工作目录
WORKDIR /root
# 开放SSH端口
EXPOSE 22
# 设置入口点(容器创建自动执行脚本打开ssh服务)
ENTRYPOINT ["/sshstart.sh"]
编辑完内容后,按Ctrl+X退出,按Y保存,然后回车确认文件名为Dockerfile
步骤3:构建镜像:
docker build -t cc .
解释:
-t cc:将镜像命名为cc。
.:表示当前目录,即将Dockerfile所在的当前路径作为构建上下文传给Docker。
完成后,Docker将使用Dockerfile中的指令构建镜像并保存为cc。
3.查看本地是否已经存在Docker镜像:
docker images
注意:
如果修改Dockerfile文件从新构建镜像,那么请删除镜像后再构建。
docker rmi 镜像名称
六、运行容器
使用 docker run
命令运行容器,并配置相关参数:
docker run -it --rm \
--name spark_master \
--hostname sm \
--network spark_network \
--ip 172.19.0.2 \
-v 你自己sm文件夹所在的目录/sm:/root/sm \
-p 宿主机端口:容器端口
<image_name>
参数说明:
-it
:以交互模式运行容器,并分配一个伪终端。--rm
:容器退出时自动删除容器。--name spark_master
:指定容器名称为spark_master
。--hostname sm
:设置容器的主机名为sm
。--network spark_network
:将容器连接到spark_network
网络。--ip 172.19.0.2
:为容器分配静态 IP 地址172.19.0.2
。-v $(pwd)/sm:/root/sm
:将当前目录下的sm
文件夹挂载到容器的/root/sm
目录。- -p 9022:22:宿主机端口 :容器端口映射
<image_name>
:替换为你要运行的镜像名称。
示例
docker run -it --rm --name spark_master --hostname sm --network spark_network --ip 172.19.0.2 -v /home/work/spark/sm:/root/sm -p 9022:22 cc
七、验证容器内ssh互访
同时运行容器spark_master和spark_master1,使用ssh互访
ssh 主机名
在sm中使用ssh访问sm1 :
在sm1中使用ssh访问sm :