docker的安装与使用安装ssh服务

来源:互联网 发布:营销活动效果数据分析 编辑:程序博客网 时间:2024/06/11 20:11
安装docker要满足一定的条件,对于centos系统,要求必须是64位,并且内核版本是3.10以上。 
如果你的centos操作系统内核低于3.10,需要升级到这个版本以上,才能安装docker。

第一步,先看目前的内核版本
[root@node1 ~]#uname -r 
在我的系统上输出:
2.6.32-431.el6.centos.plus.x86_64
第二步,导入public key
[root@node1 ~]#rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

第三步,安装ELRepo
[root@node1 ~]#rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

第四步,安装内核
在yum的ELRepo源中,有mainline(4.6)、long-term(3.10)这2个内核版本,考虑到long-term更稳定,会长期更新,所以选择这个版本。
查看ELRepo源中内核:http://elrepo.org/linux/kernel/el6/x86_64/RPMS/
安装命令:  yum --enablerepo=elrepo-kernel install kernel-lt -y

第五步,编辑grub.conf,修改Grub引导顺序

[root@node1 ~]#vim /etc/grub.conf  

确认刚安装好的内核在哪个位置,然后设置default值(从0开始),一般新安装的内核在第一个位置,所以设置default=0。


第六步,重启,查看内核版本号

[root@node1 ~]#reboot


第七步,重启后验证下系统内核版本

[root@node1 ~]# uname -r
3.10.107-1.el6.elrepo.x86_64


接下来安装docker

[root@node1 ~]# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

 yum -y install docker-io

等待在线安装

然后验证是否安装成功 输出版本号即为安装成功

[root@node1 ~]# docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d/1.7.1
OS/Arch (client): linux/amd64


启动docker 

service docker start

发现有错误信息,日志:

/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

运行

yum upgrade device-mapper-libs


再启动docker 

service docker start

查看日志 启动成功 

time="2017-07-14T10:13:37.068269901-07:00" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)" 
time="2017-07-14T10:13:37.094516931-07:00" level=info msg="[graphdriver] using prior storage driver \"devicemapper\"" 
time="2017-07-14T10:13:37.096885419-07:00" level=warning msg="Running modprobe bridge nf_nat failed with message: , error: exit status 1" 
time="2017-07-14T10:13:37.178705228-07:00" level=info msg="Loading containers: start." 



接下来下载一个centos7都镜像 先搜索一下

[root@node1 ~]# docker search centos

然后获取一个镜像

[root@node1 ~]# docker pull centos:7

等待下载后,查看下载的镜像

[root@node1 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEcentos              7                   72a210db1424        12 days ago         192.5 MB


使用此镜像创建一个容器 并执行bash命令

docker run -itcentos:7 /bin/bash

执行后会进入该容器的命令行模式

[root@303c30ca276a /]# 

可以在里面安装一些软件服务,比如安装ssh服务便于管理容器,

[root@303c30ca276a /]# yum install openssh-server

# 启动之前需手动创建/var/run/sshd,不然启动sshd的时候会报错

[root@303c30ca276a /]#mkdir -p /var/run/sshd

#需要修改/etc/sshd/sshd_config文件中内容
PermitRootLogin yes
UsePAM no

[root@303c30ca276a /]#vi /etc/ssh/sshd_config
#启动ssh服务  sshd以守护进程运行
[root@303c30ca276a /]#/usr/sbin/sshd -D &

Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

表示/etc/ssh/下没有相关的密钥,一个个逐步生成就可以 输入命令后一路回车,

ssh-keygen -t rsa -/etc/ssh/ssh_host_rsa_key

ssh-keygen -t ecdsa -/etc/ssh/ssh_host_ecdsa_key

ssh-keygen -t ed25519 -/etc/ssh/ssh_host_ed25519_key  

查看是否都生成成功

[root@303c30ca276a /]# cd /etc/ssh[root@303c30ca276a ssh]# lltotal 272-rw-r--r--. 1 root root 242153 Apr 12 14:05 moduli-rw-------. 1 root root   1675 Jul 18 11:23 ssh_host_ecdsa_key-rw-r--r--. 1 root root    399 Jul 18 11:23 ssh_host_ecdsa_key.pub-rw-------. 1 root root   1675 Jul 18 11:24 ssh_host_ed25519_key-rw-r--r--. 1 root root    399 Jul 18 11:24 ssh_host_ed25519_key.pub-rw-------. 1 root root   1675 Jul 18 11:23 ssh_host_rsa_key-rw-r--r--. 1 root root    399 Jul 18 11:23 ssh_host_rsa_key.pub-rw-------. 1 root root   4359 Jul 18 11:31 sshd_config


再启动 /usr/sbin/sshd -D &

#查看是否启动成功  

[root@303c30ca276a /]# ps -efUID         PID   PPID  C STIME TTY          TIME CMDroot          1      0  0 13:35 ?        00:00:00 /bin/bashroot         18      1  0 14:01 ?        00:00:00 /usr/sbin/sshd -Droot         20      1  0 14:01 ?        00:00:00 ps -ef

已经有sshd的进程了,说明启动成功,


此时给我们更改下root的密码

[root@303c30ca276a /]#passwd

输入两次相同的密码

此时可以通过宿主机使用ssh登陆到此容器 我们需要知道此容器分配的ip地址,

运行ifconfig查看下ip 如果报错,
bash:
ifconfig: command not found

先安装下net-tools

[root@303c30ca276a /]#yum install net-tools

在查看下 ifconfig

[root@303c30ca276a /]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.17.0.41  netmask 255.255.0.0  broadcast 0.0.0.0        inet6 fe80::42:acff:fe11:29  prefixlen 64  scopeid 0x20<link>        ether 02:42:ac:11:00:29  txqueuelen 0  (Ethernet)        RX packets 6  bytes 468 (468.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 7  bytes 558 (558.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

以上运行的在容器内操作的,在容器内安装的软件。


此时通过宿主机登陆新开个shell窗口

通过docker命令查看所有的容器或者正在运行的容器

docker ps -a  查看所有的容器

docker ps 查看正在运行的容器

[root@node1 ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES303c30ca276a        centos:7            "/bin/bash"         2 hours ago         Up 12 minutes                           thirsty_bohr  

此时一个容器id 为  303c30ca276a 正在运行  注意的是PORTS为空,表示目前没有通过宿主机端口映射到容器的服务端口

通过宿主机ssh 登陆

[root@node1 ~]#ssh root@172.17.0.40

提示输入密码

输入上面更改过的root用户密码

登陆容器成功


可以像操作平时的主机一样操作以及启动一些服务,此时只能通过宿主机上面访问ssh,下面可以把上面的启动容器打成一个镜像包。

回到容器的命令行窗口,执行exit推出,容器会自动停止。

执行更具某一个容器生成一个新的镜像,新的镜像包含容器里面安装的所有服务

docker commit <容器id> debian02 #把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合)

容器id 可以通过 docker ps -a查看

[root@node1 ~]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES303c30ca276a        centos:7            "/bin/bash"         3 hours ago         Exited (0) 3 minutes ago                       thirsty_bohr  
[root@node1 ~]# docker commit  303c30ca276a  centos/ssh

[root@node1 ~]# docker commit  303c30ca276a  centos/ssh4d4b865e0c2c5c9ff34bd66114c27b2ba12afedebf19a82e03160d0925d769bb

查看打包的镜像

docker images

root@node1 ~]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEcentos/ssh          latest              4d4b865e0c2c        33 seconds ago      302 MBcentos              latest              72a210db1424        12 days ago         192.5 MBcentos              7                   72a210db1424        12 days ago         192.5 MB

然后我们在容器可以执行运行这个镜像  并且以进程守护的方式启动ssh服务 宿主机的52222端口映射到容器的22端口

docker run -d -p 52222:22 <镜像id>  /usr/sbin/sshd -D

[root@node1 ~]# docker run -d -p 52222:22 4d4b865e0c2c  /usr/sbin/sshd -D5c78d087e84074c0d58822cf11d00c257905ea3183a2d2d7b8a5586b71a34402
已经启动一个容器 运行的镜像为 刚才打包的镜像 并且已经启动 ssh服务,此时我们可以直接通过宿主机的ip以及以及映射的端口52222登陆

[root@node1 ~]# ssh root@192.168.184.134 -p 52222The authenticity of host '[192.168.184.134]:52222 ([::1]:52222)' can't be established.RSA key fingerprint is d5:9d:c6:27:8a:dc:da:f2:03:39:25:05:9b:f5:aa:55.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '[192.168.184.134]:52222' (RSA) to the list of known hosts.root@192.168.184.134's password: Last login: Tue Jul 18 11:32:33 2017 from gateway[root@5c78d087e840 ~]# 

此时已经登陆到容器内了, 可以后续做一些相关操作

关于docker容器的端口映射
由于docker容器的IP地址每次启动都会变,所以不适用于手动添加端口映射(难道
每次重启都来查看容器的IP么?),所以需要每次启动容器时由docker程序自动添
加NAT规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下:
docker run -h="activemq" --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381 -p 51005:80-p 51006:8000 -p 51007:8888 debian/base/etc/rc.local


#此处我把mysql,redis,nginx,ssh都进行了映射。
后续对于docker容器的管理,记住容器的名称,如上述名称是activemq,则使用docker stop,start来控制容器进程。
docker stop activemq
docker start activemq
当然,也可以不让docker每次启动容器修改容器的IP地址,参考如下:


docker网络配置:http://www.open-open.com/lib/view/open1404896485747.html
关于docker容器的多程序开机自动运行
docker容器每次启动时,开机自启动的命令都要在启动容器前指定。如 docker run -I -t debian /bin/bash命令,只会运行/bin/bash程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。
多程序开机自动运行方法:可把前面所说的启动命令换成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了。
后台运行则是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令docker ps -a中找对应的容器ID,然后使用docker start <容器ID>即可。
关于docker容器和镜像的关系
无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器只有50MB,父镜像还是300MB。但是可以使用Dockfile或commit命令来,把增量镜像和父镜像一起生成一个新的镜像。
commit使用:
docker commit <镜像id> <新镜像名称>


Dockfile使用:
root@node1:/data# cat Dockerfile
FROMubuntu/testa #这是基础镜像
CMD["/root/start.sh"] #这是启动命令
root@node1:/data# docker build -t <新镜像名> ./


docker参数详解
docker
useage of docker
-D 默认false 允许调试模式(debugmode)
-H 默认是unix:///var/run/docker.sock tcp://[host[:port]]来绑定 或者unix://[/path/to/socket]来使用(二进制文件的时候),当主机ip host=[0.0.0.0],(端口)port=[4243] 或者 path=[/var/run/docker.sock]是缺省值,做为默认值来使用
-api-enable-cors 默认flase 允许CORS header远程api
-b 默认是空,附加在已存在的网桥上,如果是用'none'参数,就禁用了容器的网络
-bip 默认是空,使用提供的CIDR(ClasslessInter-Domain Routing-无类型域间选路)标记地址动态创建网桥(dcoker0),和-b参数冲突
-d 默认false 允许进程模式(daemonmode)
-dns 默认是空,使docker使用指定的DNS服务器
-g 默认是"/var/lib/docker":作为docker使用的根路径
-icc 默认true,允许inter-container来通信
-ip 默认"0.0.0.0":绑定容器端口的默认Ip地址
-iptables 默认true 禁用docker添加iptables规则
-mtu 默认1500 : 设置容器网络传输的最大单元(mtu)
-p 默认是/var/run/docker.pid进程pid使用的文件路径
-r 默认是true 重启之前运行的容器
-s 默认是空 ,这个是docker运行是使用一个指定的存储驱动器
-v 默认false 打印版本信息和退出


docker run命令详解
Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
Run a command in a new container
-a=map[]: 附加标准输入、输出或者错误输出
-c=0: 共享CPU格式(相对重要)
-cidfile="": 将容器的ID标识写入文件
-d=false: 分离模式,在后台运行容器,并且打印出容器ID
-e=[]:设置环境变量
-h="": 容器的主机名称
-i=false: 保持输入流开放即使没有附加输入流
-privileged=false: 给容器扩展的权限
-m="": 内存限制 (格式:<number><optional unit>, unit单位 = b, k, m or g)
-n=true: 允许镜像使用网络
-p=[]: 匹配镜像内的网络端口号
-rm=false:当容器退出时自动删除容器 (不能跟 -d一起使用)
-t=false: 分配一个伪造的终端输入
-u="": 用户名或者ID
-dns=[]: 自定义容器的DNS服务器
-v=[]: 创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro].如果容器目录丢失,docker会创建一个新的卷
-volumes-from="": 挂载容器所有的卷
-entrypoint="": 覆盖镜像设置默认的入口点
-w="": 工作目录内的容器
-lxc-conf=[]: 添加自定义-lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
-sig-proxy=true: 代理接收所有进程信号(even in non-tty mode)
-expose=[]: 让你主机没有开放的端口
-link="": 连接到另一个容器(name:alias)
-name="": 分配容器的名称,如果没有指定就会随机生成一个
-P=false: Publish all exposed ports to thehost interfaces 公布所有显示的端口主机接口


docker常用命令总结
docker pull <镜像名:tag> #从官网拉取镜像
docker search <镜像名> #搜索在线可用镜像名


查询容器、镜像、日志
docker top <container> #显示容器内运行的进程
docker images #查询所有的镜像,默认是最近创建的排在最上。
docker ps #查看正在运行的容器
docker ps -l #查看最后退出的容器的ID
docker ps -a #查看所有的容器,包括退出的。
docker logs {容器ID|容器名称} #查询某个容器的所有操作记录。
docker logs -f {容器ID|容器名称} #实时查看容易的操作记录。


删除容器与镜像
docker rm$(docker ps -a -q) #删除所有容器
docker rm <容器名or ID> #删除单个容器
docker rmi <ID> #删除单个镜像
docker rmi$(docker images | grep none | awk '{print $3}' | sort -r)


进入已经启动的容器

docker attache <容器名 or id>  进入某个容器

docker exec -it  <容器名 or id>  /bin/bash  进入容器并执行命令行模式

启动停止容器
docker stop <容器名or ID> #停止某个容器
docker start <容器名or ID> #启动某个容器
docker kill <容器名or ID> #杀掉某个容器




容器迁器
docker export <CONTAINER ID> > /home/export.tar #导出
cat /home/export.tar | sudo docker import - busybox-1-export:latest


# 导入export.tar文件
docker save debian> /home/save.tar #将debian容器打包
docker load< /home/save.tar #在另一台服务器上加载打包文件


save和export的对比参考地址:
http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html


运行一个新容器
#运行一个新容器,同时为它命名、端口映射。以debian02镜像为例
docker run -h="redis-test" --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local


#从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。
sudo docker cp 7bb0e258aefe:/etc/debian_version . #把容器中的/etc/debian_version拷贝到当前目录下。


docker Dockfile镜像制作
root@node1:/data# cat Dockerfile
FROM ubuntu/testa #这是基础镜像
CMD ["/root/start.sh"] #这是启动命令
root@node1:/data# docker build -t <新镜像名> ./ #生成新的镜像




Dockfile更多参数参考:
http://www.tuicool.com/articles/FRvAbe
http://www.colorscode.net/2014/01/04/howto-build-image-with-automatic-startup-ssh-service-from-dockerfile/