docker構建鏡像ssh功能

序言

    此文略長,so。。。。先聽歌,enjoy the song。。。個人蠢吻不到我愛的人。。。。
redis


docker的鏡像

    在提到docker的鏡像的時候,就不得不提到倉庫和註冊服務器,由於鏡像image是放在倉庫中,而倉庫又是放在註冊服務器中。在使用指令的時候,可使用docker image來查看鏡像,在顯示的信息中repository表示爲倉庫,而註冊服務器分爲兩種,一種是公有倉庫,也就是docker.hub,一個是私有倉庫,也就是本身搭建的倉庫。在查看註冊服務器的時候,能夠從docker info中查看到相關的信息:docker


[root@docker-ce ~]# docker info(查看系統相關信息,其中包括註冊服務器的信息,也就是registryshell

。。。json

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

Debug Mode (client): false緩存

Debug Mode (server): false安全

Registry: https://index.docker.io/v1/ (公共註冊服務器,安全的httpsbash

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              kelup表示爲運行狀態

[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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索