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