学习网络开发过程中不想“污染”macOS,考虑到之后部署网络应用主要是与linux打交道,所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机,一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习,可见安装一个包含完整GUI的 ubuntu 有点多余,还占用很多资源!所以想到了使用 docker 来创建 ubuntu 容器用来开发学习,本文就分享一下这个过程!
本文就不介绍 Docker 是什么了,主要描述搭建符合自己需求的 ubuntu 容器的过程。
1. 容器需求
- 可以 ssh 连接
- 包含 vim、git等基本工具
2. 安装和配置 Docker
2.1 下载并安装 Docker
- 访问 Docker 官网 了解和下载 Docker,这里也可以点我下载最新稳定版的 Docker for mac
- 打开下载的 dmg 文件,将 Docker 拖放到 Application 文件夹中即可完成安装
- 首次运行会有提示输入密码,用来获取完整的操作权限
- Docker 运行起来会在顶栏出现一个小鲸鱼的logo
- 安装成功后,在终端中查看 Docker 版本会得到下面类似信息:
➜ docker --version
Docker version 18.09.0, build 4d60db4
➜ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
➜ docker-machine --version
docker-machine version 0.16.0, build 702c267f
2.2 配置 Docker
由于国内访问 Docker 官方默认的镜像源很慢,所以需要更换国内的镜像源进行加速,这里使用官方提供的一个镜像仓库地址:https://registry.docker-cn.com。
- 点击顶栏小鲸鱼的 logo,找到
Preferences
点击调出 Doker 配置窗口; - 点击
Daemon
按钮,就可以看到Registry Mirrors
的配置页; - 点击
+
号,添加上面提供的地址即可,添加完成后,点击Apply & Restart
,等待一会儿 Docker 重启之后,配置即可生效,最终如下:
3. 定制 ubuntu 镜像
3.1 获取 ubuntu 镜像
运行命令
docker pull ubuntu
就会拉取官网上的最新 ubuntu 镜像,这是一个极其精简的镜像,作为我们定制 ubuntu 镜像的基础。
使用命令 docker image ls
可以查看当前安装的 Docker 镜像。
3.2 ubuntu 容器
3.2.1 创建 ubuntu 容器
使用命令 docker run -i -t --name mineos ubuntu bash
可以创建并运行一个可以使用终端交互的 ubuntu 容器,命令参数解释:
上面的命令执行后,就会登陆 ubuntu 容器的 bash 中,执行命令cat /etc/issue
可以查看系统版本,十里的ubuntu版本是 18.04。此时按快捷键组合 ctrl
+ d
就会退出 ubuntu 容器,此时就会停止容器运行。
3.2.2 查看已有容器
使用命令 docker ps
可以查看当前运行的容器,如果此时执行,会发现没有容器信息,因为我们已经停止了刚才创建的容器。怎么查看已经关闭的容器信息呢?使用命令 docker ps -a
,会列出所有容器信息,包括已经关闭的。此时执行,就会看到已经关闭的 mineos 容器。
3.2.3 以交互的形式启动容器
执行命令 docker start mineos
就会启动容器,但是你会发现无法像刚创建时登陆容器的 bash,先使用命令 docker stop mineos
,此时加入 -i
参数启动就可以了 docker start -i mineos
。
3.3 ubuntu 容器的基本配置
登陆进 ubuntu 的 bash 以后就可以当正常的 ubuntu 进行使用了。
- 更新软件源信息:
apt-get update
- 因为这个 ubuntu 的依赖镜像太精简了,所以好多工具没有安装,先安装一下 vim:
apt-get install vim
- 可以看到安装挺慢的,之所以先安装 vim 是为了可以编辑
/etc/apt/source.list
更换为国内访问更快的软件源,比如将文件中的内容替换为如下阿里云的:
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
- 重新更新软件源信息:
apt-get update
,会发现快很多 - 飞一般的安装 git 和 python3:
apt-get install git python3
3.4 配置 SSH
这一步主要是为了mac 可以 ssh 连接 ubuntu 容器。
3.4.1 安装 openssh-server
apt-get install openssh-server
用于开启 ssh 服务供外部连接。
3.4.2 配置 sshd
需要更改一下 sshd 的默认配置,编辑文件 /etc/ssh/sshd_config
,大概从 29 行开始主要更改三处,更改后内容如下:
PermitRootLogin yes # 可以登录 root 用户
PubkeyAuthentication yes # 可以使用 ssh 公钥许可
AuthorizedKeysFile .ssh/authorized_keys # 公钥信息保存到文件 .ssh/authorized_keys 中
3.4.3 重启 sshd
因为 ubuntu 过于精简,不能使用 service 命令方便的重启 sshd,这里使用命令 /etc/init.d/ssh restart
进行重启,重启是为了让上面的配置生效。
3.4.4 添加主机的 ssh 公钥
这里的主机指的就是 macOS,保证此时还是在 ubuntu 容器中。
- 在 HOME 目录下创建
.ssh
目录:mkdir ~/.ssh
- 新建文件
~/.ssh/authorized_keys
:touch ~/.ssh/authorized_keys
- 新开一个 macOS 下的终端窗口,执行命令
cat ~/.ssh/id_rsa.pub
,复制打印的一行公钥信息 - 回到 ubuntu 容器中,将第 3 步复制的公钥粘贴到
~/.ssh/authorized_keys
中保存。
如果使用过ssh免密码的登陆操作的话,相信您知道ssh的密钥生成方法,如果没了解过,可以参考:ssh-keys
- 此时完成了 SSH 访问支持的添加,
ctrl
+d
退出容器。
3.5 提交修改到镜像
现在已经推出到正常的 mac 终端窗口中了,容器的修改不会影响到源镜像,上面的操作我们已经完成了 Ubuntu 的基本配置,并且添加了 SSH 支持,这一步是产生新的镜像版本。
- 查看刚刚操作的容器信息,执行命令
docker ps -a
,可以看到 mineos 的状态已经是退出了,主要关注 mineos 的CONTAINER ID
,复制这个 ID 号,比如为e5d8c1030724
- 执行下面的命令提交产生 ubuntu 新版本的镜像:
Bash docker commit -m 'add ssh' -a '5km' e5d8c1030724 ubuntu-ssh
- -m,指定提交信息
- -a,指定提交者
- 你需要把 e5d8c1030724 替换为您的容器的
CONTAINER ID
- ubuntu-ssh 是新镜像的名称,可以随意指定
- 使用命令
docker image ls
可以查看当前安装的镜像,上述操作正常的话就会看到ubuntu-ssh
的镜像信息 - 此时之前创建的容器就没用了,可以通过命令
docker rm mineos
进行删除
4. 最终的 ubuntu 容器
有了具有 SSH 支持的 ubuntu 镜像,我们就可以创建新的 ubuntu 容器,通过以下命令进行创建:
docker run -d -p 26122:22 --name learn ubuntu-ssh /usr/sbin/sshd -D
在 macOS 的终端中执行命令 ssh -p 26122 root@localhost
即可连接已经启动的 ubuntu 容器 learn
为了更方便的连接,可以为容器创建 ssh 连接的主机短名,往 macOS 的 ~/.ssh/config
中添加以下内容:
Host learnHostName localhostUser rootPort 26122
此时就可以通过命令 ssh learn
连接 ubuntu 容器 learn 了。
参考:
Docker-SSH连接docker容器www.jianshu.comUbuntu下"sshd:unrecognized service"blog.csdn.net博客原文:
mac 下使用 Docker 搭建 ubuntu 环境www.smslit.top