docker构建镜像ssh功能

序言

    此文略长,so。。。。先听歌,enjoy the song。。。我的蠢吻不到我爱的人。。。。


docker的镜像

    在提到docker的镜像的时候,就不得不提到仓库和注册服务器,因为镜像image是放在仓库中,而仓库又是放在注册服务器中。在使用指令的时候,可以使用docker image来查看镜像,在显示的信息中repository表示为仓库,而注册服务器分为两种,一种是公有仓库,也就是docker.hub,一个是私有仓库,也就是自己搭建的仓库。在查看注册服务器的时候,可以从docker info中查看到相关的信息:


[[email protected] ~]# docker info(查看系统相关信息,其中包括注册服务器的信息,也就是registry

。。。

Docker Root Dir: /var/lib/docker (docker的根目录

Debug Mode (client): false

Debug Mode (server): false

Registry: https://index.docker.io/v1/ (公共注册服务器,安全的https

Experimental: false

Insecure Registries: (私有仓库,使用的http非安全的注册服务器

 192.168.1.111:5000

 127.0.0.0/8

Registry Mirrors: (注册服务器的加速设置,在/etc/docker/daemon.json中配置

 http://672426bf.m.daocloud.io/

Live Restore Enabled: false


[[email protected] ~]# docker images  (查看本地镜像信息,公共仓库会省略主机名和端口,私有仓库会写上主机名或者IP加端口

REPOSITORY (仓库)               TAG (相当于版本号)                IMAGE ID            CREATED             SIZE

192.168.1.111:5000/ssh7   latest              029c651eac96        2 days ago          297MB (私有仓库,注册服务器的地址为192.168.1.111,端口为5000,镜像名称为ssh7,版本为latest

ssh                       latest              272eeb0c3994        2 days ago          309MB(也是本地镜像,不过是在公共仓库下载的或者是自己build的镜像

centos                    6.8                 6704d778b3ba        2 months ago        195MB

    

1、 使用dockerfile在centos镜像中添加ssh功能

    在构建镜像的时候,可以使用docker commit,也可以使用docker build,而docker build的方式是推荐的,主要是可以看到其所有的步骤,先使用dockerfile来编译一个带有ssh功能的镜像,dockerfile的内容如下所示:

[[email protected] ~]# cat dockerfile(dockerfile内容,括号内容为注释

FROM centos (base images,基础镜像

RUN yum -y install openssh-server (使用RUN指令安装ssh服务端

RUN ssh-****** -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key (生成主机**,也可以放在一行进行安装,所有的安装依赖包和运行的指令都可以使用RUN执行

RUN ssh-****** -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN ssh-****** -q -N "" -t rsa -f /etc/ssh/ssh_host_ecdsa_key

RUN ssh-****** -q -N "" -t rsa -f /etc/ssh/ssh_host_ed25519_key

RUN echo root|passwd --stdin root (修改root的密码为root

EXPOSE 22 (监听22端口,外界可以访问

ENTRYPOINT ["/usr/sbin/sshd","-D"] (entrypoint表示默认情况下容器运行的命令

    使用docker build 生成镜像文件:

docker构建镜像ssh功能


    在进行使用指令docker build的目录,那个叫做docker build context,也就是创建镜像的上下文目录,这个目录下的内容都会发送给docker daemon,在上面中,可以看到发送的文件大小为33.79kB,由于我在前面进行编译过一次,从而使用了缓存文件,缓存存储的目录在/var/lib/docker/builder/fscache.db,在每次执行的时候,都会生成一个新的镜像层。


docker构建镜像ssh功能


    对比centos的镜像和centosssh的镜像大小,发现大小增加了,主要是在安装ssh的时候装了很多东西,而在生成主机**的时候,也增加了相应的大小。一个centos的镜像能这么小么,在安装centos的时候,下载4个多G,主要是因为在用户空间装了很多的软件;另外在docker的镜像中,并不需要kernel的相关文件,docker是运行在用户空间的程序,从而借助了host的kernel,从而镜像的大小能减少很多很多。

    在查看镜像的时候,默认使用的tag为latest,如果没有latest的镜像文件存在,那么就会报错了。

[[email protected] ~]# docker run -d --name kelssh centosssh:7 (使用刚刚创建的镜像,后台运行一个容器kelssh

a9d7d840312094e3c567fe482c4dc4845bcea2159b28068f7787d51963065ca3

[[email protected] ~]# >.ssh/known_hosts (清空信任主机,主要是创建太多,ip地址相同从而造成无法连接

[[email protected] ~]# docker inspect kelssh |grep 172 (查看容器的ip地址

            "Gateway": "172.17.0.1",

            "IPAddress": "172.17.0.2",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.2",

[[email protected] ~]# ssh 172.17.0.2(使用ssh连接容器

The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.

RSA key fingerprint is SHA256:6gpZy9wXCJMYh2eXr9e15o/Zx6YQqpRRFwKslym1NZ8.

RSA key fingerprint is MD5:63:f6:84:0a:2e:cb:d0:e1:51:b6:2d:de:0e:b6:69:1d.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '172.17.0.2' (RSA) to the list of known hosts.

[email protected]'s password: 

[[email protected] ~]# ls

anaconda-ks.cfg

[[email protected] ~]# exit(退出容器,容器不会被关闭,因为容器默认运行的进程没有被关闭,只有在默认启动的进程关闭之后,容器才会关闭

logout

Connection to 172.17.0.2 closed.

[[email protected] ~]# docker ps(查看运行的容器

CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS               NAMES

a9d7d8403120        centosssh:7         "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   22/tcp              kelssh

[[email protected] ~]# 

    在进行ssh测试的是,偶尔会卡住很久,可以新开一个终端然后ssh进行连接。在进行ssh连接的时候,可能会出现如下情况:

[[email protected] ~]# ssh 172.17.0.2(连接容器

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

SHA256:6gpZy9wXCJMYh2eXr9e15o/Zx6YQqpRRFwKslym1NZ8.

Please contact your system administrator.

Add correct host key in /root/.ssh/known_hosts to get rid of this message.

Offending RSA key in /root/.ssh/known_hosts:1

RSA host key for 172.17.0.2 has changed and you have requested strict checking.

Host key verification failed.

[[email protected] ~]# >.ssh/known_hosts (清空known_hosts文件即可


2、构建私有仓库

    在构建私有仓库的时候,主要是在dockerd注册这个本地的注册服务器,配置启动脚本如下(操作系统不一样,启动的脚本位置不同):

docker构建镜像ssh功能


    运行私有注册服务器:

[[email protected] ~]# docker run -d -v /registry:/var/lib/registry -p  5000:5000 --name kelregistry registry(-d表示后台启动,-v表示挂载目录,主要是将镜像文件存在registry目录中

8191770e5ba1356ae9aeeefc89be60bf4e9a63270b637b78f1fa8443146dcbb2

[[email protected] ~]# docker ps(镜像已经启动

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

8191770e5ba1        registry            "/entrypoint.sh /e..."   5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp   kelregistry

[[email protected] ~]# docker port kelregistry(查看容器的端口映射关系

5000/tcp -> 0.0.0.0:5000

[[email protected] ~]# docker volume ls

DRIVER              VOLUME NAME

[[email protected] ~]# docker tag centosssh:7 192.168.1.111:5000/centosssh:7(将镜像打tag,也就是打标签,在私有仓库中,必须写上ip地址和端口

[[email protected] ~]# docker push 192.168.1.111:5000/centosssh:7 (上传此镜像

The push refers to a repository [192.168.1.111:5000/centosssh]

46ac910110a3: Pushed 

f70d6e20ca12: Pushed 

297a4cae212f: Pushed 

7b6524168754: Pushed 

9e3ecc2d0a64: Pushed 

4014027e956b: Pushed 

d1be66a59bc5: Pushed 

7: digest: sha256:51db444197e769b01d419632910dc910e5e5a84934e88d43152c5f34ec2d5fb5 size: 1780

[[email protected] ~]# ls -l /registry/(查看本机文件,已经保存相关的镜像文件

total 0

drwxr-xr-x. 3 root root 22 Jan  7 03:24 docker


3、 上传镜像到公共仓库

    在上传到公共仓库的时候,需要到上面去注册帐号,然后创建一个仓库,结果如下:

docker构建镜像ssh功能

[[email protected] log]# docker login -u kellyseeme(登录自己的帐号,-u表示用户名

Password: 

Login Succeeded

[[email protected] ~]# docker push kellyseeme/ssh上传镜像,注意这里的镜像名称和上图显示的相同,不过这个。。。完全看网络。。

The push refers to a repository [docker.io/kellyseeme/ssh]

f0b3cff1cf42: Pushed 

18d4148bbb5c: Layer already exists 

c349ed5e5d5c: Layer already exists 

8b7fda58fb5e: Layer already exists 

e00c9229b481: Layer already exists 

latest: digest: sha256:6edd972667789e40011e5deed7900d68cc185a76c950594587ebc8a4a2c4821c size: 1364



4、 查看日志

    有的时候经常想着好像查看日志的时候,都是使用docker logs ID来查看容器的日志,但是很多时候也并没有,如下:

[[email protected] ~]# docker ps(查看运行状态的容器

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

8191770e5ba1        registry            "/entrypoint.sh /e..."   43 minutes ago      Up 2 minutes        0.0.0.0:5000->5000/tcp   kelregistry

b182c26a91db        ssh                 "/usr/sbin/sshd -D"      21 hours ago        Up 44 seconds       22/tcp                   kel

[[email protected] ~]# docker logs b18(查看容器b18的日志

[[email protected] ~]# docker logs -f 8191770e5ba1(查看容器的日志,使用滚动的方式输出,和tail -f效果类似

time="2018-01-07T08:22:45Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.7.6 instance.id=05315cbd-dcce-4d44-96c8-256d0dfa0b33 version=v2.6.2 

time="2018-01-07T08:22:45Z" level=info msg="redis not configured" go.version=go1.7.6 instance.id=05315cbd-dcce-4d44-96c8-256d0dfa0b33 version=v2.6.2

    在使用docker logs查看日志的时候,需要注意两个方面:

    a docker logs只能查看容器的启动的时候的进程的日志信息,而不能查看所有的日志信息,比如你在容器中运行的是一个应用程序,但是如果应用程序的启动脚本不是容器的启动脚本,那么就不能看到应用的日志

    b 无论容器处于什么状态,都可以看到相关的启动日志,因为相关的启动日志文件已经保存在了文件系统中(/var/run/docker/libcontainerd/containerd/容器ID/init/log.json)。


4、容器的状态

    容器的状态分为created,exited,running,pause,在使用docker create的时候,状态为create,使用docker run,start,restart成功之后,状态均为running;使用docker pause表示暂停,也就是pause的状态,使用unpause表示取消暂停状态;使用docker stop,kill,为exited状态,如下:

[[email protected] ~]# docker create --name create ssh(创建一个容器,状态为created

2ac9953410008d1f505fb4b3574d75d31a80bd57860811383d78936e1107d5ee

[[email protected] ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

2ac995341000        ssh                 "/usr/sbin/sshd -D"      7 seconds ago       Created                                         create(create表示为刚刚创建状态

8191770e5ba1        registry            "/entrypoint.sh /e..."   About an hour ago   Exited (2) 10 minutes ago                       kelregistry(exited表示为退出状态

b182c26a91db        ssh                 "/usr/sbin/sshd -D"      21 hours ago        Up 16 minutes               22/tcp              kelup表示为运行状态

[[email protected] ~]# docker pause kel(暂停容器,主要用来防止容器消耗cpu等资源

kel

[[email protected] ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

b182c26a91db        ssh                 "/usr/sbin/sshd -D"      21 hours ago        Up 24 minutes (Paused)      22/tcp              kel(暂停状态

[[email protected] ~]# docker unpause kel(取消暂停状态

kel

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES

b182c26a91db        ssh                 "/usr/sbin/sshd -D"   21 hours ago        Up 24 minutes       22/tcp              kel(重新变成运行态

    在使用docker run的时候,其实内部就是先create,然后进行start。


5、 监控

    在使用docker的时候,一般使用的监控是docker ps查看多少容器在运行

,-a表示显示所有状态的容器:

docker构建镜像ssh功能

    查看容器的相关cpu,内存状态的时候,使用命令如下:

docker构建镜像ssh功能

    查看容器的内部进程使用:

[[email protected] ~]# docker top kel(top查看

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD

root                59375               59360               7                   04:38               pts/0               00:00:00            /usr/sbin/sshd -D

    在使用top的时候,容器必须在运行状态。


6、 容器的运行

    在容器运行的时候,主要使用的参数是-d选项,表示为是否后台运行,如果没有添加此参数,那么使用exit退出的时候,就会退出。


[[email protected] ~]# docker run -d --name test ssh 

60eef21016e471dec81d1f73be23610b3c839d7479a98028b7f2e3595e87254e

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS               NAMES

60eef21016e4        ssh                 "/usr/sbin/sshd -D"   About a minute ago   Up About a minute   22/tcp              test

    比较可惜的是,在使用docker ps的时候,并不能看到完整的参数列表,也就是相当于一些其他的参数,例如-v挂载的目录,持久化的数据,而port是可以看到的,容器的所有信息都可以使用docker inspect 容器id来查看到。

    当要在运行中的容器执行一个命令就退出的时候,可以使用exec;当要进入容器查看相关的东西的时候,可以使用exec -it参数,如下:

[[email protected] ~]# docker exec test ps -ef (不进入容器执行相关的命令

UID         PID   PPID  C STIME TTY          TIME CMD

root          1      0  0 09:42 ?        00:00:00 /usr/sbin/sshd -D

root          9      0  0 09:47 ?        00:00:00 ps -ef

[[email protected] ~]# docker exec -it test bash(进入容器执行相关的命令

[[email protected] /]# exit(退出容器,容器依旧会运行,pid为1的进程不死容器就不会挂

exit


7、 CMD与RUN与ENTRYPOINT

    RUN一般用来在容器中安装相关的依赖,也就是一个应用软件。采用shell格式,也就是shell怎么写,RUN yum -y install openssh-server。

    CMD 主要用来执行命令,推荐使用exec方式,就是["/bin/sh","-c","echo 123"],第一个参数表示为可执行文件,后面的全部是参数。

    ENTRYPOINT和CMD是一样一样的,主要的区别就是ENTRYPOINT的必然会执行,而CMD是作为ENTRYPOINT的参数,而这个CMD是默认启动容器的时候执行的参数,在使用docker run的时候,如果使用了参数,可以替换dockerfile中CMD参数。


结尾

    文章略长,做了一个docker常用操作的梳理。


    2018新的开始,弄了一个为微信群玩玩,加我微信hhh911520,记得备注。。。拉你们进群,welcome。。


    ****************************************************************


    2018还没几天就经历了一把断电,那感觉真是无与伦比。。。分布式系统的恢复太复杂了。。。尼玛,说好的服务自启动,说好的服务自恢复呢。。。啊呸。。。骗子。。


    2018新的一年,又有很多人要离职了,想想存在的位置的不可替代性,有的时候这个也算是一个威胁,但是。。。如果不重要,走就走把,还能换一个更好的,如果重要,应该也会假装挽留一下吧。。。


    2018会有更多的机遇和挑战,那么你们都准备好了么。。。。are you ready。。。


    小楼昨夜又东风。。。


docker构建镜像ssh功能