使用commit 命令建立一個帶有 ssh 的 ubuntu 鏡像(不使用 PAM)

20190108 使用 commit 建立一個帶有 ssh 的 ubuntu 鏡像

ubuntu 18.04 裏面沒有 rc.local 
ubuntu 18.04 容器中沒有 systemctl,只有 service
ubuntu 18.04 想要設置 sshd 開機啓動,折騰了很多時間也沒有成功
ubuntu 18.04 想要設置開機啓動不是不能夠,實在好睏難!等之後熟練以後再來處理!

本次學習簡化 ssh 鏈接,容許 root 登陸,不使用 PAM
忽略防火牆設置

先介紹 2 個網上現成的例子

docker run -itd -p 10023:22 --name ubuntu-ssh rastasheep/ubuntu-sshd /bin/bash
	這個是 18.04,沒有自動啓動 sshd

sudo docker run -d -p 10022:22 rastasheep/ubuntu-sshd:16.04
	這個是 16.04 ,自動啓動了 sshd

這是我最後完成參考的博客

http://blog.51cto.com/12943999/2087906docker

如下記錄我本身的歷程

1).先安裝一個 ubuntu 基礎容器

docker pull ubuntu
docker run -itd --name ubuntu ubuntu /bin/bash

2).進入到容器查看、安裝、設置 sshd

docker exec -it ubuntu bash

確認 sshd 服務是否開啓
	ps -ef |grep ssh
	沒有 sshd

安裝 openssh-server
	apt update
	apt install vim
	apt install openssh-server

確認安裝包
	dpkg -l |grep ssh
		ii  openssh-client              1:7.6p1-4ubuntu0.1       amd64        secure shell (SSH) client, for secure access to remote machines
		ii  openssh-server              1:7.6p1-4ubuntu0.1       amd64        secure shell (SSH) server, for secure access from remote machines
		ii  openssh-sftp-server         1:7.6p1-4ubuntu0.1       amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
		ii  ssh-import-id               5.7-0ubuntu1.1           all          securely retrieve an SSH public key and install it locally

確認 sshd 位置,一下子執行 sshd 服務可能用到
	which sshd
		/usr/sbin/sshd

修改 sshd 配置
	vim /etc/ssh/sshd_config
		增長一行
		PermitRootLogin yes
		修改一處
		UsePAM no

開啓 sshd 服務
	systemctl restart sshd
		System has not been booted with systemd as init system (PID 1). Can't operate.
		** 沒有 systemctl

	換一個方式啓動服務
	service ssh start

	** 若是還不支持,直接進入 sshd 目錄去執行
	/usr/sbin/sshd

再次確認 sshd 服務是否開啓
	ps -ef |grep ssh
		root      4006     1  0 02:38 ?        00:00:00 /usr/sbin/sshd
		root      4199    10  0 02:56 pts/1    00:00:00 grep --color=auto ssh

** 如今能夠從宿主機 ssh 到 Docker 容器了!
** exit 退出容器,或者再打開一個 Terminal ,ssh到宿主機 192.168.1.192

3).從宿主機嘗試ssh 鏈接

docker inspect ubuntu-ssh
	...
	 "Gateway": "172.17.0.1",
	"IPAddress": "172.17.0.3",
	...

ssh root@172.17.0.2
	** 若是報錯 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
	vim /home/dhbm/.ssh/known_hosts,刪除以前的 ssh 記錄以後從新 ssh 鏈接

	仍是出現錯誤!
		The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
		ECDSA key fingerprint is SHA256:DLhQdo4eKOPNmpKIyR5VUFhsNiTdXqqe6+Omiu7c+uY.
		Are you sure you want to continue connecting (yes/no)? yes
		Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
		root@172.17.0.2's password: 
		Permission denied, please try again.
		root@172.17.0.2's password: 
		Permission denied, please try again.
		root@172.17.0.2's password: 

** 必須重設密碼! ubuntu 18.04 沒有設置 root 密碼!

回到前一個已經進入 容器的 Terminalm,設置 root 密碼
** 若是剛纔是 exit 退出了容器,再次 docker exec -it ubuntu bash 進入容器

passwd root

4).設置完 root 密碼以後,再來嘗試ssh 鏈接

ok!可是,ip,ifconfig ,ping 都沒有
安裝這幾個基本的工具
apt-get install net-tools
apt-get install iputils-ping
apt-get install iproute2

5).exit 退出容器,以他爲基礎,創建帶有 sshd 和基礎工具的 ubuntu 鏡像了!

docker commit -a "wzh.2019" -m "message 20190107 ssh docker" ubuntu  ubuntu-ssh:v1
	sha256:5638786e4005b4a1c743e2b5edcbc651c6342efbd80fa07b46e6febfe0d9d81b

6).檢查一下新鏡像

docker images
	REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
	ubuntu-ssh                   v1                  5638786e4005        About a minute ago   264MB
	...

7).使用新鏡像創建一個新容器 ubuntu-ssh2

docker run -itd -p 10022:22 --name ubuntu-ssh2 ubuntu-ssh:v1 /bin/bash
	06621aed44e0987fb7ccd69e1900630ebbe97d50de7dd22537ba359c76ded411

8).再打開一個 Terminal 從 宿主機嘗試ssh 鏈接新建的 ubuntu-ssh2 容器

docker inspect ubuntu-ssh2
	...
	 "Gateway": "172.17.0.1",
	"IPAddress": "172.17.0.3",
	...

從宿主機測試 ssh,悲劇了!仍是不行!	
ssh root@172.17.0.3
	ssh: connect to host 172.17.0.3 port 22: Connection refused

進入容器看看!
docker exec -it ubuntu-ssh2 bash
檢查 sshd 服務,仍是沒有!
哪裏不對呢

docker stop ubuntu-ssh2 和 docker stop ubuntu-ssh2 來回從新啓動,也是枉然!
** 結論:ubuntu-ssh2 容器啓動時,沒有自動開啓 sshd

** 簡單紀錄一下個人嘗試
打開/etc/rc.local文件,在exit 0語句前加入: 
vim /etc/rc.local
加入
/etc/init.d/ssh start;
或者
/usr/sbin/sshd

結論:ubuntu 18.04 容器 死活就不自動啓動 sshd !

網上找了幾個都是關於 Centos 7 容器的
在docker run 的時候運行/usr/sbin/init
https://blog.csdn.net/u012814856/article/details/80493760
https://blog.csdn.net/cxin917/article/details/79410984

centos 容器的 init 在 /usr/sbin/init 
個人 ubuntu 18.04 容器裏面找找 init
which init
/sbin/init
docker run -itd --name ubuntu-ssh --privileged ubuntu-ssh:v3 /sbin/init
第一次 run 以後,哈哈哈!立刻檢查 sshd 服務,確實有了!
後來關機以後,從新 docker stop ubuntu-ssh3 ,又沒有了!白高興了!

結論:
ubuntu 18.04 容器的init 只在第一次建立的時候會執行init
後續在 start 時,再也不執行 init (我的猜想,沒有仔細去分析)

只有在 run 的時候,直接讓他執行shell,啓動 sshd
重複以上過程,到 commit 只一步

9).按照 run 的時候,執行 shell 方式,從頭來過

進入到以前的 ubuntu 基礎容器 (前面已經安裝過 sshd 的)
docker exec -it ubuntu  bash
創建一個 start.sh 文件,加入一條 shell 命令
vim start.sh
	#!/bin/bash
	# by wzh 20190108
	/usr/sbin/sshd -D

root@20fca9c46e82:/# ls
	bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  start.sh  sys  tmp  usr  var

10).exit 退出容器,從新 commit (此次換了名字 ubuntu1804-ssh)

docker commit -a "wzh.2019" -m "message 20190108 ssh docker by start.sh " 20fca9c46e82
ubuntu1804-ssh:v1 

新建一個容器,名字 ubuntu1804-ssh,端口 10024
docker run -itd -p 10024:22 --name ubuntu1804-ssh ubuntu1804-ssh:v1 /run.sh

檢查確認 docker ps -a
	CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                        PORTS                               NAMES
	87d09b047e4c        ubuntu1804-ssh:v1              "/start.sh"              29 hours ago        Exited (137) 22 hours ago                                         ubuntu1804-ssh

	```

11).直接在宿主機嘗試(跳過剛纔那些在容器裏面的安裝、檢查步驟)

docker inspect ubuntu-ssh2
	...
	 "Gateway": "172.17.0.1",
	"IPAddress": "172.17.0.4",
	...

ssh root@172.17.0.4
	ok !

12).從外網嘗試

從個人工做電腦仔打開一個 Terminal
ssh -p 10024 root@192.168.1.192
	ok!

到這裏,commit 方式生成一個帶有 sshd 服務的 ubuntu 18.04 鏡像就算 ok!

相關文章
相關標籤/搜索