apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境

46c9583b54abf41007e1aab0539ff771.png

学习网络开发过程中不想“污染”macOS,考虑到之后部署网络应用主要是与linux打交道,所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机,一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习,可见安装一个包含完整GUI的 ubuntu 有点多余,还占用很多资源!所以想到了使用 docker 来创建 ubuntu 容器用来开发学习,本文就分享一下这个过程!

本文就不介绍 Docker 是什么了,主要描述搭建符合自己需求的 ubuntu 容器的过程。

1. 容器需求

  • 可以 ssh 连接
  • 包含 vim、git等基本工具

2. 安装和配置 Docker

2.1 下载并安装 Docker

  1. 访问 Docker 官网 了解和下载 Docker,这里也可以点我下载最新稳定版的 Docker for mac
  2. 打开下载的 dmg 文件,将 Docker 拖放到 Application 文件夹中即可完成安装
  3. 首次运行会有提示输入密码,用来获取完整的操作权限
  4. Docker 运行起来会在顶栏出现一个小鲸鱼的logo
  5. 安装成功后,在终端中查看 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。

  1. 点击顶栏小鲸鱼的 logo,找到 Preferences点击调出 Doker 配置窗口;
  2. 点击 Daemon 按钮,就可以看到 Registry Mirrors 的配置页;
  3. 点击 + 号,添加上面提供的地址即可,添加完成后,点击 Apply & Restart ,等待一会儿 Docker 重启之后,配置即可生效,最终如下:

09f6b5af900ea814305f3e80c810c229.png

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 容器,命令参数解释:

4071caf895e6ff4d6a610026073b74f4.png

上面的命令执行后,就会登陆 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_keystouch ~/.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

87e5271836dffcdb6384f32cbf7a5c31.png

在 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.com
b4bd927611728045030d9542e86234a9.png
Ubuntu下"sshd:unrecognized service"​blog.csdn.net

博客原文:

mac 下使用 Docker 搭建 ubuntu 环境​www.smslit.top
6ade254b0fe0fa09d9ed73c50b4c8ed5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中static关键字简介

static静态关键字: static关键字可以修饰成员变量和成员方法,被修饰的成员是属于类的,而不是简简单单的属于某个对象,也就是说可以不用通过对象调用,而是通过类直接调用。 类变量(静态变量)&a…

[WCF编程]10.操作:回调操作

一、回调操作概述 WCF支持服务将调用返回给它的客户端。在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务。回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知客户端时,…

float去掉小数点之后_float类型的存储方式

在c语言中float函数是单精度的。它在内存中以二进制的形式存储。分为符号位,阶码与尾数三部分。 符号位最为简单,如果你存储的是正数那么符号数就是0。如果是负数,则为1。下面,我以13.625为例说明阶码与尾数的表示方法。首先&…

idea 2020.2 如何设置classpath_开发属于自己的第一款IDEA插件!

作者:木杉 http://imushan.com/写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件。要…

java中Arrays类和Math类常用API简介

Arrays类: java.util.Arrays是一个与数组相关的工具类,提供了许多静态方法对数组进行操作,直接通过类点出来使用,无需创建对象。 // 1.Arrays类存在与java.util下,需要导包: import java.util.Arrays; pu…

按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: Yura不说数据说 ,PYuraLPS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.c…

UI设计

摘要 源于ajlr项目的验收,过程中ui的设计被屡次提到。所以就有了这样一个思考,什么是ui设计?对于开发人员来说,ui设计是否很重要?以及如何来进行ui设计? ui设计? User Interface,简称…

Java中继承、this关键字、super关键字

继承: 概述:当多个类中存在相同属性和行为时,将这些相同的内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承抽离出来的这个类即可。 子类:当某个类继承了另一个类的时候,可以把这个某…

java中抽象类,abstract关键字

抽象类:java语法规定,包含抽象方法的类为抽象类。 abstract关键字:abstract用来定义抽象方法和抽象类,定义抽象方法格式为:abstract修饰方法,并去掉大括号,直接以封号结束;定义抽象…

c++获取当前时间戳_python开发:python时间模块的使用

前言:今天元宵节,祝福大家元宵节快乐。今天在元宵节给各位朋友分享一下python时间模块。我们在开发中经常会与时间打交道,如:获取事件戳,时间戳的格式化等,这里简要记录一下python操作时间的方法。ython中常…

Linux重新编译内核指南

Linux的一个重要的特点就是其源代码的公开性,全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。      为什么…

python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

【每天几分钟,从零入门python编程的世界!】这节我们补充2个概念:相对路径和绝对路径。●绝对路径就像一棵大树一样,从它的根开始,往上会有大的枝干,在大的枝干上面又会有小一点的树枝,小树枝上面…

Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字

接口: 接口是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和…

百度热力图颜色说明_大数据下的龙港、鳌江人口热力图

大数据下的龙港、鳌江人口热力图--趋势显示,人口逐步集中于区域中心地区与城市 2020-08-25 大数据(big data),是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点,即大量(Volume)、高速(Velocity)…

python 显示图片matplotlib_Python OpenCV ——Matplotlib显示图片

Color image loaded by OpenCV is in BGR mode.But Matplotlib displays in RGB mode.So color images will not be displayed correctly in Matplotlib if image is read with OpenCV.Please see the exercises for more details.(引自文档)import numpy as npimport cv2from …

什么是Spring?Spring是什么?

Spring概述: Spring是一个开源框架,是为了解决企业应用程序开发复杂性而开发的。 从简单性、可測试性和松耦合的角度而言,不论什么java应用都能够从Spring中受益。 简而言之,Spring就是一个轻量级的控制反转(IOC&#…

java中多态,instanceof关键字

多态: 面向对象三大特征:继承、封装、多态,其中多态指的是有多种形态,可以使代码更加灵活,而非状态。继承或接口是多态的前提,比如一个对象狗是宠物类的实现类对象,而宠物类又继承了动物类&…

python语言的单行注释以井号开头_【学习】Python语言入门

Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 语法 Python中没有强制的语句终止字符,且代码块是通过缩进来指示的。缩进表示一个代码…

python 参数个数 同名函数_Python——函数的参数

函数的参数定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,…

webview的

问题描述我给WEBVIEW加了等待的圆圈,怎么不起作用?布局文件:<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:lay…