宿主机-免密登录Docker容器

CentOS7 安装Docker

讨论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

vim /etc/sudoers

把docker 加入sudoers里面

$sudo gpasswd -a ${USER} docker


cat /etc/group | grep ^docker

sudo systemctl restart 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 root@172.17.0.2

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>

另开一个窗口

举例:

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注