掌握docker这几招,你也能搞云计算了

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 两个参数要记牢,都是宿主到容器的映射,一个是端口,一个是卷

加上-it参数可保持容器后台运行不退出:

## 运行nodejs环境
docker run -d --name coolnode -it -v /dev/shm:/dev/shm -p 9898:9898 -v /opt/CMS:/opt/CMS node:20.11.0
## 运行Java环境
docker run -d --name cooljava -it -v /dev/shm:/dev/shm -p 8888:8888 -v /opt/CMS:/opt/CMS openjdk:17

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

ENTRYPOINT或者CMD

  • 在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令.
  • docker run 执行指定命令时,能覆盖在Dockerfile里的命令CMD和entrypoint. --entrypoint覆盖默认的ENTRYPOINT
  • 推荐使用Exec表示法
CMD ["executable","param1","param2"]

不推荐使用Shell表示法

CMD executable  param1 param2
  • 组合使用ENTRYPOINT和CMD, ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数. 例子如下:
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"] 

实际执行的命令由ENTRYPOINT和CMD指令拼接而成,即/bin/ping -c 3 localhost

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
云计算Docker是两个不同但相关的概念。 云计算是一种通过网络提供计算资源的模型,它允许用户根据需要使用计算资源,而无需拥有和管理自己的物理服务器。云计算提供了弹性和可扩展性,用户可以根据需要增加或减少计算资源,以适应业务需求的变化。云计算可以提供各种服务,包括基础设施即服务(Infrastructure as a Service,IaaS)、平台即服务(Platform as a Service,PaaS)和软件即服务(Software as a Service,SaaS)等。 Docker是一种开源的容器化平台,它允许开发人员将应用程序及其依赖项打包到一个称为容器的独立运行环境中。每个容器都可以独立运行,且与宿主机环境隔离。Docker容器可以在任何支持Docker的操作系统上运行,提供了跨平台和可移植性。使用Docker可以更加高效地部署和管理应用程序,提供了快速部署、可扩展性和灵活性等优势。 在云计算环境中,Docker可以用于打包和部署应用程序。通过使用Docker容器,开发人员可以将应用程序与其依赖项一起打包,并在云上的任何支持Docker的环境中运行。这样可以简化应用程序的部署过程,提高应用程序的可移植性和可扩展性。同时,Docker还提供了一套工具和服务,用于管理和编排多个容器,以实现更高级的应用程序部署和管理需求。 总结起来,云计算Docker都是为了提供更高效、灵活和可扩展的应用程序部署和管理解决方案。云计算提供了计算资源的弹性和可扩展性,而Docker提供了容器化技术,简化了应用程序的打包和部署过程。在实际应用中,它们可以结合使用,为开发人员和运维人员带来更好的体验和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极象

如果觉得对您有帮助,鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值