读书笔记---《Docker 技术入门与实践》---为镜像添加SSH服务
之前说到可以通过attach和exec两个命令登陆容器,但是如果遇到需要远程通过ssh登陆容器的场景,就需要手动添加ssh服务。
下面介绍两种方法创建带有ssh服务的镜像,commit命令创建和通过Dockerfile创建。
一、通过commit命令创建镜像
docker提供了docker commit 命令,支持用户提交自己对容器的修改,并生成新的镜像。命令格式为 docker commit CONTAINER [REPOSITORY [:TAG] ]。
下面是如何为 ubuntu:18.04 镜像添加SSH服务的过程。
1.1、准备工作
首先,获取 ubuntu18:04 镜像,并创建一个容器
$ docker pull ubuntu:18.04 $ docker run -it ubuntu:18.04 bash
1.2、配置软件源
如果嫌官方源速度慢可以替换为国内源,这里以阿里源为例
首先备份文件 /etc/apt/sources.list ,然后替换其中内容。
root@99c04606894d:/# cp /etc/apt/sources.list /etc/apt/sources.list.bak root@99c04606894d:/# echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
root@99c04606894d:/# echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
root@99c04606894d:/# echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
更新软件源信息
root@99c04606894d:/# apt-get update
1.3、安装和配置SSH服务
安装openssh-server
root@99c04606894d:/# apt install openssh-server
为了服务正常启动,需要创建目录/var/run/sshd
root@99c04606894d:/# mkdir -p /var/run/sshd
后台启动服务:
root@99c04606894d:/# /usr/sbin/sshd -D &
想要使用netstat查看ssh服务所占用22端口,但是发现没有命令,则需要首先安装所需软件,使用apt-file查看需要安装的软件。
root@99c04606894d:/# apt-get install apt-file
下面这一步一定要做
root@99c04606894d:/# apt-file update root@99c04606894d:/# apt-file search /bin/netstat
net-tools: /bin/netstat
netstat-nat: /usr/bin/netstat-nat
可以看到需要安装的软件包 net-tools,安装软件包并查看端口:
root@99c04606894d:/# apt-get install net-tools root@99c04606894d:/# netstat -an | grep :
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp6 ::: :::* LISTEN
修改SSH服务的安全登陆配置,取消pam登陆限制:
root@99c04606894d:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
在容器root用户家目录下创建.ssh目录,并复制需要登陆的公钥信息(一般为宿主机用户家目录 .ssh/id_rsa.pub 文件,可以用 ssh-keygen -t rsa 命令生成) 到 authorized_keys 文件中:
root@99c04606894d:/# mkdir root/.ssh
root@99c04606894d:/# vi /root/.ssh/authorized_keys
如果没有 vi 命令,可以安装vim工具,apt-get install vim
创建自动启动SSH服务的可执行文件 run.sh,并添加可执行权限
root@99c04606894d:/# touch /run.sh
root@99c04606894d:/# chmod +x /run.sh
root@99c04606894d:/# vi /run.sh
#!/bin/bash
/usr/sbin/sshd -D
最后,退出容器:
root@ce21cd862b7e:/# exit
1.4、保存镜像
查看容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c04606894d ubuntu:18.04 "bash" About an hour ago Exited () seconds ago elegant_mendeleev
生成新的镜像 sshd:ubuntu
$ docker commit 99c04606894d sshd:ubuntu
sha256:275da5f9600434f238c2d455a8fd103e0c55ad5c6113d2739a56839985832363
查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sshd ubuntu 275da5f96004 seconds ago 494MB
1.5、使用镜像
启动容器,并映射宿主机 10022 端口到 容器 22 端口:
$ docker run -p : -d sshd:ubuntu /run.sh
ce21cd862b7edc64c0cd3853dc4a7c2fffe977a21254cd4b866748dac516b371
查看容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce21cd862b7e sshd:ubuntu "/run.sh" seconds ago Up seconds 0.0.0.0:->/tcp fervent_jennings
登陆容器,不需要输入密码即可登陆
$ ssh root@192.168.121.121 -p
The authenticity of host '[192.168.121.121]:10022 ([192.168.121.121]:10022)' can't be established.
ECDSA key fingerprint is SHA256:a5DBqdYJ+WuBgJh5GhRb/fXgrtZcgDpL0dzZZqzKy88.
ECDSA key fingerprint is MD5:e2:d3::0b:d4:ce:9e:ea:f2:4b::d9::8d::fe.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.121.121]:10022' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04. LTS (GNU/Linux 3.10.-.el7.x86_64 x86_64) * Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into. To restore this content, you can run the 'unminimize' command. The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law. root@18ff1392f000:~#
二、使用Dockerfile创建
2.1、创建工作目录
首先,创建一个 sshd_ubuntu 工作目录
$ mkdir sshd_ubuntu
创建 Dockerfile 和 run.sh
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh $ vi run.sh
#!/bin/bash
/usr/sbin/sshd -D
2.2、编写 authorized_keys 文件
在宿主机上生成 SSH 密钥对,并创建 authorized_keys 文件:
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >authorized_keys
2.3、编写 Dockerfile
$ vi Dockerfile
# 设置继承镜像
FROM ubuntu:18.04 # 提供一些作者的信息
MAINTAINER xiaozhou (xiaozhou@docker.com) # 下面开始运行命令,此处更改 ubuntu 的源为国内阿里的源
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update # 安装ssh服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd # 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod /run.sh # 开放端口
EXPOSE # 设置自启动命令
CMD ["/run.sh"]
2.4、创建镜像
$ docker build -t sshd:dockerfile .
查看创建的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sshd dockerfile 828c78d68a36 seconds ago 231MB
ubuntu 18.04 4c108a37151f weeks ago .2MB
2.5、运行容器
$ docker run -d -p : sshd:dockerfile
b45d884c2cbb591fe97a34064c2b9ee09ffedf1cff22e992df0c582a99da2011
查看创建的容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b45d884c2cbb sshd:dockerfile "/run.sh" seconds ago Up seconds 0.0.0.0:->/tcp lucid_brown
登陆容器
$ ssh root@192.168.121.121 -p
Welcome to Ubuntu 18.04. LTS (GNU/Linux 3.10.-.el7.x86_64 x86_64) * Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into. To restore this content, you can run the 'unminimize' command. The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law. root@b45d884c2cbb:~#
如果不让root直接无密码登陆容器,可以注释 ADD authorized_keys /root/.ssh/authorized_keys 这一步,使用下面命令代替,创建普通账户并设置密码,设置root密码
RUN useradd dkuser
RUN echo "dkuser:123456" | chpasswd
RUN echo "root:123456" | chpasswd
这样的话就只能通过普通账户dkuser登陆容器,然后再转到root用户。
读书笔记---《Docker 技术入门与实践》---为镜像添加SSH服务的更多相关文章
- Docker实战-为镜像添加SSH服务
1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...
- Docker实战(七)之为镜像添加SSH服务
1.基于commit命令创建 Docker提供了docker commit命令,支持用户提交自己对制定容器的修改,并生成新的镜像.命令格式为docker commit CONTAINER [REPOS ...
- 为Docker镜像添加SSH服务
一.基于commit命令创建 1. 首先下载镜像 $ docker run -it ubuntu:16.04 /bin/bash 2. 安装SSH服务 #更新apt缓存 root@5ef1d31632 ...
- docker 为镜像添加ssh服务-docker commit命令创建
环境centos7 一.准备工作 docker pull ubuntu:18.04 docker run -it ubuntu:18.04 bash 二.配置软件源apt-get update,如果系 ...
- 读书笔记---《Docker 技术入门与实践》---其一
一.镜像1.1.搜索 搜索所有nginx镜像 $ docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Officia ...
- docker 为镜像添加ssh服务-使用Dockerfile 创建
首先,基于要添加内容的镜像ubuntu:18.04运行一个容器, 在宿主机(下面步骤是在容器中创建的,应该在宿主机创建进行以下步骤) 一.创建一个工作目录 二.创建Dockerfile 和脚本run. ...
- docker为镜像添加SSH服务
启动并进入容器中 这里用db1容器完成实验. 安装openssh服务和修改sshd配置文件 安装openssh yum install openssh-server openssh-clients - ...
- Docker技术入门与实战第2版-高清文字版
Docker技术入门与实战第2版-高清文字版 下载地址https://pan.baidu.com/s/1bAoRQQlvBa-PXy5lgIlxUg 扫码下面二维码关注公众号回复100011 获取 ...
- Docker技术入门与实战
Docker技术入门与实战 下载地址https://pan.baidu.com/s/1bAoRQQlvBa-PXy5lgIlxUg 扫码下面二维码关注公众号回复100011 获取分享码 本书目录结 ...
随机推荐
- __init__ 和__new__的区别
__init__和__new__的区别 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例, ...
- Notepad++中直接运行python
点击进入幕布视图浏览 https://mubu.com/doc/a8VGCUfqqw 一.使用Notepad++编辑python文件,并直接运行 1.用notepad++打开python文件.或者新建 ...
- c# PID算法入门
离开工控行业已经有一段时间了,最近回忆起以前的工作,又对 PID 算法有了兴趣.所以写了一个小项目,希望可以帮到需要的人,也算是对那段工作经历的一个总结. 这是一个 winform 的项目.负载是一个 ...
- C#5.0 异步编程 Async和Await--异步方法的规范和注意事项
要些异步方法要注意一下几点: 异步方法的返回值有三种: 1.没有任何返回值的void 2.返回一个Task任务的Task,可以获得该异步方法的执行状态 3.返回Task<T> 可以获得异步 ...
- Centos7命令行安装Tomcat以及配置防火墙开放端口
[转载]Centos 7 yum安装tomcat 命令: 系统环境CentOS Linux release 7.2.1511 (Core) 一.搭建准备:1.先到tomcat官网https://tom ...
- SqlServer 将表里面的值赋给变量
@@c_beiz varchar(500) select top 1 @c_beiz = c_beiz from g_billd_qh_tmp where u_id=''+@uid+'' and io ...
- JavaSE---枚举
1.概述 1.1 某些情况下,一个类的对象是 有限且固定的,eg:四季... 1.2 手动实现枚举类: 1.1.1 私有化构造器 1.1.2 将类的属性用private final修饰: 将类的实例 ...
- 【JavaWeb项目】一个众筹网站的开发(六)后台用户权限控制
登陆成功进入控制面板后 左侧的菜单是共同的元素,抽取出来做静态包含 要求必须是按照不同的用户得到不同的菜单 用户做了权限限制,哪个用户能操作哪些内容(链接.按钮.内容) 一.RBAC权限模型 权限管理 ...
- 转载 如何理解API,API 是如何工作的
本文转载于https://blog.csdn.net/cumtdeyurenjie/article/details/80211896 感谢作者 仁杰兄 大家可能最近经常听到 API 这个概念,那什么是 ...
- position:fixed 造成页面抖动解决办法
今天做项目遇到一个问题.鼠标滚动到指定长度后,理想状况是菜单吸附到顶部.但是实际上在一些页面上会造成抖动.定位之后发现.window.pageYoffset值会变成0 搜索一些资料后发现.因为fixe ...