Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。linux
经过 uname -r 命令查看你当前的内核版本docker
[root@bigdata ~]# uname -r
Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令以下:vim
[root@bigdata ~]# yum -y install docker
[root@bigdata ~]# docker version
方式一:centos
[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 命令会使用 Unix socket 与 Docker 引擎通信。而只有 root 用户和 docker 组的用户才能够访问 Docker 引擎的 Unix socket。出于安全考虑,通常 Linux 系统上不会直接使用 root 用户。所以,更好地作法是将须要使用 docker 的用户加入 docker 用户组。bash
[root@bigdata ~]# groupadd docker [root@bigdata ~]# useradd -g docker docker
[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 ~]$
如上图报错/usr/bin/docker-current: error pulling image configuration。。。app
出现这个问题,通常的缘由是没法链接到 docker hub经过(使用root用户执行如下命令):ssh
[root@bigdata ~]# cat /etc/sysconfig/docker
在文件中添加如下内容:socket
--registry-mirror=http://f2d6cb40.m.daocloud.io
重启dockeroop
[root@bigdata ~]# service docker restart
再次运行helloworld(docker用户)
[docker@bigdata ~]$ docker run hello-world
因为本地没有hello-world这个镜像,因此会下载一个hello-world的镜像,并在容器内运行。
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
能够直接使用docker pull centos:7命令安装镜像
[docker@bigdata ~]$ docker pull centos:7
[docker@bigdata ~]$ docker image ls
一个是centos镜像,另外一个是咱们以前使用docker run hello-world命令下载的镜像。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。
有了镜像后,咱们就可以以这个镜像为基础启动并运行一个容器。
[docker@bigdata ~]$ docker run -it --rm centos bash
docker run 就是运行容器的命令,说明一下上面用到的参数。
- -it:这是两个参数,一个是 -i:交互式操做,一个是 -t 终端。咱们这里打算进入 bash 执行一些命令并查看返回结果,因 此咱们须要交互式终端。
- --rm:这个参数是说容器退出后随之将其删除。默认状况下,为了排障需求,退出的容器并不会当即删除,除非手动 docker rm。咱们这里只是随便执行个命令,看看结果,不须要排障和保留结果,所以使用 --rm 能够避免浪费空间。
- centos :这是指用centos 镜像为基础来启动容器。
- bash:放在镜像名后的是命令,这里咱们但愿有个交互式 Shell,所以用的是 bash。
[root@cb55b5f51685 /]# cat /etc/os-release
进入容器后,咱们能够在 Shell 下操做,执行任何所需的命令。这里,咱们执行了 cat /etc/os-release,这是 Linux 经常使用的查看当前系统版本的命令,从返回的结果能够看到容器内是 CentOS Linux 系统。
最后咱们能够经过 exit 退出了这个容器。
[docker@bigdata ~]$ docker system df
[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同样惟一标识容器,同一台宿主机上不容许有同名容器存在,不然会冲突。
使用命令中止并删除这个容器就能够
[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命令
[root@hadoop1 /]# yum install vim
[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
[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
[root@hadoop1 /]# passwd
测试
[root@hadoop1 /]# ssh localhost
上图中能够看到已经登陆到本机了,也就说容器中的主机拥有了ssh远程登陆其它主机的能力,固然你也能够登陆其余主机。要退出的话,输入命令exit便可。
[root@hadoop1 ~]# vi /etc/hosts
获得容器中的主机的ip地址172.17.0.2(可能和你获得的不同)
而后在宿主机中开启一个新的终端输入命令
[docker@bigdata ~]$ ssh root@172.17.0.2
[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
在容器/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>
另开一个窗口
举例: