Docker的好处
容器技术出现十多年了,已经在测试和生产环境得到普遍应用。几个好处:
- 便携性、隔离性
- 封装性,可复用
- 方便做集群部署和资源调度
…
所谓云计算,就是所有计算、服务、产品都云化,部署在云上,你只管使用就行,不用操心它怎么部署。怎么云化?虚拟化和docker化嘛。那还不会docker的小伙伴们还不赶紧普及一下docker。
下面是本人以前记录的笔记,很基础,现在搬到CSDN上,也算是上云了吧。
玩转docker的基础几招
1. 构建一个docker镜像
只需要当前目录下存在Dockerfile文件即可:
docker build -t cms/python-docker:v1 .
2. 运行一个容器
根据已知镜像,拉起一个新的容器:
docker run -d --name cmspy -v /dev/shm:/dev/shm -p 9080:80 -v /opt/CMS:/opt/CMS cms/python-docker:v1
- -d: 以daemon方式运行,执行完后容器不退出
- -p 和 -v 两个参数要记牢,都是宿主到容器的映射,一个是端口,一个是卷
3. 进入一个容器
一个容器运行起来后,我们要钻进去看个究竟,就用下面的命令:
docker exec -it <容器ID或名称> bash
docker exec 是一个有用的命令,完整了解一下:
docker exec
docker exec [OPTIONS] container_name COMMAND [ARG...]
OPTIONS说明:-d,以后台方式执行命令;
-e,设置环境变量
-i,交互模式
-t,设置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";
再免费赠送实际场景中的一个例子,例如我在Jenkins中每天自动运行远程服务器上容器中的脚本:
## 先拉最新代码
ssh -p 22 liu@111.112.235.88 "sudo docker exec -u liuhu cmspy bash -c 'cd /home/liuhu/cmspy && git pull origin master'"
## 再重启进程
ssh -p 22 liu@111.112.235.88 "sudo docker exec cmspy bash -c 'supervisorctl restart cmspy-crawler'"
这两条命令放在Jenkin的job脚本中,助你成功。
4. docker cp
容器宕掉了,重启也失败,咋办?
遇到这种情况,是不是窝火?不要紧,两招救你。
一、把相应文件拷到宿主机上
docker cp <containerID>:/xxx/xxx .
改巴改巴再拷进去:
docker cp yourfile <containerID>:/xxx/xxx/yourfile
文件和目录都可以采用这种方式随意copy进出
二、上述办法还不奏效,那说明容器的启动文件有问题,那就把启动文件copy出来,修改,在启动脚本第一行,加上
sleep 9999999
如果是别的语言的脚本,也如法炮制。sleep机制总归是有的。
copy回去,再重启就不会退出了。
5. 容器备份和导出
保存容器为镜像:
docker commit -a "my first commit" -m "headful chrome docker" d479afb70a20 cms/headful-chrome:v2
容器导出:
docker export 7691a814370e > ubuntu.tar
容器导入:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
6. 查看命令
查看所有镜像:
docker images
查看所有容器:
docker ps -a
查看某个镜像和容器:
docker inspect <镜像或容器的ID或名称>
7. 删除
删除镜像:
docker rmi <镜像ID>
删除容器
docker rm <容器ID>
其它
镜像重命名:
docker tag OldName:tag NewName:tag
容器重命名:
docker rename OldName:tag NewName:tag
网络问题
查看桥接模式下的所有网络:
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": ""}...
可以看到每个容器分配的IP地址,这些IP地址在同一个网段,正常情况下容器之间按照这个分配的IP访问即可。宿主机的主机号默认为1, 即 10.244.192.1
同一宿主机上不同docker容器的通信
link方式
docker network ls
–link im_mysql:local_mysql
docker network create -d bridge network1
在两个容器中:
docker network connect network1 container1
docker network connect network1 container2
然后,在其中一个容器中ping另一个容器,测试是否能连通:
ping container2
常见问题
重启容器服务
如果服务器上需要这样的重启功能,可以有两种方法进行设置:
1.容器还没有创建,在运行容器的时候加入–restart=always参数
docker run -id --restart=always -p 9999:9999 -v xxxx:xxxx 镜像名称:tag
1
2.容器已经运行的情况,运行以下命令:
docker update --restart=always 容器名字或者容器ID
1
想立即生效就重启docker systemctl restart docker, 不然就等到它下次重启自动生效
其他:如果想停止自动启动,运行以下命令:
docker update --restart=no 容器名字或者容器ID
容器资源监控
CPU占用前五名:
docker stats --no-stream|awk ‘{print $3," "$1,$2}’|sort -h |tail -n 5
内存占用前五名:
docker stats --no-stream|awk ’ {print $4," "$1,$2}’ |sort -h |tail -n 5