1. 程式人生 > >宿主機-免密登錄Docker容器

宿主機-免密登錄Docker容器

hub 3.1 目錄 測試 pub emctl lsof 進行 2.3

討論QQ:1586558083

目錄

  • 一、檢查系統內核
  • 二、安裝Docker
    • 2.1 安裝
    • 2.2 查看docker版本
    • 2.3 啟動docker
  • 三、建立docker用戶和組
    • 3.1 創建用戶及組
    • 3.2 使用新創建的用戶運行helloworld
    • 3.3 解決報錯
  • 四、安裝centos鏡像
    • 4.1 下載鏡像
    • 4.2 查看擁有的鏡像
    • 4.3 運行容器
    • 4.4 在容器中運行命令
    • 4.5 查看鏡像、容器、數據卷所占用的空間
    • 4.6 容器退出再次進入報錯
  • 五、運行容器
    • 5.1 使用命令運行容器
    • 六、剛安裝的系統非常純凈,需要安裝必備的軟件
    • 6.1 安裝vim
    • 6.2 升級及安裝sshd
    • 6.3 修改root密碼
    • 6.4 宿主機能登錄本機(容器中的主機)
    • 6.5 配置ssh無密碼登錄
  • 七、上傳軟件到容器裏面
  • 八、保存鏡像

正文

回到頂部

一、檢查系統內核

Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

通過 uname -r 命令查看你當前的內核版本

[root@bigdata ~]# uname -r

技術分享圖片

回到頂部

二、安裝Docker

2.1 安裝

Docker 軟件包和依賴包已經包含在默認的 CentOS-Extras 軟件源裏,安裝命令如下:

[root@bigdata ~]# yum -y install docker

技術分享圖片

2.2 查看docker版本

[root@bigdata ~]# docker version

技術分享圖片

2.3 啟動docker

方式一:

[root@bigdata ~]# service docker start
Redirecting to /bin/systemctl start docker.service
[root@bigdata ~]# 

技術分享圖片

方式二:

[root@bigdata ~]# systemctl start docker.service
[root@bigdata ~]# ps aux | grep docker

技術分享圖片

回到頂部

三、建立docker用戶和組

3.1 創建用戶及組

默認情況下,docker 命令會使用 Unix socket 與 Docker 引擎通訊。而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket。出於安全考慮,一般 Linux 系統上不會直接使用 root 用戶。因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組。

[root@bigdata ~]# groupadd docker
[root@bigdata ~]# useradd -g docker docker

3.2 使用新創建的用戶運行helloworld

[docker@bigdata ~]$ docker run hello-world
技術分享圖片
[docker@bigdata ~]$ docker run hello-world
Unable to find image hello-world:latest locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
9bb5a5d4561a: Pulling fs layer 
/usr/bin/docker-current: error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/e3/e38bc07ac18ee64e6d59cf2eafcdddf9cec2364dfe129fe0af75f1b0194e0c96/data?Expires=1525823399&Signature=SjqbSNVW5X~uDhy9jXvuLqv22jC3auyGRx4JCRE1ceXkdh0Qpsc21VmhIXwAO6XcxwyJ1gGNVQhnJWYozOWXjysL8taJFBCxKNqAD9Cy~TCt-iMi06z9dHX6-WxxIU3WJ4LbCT7RxsWIKArTVKmPvyQdD4Djkgr~rWzoL6eyTfg_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout.
See /usr/bin/docker-current run --help.
[docker@bigdata ~]$ 
技術分享圖片

技術分享圖片

3.3 解決報錯

如上圖報錯/usr/bin/docker-current: error pulling image configuration。。。

出現這個問題,一般的原因是無法連接到 docker hub通過(使用root用戶執行以下命令):

[root@bigdata ~]# cat /etc/sysconfig/docker

在文件中添加以下內容:

--registry-mirror=http://f2d6cb40.m.daocloud.io

技術分享圖片

重啟docker

[root@bigdata ~]# service docker restart

技術分享圖片

再次運行helloworld(docker用戶)

[docker@bigdata ~]$ docker run hello-world

技術分享圖片

由於本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,並在容器內運行。

回到頂部

四、安裝centos鏡像

4.1 下載鏡像

從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式為:

docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]  

可以直接使用docker pull centos:7命令安裝鏡像

[docker@bigdata ~]$ docker pull centos:7

技術分享圖片

4.2 查看擁有的鏡像

[docker@bigdata ~]$ docker image ls

技術分享圖片

一個是centos鏡像,另一個是我們之前使用docker run hello-world命令下載的鏡像。

鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。

4.3 運行容器

有了鏡像後,我們就能夠以這個鏡像為基礎啟動並運行一個容器。

[docker@bigdata ~]$ docker run -it --rm centos bash

技術分享圖片

docker run 就是運行容器的命令,說明一下上面用到的參數。

  • -it:這是兩個參數,一個是 -i:交互式操作,一個是 -t 終端。我們這裏打算進入 bash 執行一些命令並查看返回結果,因 此我們需要交互式終端。
  • --rm:這個參數是說容器退出後隨之將其刪除。默認情況下,為了排障需求,退出的容器並不會立即刪除,除非手動 docker rm。我們這裏只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。
  • centos :這是指用centos 鏡像為基礎來啟動容器。
  • bash:放在鏡像名後的是命令,這裏我們希望有個交互式 Shell,因此用的是 bash。

4.4 在容器中運行命令

[root@cb55b5f51685 /]# cat /etc/os-release 

技術分享圖片

進入容器後,我們可以在 Shell 下操作,執行任何所需的命令。這裏,我們執行了 cat /etc/os-release,這是 Linux 常用的查看當前系統版本的命令,從返回的結果可以看到容器內是 CentOS Linux 系統。
最後我們可以通過 exit 退出了這個容器。

4.5 查看鏡像、容器、數據卷所占用的空間

[docker@bigdata ~]$ docker system df

技術分享圖片

4.6 容器退出再次進入報錯

技術分享圖片
[docker@bigdata ~]$ docker run -it -v /home/docker/build:/root/build --privileged -h hadoop1 --name hadoop1 centos /bin/bash
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/hadoop1" is already in use by container a094bdef9e1cac62a17022e568fe9b1eb021e13adf8ed2624a71be5a2e42c618. You have to remove (or rename) that container to be able to reuse that name..
See /usr/bin/docker-current run --help.
[docker@bigdata ~]$ 
技術分享圖片
  • docker ps: 查看當前運行的容器
  • docker ps -a:查看所有容器,包括停止的。

技術分享圖片

標題含義:

  • CONTAINER ID:容器的唯一表示ID。
  • IMAGE:創建容器時使用的鏡像。
  • COMMAND:容器最後運行的命令。
  • CREATED:創建容器的時間。
  • STATUS:容器狀態。
  • PORTS:對外開放的端口。
  • NAMES:容器名。可以和容器ID一樣唯一標識容器,同一臺宿主機上不允許有同名容器存在,否則會沖突。

使用命令停止並刪除這個容器就可以

技術分享圖片

回到頂部

五、運行容器

5.1 使用命令運行容器

[docker@bigdata ~]$ docker run -it -v /home/docker/build:/root/build --privileged -h hadoop1 --name hadoop1 centos /bin/bash

以centos鏡像啟動一個容器,容器名是hadoop1,主機名是hadoop1,並且將基於容器的centos系統的/root/build目錄與本地/home/docker/build共享。

技術分享圖片

參數解釋:

  • -v 表示基於容器的centos系統的/root/build目錄與本地/home/hadoop/build共享;這可以很方便將本地文件上傳到Docker內部的centos系統;
  • -h 指定主機名為hadoop1
  • –-name 指定容器名
  • /bin/bash 使用bash命令

六、剛安裝的系統非常純凈,需要安裝必備的軟件

6.1 安裝vim

[root@hadoop1 /]# yum install vim

6.2 升級及安裝sshd

6.2.1 安裝

[root@hadoop1 /]# yum -y update
[root@hadoop1 /]# yum -y install openssh-server
[root@hadoop1 /]# yum -y install openssh-clients

技術分享圖片

編輯sshd的配置文件/etc/ssh/sshd_config,將其中的UsePAM yes改為UsePAM no

[root@hadoop1 /]# vi /etc/ssh/sshd_config 

技術分享圖片

6.2.2 啟動

[root@hadoop1 /]# /usr/sbin/sshd -D

技術分享圖片

報錯如圖,解決方案為:創建公私密鑰,輸入命令後,直接按兩次enter鍵確認就行了

[root@hadoop1 /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 

技術分享圖片

[root@hadoop1 /]# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key

技術分享圖片

[root@hadoop1 /]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

技術分享圖片

再次啟動SSH服務

技術分享圖片

[root@hadoop1 /]# yum -y install lsof
[root@hadoop1 /]# lsof -i:22

技術分享圖片

6.3 修改root密碼

[root@hadoop1 /]# passwd

技術分享圖片

測試

[root@hadoop1 /]# ssh localhost

技術分享圖片

上圖中可以看到已經登錄到本機了,也就說容器中的主機擁有了ssh遠程登錄其它主機的能力,當然你也可以登錄其他主機。要退出的話,輸入命令exit即可。

6.4 宿主機能登錄本機(容器中的主機)

[root@hadoop1 ~]# vi /etc/hosts

技術分享圖片

得到容器中的主機的ip地址172.17.0.2(可能和你得到的不一樣)

然後在宿主機中開啟一個新的終端輸入命令

[docker@bigdata ~]$ ssh [email protected]

技術分享圖片

6.5 配置ssh無密碼登錄

[root@hadoop1 ~]# ssh-keygen -t rsa

技術分享圖片

[root@hadoop1 ~]# cd .ssh/
[root@hadoop1 .ssh]# cat id_rsa.pub >> authorized_keys

輸入完後,這時再輸入命令

[root@hadoop1 .ssh]# ssh localhost

技術分享圖片

回到頂部

七、上傳軟件到容器裏面

將JDK上傳到Linux系統,,然後將其移動到/home/docker/build文件夾下面,註意:這裏需要使用root用戶

[root@bigdata docker]# mv jdk-8u73-linux-x64.tar.gz build/

技術分享圖片

進入容器裏面的/root/build文件夾下面進行查看

[root@hadoop1 /]# cd /root/build/
[root@hadoop1 build]# ls

技術分享圖片

5.2.3 安裝JDK

在容器/root下面建一個apps文件夾

[root@hadoop1 ~]# mkdir apps

解壓JDK的安裝包到apps文件夾下面

[root@hadoop1 build]# tar -zxvf jdk-8u73-linux-x64.tar.gz -C /root/apps/

修改環境變量

[root@hadoop1 ~]# vi .bashrc
#JAVA
export JAVA_HOME=/root/apps/jdk1.8.0_73
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin 

保存使其立即生效

[root@hadoop1 ~]# source .bashrc

技術分享圖片

回到頂部

八、保存鏡像

基於已有的docker容器,做一新的dokcer image.

$ docker commit <container_id> <image_name>

另開一個窗口

舉例:

技術分享圖片

宿主機-免密登錄Docker容器