文章目录
- Docker的好处
- 玩转docker的基础几招
- 1. 构建一个docker镜像
- 2. 运行一个容器
- 3. 进入一个容器
- docker exec
- 4. docker cp
- 5. 容器备份和导出
- 6. 查看命令
- 7. 删除
- 其它
- alpine镜像和容器
- 网络问题
- 同一宿主机上不同docker容器的通信
- link方式
- 常见问题
- 重启容器服务
- 容器资源监控
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
alpine镜像和容器
alpine 镜像是被高度裁剪过的镜像,里面yum, apt, apt-get都没有,它的包管理器是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
运行上述命令就会安装上许多基础工具,如lsof。
安装软件采用:
apk add <program_name>
更新和删除某个包:
apk add -u <package_name_1> <pakage_name_2> ……
apk del <package_name>
根据alpine镜像构建自己的镜像:
FROM alpine:latest
RUN apk update && apk upgrade
RUN apk add <package_name>
网络问题
查看桥接模式下的所有网络:
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