怎么样才能让docker有ssh连接方式(你真的不能错过)

docker的镜像

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

[root@docker-ce ~]# 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

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

JAVA

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

怎么样才能让docker有ssh连接方式(你真的不能错过)(1)

JAVA

对比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文件即可)

2、构建私有仓库

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

怎么样才能让docker有ssh连接方式(你真的不能错过)(2)

JAVA

运行私有注册服务器:

[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

3、 上传镜像到公共仓库

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

怎么样才能让docker有ssh连接方式(你真的不能错过)(3)

JAVA

[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

4、 查看日志

有的时候经常想着好像查看日志的时候,都是使用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查看日志的时候,需要注意两个方面:

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

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

5、容器的状态

容器的状态分为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 Up16 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 Up24 minutes 22/tcp kel(重新变成运行态)

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

6、 监控

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

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

怎么样才能让docker有ssh连接方式(你真的不能错过)(4)

JAVA

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

怎么样才能让docker有ssh连接方式(你真的不能错过)(5)

JAVA

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

[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的时候,容器必须在运行状态。

7、 容器的运行

在容器运行的时候,主要使用的参数是-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

8、 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参数。

视频资料链接:

data:text/html;charset=UTF-8;base64,

5oGt5Zac5L2g77yM5p625p6E5biI5a2m5Lmg576k5Y 35pivNTc1NzUxODU0Cg==

复制粘贴在网站打开即可

怎么样才能让docker有ssh连接方式(你真的不能错过)(6)

java

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页