Docker的好處
容器技術(shù)出現(xiàn)十多年了,已經(jīng)在測(cè)試和生產(chǎn)環(huán)境得到普遍應(yīng)用。幾個(gè)好處:
- 便攜性、隔離性
- 封裝性,可復(fù)用
- 方便做集群部署和資源調(diào)度
…
所謂云計(jì)算,就是所有計(jì)算、服務(wù)、產(chǎn)品都云化,部署在云上,你只管使用就行,不用操心它怎么部署。怎么云化?虛擬化和docker化嘛。那還不會(huì)docker的小伙伴們還不趕緊普及一下docker。
下面是本人以前記錄的筆記,很基礎(chǔ),現(xiàn)在搬到CSDN上,也算是上云了吧。
玩轉(zhuǎn)docker的基礎(chǔ)幾招
1. 構(gòu)建一個(gè)docker鏡像
只需要當(dāng)前目錄下存在Dockerfile文件即可:
docker build -t cms/python-docker:v1 .
2. 運(yùn)行一個(gè)容器
根據(jù)已知鏡像,拉起一個(gè)新的容器:
docker run -d --name cmspy -v /dev/shm:/dev/shm -p 9080:80 -v /opt/CMS:/opt/CMS cms/python-docker:v1
- -d: 以daemon方式運(yùn)行,執(zhí)行完后容器不退出
- -p 和 -v 兩個(gè)參數(shù)要記牢,都是宿主到容器的映射,一個(gè)是端口,一個(gè)是卷
3. 進(jìn)入一個(gè)容器
一個(gè)容器運(yùn)行起來(lái)后,我們要鉆進(jìn)去看個(gè)究竟,就用下面的命令:
docker exec -it <容器ID或名稱> bash
docker exec 是一個(gè)有用的命令,完整了解一下:
docker exec
docker exec [OPTIONS] container_name COMMAND [ARG...]
OPTIONS說(shuō)明:
-d,以后臺(tái)方式執(zhí)行命令;
-e,設(shè)置環(huán)境變量
-i,交互模式
-t,設(shè)置TTY
-u,用戶名或UID,例如myuser:myusergroup
例子:
sudo docker exec myContainer bash -c "cd /home/myuser/myproject && git fetch ssh://gerrit_server:29418/myparent/myproject ${GERRIT_REFSPEC} && git checkout FETCH_HEAD";
sudo docker exec myContainer bash -c "cd /home/myuser/myproject;git fetch ssh://gerrit_server:29418/myparent/myproject ${GERRIT_REFSPEC};git checkout FETCH_HEAD";
再免費(fèi)贈(zèng)送實(shí)際場(chǎng)景中的一個(gè)例子,例如我在Jenkins中每天自動(dòng)運(yùn)行遠(yuǎn)程服務(wù)器上容器中的腳本:
## 先拉最新代碼
ssh -p 22 liu@111.112.235.88 "sudo docker exec -u liuhu cmspy bash -c 'cd /home/liuhu/cmspy && git pull origin master'"
## 再重啟進(jìn)程
ssh -p 22 liu@111.112.235.88 "sudo docker exec cmspy bash -c 'supervisorctl restart cmspy-crawler'"
這兩條命令放在Jenkin的job腳本中,助你成功。
4. docker cp
容器宕掉了,重啟也失敗,咋辦?
遇到這種情況,是不是窩火?不要緊,兩招救你。
一、把相應(yīng)文件拷到宿主機(jī)上
docker cp <containerID>:/xxx/xxx .
改巴改巴再拷進(jìn)去:
docker cp yourfile <containerID>:/xxx/xxx/yourfile
文件和目錄都可以采用這種方式隨意copy進(jìn)出
二、上述辦法還不奏效,那說(shuō)明容器的啟動(dòng)文件有問(wèn)題,那就把啟動(dòng)文件copy出來(lái),修改,在啟動(dòng)腳本第一行,加上
sleep 9999999
如果是別的語(yǔ)言的腳本,也如法炮制。sleep機(jī)制總歸是有的。
copy回去,再重啟就不會(huì)退出了。
5. 容器備份和導(dǎo)出
保存容器為鏡像:
docker commit -a "my first commit" -m "headful chrome docker" d479afb70a20 cms/headful-chrome:v2
容器導(dǎo)出:
docker export 7691a814370e > ubuntu.tar
容器導(dǎo)入:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
6. 查看命令
查看所有鏡像:
docker images
查看所有容器:
docker ps -a
查看某個(gè)鏡像和容器:
docker inspect <鏡像或容器的ID或名稱>
7. 刪除
刪除鏡像:
docker rmi <鏡像ID>
刪除容器
docker rm <容器ID>
其它
鏡像重命名:
docker tag OldName:tag NewName:tag
容器重命名:
docker rename OldName:tag NewName:tag
alpine鏡像和容器
alpine 鏡像是被高度裁剪過(guò)的鏡像,里面yum, apt, apt-get都沒(méi)有,它的包管理器是apk。
Alpine Linux is the go-to distribution for use in docker containers. And if you happen to follow any online tutorials on using Docker for setting up your containers, it is very much possible that you had used the alpine linux image (without realizing it) and are now trying to use the package manager of some other distribution.
In Alpine Linux, the package manager is called apk, while in Debian-based distributions like Ubuntu, the package manager is called apt.
apk update && apk upgrade
運(yùn)行上述命令就會(huì)安裝上許多基礎(chǔ)工具,如lsof。
安裝軟件采用:
apk add <program_name>
更新和刪除某個(gè)包:
apk add -u <package_name_1> <pakage_name_2> ……
apk del <package_name>
根據(jù)alpine鏡像構(gòu)建自己的鏡像:
FROM alpine:latest
RUN apk update && apk upgrade
RUN apk add <package_name>
網(wǎng)絡(luò)問(wèn)題
查看橋接模式下的所有網(wǎng)絡(luò):
docker network inspect bridge
...
"f9575d8c4f6070da8b9fbb8c2524ae4837c12a94ac0310dde7c93daf3337c6c6": {
"Name": "k8s_POD_grafana-55f67dc7c8-9d5vf_prophet_971f0f71-31fa-47f9-857a-b7e6ddca95be_2",
"EndpointID": "3cc3a6caba59e5e21953fcbfc23e1a265b9adfb5dfae13ae15ca7582246a58f9",
"MacAddress": "02:42:0a:f4:c0:0d",
"IPv4Address": "10.244.192.13/21",
"IPv6Address": ""
},
"fce7b55b783031bb7b21e663d079c8fc01cb8fbe0c6a5b51aaef55c09680e781": {
"Name": "k8s_POD_abtest-manager-6d897df946-ql2g8_prophet_1ed95389-fed8-4d89-9c02-331b689edb74_2",
"EndpointID": "c8781810bef94fd63bb8dd63c80f1a0b6b7fef38a5dea1cf486ab7a6f11196fd",
"MacAddress": "02:42:0a:f4:c0:1d",
"IPv4Address": "10.244.192.29/21",
"IPv6Address": ""
},
"fd47a419724609ae922a6743487eca3a2c965b8260f8b882899a44970e68d93c": {
"Name": "k8s_POD_mysql-master-6d9749bc5c-pdwjr_prophet_daab0220-2c50-4877-93f3-5593b80b1a33_2",
"EndpointID": "ebaa346ed71e9e6a8d938fd899e2baee1671dfeb2e1415ee2379d44c93bcadeb",
"MacAddress": "02:42:0a:f4:c0:13",
"IPv4Address": "10.244.192.19/21",
"IPv6Address": ""
}
...
可以看到每個(gè)容器分配的IP地址,這些IP地址在同一個(gè)網(wǎng)段,正常情況下容器之間按照這個(gè)分配的IP訪問(wèn)即可。宿主機(jī)的主機(jī)號(hào)默認(rèn)為1, 即 10.244.192.1
同一宿主機(jī)上不同docker容器的通信
link方式
docker network ls
–link im_mysql:local_mysql
docker network create -d bridge network1
在兩個(gè)容器中:
docker network connect network1 container1
docker network connect network1 container2
然后,在其中一個(gè)容器中ping另一個(gè)容器,測(cè)試是否能連通:
ping container2
常見(jiàn)問(wèn)題
重啟容器服務(wù)
如果服務(wù)器上需要這樣的重啟功能,可以有兩種方法進(jìn)行設(shè)置:
1.容器還沒(méi)有創(chuàng)建,在運(yùn)行容器的時(shí)候加入–restart=always參數(shù)
docker run -id --restart=always -p 9999:9999 -v xxxx:xxxx 鏡像名稱:tag
1
2.容器已經(jīng)運(yùn)行的情況,運(yùn)行以下命令:
docker update --restart=always 容器名字或者容器ID
1
想立即生效就重啟docker systemctl restart docker, 不然就等到它下次重啟自動(dòng)生效
其他:如果想停止自動(dòng)啟動(dòng),運(yùn)行以下命令:
docker update --restart=no 容器名字或者容器ID
容器資源監(jiān)控
CPU占用前五名:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-657145.html
docker stats --no-stream|awk ‘{print $3," "$1,$2}’|sort -h |tail -n 5
內(nèi)存占用前五名:
docker stats --no-stream|awk ’ {print $4," "$1,$2}’ |sort -h |tail -n 5文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657145.html
到了這里,關(guān)于掌握docker這幾招,你也能搞云計(jì)算了的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!