此文略长,so。。。。先听歌,enjoy the song。。。个人蠢吻不到我爱的人。。。。
redis
在提到docker的镜像的时候,就不得不提到仓库和注册服务器,由于镜像image是放在仓库中,而仓库又是放在注册服务器中。在使用指令的时候,可使用docker image来查看镜像,在显示的信息中repository表示为仓库,而注册服务器分为两种,一种是公有仓库,也就是docker.hub,一个是私有仓库,也就是本身搭建的仓库。在查看注册服务器的时候,能够从docker info中查看到相关的信息:docker
[root@docker-ce ~]# docker info(查看系统相关信息,其中包括注册服务器的信息,也就是registry)shell
。。。json
Docker Root Dir: /var/lib/docker (docker的根目录)centos
Debug Mode (client): false缓存
Debug Mode (server): false安全
Registry: https://index.docker.io/v1/ (公共注册服务器,安全的https)bash
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
[root@docker-ce ~]# 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
一、 使用dockerfile在centos镜像中添加ssh功能
在构建镜像的时候,可使用docker commit,也可使用docker build,而docker build的方式是推荐的,主要是能够看到其全部的步骤,先使用dockerfile来编译一个带有ssh功能的镜像,dockerfile的内容以下所示:
[root@docker-ce ~]# cat dockerfile(dockerfile内容,括号内容为注释)
FROM centos (base images,基础镜像)
RUN yum -y install openssh-server (使用RUN指令安装ssh服务端)
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key (生成主机密钥,也能够放在一行进行安装,全部的安装依赖包和运行的指令均可以使用RUN执行)
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -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 build的目录,那个叫作docker build context,也就是建立镜像的上下文目录,这个目录下的内容都会发送给docker daemon,在上面中,能够看到发送的文件大小为33.79kB,因为我在前面进行编译过一次,从而使用了缓存文件,缓存存储的目录在/var/lib/docker/builder/fscache.db,在每次执行的时候,都会生成一个新的镜像层。
对比centos的镜像和centosssh的镜像大小,发现大小增长了,主要是在安装ssh的时候装了不少东西,而在生成主机密钥的时候,也增长了相应的大小。一个centos的镜像能这么小么,在安装centos的时候,下载4个多G,主要是由于在用户空间装了不少的软件;另外在docker的镜像中,并不须要kernel的相关文件,docker是运行在用户空间的程序,从而借助了host的kernel,从而镜像的大小能减小不少不少。
在查看镜像的时候,默认使用的tag为latest,若是没有latest的镜像文件存在,那么就会报错了。
[root@docker-ce ~]# docker run -d --name kelssh centosssh:7 (使用刚刚建立的镜像,后台运行一个容器kelssh)
a9d7d840312094e3c567fe482c4dc4845bcea2159b28068f7787d51963065ca3
[root@docker-ce ~]# >.ssh/known_hosts (清空信任主机,主要是建立太多,ip地址相同从而形成没法链接)
[root@docker-ce ~]# 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",
[root@docker-ce ~]# 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.
root@172.17.0.2's password:
[root@a9d7d8403120 ~]# ls
anaconda-ks.cfg
[root@a9d7d8403120 ~]# exit(退出容器,容器不会被关闭,由于容器默认运行的进程没有被关闭,只有在默认启动的进程关闭以后,容器才会关闭)
logout
Connection to 172.17.0.2 closed.
[root@docker-ce ~]# 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
[root@docker-ce ~]#
在进行ssh测试的是,偶尔会卡住好久,能够新开一个终端而后ssh进行链接。在进行ssh链接的时候,可能会出现以下状况:
[root@docker-ce ~]# 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.
[root@docker-ce ~]# >.ssh/known_hosts (清空known_hosts文件便可)
二、构建私有仓库
在构建私有仓库的时候,主要是在dockerd注册这个本地的注册服务器,配置启动脚本以下(操做系统不同,启动的脚本位置不一样):
运行私有注册服务器:
[root@docker-ce ~]# docker run -d -v /registry:/var/lib/registry -p 5000:5000 --name kelregistry registry(-d表示后台启动,-v表示挂载目录,主要是将镜像文件存在registry目录中)
8191770e5ba1356ae9aeeefc89be60bf4e9a63270b637b78f1fa8443146dcbb2
[root@docker-ce ~]# 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
[root@docker-ce ~]# docker port kelregistry(查看容器的端口映射关系)
5000/tcp -> 0.0.0.0:5000
[root@docker-ce ~]# docker volume ls
DRIVER VOLUME NAME
[root@docker-ce ~]# docker tag centosssh:7 192.168.1.111:5000/centosssh:7(将镜像打tag,也就是打标签,在私有仓库中,必须写上ip地址和端口)
[root@docker-ce ~]# 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
[root@docker-ce ~]# ls -l /registry/(查看本机文件,已经保存相关的镜像文件)
total 0
drwxr-xr-x. 3 root root 22 Jan 7 03:24 docker
三、 上传镜像到公共仓库
在上传到公共仓库的时候,须要到上面去注册账号,而后建立一个仓库,结果以下:
[root@docker-ce log]# docker login -u kellyseeme(登陆本身的账号,-u表示用户名)
Password:
Login Succeeded
[root@docker-ce ~]# 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
四、 查看日志
有的时候常常想着好像查看日志的时候,都是使用docker logs ID来查看容器的日志,可是不少时候也并无,以下:
[root@docker-ce ~]# 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
[root@docker-ce ~]# docker logs b18(查看容器b18的日志)
[root@docker-ce ~]# 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)。
四、容器的状态
容器的状态分为created,exited,running,pause,在使用docker create的时候,状态为create,使用docker run,start,restart成功以后,状态均为running;使用docker pause表示暂停,也就是pause的状态,使用unpause表示取消暂停状态;使用docker stop,kill,为exited状态,以下:
[root@docker-ce ~]# docker create --name create ssh(建立一个容器,状态为created)
2ac9953410008d1f505fb4b3574d75d31a80bd57860811383d78936e1107d5ee
[root@docker-ce ~]# 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 kel(up表示为运行状态)
[root@docker-ce ~]# docker pause kel(暂停容器,主要用来防止容器消耗cpu等资源)
kel
[root@docker-ce ~]# 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(暂停状态)
[root@docker-ce ~]# docker unpause kel(取消暂停状态)
kel
[root@docker-ce ~]# 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。
五、 监控
在使用docker的时候,通常使用的监控是docker ps查看多少容器在运行
,-a表示显示全部状态的容器:
查看容器的相关cpu,内存状态的时候,使用命令以下:
查看容器的内部进程使用:
[root@docker-ce ~]# 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的时候,容器必须在运行状态。
六、 容器的运行
在容器运行的时候,主要使用的参数是-d选项,表示为是否后台运行,若是没有添加此参数,那么使用exit退出的时候,就会退出。
[root@docker-ce ~]# docker run -d --name test ssh
60eef21016e471dec81d1f73be23610b3c839d7479a98028b7f2e3595e87254e
[root@docker-ce ~]# 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参数,以下:
[root@docker-ce ~]# 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
[root@docker-ce ~]# docker exec -it test bash(进入容器执行相关的命令)
[root@60eef21016e4 /]# exit(退出容器,容器依旧会运行,pid为1的进程不死容器就不会挂)
exit
七、 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。。。
小楼昨夜又东风。。。
本文分享自微信公众号 - SRE运维实践(gh_319dd73ec076)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。