实践中学docker

最近把自己写的一个工具做成了docker,把自己总结的一些docker知识汇总了下。

docker的基本原理

docker与宿主机的逻辑隔离是通过linux的namespace,资源隔离是通过linux的cgoup,文件系统的隔离则是通过linux的rootfs。docker通过把依赖打入docker image,解决了部署环境的不一致问题。但是docker实际上还是与宿主机共享系统内核,所以docker可以说只是静态的隔离,一个linux上的docker也不可能在windows上运行。
当我们的软件运行依赖比较多的时候,我们可以选择打docker image的方式来使它更易于安装部署。

docker打包

编写Dockerfile
FROM:选择基本镜像
COPY:把本地文件或文件夹copy到docker中
WORKDIR:docker启动后的工作目录
RUN:可以有多个,这里可以安装一些本软件运行必需的依赖
ENV:docker中的环境变量
CMD/ENTRYPOINT:docker启动后运行的进程。这里我写了个脚本运行,COPY那一步已经copy到docker中去了

FROM ***/base/ubuntu1804:python3.6_pip
MAINTAINER ***
COPY test /test
WORKDIR /
RUN pip3 install -r test/requirements.txt
RUN DEBIAN_FRONTEND="noninteractive" apt-get update && \
    DEBIAN_FRONTEND="noninteractive" apt-get install -y -q --allow-unauthenticated wget
ENV BROKER_IP 127.0.0.1
ENV USERNAME admin
CMD ["bash", "/test/run.sh"]

在Dockerfile所在目录运行docker build,test是镜像名,v1是版本号

docker build -t test:v1 .

docker本机运行

通过docker build,本机就有了test:v1这个docker镜像,可以通过docker images 查看,现在我们看看本地如何运行这个docker image。

docker run --network host -v <本机文件或文件夹>:<docker中的文件或文件夹>  -e BROKER_IP="192.168.1.2" test:v1 

-v是可以把本机的文件或文件夹映射到docker,-e可以修改dockerfile中定义的环境变量,这两个选项可以动态地改变docker运行进程的一些配置,比如说例子中docker启动后会运行run.sh,run.sh可能会读取一些配置文件或者环境变量,这时就可以通过这种方式进行配置。

–network host表示使用宿主机的网络栈,因为我的docker只是发一些数据出去,所以不需要隔离网络。另外某些宿主机因为配置的原因docker内的网络不能访问外网,这个时候这个选项就很有用了。具体啥配置导致的我还没弄清楚。

docker到处运行

本机能运行了,docker镜像如何在其他机器上运行呢?毕竟docker的优势就在于不需要安装依赖就可以到处运行。有两种方式:
1)docker 镜像导入
本机导出镜像

docker save -o testv1.tar test:v1

需要运行的机器上导入镜像

docker load -i testv1.tar

这样就可以在别的机器上运行镜像了。

2)docker 镜像上传到docker registry
可以将docker镜像上传到私有docker hub或者私有仓库,这样docker run的时候会自动下载镜像。比如我的私有仓库是mydockerhub.com。
本机上传镜像

docker login -u username mydockerhub.com
docker tag test:v1 mydockerhub.com/test/test:v1
docker push mydockerhub.com/test/test:v1

其他机器上运行

docker run --network host -v <本机文件或文件夹>:<docker中的文件或文件夹>  -e BROKER_IP="192.168.1.2" mydockerhub.com/test/test:v1

docker小知识

1)docker 所有进程的祖先是谁?
进入docker,可以看到run.sh的父亲是0号进程,run.sh是1号进程,其他都是run.sh的子孙。而在宿主机上,run.sh的父亲是docker。
2)docker stop后,docker内所有进程会不会停止?
会的,docker启动后的父子进程都会停止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值